点击查看系列文章目录
0 背景
在《NVIDIA之TLT迁移学习训练自己的数据集》文章中,我们用NVIDIA的TLT工具对模型进行训练、剪枝,得到一个检测效果较好的模型,接下来如要进行部署应用,在deepstream里应用是一个很好的选择。
我们知道,TLT支持两种方式导出模型:
- tlt-export工具导出etlt格式的模型,支持FP32/FP16/INT8类型
- 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,就不用上边那么麻烦的过程,链接