C++中使用TensorRT实现SAM分割一切

2024-11-25 08:46   重庆  

点击下方卡片,关注“机器视觉与AI深度学习

视觉/图像重干货,第一时间送达!

    此项目名为SPEED-SAM-C++-TENSORRT是 Segment Anything Model (SAM) 的高性能实现,使用 NVIDIA 的 TensorRT 进行高效推理,并使用 CUDA 优化 GPU 利用率。下面详细介绍了该实现的工作原理、如何编译它以及关键组件。
https://github.com/hamdiboukamcha/SPEED-SAM-C-TENSORRT
项目结构和概述
    项目的目录结构如下:
    该项目专为快速图像分割任务而设计,可以根据选定的点或边界框对图像进行分割。它使用 TensorRT 从 ONNX 模型构建优化的推理引擎,从而可以在 NVIDIA GPU 上进行高效的深度学习推理。
关键组件说明
    构建 TensorRT 引擎:
    该EngineTRT::build()方法解析 ONNX 模型并构建 TensorRT 引擎。如果需要动态形状支持(针对不同的输入大小),则配置优化配置文件。
    该EngineTRT::saveEngine()功能允许将序列化的引擎保存到文件中,以方便在未来的会话中快速加载。
    图像分割过程:
    该类SpeedSam负责协调分割过程。首先,使用预先训练的编码器模型对图像进行编码。接下来,解码器模型根据输入点或边界框生成掩码。
    提供了两种主要的分割方法:
    基于点的分割(segmentWithPoint):用户单击图像来指定要分割的点。
    边界框分割(segmentBbox):用户绘制一个边界框来定义分割区域。
    内存优化:
    该实现使用 CUDA 流来重叠数据传输和计算,从而减少延迟。
    尽可能采用 FP16 精度来加速推理,而不会显著牺牲准确性。
编译和设置
    先决条件:
    CUDA:NVIDIA 的并行计算平台。
    TensorRT:一个用于高性能深度学习推理的库。
    OpenCV:用于图像处理。
    C++17:编译所需。
    编译步骤:
    克隆存储库并导航到项目目录:
git clone https://github.com/hamdiboukamcha/SPEED-SAM-C-TENSORRT.git cd SPEED-SAM-CPP-TENSORRT
    创建构建目录并使用 CMake 进行编译:
mkdir build && cd buildcmake ..make -j$(nproc)
    注意:CMakeLists.txt如有必要,请使用 TensorRT 和 OpenCV 的正确路径进行更新。

运行应用程序

    基于点的分割:
    程序显示图像并等待用户选择一个点。一旦选择了点,模型就会根据指定的位置分割图像并叠加遮罩
    边界框分割:
    用户可以在所需区域周围绘制一个边界框。然后模型会在定义的区域内分割图像并显示结果。
    输出:
    分割后的图像保存到指定的输出路径,并记录推理时间等性能指标。
性能和优化

    • 推理速度:图像编码器和掩码解码器实现了快速的推理时间,整个管道在大约 12 毫秒内完成。
    • 内存管理:有效利用 GPU 内存和 CUDA 流可最大限度地减少延迟并最大限度地提高吞吐量。
    • 精度设置:使用 FP16 精度的选项允许在速度和准确性之间进行权衡。
结 论
    SPEED -SAM-C++-TENSORRT项目展示了使用 TensorRT 和 CUDA 对 Segment Anything 模型进行优化实现。通过利用 NVIDIA 强大的库,该项目实现了实时分割性能,使其适用于需要快速准确图像分析的应用程序。灵活的代码结构和全面的日志记录也使其成为在 GPU 上进行深度学习推理的开发人员的宝贵资源。

—THE END—

觉得有用,麻烦给个赞和在看 

机器视觉与AI深度学习
专注于机器视觉、AI、深度学习等技术最新资讯、实战内容及应用案例的分享,交流!
 最新文章