Orin 上 DeepStream 二次推理

发布时间:2026/9/2 11:01:28
Orin 上 DeepStream 二次推理 Orin 上 DeepStream 二次推理文章目录Orin 上 DeepStream 二次推理1. 结论先行2. 贯穿示例四路门店 行人属性3. 主检测与二次推理的分工4. 二次推理在链路中的位置5. 什么时候该上二次推理6. 为二次网络准备 engine7. deepstream-app 配置要点8. batch-size 与路数怎么对齐9. 在 probe 里读二次结果10. 资源不够时的调整顺序11. 多个 secondary-gie12. 常见误区与排查13. 与后续链路的衔接14. 术语对照15. 上线前检查清单摘要多路检测和跟踪跑通后业务常要在主检测框上再跑一层工服颜色、是否戴帽、车牌字符、包裹属性等。DeepStream 里这一层叫secondary GIE二次推理配置块常写作[secondary-gie0]。本文用「四路门店监控 行人二次属性」贯穿示例写清二次推理挂在哪、怎么只对指定类别裁剪推理、batch-size与 engine 怎么对齐、以及和 DLA 分流的关系。适合已跑通 Orin 上用 DeepStream 跑多路检测 与系列《Orin 上 DeepStream 跟踪与事件输出》的人。插件名与字段随 JetPack / DeepStream 版本可能略有差异以板上 sample 为准。图1. 主检测、跟踪与二次推理链路1. 结论先行阶段建议做法不建议做法主检测还不稳先稳住 pgie、路数与 batch一上来叠二次网络只要框不要属性不要开 secondary-gie全类别每帧二次推理只要「人」做属性用operate-on-class-ids过滤车、包也送进分类网辅模型是规整 CNN评估 DLA 挂 secondary把 YOLO 主检测硬塞 DLA多路已经掉帧先减路数或加大interval同时开 tracker 二次 推流主检测回答「框在哪」二次推理回答「框里更细的属性是什么」。两层 engine、两层 batch 约束都要单独验收不能共用主检测的 TensorRT 文件。2. 贯穿示例四路门店 行人属性设定如下Orin NX 16GB4 路 720p RTSP主检测 YOLO人 / 车 / 包已开tracker事件层只要「人」进入收银区业务新增行人二次网络输出uniform/no_uniform/helmet等属性写入事件 JSON封闭小壳工作功耗档下不能把 GPU 长期打满在这个设定里二次推理只应对class_id0人的框裁剪后推理车和包不进入 secondary-gie。属性结果挂在NvDsObjectMeta的classifier meta分类元数据存放二次网络输出的标签与置信度上由 probe 合并进事件。验收时建议按下面顺序走不要跳步只开 pgie 4 路确认 FPS 与显存占用达标。加 tracker确认track_id连续、事件去重逻辑仍成立。只开 secondary-gie暂时关掉 analytics 与 Agent看 OSD 或日志里是否出现属性标签。把 probe 挪到 sgie 之后事件 JSON 里带上attributes字段。再开 analytics / Agent / GPIO每次只加一层方便定位掉帧来源。3. 主检测与二次推理的分工维度主检测 pgie二次推理 sgie输入整帧或 streammux 合批后的帧主检测框裁剪出的 ROI典型模型YOLO、SSD 等检测网属性分类、车牌字符、细粒度 CNN输出挂在obj_meta的类别与框classifier_meta链表batch 含义视频路数单帧内目标 crop 数engine 文件独立一份独立一份不能复用 pgie很多人第一次加二次推理时会把两份模型合成一个「大检测网」再导出 engine。这样做的问题是改属性模型就要重训整网路数一多显存也吃不消。DeepStream 的 secondary-gie 机制本质是把检测与属性解耦各自维护 engine、各自调 batch。4. 二次推理在链路中的位置在 pgie主检测之后、OSD 之前插入secondary-gie若已开 tracker通常顺序为streammux → pgie → tracker → secondary-gie0 →可选 nvdsanalytics→ OSD → sink组件作用pgie主检测输出框、类别、置信度tracker稳定object_id便于事件与属性按 track 去重secondary-gie对每个或过滤后的目标框裁剪 ROI跑第二份 engineprobe读取主类 二次属性写事件队列tracker 与 sgie 的顺序行业常见写法是pgie → tracker → sgie。tracker 先稳定框与track_id二次网络跟在后面做属性这样属性可以按 track 做冷却与去重。若你的辅模型对框抖动极敏感也可以评估pgie → sgie → tracker但要实测 ID 跳变对业务的影响。analytics 放哪若规则是「人进收银区且未穿工服才告警」通常sgie在nvdsanalytics之前让 analytics 或 probe 同时读到区域状态与属性。具体顺序以你板上deepstream-app的 sample 为准改顺序后务必重跑一轮事件回放。官方说明见 Gst-nvinfer 中 Primary / Secondary 推理模式。图2. 只对指定类别做二次推理5. 什么时候该上二次推理业务需求是否适合 secondary-gie工服 / 帽檐 / 口罩等属性适合辅模型多为小 CNN车牌字符规整检测识别链适合常拆成检测后的 crop 分类主检测类别已经够用不需要二次层要用大参数 VLM 看全图不适合塞在 sgie应独立进程每帧全图二次推理浪费算力应先过滤类别与 ROIOrin Nano没有 DLA深度学习加速器Orin 上专用于卸载规整卷积网络的固定功能单元二次网络只能和主检测一起挤 GPU路数要更保守。NX / AGX 可把规整辅模型放到 DLA见 Orin 上 DLA 与 GPU 的分工与使用。各板型粗估同一 720p、YOLO 主检 小属性网仅供参考以板上压测为准板型4 路 tracker 1 个 sgie备注Orin Nano 8GB紧宜 23 路或加interval无 DLAGPU 独扛Orin NX 16GB较宽裕可试 DLA0 挂 sgie2 颗 DLAAGX Orin余量最大可叠 2 个 sgie多模型并发6. 为二次网络准备 engine二次 engine必须在目标板上用 TensorRT 生成规则和主检测相同换 SKU、换 JetPack 大版本都要重建。# 示例属性分类 ONNX → FP16 engineGPUtrtexec\--onnx/home/ubuntu/models/person_attr.onnx\--saveEngine/home/ubuntu/models/person_attr_fp16.engine\--fp16\--memPoolSizeworkspace:256M若走 DLANX / AGXtrtexec\--onnx/home/ubuntu/models/person_attr.onnx\--saveEngine/home/ubuntu/models/person_attr_dla0_fp16.engine\--fp16\--useDLACore0\--allowGPUFallback\--memPoolSizeworkspace:256M说明输入尺寸与训练时 crop 一致例如 128×256与主检测 640×640 无关。DLA 引擎要查构建日志里的fallback 比例大半层回 GPU 时收益有限。文件命名建议带sgie、dla0等后缀避免 DeepStream 配置指错 engine。建引擎时的batch 维必须与[secondary-gie0]里batch-size一致这是 secondary 启动失败的头号原因。离线先用单张 crop 图验模型再进 DeepStream# 从测试图裁一块人体 ROI用 trtexec 或自写脚本跑一遍trtexec--loadEngine/home/ubuntu/models/person_attr_fp16.engine\--shapesinput:1x3x256x128\--dumpOutput输出向量长度应与labelfile-path行数一致不对就先修 ONNX不要急着改 pipeline。7. deepstream-app 配置要点在已有[primary-gie]、[tracker]基础上增加[secondary-gie0]路径与字段名以本机deepstream-appsample 为准[secondary-gie0] enable1 gpu-id0 gie-unique-id2 operate-on-gie-id1 operate-on-class-ids0 input-object-min-width32 input-object-min-height32 batch-size16 model-engine-file/home/ubuntu/models/person_attr_fp16.engine labelfile-path/home/ubuntu/models/person_attr_labels.txt network-mode2 process-mode2 classifier-async-mode0 classifier-threshold0.51参数含义gie-unique-id本 secondary 的唯一 IDprobe 里用来区分operate-on-gie-id依赖哪一路 pgie 的输出对应 pgie 的gie-unique-idoperate-on-class-ids只对哪些主检测类别做二次推理上例只对「人」input-object-min-width/height太小的框不送分类减少噪声batch-size二次合批上限见下一节process-mode2分类器模式以当前 DeepStream 文档为准主检测里要事先对齐[primary-gie] enable1 gie-unique-id1 batch-size4 ...labels 文件每行一个属性类名顺序与模型输出一致。改类别名或顺序后要同步改 probe 里解析逻辑。deepstream-app主配置里还要声明 secondary 数量字段名因版本而异常见写法如下[application] enable-perf-measurement1 ... [num-sources] ... [primary-gie] enable1 ... [tracker] enable1 ... [secondary-gie0] enable1 ... # 若还有 secondary-gie1继续往下写若走 DLA在对应[secondary-gie0]段增加以 sample 为准enable-dla1 use-dla-core0注意use-dla-core0的 engine 必须用--useDLACore0构建core 号与 engine 文件必须一一对应。8. batch-size 与路数怎么对齐多路场景里主检测batch-size通常等于路数见多路检测一文。二次层的batch-size含义不同它是单帧内最多合批多少个目标框不是 RTSP 路数。维度主检测 pgie二次 sgiebatch 含义多少路视频进一次推理多少个人脸 / 人体 crop 进一次推理常见设值等于路数如 4按峰值目标数如 8、16、32engine 构建按 pgie batch 建按 sgiebatch-size建经验上先统计单路高峰时「人」框数量再定 sgiebatch-size。batch-size设太小会排队掉帧设太大浪费显存且 engine 变大。改 sgiebatch-size后必须重建secondary engine。举例4 路门店高峰时单路平均 3 个「人」框、峰值 6 个则全帧最多约 24 个 crop。batch-size16时高峰会拆成两批推理延迟略升但通常可接受若峰值经常超过 batch表现为属性更新变慢或日志里出现排队。此时优先加大 batch 并重建 engine而不是盲目加路数。压测时同时看业务 FPS 与tegrastats口径见 Orin 上同一模型 FPS 不同测量方法、功耗和前后处理拆解壳温与降频见 Orin 上功耗档与降频排查。图3. 路数 batch 与目标 crop batch 是两件事9. 在 probe 里读二次结果二次分类结果挂在对象的classifier meta链表上。probe 仍挂在 tracker或 sgie之后遍历NvDsObjectMeta# 示意读取二次属性并写入事件defsgie_probe(pad,info,u_data):batch_metapyds.gst_buffer_get_nvds_batch_meta(hash(info.get_buffer()))l_framebatch_meta.frame_meta_listwhilel_frame:frame_metapyds.NvDsFrameMeta.cast(l_frame.data)l_objframe_meta.obj_meta_listwhilel_obj:objpyds.NvDsObjectMeta.cast(l_obj.data)attrs[]l_classifierobj.classifier_meta_listwhilel_classifier:cmetapyds.NvDsClassifierMeta.cast(l_classifier.data)l_labelcmeta.label_info_listwhilel_label:labelpyds.NvDsLabelInfo.cast(l_label.data)attrs.append({name:label.result_label,score:label.result_prob,})l_labell_label.nextl_classifierl_classifier.nextifattrsandshould_emit(frame_meta,obj,attrs):event_queue.put(build_event(frame_meta,obj,attrs))l_objl_obj.nextl_framel_frame.nextreturnpyds.GST_PAD_PROBE_OK与系列《Orin 上 DeepStream 跟踪与事件输出》的事件 JSON 对齐时可增加字段attributes:[{name:uniform,score:0.91},{name:helmet,score:0.87}]probe 里仍遵守只写队列不调 GPIO、不调大模型。属性字段建议与主事件共用同一track_id这样 Agent 侧可以「同一 track 在冷却时间内不重复处理」。业务规则示例伪代码defshould_emit(frame_meta,obj,attrs):ifobj.class_id!0:returnFalseuniformnext((aforainattrsifa[name]uniform),None)ifnotuniformoruniform[score]0.6:returnFalsereturnin_roi(frame_meta,obj)andnotin_cooldown(obj.object_id)10. 资源不够时的调整顺序多路 跟踪 二次同时开时建议按下面顺序减压primary-gie的interval改为 1 或 2隔帧检测缩小operate-on-class-ids只对必要类别二次推理提高input-object-min-width/height过滤远小目标减小 sgiebatch-size或换更小的属性模型减少路数或降分辨率仍不够再评估升 SKU或DLA 分流NX / AGX不要第一步就关 tracker没有track_id带属性的告警很难去重。11. 多个 secondary-gie需要两套属性例如「工服」「工牌 OCR 小网」时可再加[secondary-gie1]注意点说明gie-unique-id每个 secondary 必须不同operate-on-gie-id可以都指向同一个 pgieDLANX 16GB / AGX 可尝试 sgie0→DLA0、sgie1→DLA1时延串行多个 sgie 会累加延迟要实测 P99第二颗 DLA 与 engine 绑定关系见 DLA 分工一文同一 core 建 engine、配置里却写另一个 core是常见启动失败原因。12. 常见误区与排查图4. 二次推理排查顺序现象多见原因处理启动报 engine 错误sgie batch 与建引擎时不一致按配置 batch 重建 engine没有任何二次结果operate-on-class-ids与主类 ID 对不上对照 labels 与 pgie 类别表只有 stream-0 有属性只配了单路或 gie-id 引用错检查每路 meta 与 unique-id一开 sgie 就掉帧高峰 crop 数超过 batch 或 GPU 已满减路数、加 interval、缩小 batch属性全错二次 labels 顺序与模型不一致用单张 crop 图离线验证DLA 开了更慢fallback 过多看trtexec层日志或回 GPU事件里没属性字段probe 在 sgie 之前把 probe 挂到 sgie 之后属性分数一直为 0classifier-threshold过高先降到 0.3 做联调再拉回生产值二次结果闪烁主框抖动 无 track 冷却开 tracker 或对属性做滑动平均排查时一次只改一个变量先关 sgie 确认主链稳再只开 sgie 不对 analytics最后才叠事件与 Agent。建议把每步的 FPS、GPU 占用、事件条数记进表格方便和 Orin 上用 DeepStream 跑多路检测 里的压测口径对齐。13. 与后续链路的衔接下一步说明事件 属性进 Agent见 Orin 上边缘 Agent 落地属性触发 GPIO见 Orin 上检测事件接 GPIO 与继电器INT8 二次模型见系列《Orin 上 INT8 与量化部署》量产固化见 Orin 上开机自启跑检测docker容器含完整脚本总览见 NVIDIA Jetson Orin 完全使用手册14. 术语对照术语含义pgiePrimary GIE主检测推理插件sgie / secondary-gieSecondary GIE对主检测框做二次推理operate-on-class-ids只对指定主检测类别做二次推理classifier meta二次分类结果附在对象 meta 上的链表process-modenvinfer 工作模式检测 / 分类等gie-unique-id推理组件在 pipeline 内的唯一编号ROIRegion of Interest感兴趣区域此处指主检测框裁剪出的小图TensorRT engine在目标板上编译好的推理引擎文件batch 与精度写死在构建参数里interval主检测隔帧推理间隔设为 1 表示隔一帧检一次可腾出 GPU 给 sgie15. 上线前检查清单检查项通过标准主检测 4 路 FPS与加 sgie 前相比掉幅在可接受范围例如不超过 15%secondary engine batch与[secondary-gie0]的batch-size一致operate-on-class-ids与 pgie labels 里「人」的 ID 一致probe 挂载位置在 sgie 之后事件 JSON 含attributesDLA engine若启用use-dla-core与trtexec --useDLACore一致草稿箱标识保存后见GEO检测与高质量Orin 上 DeepStream 二次推理核心是把辅模型从主检测里拆出来用operate-on-class-ids控制算力用独立的 engine 与 batch 验收。主链多路 跟踪稳了之后再加 sgie属性结果通过 classifier meta 进事件层后面才能稳妥接 Agent 与 GPIO。上线前请在本机跑通「关 sgie / 只开 sgie / 全链路」三档对照并记录 FPS 与显存具体字段与 sample 路径以当前 JetPack 自带的deepstream-app配置为准。