TAO v5.5.0

为 YOLOv4 部署到 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 模型的更多详细信息,请参阅导出模型部分。

重要提示

从 5.0.0 版本开始,tao model converter 已弃用。此方法在未来的版本中可能不可用。本节仅适用于您仍在使用 tao model converter 进行旧版的情况。对于 tao deploy,请跳转到集成 YOLOv4 模型

YOLOv4 模型需要 TensorRT OSS 构建。这是必需的,因为这些模型需要的几个 TensorRT 插件仅在 TensorRT 开源仓库中可用,而不在常规 TensorRT 版本中可用。具体而言,对于 YOLOv4,我们需要 batchTilePluginbatchedNMSPlugin

如果部署平台是带有 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 主版本/次版本为 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

要将 TAO 训练的模型与 DeepStream 集成,您应该使用 TAO Deploy 生成特定于设备的优化 TensorRT 引擎。生成的 TensorRT 引擎文件随后可以被 DeepStream 摄取。如果仅提供 ONNX 模型,DeepStream 也可以为 YOLOv4 动态生成 TensorRT 引擎。

对于 YOLOv4,您需要构建 TensorRT 开源插件和自定义边界框解析器。TensorRT 开源软件 (OSS) 部分提供了构建 TensorRT 开源插件的说明。YOLOv4 模型的前提条件部分提供了构建自定义边界框解析器的说明,所需代码可以在此 GitHub 仓库 中找到。

要将模型与 DeepStream 集成,您需要以下内容

  1. 下载 并安装 DeepStream SDK。DeepStream 开发指南 中提供了 DeepStream 的安装说明。

  2. 导出的 .onnx 模型文件和可选的 INT8 精度校准缓存。

  3. TensorRT 7+ OSS 插件 .

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

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

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

arch_ref_appl.png

此应用程序通常使用 2 个或更多配置文件。在安装目录中,配置文件位于 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

集成 YOLOv4 模型

要在 DeepStream 中运行 YOLOv4 模型,您需要一个标签文件和一个 DeepStream 配置文件。此外,您需要为 DeepStream 编译 TensorRT 7+ 开源软件和 YOLOv4 边界框解析器。

GitHub 仓库 上提供了 DeepStream 示例,其中包含有关如何使用 TAO 中训练的 YOLOv4 模型运行推理的文档。

YOLOv4 模型的前提条件

  1. YOLOv4 需要 batchTilePlugin、resizeNearestPlugin 和 batchedNMSPlugin。这些插件在 TensorRT 开源仓库中可用,但在 TensorRT 7.0 中不可用。有关构建 TensorRT OSS 的详细说明,请参阅TensorRT 开源软件 (OSS)

  2. YOLOv4 需要 YOLOv3 自定义边界框解析器,这些解析器不是 DeepStream SDK 内置的。构建 YOLOv3 自定义边界框解析器的源代码可在 GitHub 仓库 中找到。以下说明可用于构建边界框解析器

步骤 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 模型训练用于检测的类别的名称。此处列出的类别的顺序必须与模型预测输出的顺序一致。在训练期间,TAO YOLOv4 将指定所有小写类别名称,并按字母顺序对其进行排序。例如,如果 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_labels.txt 文件将是

复制
已复制!
            

bicycle car person

检测模型通常用作主要推理引擎。它也可以用作辅助推理引擎。要在示例 deepstream-app 中运行此模型,您必须修改现有的 config_infer_primary.txt 文件以指向此模型。

dstream_deploy_options2.png

将 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 labels>

有关所有选项,请参见下面的配置文件。要了解所有参数的用途,请参阅 DeepStream 开发指南

这是一个示例配置文件,pgie_yolov4_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_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 应用程序集成

ONNX 模型也可以直接集成到 DeepStream 中。这是一个示例配置文件,pgie_yolov4_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_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

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