Deepstream里如何调用多个模型

本文详细介绍了Deepstream如何实现多个模型的并行推理,包括主从模型配置、同步控制及优化。通过分析配置文件、模型调用、内存管理以及同步代码,揭示了在JetsonNano上并行推理可能遇到的性能问题和解决方案,强调了在特定情况下串行调用模型可能优于并行调用。同时,讨论了如何处理模型间协作、视频流复制和跟踪效果的影响因素。

       Deepstream提供了nvinfer plugin供封装调用模型使用, Deepstream的sample代码deepstream app里实现调用多个模型时是针对一主多从的使用方案,也就是一个主模型(primary inference engine),一个或者多个次要从属模型(secondary inference engine),因为模型使用前都转换成了TensorRT的engine文件,所以一般叫engine。下面是典型的基于Deepstream的调用多个模型推理的app的结构:

各部分的plugin的功能的简要说明如下:

      Samples里的deepstream-app里使用了四个模型(对应创建了四个nvinfer plugin),一个主模型(由下图中的左侧的nvinfer plugin负责封装调用),三个次要模型(由下图中右侧的三个nvinfer plugin负责调用),主模型用来识别车,三个次要从属模型分别用来识别车的颜色、种类、厂商。

模型文件位于/opt/nvidia/deepstream/deepstream/samples/models/下,主模型和次要从属模型的分工完全是由配置文件来配置的,封装调用它们的nvinfer plugin是相同的,运行deepstream app时指定config文件为/opt/nvidia/deepstream/deepstream/samples/config/deepstream-app/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt

cd/opt/nvidia/deepstream/deepstream/samples/config/deepstream-app
deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt

即可将四个模型跑起来。

四个nvinfer plugin 和tracker plugin以及tee和4个queue element的结构组成如下:

 最左侧的是primary inference engine对应的plugin,挨着的是tracker plugin,再往右边是一个tee element用于视频流的复制分叉,和tee直连的是用于缓冲的4个queue element,上面三个queue element分别连对应的三个secondary inference engine

<think>我们正在处理一个关于在NVIDIA DeepStream中部署RetinaFace人脸检测模型的问题。根据提供的引用,RetinaFace是一个高效的人脸检测算法,在WiderFace数据集上表现优异,并且已经在insightface平台上开源。引用中提到了RetinaFace的网络结构,包括使用MobileNet0.25作为主干网络,结合FPN和SSH模块,以及三个头部(ClassHead, BoxHead, LandmarkHead)。此外,在第二个引用中提到了在Jetson AGX上使用TensorRT优化RetinaFace模型,实现了性能提升。 由于DeepStream是一个基于GStreamer的流媒体分析工具包,专门用于构建高性能视频分析应用,它支持TensorRT加速的模型推理。因此,在DeepStream中部署RetinaFace模型需要将RetinaFace模型转换为DeepStream可用的格式(通常是ONNX或直接转换为TensorRT引擎),并编写相应的配置文件。 以下是部署步骤的概述: 1. **模型转换**:将RetinaFace模型转换为ONNX格式,然后使用TensorRT生成优化后的引擎文件。由于RetinaFace原模型是基于MXNet的,我们可以使用官方提供的转换工具或自行编写转换脚本。 2. **创建DeepStream插件**:DeepStream使用自定义的GStreamer插件来处理推理。我们可以利用现有的nvinfer插件(即Gst-nvinfer)来加载TensorRT引擎。需要配置nvinfer插件的参数,包括模型路径、输入输出张量的设置等。 3. **预处理和后处理**:RetinaFace模型需要特定的预处理(如图像归一化、缩放等)和后处理(包括解码边界框、关键点以及应用NMS)。这些可以在DeepStream中通过自定义解析函数(parse function)来实现。DeepStream允许用户编写自己的解析插件,或者使用nvinfer插件内置的功能(如果匹配)。 4. **集成到DeepStream应用中**:将配置好的推理插件集成到DeepStream管道中,并连接其他组件(如解码、预处理、显示等)。 5. **性能优化**:根据引用[2]中的案例,可以使用TensorRT的优化技术,如CBR(卷积-批归一化-ReLU)融合和动态分辨率支持,以提高推理速度。 具体步骤: ### 1. 模型转换 - 从insightface官方仓库获取RetinaFace模型(MXNet格式)。 - 将MXNet模型转换为ONNX格式。可以使用`mxnet-to-onnx`转换工具。 - 使用TensorRT的`trtexec`工具将ONNX模型转换为TensorRT引擎。根据目标平台(如Jetson AGX Xavier)选择合适精度(FP32/FP16/INT8)和优化参数。 ### 2. 配置DeepStream推理插件 - 在DeepStream应用的配置文件中(如`config_infer_primary.txt`),指定转换后的TensorRT引擎文件路径。 - 设置输入图像的格式和大小(RetinaFace通常使用640x640或可变输入大小)。 - 配置输出层的名称和数量,RetinaFace有多个输出(分类、边界框、关键点)。 ### 3. 实现后处理解析函数 - RetinaFace的输出需要解码,包括边界框解码(从默认框偏移量解码为实际坐标)、置信度过滤、关键点解码以及NMS。 - 在DeepStream中,我们可以通过编写自定义的解析函数(称为parse function)来实现。这个函数需要绑定到nvinfer插件上,在推理完成后被调用。 - 解析函数需要按照nvinfer插件的要求编写,通常使用C/C++编写,并编译成共享库。函数接口可参考DeepStream SDK中的示例(如`gst-nvinfer`的示例解析函数)。 ### 4. 构建DeepStream管道 - 使用GStreamer管道描述,将各个组件(源、解码器、转换、推理、渲染等)连接起来。 - 例如: ``` filesrc -> h264parse -> nvv4l2decoder -> nvstreammux -> nvinfer -> nvdsosd -> nveglglessink ``` - 其中,`nvinfer`插件加载我们配置的RetinaFace模型。 ### 5. 性能优化 - 参考引用[2],使用TensorRT的FP16或INT8量化可以提升速度。在转换引擎时指定精度。 - 利用动态批处理(如果支持)和动态分辨率(如果模型支持)来适应不同输入。 - 在Jetson平台上,使用DeepStream的硬件加速功能。 ### 注意事项: - 由于RetinaFace包含多个输出(分类、框、关键点),在配置nvinfer插件时需要正确指定所有输出层的名称。 - 后处理解析函数需要处理这些输出,并生成符合DeepStream要求的对象检测元数据(NvDsObjectMeta)。 ### 示例解析函数框架: ```c extern "C" bool NvDsInferParseRetinaFace (std::vector<NvDsInferLayerInfo> const &outputLayers, NvDsInferNetworkInfo const &networkInfo, NvDsInferParseDetectionParams const &detectionParams, std::vector<NvDsInferParseObjectInfo> &objectList) { // 1. 从outputLayers中获取三个头部的输出数据 // 2. 解码边界框和关键点(根据RetinaFace的解码规则) // 3. 应用置信度阈值过滤 // 4. 应用NMS(非极大值抑制) // 5. 将检测结果填充到objectList中(包括边界框和关键点) } ``` ### 总结 部署RetinaFace到DeepStream需要模型转换、配置推理插件、实现自定义解析函数以及构建管道。通过TensorRT优化,可以在NVIDIA设备上高效运行。 §§相关问题§§ 1. 如何将MXNet模型转换为ONNX格式? 2. 在DeepStream中如何编写自定义解析函数? 3. 如何优化RetinaFace模型在TensorRT上的推理速度? 4. 在Jetson设备上部署DeepStream应用有哪些注意事项?</think>### 在NVIDIA DeepStream中部署RetinaFace模型的步骤 #### 1. **模型转换与优化** - **MXNet转ONNX** 使用官方`insightface`工具将MXNet模型转换为ONNX格式: ```python from insightface.model_zoo import get_model model = get_model('retinaface_r50_v1') # 或mobilenet0.25版本 model.export('retinaface.onnx') # 导出ONNX ``` - **TensorRT优化** 通过TensorRT生成优化引擎: ```bash trtexec --onnx=retinaface.onnx --fp16 --workspace=2048 --saveEngine=retinaface.engine ``` 关键优化(参考引用[2]): - 启用FP16精度 - 使用CBR融合(卷积-批归一化-ReLU融合) - 支持动态分辨率输入(`--minShapes=input:1x3x640x640 --optShapes=input:1x3x1080x1920`) #### 2. **DeepStream配置** - **配置文件 (`config_infer_primary.txt`)** 核心参数: ```ini model-engine-file=retinaface.engine batch-size=4 net-scale-factor=0.007843 # 1/127.5 offsets=104;117;123 # BGR均值 output-blob-names=face_rpn_cls_prob_reshape_stride32;face_rpn_bbox_pred_stride32;... # 根据模型输出层命名 parse-bbox-func-name=NvDsInferParseRetinaFace # 自定义解析函数 ``` #### 3. **自定义后处理插件** 需实现以下功能(C/C++): - **边界框解码**:根据锚点框(anchor)还原坐标 $$ \text{decode\_bbox} = \text{anchor} + \text{pred\_offset} \times 0.1 $$ - **关键点解码**:5个人脸关键点坐标计算 - **NMS处理**:使用`nmsOpticalFlow`消除重叠框(IoU阈值0.4) ```cpp // 示例:后处理函数伪代码 extern "C" bool NvDsInferParseRetinaFace( std::vector<NvDsInferParseObjectInfo>& output, const float* cls_data, // 分类置信度 const float* bbox_data, // 边界框偏移 const float* landmark_data, // 关键点 const NvDsInferNetworkInfo& network_info) { // 1. 遍历所有锚点框 // 2. 应用置信度阈值(>0.8) // 3. 解码边界框和关键点 // 4. 执行NMS } ``` > 编译为`.so`文件并配置在`custom-lib-path`中[^1]。 #### 4. **管道集成** ```bash gst-launch-1.0 filesrc location=video.mp4 ! decodebin ! \ nvstreammux width=1920 height=1080 batch-size=4 ! \ nvinfer config-file-path=config_infer_primary.txt ! \ nvdsosd display-meta=1 ! \ nveglglessink ``` - **关键组件**: - `nvstreammux`:批处理输入流 - `nvinfer`:加载TensorRT引擎 - `nvdsosd`:绘制检测框和关键点 #### 5. **性能优化技巧** - **动态分辨率**:在TensorRT中配置多尺度输入(支持1080p/720p自动切换)[^2] - **Jetson功耗控制**: ```bash sudo jetson_clocks --fan # 启用主动散热 sudo nvpmodel -m 0 # 最大性能模式 ``` - **内存优化**:使用`deepstream-app --perf-measure`监控显存占用 ### 部署验证 1. **精度测试**:使用WiderFace验证集,确保AP值符合预期(参考引用[1]) 2. **实时性测试**:在Jetson AGX Xavier上,1080p视频应达到20+FPS[^2] 3. **资源监控**: ```bash tegrastats --interval 1000 # 查看GPU/CPU利用率 ``` ### 常见问题解决 - **后处理崩溃**:检查自定义插件的内存边界 - **低FPS**:启用TensorRT FP16或INT8量化 - **漏检人脸**:调整`nms-iou-threshold`(建议0.3~0.5) > 官方参考:NVIDIA DeepStream SDK文档中的`CustomParser`示例
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值