ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO-World 与 MMYOLO 模型的 DeepStream SDK 部署实战:基于自定义 Parser 的 TensorRT 推理指南

YOLO-World 与 MMYOLO 模型的 DeepStream SDK 部署实战:基于自定义 Parser 的 TensorRT 推理指南 人工智能计算机视觉深度学习【免费下载链接】YOLO-World[CVPR 2024] Real-Time Open-Vocabulary Object Detection项目地址https://gitcode.com/gh_mirrors/yo/YOLO-World点击查看免费下载导读本文以 deploy/easydeploy/deepstream/README_zh-CN.md 为核心系统讲解如何在 NVIDIA DeepStream SDK 中加载由 EasyDeploy 导出的 TensorRT Engine并通过改写NvDsInferParseCustomMMYOLO自定义 parser 完成 MMYOLO含 YOLO-World 系列模型的端到端推理。读完本文你将掌握 DeepStream 环境搭建、Engine 转换、插件编译、应用配置的完整链路并理解 parser 如何解码 MMYOLO 的四路输出张量。背景为什么需要自定义 ParserDeepStream SDK 是 NVIDIA 提供的流媒体分析框架其核心推理单元GIE基于 TensorRT 构建。默认情况下DeepStream 内置的 bounding box parser 只认识 YOLO 系如 DarkNet 输出格式或检测类网络的通用输出约定而 MMYOLOMMDetection 3.x 的 YOLO 分支YOLO-World 即基于该体系构建通过 EasyDeploy 端到端导出的 ONNX/TensorRT 模型输出的是num_dets / boxes / scores / labels四路独立张量见 model_convert.md 中的输出约定与 DeepStream 内置 parser 期望的格式并不匹配。因此本项目deploy/easydeploy/deepstream提供了一个适配层在 C 侧实现NvDsInferParseCustomMMYOLO解析函数编译为共享库后由 DeepStream 通过parse-bbox-func-name与custom-lib-path两个配置项动态加载从而把 MMYOLO 的输出张量解码为 DeepStream 标准的NvDsInferParseObjectInfo检测框结构接入 OSDOn-Screen Display显示与后续分析管线。预先准备三步搭建推理环境1. 安装 NVIDIA 驱动与 CUDA首先根据当前的显卡型号和目标使用设备桌面 GPU 或 NVIDIA AIoT 嵌入式设备的驱动完成显卡驱动和 CUDA 的安装。注意驱动与 CUDA 版本需相互匹配并满足 TensorRT 与 DeepStream 的版本要求。2. 安装 DeepStream SDKDeepStream SDK 的稳定版本已更新至v6.2官方推荐使用该版本。安装完成后默认根目录位于/opt/nvidia/deepstream/deepstream其下包含samples示例视频流、lib运行时库与sources/includesC 头文件这些路径正是后续 CMake 编译脚本的依赖来源。3. 将 MMYOLO 模型转换为 TensorRT EngineDeepStream 底层依赖多个 NVIDIA 库TensorRT、GStreamer 插件等因此必须先将训练好的 MMYOLO 模型转换为 TensorRT engine 文件转换方案推荐使用 EasyDeploy 中的 TensorRT 部署流程具体步骤参考 模型 ONNX 转换文档。转换链路分为两步第一步导出端到端 ONNX。使用 export_onnx.py 将模型导出为包含后处理的端到端 ONNX关键参数如下节选自 model_convert.mdconfig构建模型使用的配置文件如 RTMDet 或 YOLO-World 的检测配置checkpoint训练得到的权重文件如.pth--work-dir转换后模型的保存路径--img-size转换时输入尺寸如640 640--batch-size转换后模型的输入 batch size--device转换设备默认为cuda:0--simplify是否用 onnx-simplifier 简化模型默认关闭--opset导出 ONNX 的 opset默认为11--backend目标后端onnxruntime/tensorrt8/tensorrt7默认为onnxruntime--pre-topk后处理筛选候选框个数阈值默认1000--keep-topkNMS 输出候选框个数阈值默认100--iou-thresholdNMS 的 IoU 阈值默认0.65--score-thresholdNMS 得分阈值默认0.25。端到端导出的 ONNX 输入名为images尺寸 640×640输出为四路张量num_dets尺寸 1×1检测目标数量、boxes尺寸 1×100×4坐标格式x1y1x2y2、scores尺寸 1×100检测框分数、labels尺寸 1×100类别 id。推理时可以利用num_dets截断从 100 个检测结果中取前num_dets个作为最终结果——这正是 DeepStream 自定义 parser 要解码的数据形态。第二步ONNX 转 TensorRT Engine。利用 TensorRT 工具trtexec或 build_engine.py读取 ONNX 生成.engine文件。当前 EasyDeploy 支持 TensorRT8 / TensorRT7 / ONNXRuntime 后端的端到端转换仅支持静态 shape静态 batch、静态长宽模型的导出。转换完成后将 engine 文件放置在deploy/easydeploy/deepstream目录下对应配置中的model-engine-file../end2end.engine相对路径文件名建议与配置保持一致例如end2end.engine。提示若目标平台不支持 TensorRT / ONNXRuntime 的端到端部署也可使用--model-only只导出 Backbone Neck此时需要自行实现 decode NMS 后处理且性能通常低于 TensorRT 并行后处理方案。编译使用构建自定义 Parser 并运行推理当前deploy/easydeploy/deepstream目录下默认演示的是 MMYOLO 的RTMDet模型若想使用其他模型如 YOLOv5、YOLOv8或基于 MMYOLO 的 YOLO-World请参照configs/目录下的配置文件进行改写详见下文配置文件解析一节。将转换好的 TensorRT engine 放在当前目录后执行如下命令编译自定义 parser 并安装mkdir build cd build cmake .. make -j$(nproc) make install编译完成后即可启动 DeepStream 应用进行推理deepstream-app -c deepstream_app_config.txt其中-c指定 DeepStream 应用配置文件 deepstream_app_config.txt应用会按配置加载 GStreamer 管线、primary-gie推理单元以及自定义 parser 库最终通过 OSD 插件把检测框和标签叠加到视频流上。CMake 编译脚本解析CMakeLists.txt 将 parser 源码编译为共享库libnvdsparsebbox_mmyolo.so核心要点指定 CUDA 架构60/61/62/70/72/75/86与 CUDA 编译器/usr/local/cuda/bin/nvccC 标准要求 C14编译选项含-shared -fPIC生成共享库通过find_package(CUDA REQUIRED)定位 CUDATensorRT 头文件默认在/usr/include/x86_64-linux-gnu库目录在/usr/lib/x86_64-linux-gnuDeepStream 根路径默认为/opt/nvidia/deepstream/deepstream头文件取自${DEEPSTREAM}/sources/includes库取自${DEEPSTREAM}/lib最终链接nvinfer、nvinfer_plugin两个 TensorRT 库。如果你的 DeepStream 安装路径或 TensorRT 库位置不同可通过cmake缓存变量如-DDEEPSTREAM...、-DTensorRT_INCLUDE_DIRS...覆盖默认值。项目代码结构├── deepstream │ ├── configs # MMYOLO 模型对应的 DeepStream 配置 │ │ ├── config_infer_rtmdet.txt │ │ ├── config_infer_yolov5.txt │ │ └── config_infer_yolov8.txt │ ├── custom_mmyolo_bbox_parser # 适配 DeepStream formats 的 parser │ │ └── nvdsparsebbox_mmyolo.cpp │ ├── CMakeLists.txt │ ├── coco_labels.txt # coco labels │ ├── deepstream_app_config.txt # DeepStream app 配置 │ ├── README_zh-CN.md │ └── README.md配置文件解析应用配置与 GIE 推理配置1. 应用级配置 deepstream_app_config.txtdeepstream_app_config.txt 定义了整条推理管线各节含义如下配置节关键参数说明[application]enable-perf-measurement1、perf-measurement-interval-sec5开启性能统计每 5 秒输出一次 FPS/延迟[tiled-display]rows/columns1、width1280、height720单路视频平铺显示窗口尺寸[source0]type3URI 文件源、urifile:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4输入视频流默认使用 DeepStream 自带的 1080p 示例视频[sink0]type2渲染显示输出显示 sink[osd]border-width5、text-size15、fontSerif检测框与标签叠加显示On-Screen Display[streammux]batch-size1、width1920、height1080流复用器将输入统一缩放为 1920×1080 送入推理[primary-gie]config-fileconfigs/config_infer_rtmdet.txt主推理单元GIE的推理配置指向模型专属配置[tests]file-loop0是否循环播放输入文件如需更换输入源修改[source0]的uri指向本地视频文件或 RTSP 流即可如需更换模型修改[primary-gie]的config-file指向新的推理配置如configs/config_infer_yolov5.txt。2. GIE 推理配置 config_infer_rtmdet.txtconfigs/config_infer_rtmdet.txt 是 RTMDet 模型对应的 TensorRT 推理配置核心参数如下参数值RTMDet说明net-scale-factor0.01735207357279195输入像素归一化缩放系数1/255 * 640/32等由预处理推导等于255 × 输入缩放的倒数。RTMDet 使用 640 输入、RGB 顺序故与 YOLO 系配置不同offsets57.375;57.12;58.395各通道减去的均值对应 RTMDet 的mean[123.675, 116.28, 103.53]除以 2 后的近似值由模型归一化方式决定model-color-format1RTMDet输入颜色格式1表示 RGB0表示 BGRYOLOv5/YOLOv8 使用0model-engine-file../end2end.engineTensorRT engine 文件路径相对deepstream目录labelfile-path../coco_labels.txt类别标签文件路径batch-size1推理 batch sizenum-detected-classes80检测类别总数与 coco_labels.txt 的 80 行对应network-mode0网络精度模式0 为 FP32cluster-mode2聚类模式NMS 相关maintain-aspect-ratio1保持宽高比预处理parse-bbox-func-nameNvDsInferParseCustomMMYOLO指定自定义解析函数名必须与 parser 源码中的导出符号一致custom-lib-path../build/libnvdsparsebbox_mmyolo.so自定义 parser 共享库路径[class-attrs-all]下pre-cluster-threshold0.45聚类前得分阈值[class-attrs-all]下topk100每类保留的候选框数量上限3. 不同模型的配置差异对比 config_infer_yolov5.txt 与 config_infer_yolov8.txt 可见YOLO 系模型的net-scale-factor为0.0039215697906911373即1/255model-color-format为0BGR且不需要offsets参数而 RTMDet 由于归一化方式不同采用 RGB 顺序并配合offsets均值扣除。因此接入新模型时最需要核对的三处参数是归一化系数scale、通道均值offsets与颜色格式color-format它们必须与模型训练/导出时的预处理严格一致否则检测精度会显著下降。4. 类别标签文件coco_labels.txt 按行存放 80 个 COCO 类别名称person、bicycle、car、motorbike、aeroplane……到 toothbrush行号即类别 id与模型输出的labels张量对应。使用自定义数据集时需按训练时类别 id 顺序改写该文件并同步修改num-detected-classes。自定义 Parser 源码剖析解码 MMYOLO 输出nvdsparsebbox_mmyolo.cpp 是整个部署方案的关键它实现 DeepStream 约定的 C 链接解析函数接口。其工作机制可分三层理解1. 入口函数与参数校验extern C bool NvDsInferParseCustomMMYOLO( std::vectorNvDsInferLayerInfo const outputLayersInfo, NvDsInferNetworkInfo const networkInfo, NvDsInferParseDetectionParams const detectionParams, std::vectorNvDsInferParseObjectInfo objectList);函数以extern C声明防止 C name-mangling保证符号名与配置parse-bbox-func-nameNvDsInferParseCustomMMYOLO精确匹配入口首先校验outputLayersInfo非空且大小为 4即端到端模型必须恰好有num_dets / boxes / scores / labels四路输出否则打印Could not find output layer in bbox parsing并返回false得分阈值取自detectionParams.perClassThreshold[0]对应配置中[class-attrs-all]的pre-cluster-threshold0.45对四路输出做了维度断言num_dets为 2 维、boxes为 3 维、scores与labels均为 2 维避免张量布局不符合预期时静默出错。2. 核心解码函数 decodeMMYoloTensorstatic std::vectorNvDsInferParseObjectInfo decodeMMYoloTensor( const int* num_dets, const float* bboxes, const float* scores, const int* labels, const float conf_thres, const unsigned int img_w, const unsigned int img_h);解码逻辑对应 model_convert.md 中端到端模型的输出约定以num_dets[0]为有效目标数遍历前nums个检测结果跳过得分低于conf_thres的框读取boxes中x1y1x2y2格式的坐标并通过clamp函数将坐标裁剪到[0, img_w] × [0, img_h]图像范围内防止越界框导致显示异常将坐标转换为NvDsInferParseObjectInfo结构leftx1、topy1、widthx2-x1、heighty2-y1同时填充detectionConfidence得分与classId标签 id将结果写入objectList并返回true。3. 编译期原型校验文件末尾的宏CHECK_CUSTOM_PARSE_FUNC_PROTOTYPE(NvDsInferParseCustomMMYOLO)会在编译期检查函数签名是否符合 DeepStream 自定义 parser 的接口约定签名不匹配时直接编译失败从源头杜绝运行时符号不匹配问题。验证与调试建议Engine 路径运行前确认end2end.engine位于deploy/easydeploy/deepstream目录下且配置中的model-engine-file、custom-lib-path相对路径与实际布局一致输出张量数量若换用非端到端导出--model-only的模型parser 会因输出层数量不是 4 而报错退出此时应改用端到端导出方式预处理一致性检测精度异常时优先核对net-scale-factor、offsets、model-color-format三参数与模型导出配置是否一致性能观测[application]节开启的enable-perf-measurement会在终端每 5 秒输出 FPS 等性能指标可直接用于评估 DeepStream 管线在目标设备上的实时性输入源默认输入为 DeepStream 自带的sample_1080p_h264.mp4示例视频如需验证真实业务流将[source0]的uri改为本地文件或 RTSP 地址即可无需重新编译。总结本文完整梳理了在 DeepStream SDK 中推理 MMYOLO / YOLO-World 模型的部署链路环境准备驱动 CUDA DeepStream v6.2、通过 EasyDeploy 导出端到端 ONNX 并转换为 TensorRT Engine、编译libnvdsparsebbox_mmyolo.so自定义 parser、以及通过deepstream_app_config.txt与config_infer_*.txt双配置文件完成管线组装。核心在于理解端到端模型四路输出张量num_dets / boxes / scores / labels与 DeepStreamNvDsInferParseObjectInfo结构之间的映射以及预处理参数scale / offsets / color-format必须与模型导出保持一致。基于这套方案开发者可以快速将任意基于 MMYOLO 体系训练的检测模型含 YOLO-World 系列迁移到 DeepStream 边缘推理平台实现低延迟的视频流实时目标检测。赞分享人工智能计算机视觉深度学习【免费下载链接】YOLO-World[CVPR 2024] Real-Time Open-Vocabulary Object Detection项目地址https://gitcode.com/gh_mirrors/yo/YOLO-World点击查看免费下载相关推荐HVE Core安全架构师指南Security Planner到RAI Planner的完整路径HVE Core安全架构师指南Security Planner到RAI Planner的完整路径 HVE Core 是 GitHub Copilot 生态中一人工智能计算机视觉深度学习DeepStream-Yolo高效部署YOLO模型的完整指南DeepStream Yolo高效部署YOLO模型的完整指南 DeepStream Yolo是一个强大的开源项目为开发者提供了在NVIDIA DeepStr计算机视觉深度学习YOLO-World安装指南基于mmyolo与mmdetection的环境配置全流程YOLO World安装指南基于mmyolo与mmdetection的环境配置全流程 引言计算机视觉开发者的环境配置痛点 你是否曾因深度学习框架版本冲突而浪人工智能计算机视觉深度学习上一篇Boogu-Image-0.1-Turbo-fp8常见问题解答从安装到使用的10个关键问题下一篇fastest-levenshtein揭秘JavaScript中最快的字符串相似度计算库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表