DeepStream5.0系列之TLT模型调用

点击查看系列文章目录

0 背景

在《NVIDIA之TLT迁移学习训练自己的数据集》文章中,我们用NVIDIA的TLT工具对模型进行训练、剪枝,得到一个检测效果较好的模型,接下来如要进行部署应用,在deepstream里应用是一个很好的选择。

我们知道,TLT支持两种方式导出模型:

  1. tlt-export工具导出etlt格式的模型,支持FP32/FP16/INT8类型
  2. tlt-converter工具导出engine格式的模型

但第 2 种方法导出的 engine 是平台相关的,如果部署平台与导出平台不一致,模型会不能用,因此我们使用第一种方式导出的tllt模型进行部署

1 环境配置

nvidia提供了一些示例:https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps

里边介绍了dssd\faster rcnn\retinanet\yolov3\detectNet六种模型的集成方法,我们以faster rcnn为例,首先配置所需的环境

1.1 源码下载

为了支持大文件的下载,需要安装git-lfs

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install

然后下载源码

git clone https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps.git

1.2 安装OSS插件

OSS是tensorrt的一个插件,目的是为了在SSD\DSSD\RetinaNet\yolov3推理时提供一些操作支持,我们这里也总结下安装过程。

OSS支持两种平台:Jetson和X86,我们以X86为例,Jetson平台类似,可以参考官方安装方法

1.2.1 cmake安装

OSS需要使用3.13以上版本的cmake编译,运行cmake --version查看你系统中的版本,如果版本高于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

1.2.2 tensorrt安装

注意这块选择的 branch 要和自己设备上的 tensorrt 版本相一致,可通过 dpkg -l |grep tensorrt 来查看,比如我这里输出

nvidia@nvidia-desktop:~$ dpkg -l |grep tensorrt
ii  nvidia-container-csv-tensorrt                 7.1.3.0-1+cuda10.2                               arm64        Jetpack TensorRT CSV file
ii  tensorrt                                      7.1.3.0-1+cuda10.2                               arm64        Meta package of TensorRT

则下边的 -b 就要设置 release/7.1 ,这是个雷,一定小心

git clone -b release/7.0 https://github.com/nvidia/TensorRT
cd TensorRT/
git submodule update --init --recursive
export TRT_SOURCE=`pwd`
mkdir -p build && cd build
## NOTE: as mentioned above, please make sure your GPU_ARCHS in TRT OSS CMakeLists.txt
## if GPU_ARCHS is not in TRT OSS CMakeLists.txt, add -DGPU_ARCHS=xy as below, for xy, refer to below "How to Get GPU_ARCHS" section
/usr/local/bin/cmake .. -DGPU_ARCHS=75  -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)

注意要将DGPU_ARCHS替换为自己显卡的计算能力

1.3.3替换动态库

编译生成动态库后进行替换,也是根据自己的版本替换,这里是以7.0.0.1为例,这一步容易出现问题,注意只替换真实文件就行,不要替换软链接

// 备份原动态库
sudo mv /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.0.0.1 /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.0.0.1.bak
sudo cp $TRT_SOURCE/`pwd`/out/libnvinfer_plugin.so.7.0.0.1  /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.0.0.1
sudo ldconfig

替换为后效果如下 

如果有问题,可参考这篇帖子进行修改

1.3 编译custom源码

cd deepstream_tlt_apps
export DS_SRC_PATH="/opt/nvidia/deepstream/deepstream-5.0"  
export CUDA_VER=10.2 
make -j$(nproc)

2 模型测试

将我们用迁移学习TLT工具剪枝训练过的etlt模型拷贝到工程目录下(也可选择其它精度)

frcnn_kitti_resnet50_retrain_fp16.etlt

修改nvdsinfer_customparser_frcnn_tlt目录下的frcnn_labels.txt为自己的类别,同时最后加一个background类别,格式如下

person
background

修改pgie_frcnn_tlt_config.txt文件,指定模型路径和秘钥

tlt-encoded-model=frcnn_kitti_resnet50_retrain.etlt.etlt
tlt-model-key=YjlxOTRkaHRjYWI2Z2NxN2cwOXBlZjh1OTQ6ZTE2YjdkN***

指定输出engine的精度,我们这里选择导出FP16精度

## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=2

修改类别数,记得要加background

num-detected-classes=2

然后就可以运行deepstream-custom进行测试,格式如下

./deepstream-custom -c pgie_config_file -i <H264 or JPEG filename> [-b BATCH] [-d]
    -h: print help info
    -c: pgie config file, e.g. pgie_frcnn_tlt_config.txt
    -i: H264 or JPEG input file
    -b: batch size, this will override the value of "baitch-size" in pgie config file
    -d: enable display, otherwise dump to output H264 or JPEG file
 
 e.g.
 ./deepstream-custom  -c pgie_frcnn_tlt_config.txt -i $DS_SRC_PATH/samples/streams/sample_720p.h264

运行后会生成engine文件,就可以在deepstream里进行调用,只需要配置好gie即可

[primary-gie]
enable=1
gpu-id=0
batch-size=1
gie-unique-id=1
interval=0
labelfile-path=./nvdsinfer_customparser_frcnn_tlt/frcnn_labels.txt
model-engine-file=frcnn_kitti_resnet50_retrain_fp16.etlt_b1_gpu0_fp16.engine
config-file=pgie_frcnn_tlt_config.txt
nvbuf-memory-type=0

至此完成在deepstream中调用TLT训练导出的模型。

=================== 20210104更新 =============================

前段时间参加了 NVIDIA GTC 2020 Hackathon 比赛,知道了在 jetson 上可以直接使用 tlt-converter 工具,将 eltt 模型转化成 engine,就不用上边那么麻烦的过程,链接

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页