使用 Python pyservicemaker API 进行 NVIDIA DeepStream SDK 开发。在构建视频分析流水线、基于 GStreamer
DeepStream 开发技能是一项面向实际任务的技能,主要用于当此技能激活时, 在生成代码之前始终阅读相关参考文档;不要依赖记忆——参考文档包含了关于确切属性名称、正确 API 用法和常见陷阱的关键细节;
NVIDIA Driver :590+;CUDA :13.1;TensorRT :10.14.1.48;平台 :Ubu。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
当此技能激活时,在生成代码之前始终阅读相关参考文档。不要依赖记忆——参考文档包含了关于确切属性名称、正确 API 用法和常见陷阱的关键细节。
Source → Stream Muxer → Inference → [Tracker] → OSD → Renderer
[方括号] 中的组件是可选的——仅在用户明确请求时添加。
| 阶段 | 角色 | 关键元素 | 必需? |
|---|---|---|---|
| Source | 从文件、RTSP、摄像头输入 | nvurisrcbin(首选)、nvmultiurisrcbin、filesrc |
是 |
| Stream Muxer | 将多个流合并为批次用于推理 | nvstreammux |
是 |
| Inference | TensorRT 模型执行 | nvinfer、nvinferserver |
是 |
| Tracker | 跨帧的多目标跟踪 | nvtracker |
仅在请求时 |
| OSD | 绘制边界框、标签、叠加层 | nvosdbin |
是(用于可视化) |
| Renderer | 显示或保存输出 | nveglglessink、nv3dsink、filesink |
是 |
DeepStream 使用 NVIDIA 视频内存管理器(NVMM)实现零拷贝 GPU 缓冲区传输。Caps 字符串使用 memory:NVMM 表示 GPU 内存(例如 video/x-raw(memory:NVMM), format=NV12)。
仅添加请求的组件:不要添加用户未要求的流水线元素。
nvtracker):仅在用户明确请求跨帧跟踪或目标 ID 时添加nvdsanalytics):仅在用户请求越线检测、ROI 计数等时添加nvmsgbroker/nvmsgconv):仅在用户请求 Kafka/云消息传递时添加默认使用 nvurisrcbin 作为源:当用户提到"摄像头"、"流"、"视频"或提供文件路径时:
nvurisrcbin——它透明地处理 RTSP、HTTP 和本地文件(file://)filesrc + qtdemux + 解析器nvstreammux 上设置 live-source=1,在 sink 上设置 sync=0"file://" + os.path.abspath(path)元数据迭代:使用 .frame_items 和 .object_items(返回迭代器,而非列表)
len()——迭代以计数请求 Pad 语法:使用 "sink_%u" 模板,切勿使用字面量 pad 名称
pipeline.link(("decoder", "mux"), ("", "sink_%u")) # 正确
# pipeline.link(("decoder", "mux"), ("", "sink_0")) # 错误 - 会失败
Sink 的平台检测:
import platform sink_type = "nv3dsink" if platform.processor() == "aarch64" else "nveglglessink"
缓冲区克隆:始终为异步处理克隆缓冲区
tensor = buffer.extract(0).clone() # 关键
队列类型:
queue.Queue → 与 threading.Thread 一起使用multiprocessing.Queue → 与 multiprocessing.Process 一起使用nvinfer 配置格式:
property: 部分(而非 model:),key: value 冒号后有空格[property] 部分,key=value 使用等号propertynvmsgbroker 是 SINK:不能有下游元素——使用 tee 拆分流水线
所有 Sink 在 Tee 拆分或动态源时需要 async=0:对状态转换至关重要
# 使用 tee 拆分或动态源时,所有 SINK 必须设置 async=0
pipeline.add("nveglglessink", "sink", {
"sync": 0, "qos": 0,
"async": 0 # 关键 - 防止状态转换死锁
})
缺失时的症状:流水线停留在 PAUSED 状态,无视频显示。
内置 Probe 附件:measure_fps_probe 只能附加到处理元素(例如 nvinfer、nvosdbin),不能附加到 sink 元素。附加到 sink 会引发 RuntimeError: Probe failure。
动态 ONNX 模型需要 infer-dims:当 ONNX 模型具有动态输入形状时(例如,Ultralytics YOLO 使用 dynamic=True 导出,或具有动态 batch/height/width 轴),你必须在 nvinfer 配置中添加 infer-dims=C;H;W。没有它,TensorRT 会将动态维度视为 -1 并失败,报错 setDimensions: Error Code 3。常用值:
infer-dims=3;640;640infer-dims=3;416;416infer-dims=3;1280;1280Ultralytics YOLO 输出格式取决于模型代次——较新模型(v10+/v26+)输出后 NMS 结果;较旧模型(v8/v11)输出原始前 NMS 张量。自定义解析器和 cluster-mode 必须匹配实际输出:
| 模型代次 | 输出张量形状 | 字段 | cluster-mode |
|---|---|---|---|
| v8 / v11 | [batch, 84, 8400] |
[features(4+80), anchors] — 原始 cx/cy/w/h + 类别分数,无 NMS |
2(NMS) |
| v10 / v26+ | [batch, 300, 6] |
[max_det, (x1,y1,x2,y2,conf,cls)] — 已后 NMS,像素坐标 |
4(无) |
运行时如何识别:在自定义解析器中记录 inferDims.d[0] 和 inferDims.d[1]。
d={84, 8400} → 前 NMS(v8/v11 风格)d={300, 6} → 后 NMS(v10/v26+ 风格)不匹配的症状:如果 cluster-mode: 2 用于后 NMS 的 [N, 6] 输出,边界框会与实际目标偏移 45° 或 135°(DeepStream 的 NMS 错误地重新处理了已最终的坐标)。
如果看到倾斜或旋转的框,还需检查 references/nvinfer_config.md 中的 OBB / rotation_angle 说明:对于非 OBB 模型,使用 obj{} 值初始化 NvDsInferObjectDetectionInfo 并保持 rotation_angle = 0;普通的 NvDsInferObjectDetectionInfo obj; 会使字段保持未初始化状态。
虚拟环境必须包含 pyservicemaker:pyservicemaker 已系统范围安装,但从标准 Python 虚拟环境中不可访问。当任务需要 venv 时(例如,用于模型下载/转换的 pip 依赖),始终在 venv 内安装 pyservicemaker 和 pyyaml。生成的代码和 README 中的 venv 设置必须始终包含:
python3 -m venv venv source venv/bin/activate pip install /opt/nvidia/deepstream/deepstream/service-maker/python/pyservicemaker*.whl pyyaml pip install -r requirements.txt # 其他依赖
缺失时的症状:在 venv 内运行应用程序时出现 ModuleNotFoundError: No module named 'pyservicemaker'。
/opt/nvidia/deepstream/deepstream/samples/models//opt/nvidia/deepstream/deepstream/samples/models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so/opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/重要:始终阅读这些文档以获取完整细节。不要凭记忆生成代码。
| 文档 | 使用场景 |
|---|---|
| references/gstreamer_plugins.md | 查找插件属性,列出所有属性 |
| references/service_maker_api.md | 使用 Pipeline/Flow API、元数据访问、probe、EventMessageUserMetadata |
| references/use_cases_pipelines.md | 构建流水线:简单播放、多推理、级联 GIE |
| references/streaming_sources.md | 使用 nvurisrcbin 摄取本地文件、HTTP MP4、HLS、MPEG-DASH 或 RTSP 源 |
| references/kafka_messaging.md | Kafka/消息代理设置、nvmsgconv/nvmsgbroker 配置、msg2p-newapi |
| references/best_practices.md | 设计模式、常见陷阱、反模式 |
| references/buffer_apis.md | BufferProvider/Feeder(注入)、BufferRetriever/Receiver(提取) |
| references/media_extractor_advanced.md | MediaExtractor、MediaChunk、FrameSampler |
| references/utilities_config.md | PerfMonitor、EngineFileMonitor、SourceConfig、SensorInfo、SmartRecordConfig |
| references/nvinfer_config.md | nvinfer 配置文件格式,所有参数 |
| references/tracker_config.md | nvtracker 配置、NvDCF/IOU/DeepSORT/NvSORT |
| references/troubleshooting.md | 错误消息和解决方案 |
| references/rest_api_dynamic.md | REST API、动态源添加/移除、nvmultiurisrcbin |
| references/metamux_config.md | nvdsmetamux 配置、并行多模型推理、元数据合并、源 ID 过滤 |
| references/docker_containers.md | Docker 镜像、Dockerfile 示例、pyservicemaker 安装、容器运行命令 |
| references/nvds_msgapi_adapter.md | 构建自定义协议适配器:nvds_msgapi |
| 错误 | 解决方案 |
|---|---|
iterator has no len() |
迭代以计数,不要使用 len() |
pad template not found |
使用 "sink_%u" 而非 "sink_0" |
| 队列数据丢失 | 使用 multiprocessing.Queue 配合 Process |
| 配置解析失败 | 在 YAML 中使用 property: 而非 model: |
is-classifier 弃用警告 |
分类器使用 network-type: 1 替代 is-classifier: 1;检测器两者都省略 |
min-boxes 未知键警告 |
在 class-attrs-* 部分中使用 minBoxes(驼峰命名),而非 min-boxes |
| 辅助 GIE 不活动 | 设置 process-mode: 2,检查 operate-on-gie-id |
| Tee/动态源卡在 PAUSED | 在所有 sink 元素上设置 async: 0 |
| RTSP 无数据/重新连接 | 使用 ffplay 测试 URL,检查凭据 |
RuntimeError: Probe failure |
measure_fps_probe 不能附加到 sink 元素;改用 nvinfer 或 nvosdbin |
setDimensions 负维度 / 引擎构建失败 |
为动态 ONNX 模型添加 infer-dims=C;H;W(例如 infer-dims=3;640;640) |
venv 中 No module named 'pyservicemaker' |
在 venv 内运行 pip install /opt/nvidia/deepstream/deepstream/service-maker/python/pyservicemaker*.whl pyyaml |
AttributeError: object has no attribute 'obj_label' |
在 pyservicemaker 中使用 obj_meta.label 而非 obj_meta.obj_label(C API 名称与 Python 绑定不同) |
相关专题
热门下载
相关下载
精品课程
共0课时 | 0人学习
共17课时 | 4.3万人学习
最新文章