部署 MaskRCNN 到 DeepStream
您训练的深度学习和计算机视觉模型可以部署在边缘设备上,例如 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 模型的更多详细信息,请参阅导出模型部分。
MaskRCNN 需要 TensorRT OSS 构建中的 generateDetectionPlugin
、multilevelCropAndResizePlugin
、resizeNearestPlugin
和 multilevelProposeROI
插件。
如果部署平台是带有 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 major/minor 版本为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
对于 MaskRCNN,您需要构建 TensorRT 开源插件和自定义边界框解析器。说明在上面的 TensorRT 开源软件 (OSS) 部分中提供,所需代码可以在此 GitHub 仓库 中找到。
要将模型与 DeepStream 集成,您将需要以下内容
DeepStream SDK(从 DeepStream SDK 下载页面 下载)。DeepStream 的安装说明在 DeepStream 开发指南 中提供。
导出的
.onnx
模型文件和可选的 INT8 精度校准缓存。labels.txt
文件,其中包含类别的标签,标签顺序与网络生成输出的顺序一致。示例
config_infer_*.txt
文件,用于配置 DeepStream 中的 nvinfer 元素。nvinfer 元素处理与 DeepStream 中的 TensorRT 优化和引擎创建相关的所有内容。
TDeepStream SDK 附带一个端到端参考应用程序,该应用程序是完全可配置的。您可以配置输入源、推理模型和输出接收器。该应用程序需要一个主要对象检测模型,然后是一个可选的辅助分类模型。参考应用程序安装为 deepstream-app
。下图显示了参考应用程序的架构

通常,此应用程序使用两个或多个配置文件。在安装目录中,配置文件位于 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
。
集成 MaskRCNN 模型
要在 DeepStream 中运行 MaskRCNN 模型,您需要一个标签文件和一个 DeepStream 配置文件。此外,您需要编译 TensorRT 7+ 开源软件和用于 DeepStream 的 MaskRCNN 输出解析器。
请参阅此处的 GitHub 页面,其中包含 DeepStream 示例以及有关如何使用来自 TAO 的训练 MaskRCNN 模型运行推理的文档。
MaskRCNN 模型的前提条件
MaskRCNN 需要
generateDetectionPlugin
、multilevelCropAndResizePlugin
、resizeNearestPlugin
和multilevelProposeROI
插件,这些插件在 TensorRT 开源仓库中可用。有关构建 TensorRT OSS 的详细说明,请参见TensorRT 开源软件 (OSS)部分。MaskRCNN 需要自定义输出解析器,这些解析器未内置于 DeepStream SDK 中。用于构建 MaskRCNN 的自定义边界框解析器的源代码可在此处获得。以下说明可用于构建边界框解析器
安装 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
使用 SSH 或 HTTPS 下载源代码
git clone -b release/tlt3.0 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps
构建解析器
// or Path for DS installation export CUDA_VER=10.2 // CUDA version, e.g. 10.2 make
这将在目录
post_processor
中生成libnvds_infercustomparser_tlt.so
。
如果 COCO 注释文件在“categories”中包含以下内容
[{'supercategory': 'person', 'id': 1, 'name': 'person'},
{'supercategory': 'car', 'id': 2, 'name': 'car'}]
那么相应的 maskrcnn_labels.txt
文件将如下所示
BG
person
car
按如下所示运行 deepstream-app
deepstream-app -c <deepstream-app config file>
此外,您可以使用 deepstream-mrcnn-test
来运行 MaskRCNN 模型。请参阅 $DS_TOP/source/apps/sample_apps/deepstream-mrcnn-test/
下的 README。
配置文件由 deepstream-app 使用(有关更多详细信息,请参阅 Deepstream 配置指南)。您需要在 osd
组下启用 display-mask
以查看掩码可视化视图
[osd]
enable=1
gpu-id=0
border-width=3
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Serif
display-mask=1
display-bbox=0
display-text=0
Nvinfer config file
Nvinfer 配置文件在 nvinfer 插件中使用;有关更多详细信息,请参阅 Deepstream 插件手册。以下是运行 MaskRCNN 模型的关键参数
uff-file=<Path to MRCNN uff model>
parse-bbox-instance-mask-func-name=<post process parser name>
custom-lib-path=<path to post process parser lib>
network-type=3 ## 3 is for instance segmentation network
output-instance-mask=1
labelfile-path=<Path to label file>
int8-calib-file=<Path to optional INT8 calibration cache>
infer-dims=<Inference resolution if different than provided>
num-detected-classes=<# of classes if different than default>
这是一个示例
[property]
gpu-id=0
net-scale-factor=0.017507
offsets=123.675;116.280;103.53
model-color-format=0
uff-file=<Path to MRCNN uff model>
parse-bbox-instance-mask-func-name=NvDsInferParseCustomMrcnnTLT
custom-lib-path=<path to post process parser lib>
network-type=3 ## 3 is for instance segmentation network
labelfile-path=<Path to MaskRCNN label file>
int8-calib-file=<Path to optional INT8 calibration cache>
infer-dims=<Inference resolution if different than provided>
num-detected-classes=3
uff-input-blob-name=Input
output-blob-names=generate_detections;mask_fcn_logits/BiasAdd
batch-size=1
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=2
interval=0
gie-unique-id=1
#no cluster
## 0=Group Rectangles, 1=DBSCAN, 2=NMS, 3= DBSCAN+NMS Hybrid, 4 = None(No clustering)
## MRCNN supports only cluster-mode=4; Clustering is done by the model itself
cluster-mode=4
output-instance-mask=1
[class-attrs-all]
pre-cluster-threshold=0.8