DeepStream导入视觉模型Skill deepstream-import-vision-model

本技能用于将HuggingFace或NVIDIA NGC上的视觉目标检测模型自动导入NVIDIA DeepStream管道,包括ONNX下载、SafeTensors导出、TensorRT引擎构建、自定义bbox解析器生成、多流性能基准测试并输出PDF报告。支持端到端自动化,适用于视频AI加速与智能视频分析。关键词:DeepStream、视觉模型导入、TensorRT、ONNX、目标检测、NVIDIA、多流benchmark、模型转换、边缘视频分析、vison-model import

视频智能服务(VSS) 0 次安装 0 次浏览 更新于 9/6/2026
名称 deepstream-import-vision-model
描述 > 使用此技能将任何来自HuggingFace或NVIDIA NGC的视觉模型导入NVIDIA DeepStream管道,实现端到端自动化:ONNX下载、SafeTensors导出、TRT引擎构建、自定义nvinfer边界框解析器、多流基准测试和PDF报告。仅支持目标检测模型。
开源协议 CC-BY-4.0 AND Apache-2.0 metadata:
作者 NVIDIA CORPORATION
版本 1.2.2

DeepStream 导入视觉模型

当此技能激活时,在开始每个阶段之前,请先阅读相关的参考文档。不要依赖记忆 — 参考文档包含确切的脚本路径、bash变量约定、日志文件名约定和关键解析规则。

当前范围: 仅支持目标检测模型。在 config.json 中检测到分类、分割或其他架构时,快速失败。

管道概览

步骤 阶段 参考 功能
1–3 模型获取 references/model-acquire.md 浏览HF/NGC,检测格式,下载ONNX或导出SafeTensors
4–5 引擎构建 references/engine-build.md 构建动态TRT引擎,运行trtexec BS=1和BS=MAX_BS
6–7 DS管道 references/pipeline-run.md 自定义bbox解析器、nvinfer配置、单流+多流基准测试
8 报告 references/report-generation.md 5个图表、HTML、PDF基准测试报告

自动运行完整管道,无需在每个步骤暂停确认。

预检检查

运行前执行:

# 1. GPU和驱动
nvidia-smi

# 2. TensorRT版本匹配(builder和DS运行时之间必须匹配)
trtexec 2>&1 | head -3
dpkg -l | grep libnvinfer-bin

# 3. 共享Python虚拟环境 — 创建一次,可在所有模型间重用
mkdir -p build
VENV=build/.venv_optimum
if [ ! -x "$VENV/bin/python3" ]; then
  python3 -m venv "$VENV"
  "$VENV/bin/pip" install --upgrade pip -q
  "$VENV/bin/pip" install "optimum[exporters]>=1.20,<2.0" "torch<2.12" \
    transformers onnxruntime matplotlib numpy markdown -q
fi

# 4. 系统工具
which wkhtmltopdf || apt-get install -y wkhtmltopdf
which mediainfo    || apt-get install -y mediainfo
which deepstream-app  # KITTI转储(步骤6g)和基准测试性能测量(步骤7c)需要;随DeepStream SDK提供

# 5. 示例视频 — 当用户没有提供自定义DS_VIDEO时,才检查默认路径
if [ -z "$DS_VIDEO" ]; then
  [ -f /opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4 ] || \
    echo "WARNING: sample_720p.mp4 not found. Install DeepStream samples or set DS_VIDEO=/path/to/your.mp4"
fi

强制输出结构

一旦确定 MODEL_NAME(步骤1),就创建。绝不把文件平铺存放。

models/{model_name}/
  model/           <- ONNX文件
  parser/          <- .cpp, Makefile, .so
  config/          <- nvinfer配置、ds-app配置、labels.txt
  scripts/         <- 运行辅助脚本
  benchmarks/
    engines/       <- _dynamic_b{MAX_BS}.engine、timing.cache、构建日志
    b1/            <- trtexec BS=1日志
    b{MAX_BS}/     <- trtexec BS=MAX_BS日志
    ds/            <- DS基准测试日志
  reports/         <- benchmark_report.md、.html、.pdf、benchmark_data.json
    charts/        <- chart_*.png(5个图表)
  samples/         <- 输出.mp4或.ogv(theoraenc回退)、测试帧
    kitti_output/  <- KITTI检测.txt文件
mkdir -p models/$MODEL_NAME/{model,parser,config,scripts,benchmarks/engines,benchmarks/ds,reports/charts,samples/kitti_output}

关键规则

  1. 引擎命名 — 始终为 {model}_dynamic_b{MAX_BS}.engine。绝不能是裸的 model_dynamic.engine。
  2. batch_size == num_streams — 在DS运行中,batch-size和流数量始终相等。
  3. 日志文件名固定 — trtexec_b1.log、trtexec_b${MAX_BS}.log、ds_s${N}_run1.log、ds_s${N}_run2.log。无时间戳。报告生成读取精确路径。
  4. 解析器零初始化 — 始终 NvDsInferObjectDetectionInfo obj = {};。DeepStream OBB支持需要;裸 obj; 会让 rotation_angle 未初始化,导致倾斜的边界框。
  5. KITTI验证门 — 如果KITTI帧数为零或检测率<90%,不要进入步骤7。
  6. 共享虚拟环境 — build/.venv_optimum 可在所有模型间重用。绝不创建每模型虚拟环境。
  7. trtexec --noDataTransfers — 纯GPU计算与DeepStream的GPU到GPU数据流匹配。
  8. 报告HTML+PDF — 始终使用 skills/deepstream-import-vision-model/scripts/report/md-to-html-pdf.py。绝不编写自定义HTML生成器或直接调用 wkhtmltopdf。
  9. 仅目标检测 — 在构建任何内容之前,从 config.json 拒绝非检测架构。
  10. 编码器回退(强制) — 禁止 x264enc 和 openh264enc。在无NVENC的系统上,使用 theoraenc + oggmux(LGPL;随gst-plugins-base提供;输出为 .ogv)。如果 theoraenc/oggmux 不存在,跳过视频创建(DS_SINGLE_STREAM_MODE=skipped)。报告使用了哪种模式:nvv4l2h264enc / theoraenc-fallback / skipped。
  11. 视频源(强制) — 默认始终是 sample_720p.mp4 (1280×720)。绝不自主替换为 sample_1080p_h264.mp4 或任何其他文件。仅在用户明确提供路径时(通过 DS_VIDEO 环境变量或脚本参数)使用不同视频。

管道计时

包裹每个步骤:

STEP_START=$(date +%s.%N)
# ... 步骤命令 ...
STEP_END=$(date +%s.%N)
STEP_DURATION=$(echo "$STEP_END - $STEP_START" | bc)
echo "[Step N] completed in ${STEP_DURATION}s"

跟踪 PIPELINE_START(步骤1前)和 PIPELINE_END(步骤8后)。在基准测试报告中报告所有持续时间。

报告输出(强制 — 所有3种格式)

  1. benchmark_report.md — Markdown源(12个必需章节)
  2. benchmark_report.html — 样式化HTML(图表base64内联,无本地文件访问)
  3. benchmark_report_{model_name}.pdf — 通过 md-to-html-pdf.py 生成;通过计算HTML输出中的 data:image/png 出现次数来验证图表已嵌入:grep -o ‘data:image/png’ benchmark_report.html | wc -l 应等于5

使用共享虚拟环境运行图表和报告脚本:source build/.venv_optimum/bin/activate。

参考文档

重要:在开始每个阶段之前,请阅读相关参考。不要凭记忆生成代码。

文档 使用时机
references/model-acquire.md 步骤1–3:HF/NGC URL解析、格式检测、ONNX下载、SafeTensors导出、标签提取
references/engine-build.md 步骤4–5:trtexec引擎构建、基准测试、PEAK_GPU_STREAMS推导、迭代缩放
references/pipeline-run.md 步骤6–7:自定义bbox解析器、nvinfer配置、单流验证、KITTI转储、多流基准测试
references/report-generation.md 步骤8:benchmark_data.json、5个图表、12节Markdown报告、HTML+PDF

脚本

位于 scripts/ 中。

脚本 阶段 用途
model/hf-list-files.sh 1–3 列出HuggingFace仓库文件
model/hf-download-config.sh 1–3 从HF下载config.json
model/ngc-list-files.sh 1–3 列出NGC模型文件
model/ngc-download.sh 1–3 下载NGC模型存档
model/safetensors-to-onnx.sh 1–3 通过optimum-cli导出SafeTensors → ONNX
model/inspect-onnx.py 1–5 检查ONNX输入/输出形状
model/make-static-batch-onnx.py 4–5 将批处理维度烘焙到ONNX中
model/cleanup.sh 任意 删除暂存目录,保留共享虚拟环境
engine/benchmark-trtexec.sh 4–5 使用标准标志运行trtexec
deepstream/ds-single-stream.sh 6–7 单流视觉验证(首选NVENC;theoraenc+oggmux回退;两者都没有则跳过)
deepstream/ds-sweep.sh 6–7 两阶段批量大小扫描
deepstream/benchmark-ds.sh 6–7 固定流DS基准测试
deepstream/ds-kitti-dump.sh 6–7 通过deepstream-app进行KITTI检测转储
deepstream/ds-perf-run.sh 7 步骤7c两次运行基准测试 — 包装 deepstream-app,带 enable-perf-measurement=1,为报告解析器写入固定名称日志
deepstream/extract-frame.sh 6–7 从输出视频中提取示例帧(.mp4 NVENC路径或.ogv theoraenc回退)
report/generate-benchmark-charts.py 8 生成5个基准测试PNG图表
report/md-to-html-pdf.py 8 Markdown → 样式化HTML → PDF(规范基准测试报告路径)
report/md-to-pdf.sh 任意 Markdown → PDF(通过pandoc/pdflatex) — 仅用于设计文档和参考,不用于基准报告(那些用md-to-html-pdf.py
report/report-style.css 8 HTML报告的CSS
report/render-mermaid-for-pdf.py 8 Mermaid图 → PNG
report/mermaid-puppeteer.json 8 经过审查的Puppeteer配置(沙箱;非root)
report/mermaid-puppeteer-root.json 8 经过审查的Puppeteer配置(以root运行时使用)

快速错误参考

错误 修复
倾斜/对角线边界框 解析器结构未零初始化 — 使用 NvDsInferObjectDetectionInfo obj = {};
零KITTI文件 gie-kitti-output-dir 未被nvinfer读取 — 使用 ds-kitti-dump.sh(包装 deepstream-app)
每次DS运行引擎重建 model-engine-file 路径错误 — 检查相对于 config/ 目录的路径
setDimensions 负维度 为动态ONNX模型在nvinfer配置中添加 infer-dims=3;H;W
–memPoolSize 工作空间0.03 MiB 使用 M 后缀而不是 MiB — 例如 --memPoolSize=workspace:32768M
ForeignNode构建失败(DETR) 使用dynamo导出路径或运行 onnxsim — 见references/engine-build.md
零检测 错误的 net-scale-factor — 检查references/pipeline-run.md中的模型族表
No module named ‘pyservicemaker’ 安装到虚拟环境:pip install /opt/nvidia/deepstream/…/pyservicemaker*.whl

<!-- 签名刷新标记。 -->