TAO v5.5.0

部署 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 构建中的 generateDetectionPluginmultilevelCropAndResizePluginresizeNearestPluginmultilevelProposeROI 插件。

如果部署平台是带有 NVIDIA GPU 的 x86,请按照 x86 上的 TensorRT OSS 说明进行操作。另一方面,如果您的部署在 NVIDIA Jetson 平台上,请按照 Jetson (ARM64) 上的 TensorRT OSS 说明进行操作。

x86 上的 TensorRT OSS

在 x86 上构建 TensorRT OSS

  1. 安装 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


  2. 获取 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

  3. 构建 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 OSS CMakeLists.txt 中。如果 GPU_ARCHS 不在 TensorRT OSS CMakeLists.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/. 下生成。

  4. 替换原始的 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

  1. 安装 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

  2. 根据您的平台获取 GPU 架构。下表给出了不同 Jetson 平台的 GPU_ARCHS

    Jetson 平台 GPU_ARCHS
    Nano/Tx1 53
    Tx2 62
    AGX Xavier/Xavier NX 72
  3. 构建 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/. 下生成。

  4. "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 精度校准缓存。

  • TensorRT 7+ OSS 插件

  • labels.txt 文件,其中包含类别的标签,标签顺序与网络生成输出的顺序一致。

  • 示例 config_infer_*.txt 文件,用于配置 DeepStream 中的 nvinfer 元素。nvinfer 元素处理与 DeepStream 中的 TensorRT 优化和引擎创建相关的所有内容。

TDeepStream SDK 附带一个端到端参考应用程序,该应用程序是完全可配置的。您可以配置输入源、推理模型和输出接收器。该应用程序需要一个主要对象检测模型,然后是一个可选的辅助分类模型。参考应用程序安装为 deepstream-app。下图显示了参考应用程序的架构

arch_ref_appl.png

通常,此应用程序使用两个或多个配置文件。在安装目录中,配置文件位于 samples/configs/deepstream-appsample/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.txtconfig_infer_secondary_*.txt

集成 MaskRCNN 模型

要在 DeepStream 中运行 MaskRCNN 模型,您需要一个标签文件和一个 DeepStream 配置文件。此外,您需要编译 TensorRT 7+ 开源软件和用于 DeepStream 的 MaskRCNN 输出解析器。

请参阅此处的 GitHub 页面,其中包含 DeepStream 示例以及有关如何使用来自 TAO 的训练 MaskRCNN 模型运行推理的文档。

MaskRCNN 模型的前提条件

  • MaskRCNN 需要 generateDetectionPluginmultilevelCropAndResizePluginresizeNearestPluginmultilevelProposeROI 插件,这些插件在 TensorRT 开源仓库中可用。有关构建 TensorRT OSS 的详细说明,请参见TensorRT 开源软件 (OSS)部分。

  • MaskRCNN 需要自定义输出解析器,这些解析器未内置于 DeepStream SDK 中。用于构建 MaskRCNN 的自定义边界框解析器的源代码可在此处获得。以下说明可用于构建边界框解析器

    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

如果 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

上一篇 部署 YOLOv4-tiny 到 DeepStream
下一篇 部署 UNet 到 Deepstream
© 版权所有 2024,NVIDIA。 上次更新时间:2024 年 10 月 15 日。