部署到 DeepStream 以用于 YOLOv4-tiny
您训练的深度学习和计算机视觉模型可以部署在边缘设备上,例如 Jetson Xavier 或 Jetson Nano、独立 GPU 或 NVIDIA GPU 云端。TAO 旨在与 DeepStream SDK 集成,因此使用 TAO 训练的模型可以与 DeepStream SDK 开箱即用。
DeepStream SDK 是一种流分析工具包,可加速构建基于 AI 的视频分析应用程序。本节将介绍如何将您训练的模型部署到 DeepStream SDK。
要将 TAO 训练的模型部署到 DeepStream,我们有两种选择
选项 1:将
.etlt
模型直接集成到 DeepStream 应用程序中。模型文件由导出生成。选项 2:使用 TAO Deploy 生成设备特定的优化 TensorRT 引擎。生成的 TensorRT 引擎文件也可以被 DeepStream 摄取。
选项 3(x86 设备已弃用): 使用 TAO Converter 生成设备特定的优化 TensorRT 引擎。
特定于机器的优化是在引擎创建过程中完成的,因此应为每个环境和硬件配置生成不同的引擎。如果推理环境的 TensorRT 或 CUDA 库已更新(包括次要版本更新),或者如果生成了新模型,则需要生成新引擎。不支持运行使用不同版本的 TensorRT 和 CUDA 生成的引擎,并且会导致影响推理速度、准确性和稳定性的未知行为,或者可能完全无法运行。
选项 1 非常简单。.etlt
文件和校准缓存由 DeepStream 直接使用。DeepStream 将自动生成 TensorRT 引擎文件,然后运行推理。TensorRT 引擎生成可能需要一些时间,具体取决于模型的大小和硬件类型。
可以使用选项 2 提前完成引擎生成:TAO Deploy 用于将 .etlt
文件转换为 TensorRT;然后将此文件直接提供给 DeepStream。TAO Deploy 工作流程类似于 TAO Converter,后者从 TAO 4.0.x 版本开始已弃用于 x86 设备,但仍是部署到 Jetson 设备所必需的。
有关如何导出 TAO 模型的更多详细信息,请参阅导出模型部分。
从 5.0.0 版本开始,tao model converter
已弃用。此方法在未来的版本中可能不可用。本节仅适用于您仍在使用 tao model converter
进行遗留操作的情况。对于 tao deploy
,请跳转到集成 YOLOv4-tiny 模型。
YOLOv4-tiny 模型需要 TensorRT OSS 构建。这是必需的,因为这些模型所需的几个 TensorRT 插件仅在 TensorRT 开源仓库中可用,而不在通用 TensorRT 版本中。具体而言,对于 YOLOv4-tiny,我们需要 batchTilePlugin
和 batchedNMSPlugin
。
如果部署平台是带有 NVIDIA GPU 的 x86,请按照 x86 上的 TensorRT OSS 说明进行操作;如果您的部署在 NVIDIA Jetson 平台上,请按照 Jetson (ARM64) 上的 TensorRT OSS 说明进行操作。
x86 上的 TensorRT OSS
在 x86 上构建 TensorRT OSS
安装 Cmake (>=3.13)。
注意TensorRT OSS 需要 cmake >= v3.13,因此如果您的 cmake 版本低于 3.13c,请安装 cmake 3.13
sudo apt remove --purge --auto-remove cmake wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz tar xvf cmake-3.13.5.tar.gz cd cmake-3.13.5/ ./configure make -j$(nproc) sudo make install sudo ln -s /usr/local/bin/cmake /usr/bin/cmake
获取 GPU 架构。
GPU_ARCHS
值可以通过deviceQuery
CUDA 示例检索cd /usr/local/cuda/samples/1_Utilities/deviceQuery sudo make ./deviceQuery
如果您的系统中不存在
/usr/local/cuda/samples
,您可以从此 GitHub 仓库 下载deviceQuery.cpp
。编译并运行deviceQuery
。nvcc deviceQuery.cpp -o deviceQuery ./deviceQuery
此命令将输出类似这样的内容,这表明
GPU_ARCHS
基于 CUDA Capability 主版本/次版本为75
。Detected 2 CUDA Capable device(s) Device 0: "Tesla T4" CUDA Driver Version / Runtime Version 10.2 / 10.2 CUDA Capability Major/Minor version number: 7.5
构建 TensorRT OSS
git clone -b 21.08 https://github.com/nvidia/TensorRT cd TensorRT/ git submodule update --init --recursive export TRT_SOURCE=`pwd` cd $TRT_SOURCE mkdir -p build && cd build
注意确保步骤 2 中的
GPU_ARCHS
在 TensorRT OSSCMakeLists.txt
中。如果 GPU_ARCHS 不在 TensorRT OSSCMakeLists.txt
中,请添加-DGPU_ARCHS=<VER>
,如下所示,其中<VER>
表示步骤 2 中的GPU_ARCHS
。/usr/local/bin/cmake .. -DGPU_ARCHS=xy -DTRT_LIB_DIR=/usr/lib/x86_64-linux-gnu/ -DCMAKE_C_COMPILER=/usr/bin/gcc -DTRT_BIN_DIR=`pwd`/out make nvinfer_plugin -j$(nproc)
构建成功结束后,
libnvinfer_plugin.so*
将在\`pwd\`/out/.
下生成。替换原始的
libnvinfer_plugin.so*
sudo mv /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.8.x.y ${HOME}/libnvinfer_plugin.so.8.x.y.bak // backup original libnvinfer_plugin.so.x.y sudo cp $TRT_SOURCE/`pwd`/out/libnvinfer_plugin.so.8.m.n /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.8.x.y sudo ldconfig
Jetson (ARM64) 上的 TensorRT OSS
安装 Cmake (>=3.13)
注意TensorRT OSS 需要 cmake >= v3.13,而 Jetson/Ubuntu 18.04 上的默认 cmake 是 cmake 3.10.2。
使用以下命令升级 TensorRT OSS
sudo apt remove --purge --auto-remove cmake wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz tar xvf cmake-3.13.5.tar.gz cd cmake-3.13.5/ ./configure make -j$(nproc) sudo make install sudo ln -s /usr/local/bin/cmake /usr/bin/cmake
根据您的平台获取 GPU 架构。下表给出了不同 Jetson 平台的
GPU_ARCHS
。Jetson 平台 GPU_ARCHS Nano/Tx1 53 Tx2 62 AGX Xavier/Xavier NX 72 构建 TensorRT OSS
git clone -b 21.03 https://github.com/nvidia/TensorRT cd TensorRT/ git submodule update --init --recursive export TRT_SOURCE=`pwd` cd $TRT_SOURCE mkdir -p build && cd build
注意下面的
-DGPU_ARCHS=72
适用于 Xavier 或 NX,对于其他 Jetson 平台,请将72
更改为参考步骤 2 中的GPU_ARCHS
。/usr/local/bin/cmake .. -DGPU_ARCHS=72 -DTRT_LIB_DIR=/usr/lib/aarch64-linux-gnu/ -DCMAKE_C_COMPILER=/usr/bin/gcc -DTRT_BIN_DIR=`pwd`/out make nvinfer_plugin -j$(nproc)
构建成功结束后,
libnvinfer_plugin.so*
将在‘pwd’/out/.
下生成。将
"libnvinfer_plugin.so*"
替换为新生成的。sudo mv /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.x.y ${HOME}/libnvinfer_plugin.so.8.x.y.bak // backup original libnvinfer_plugin.so.x.y sudo cp `pwd`/out/libnvinfer_plugin.so.8.m.n /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.x.y sudo ldconfig
要将 TAO 训练的模型与 DeepStream 集成,您应该使用 TAO Deploy 生成设备特定的优化 TensorRT 引擎。然后,生成的 TensorRT 引擎文件可以被 DeepStream 摄取。如果仅提供 ONNX 模型,DeepStream 也可以为 YOLOv4-tiny 动态生成 TensorRT 引擎。
对于 YOLOv4-tiny,您将需要构建 TensorRT 开源插件和自定义边界框解析器。构建 TensorRT 开源插件的说明在上面的 TensorRT 开源软件 (OSS) 部分中提供。构建自定义边界框解析器的说明在下面的 YOLOv4-tiny 模型的前提条件部分中提供,所需代码可以在此 GitHub 仓库 中找到。
要将模型与 DeepStream 集成,您需要以下内容
下载并安装 DeepStream SDK。DeepStream 开发指南中提供了 DeepStream 的安装说明。
导出的
.onnx
模型文件和可选的 INT8 精度校准缓存。一个
labels.txt
文件,其中包含按网络生成输出的顺序排列的类标签。一个示例
config_infer_*.txt
文件,用于配置 DeepStream 中的 nvinfer 元素。nvinfer 元素处理与 DeepStream 中的 TensorRT 优化和引擎创建相关的所有内容。
DeepStream SDK 附带一个端到端参考应用程序,该应用程序是完全可配置的。用户可以配置输入源、推理模型和输出接收器。该应用程序需要一个主要对象检测模型,后跟一个可选的辅助分类模型。参考应用程序安装为 deepstream-app
。下图显示了参考应用程序的架构。

此应用程序通常使用 2 个或更多配置文件。在安装目录中,配置文件位于 samples/configs/deepstream-app
或 sample/configs/tlt_pretrained_models
中。主配置文件配置上述管道中的所有高级参数。这将设置输入源和分辨率、推理次数、跟踪器和输出接收器。其他支持配置文件用于每个单独的推理引擎。特定于推理的配置文件用于指定模型、推理分辨率、批大小、类数和其他自定义项。主配置文件将调用所有支持配置文件。以下是 samples/configs/deepstream-app
中的一些配置文件,供您参考。
source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
:主配置文件config_infer_primary.txt
:上述管道中主检测器的支持配置文件config_infer_secondary_*.txt
:上述管道中辅助分类器的支持配置文件
deepstream-app
仅适用于主配置文件。此文件很可能对于所有模型都保持不变,可以直接从 DeepStream SDK 中使用,几乎无需更改。用户只需修改或创建 config_infer_primary.txt
和 config_infer_secondary_*.txt
。
集成 YOLOv4-tiny 模型
要在 DeepStream 中运行 YOLOv4-tiny 模型,您需要一个标签文件和一个 DeepStream 配置文件。此外,您需要为 DeepStream 编译 TensorRT 7+ 开源软件和 YOLOv4-tiny 边界框解析器。
在 GitHub 仓库 上提供了使用来自 TAO 的训练 YOLOv4-tiny 模型运行推理的 DeepStream 示例和文档。
YOLOv4-tiny 模型的前提条件
YOLOv4-tiny 需要 batchTilePlugin、resizeNearestPlugin 和 batchedNMSPlugin。这些插件在 TensorRT 开源仓库中可用,但在 TensorRT 7.0 中不可用。有关构建 TensorRT OSS 的详细说明,请参见TensorRT 开源软件 (OSS)。
YOLOv4-tiny 需要 YOLOv3 自定义边界框解析器,这些解析器未内置在 DeepStream SDK 中。GitHub 仓库中提供了构建 YOLOv3 自定义边界框解析器的源代码。以下说明可用于构建边界框解析器
步骤 1:安装 git-lfs (git >= 1.8.2)
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
步骤 2:使用 SSH 或 HTTPS 下载源代码
git clone -b release/tlt3.0 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps
步骤 3:构建
// or Path for DS installation
export CUDA_VER=10.2 // CUDA version, e.g. 10.2
make
这将在目录 post_processor
中生成 libnvds_infercustomparser_tlt.so
。
标签文件是一个文本文件,其中包含 YOLOv4-tiny 模型经过训练要检测的类的名称。此处列出类的顺序必须与模型预测输出的顺序匹配。在训练期间,TAO YOLOv4-tiny 将指定所有小写类名称,并按字母顺序对其进行排序。例如,如果 dataset_config 是
dataset_config {
data_sources: {
label_directory_path: "/workspace/tao-experiments/data/training/label_2"
image_directory_path: "/workspace/tao-experiments/data/training/image_2"
}
target_class_mapping {
key: "car"
value: "car"
}
target_class_mapping {
key: "person"
value: "person"
}
target_class_mapping {
key: "bicycle"
value: "bicycle"
}
validation_data_sources: {
label_directory_path: "/workspace/tao-experiments/data/val/label"
image_directory_path: "/workspace/tao-experiments/data/val/image"
}
}
那么相应的 yolov4_tiny_labels.txt 文件将是
bicycle
car
person
检测模型通常用作主要推理引擎。它也可以用作辅助推理引擎。要在示例 deepstream-app
中运行此模型,您必须修改现有的 config_infer_primary.txt
文件以指向此模型。

将 TensorRT 引擎文件与 DeepStream 应用程序集成
步骤 1:使用 TAO Deploy 生成 TensorRT 引擎。
步骤 2:成功生成引擎文件后,修改以下参数以将此引擎与 DeepStream 一起使用。
model-engine-file=<PATH to generated TensorRT engine>
所有其他参数在两种方法之间是通用的。要使用自定义边界框解析器而不是 DeepStream 中的默认解析器,请在主推理配置文件的 [property] 部分中修改以下参数
parse-bbox-func-name=NvDsInferParseCustomBatchedNMSTLT
custom-lib-path=<PATH to libnvds_infercustomparser_tlt.so>
使用以下命令添加上面生成的标签文件
labelfile-path=<YOLOv4-tiny labels>
对于所有选项,请参见下面的配置文件。要了解所有参数的用途,请参考 DeepStream 开发指南。
这是一个示例配置文件,pgie_yolov4_tiny_config.txt
[property]
gpu-id=0
net-scale-factor=1.0
offsets=103.939;116.779;123.68
model-color-format=1
labelfile-path=<Path to yolov4_tiny_labels.txt>
model-engine-file=<PATH to generated TensorRT engine>
infer-dims=3;384;1248
maintain-aspect-ratio=1
uff-input-order=0
uff-input-blob-name=Input
batch-size=1
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=0
num-detected-classes=3
interval=0
gie-unique-id=1
is-classifier=0
#network-type=0
#no cluster
cluster-mode=3
output-blob-names=BatchedNMS
parse-bbox-func-name=NvDsInferParseCustomBatchedNMSTLT
custom-lib-path=<Path to libnvds_infercustomparser_tlt.so>
[class-attrs-all]
pre-cluster-threshold=0.3
roi-top-offset=0
roi-bottom-offset=0
detected-min-w=0
detected-min-h=0
detected-max-w=0
detected-max-h=0
ONNX 模型也可以直接集成到 DeepStream 中。这是一个示例配置文件,pgie_yolov4_tiny_config.txt
[property]
gpu-id=0
net-scale-factor=1.0
offsets=103.939;116.779;123.68
model-color-format=1
labelfile-path=<Path to yolov4_tiny_labels.txt>
onnx-file=<Path to ONNX model>
maintain-aspect-ratio=1
batch-size=1
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=0
num-detected-classes=3
interval=0
gie-unique-id=1
is-classifier=0
#network-type=0
#no cluster
cluster-mode=3
parse-bbox-func-name=NvDsInferParseCustomBatchedNMSTLT
custom-lib-path=<Path to libnvds_infercustomparser_tlt.so>
[class-attrs-all]
pre-cluster-threshold=0.3
roi-top-offset=0
roi-bottom-offset=0
detected-min-w=0
detected-min-h=0
detected-max-w=0
detected-max-h=0