点击查看系列文章目录
在《NVIDIA之TLT迁移学习训练自己的数据集》文章中,我们用NVIDIA的TLT工具对模型进行训练、剪枝,得到一个检测效果较好的模型,接下来如要进行部署应用,在deepstream里应用是一个很好的选择。
我们知道,TLT支持两种方式导出模型:
但是平台相关的,如果部署平台与导出平台不一致,模型会不能用,因此我们使用第一种方式导出的tllt模型进行部署
nvidia提供了一些示例:https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps
里边介绍了dssd\faster rcnn\retinanet\yolov3\detectNet六种模型的集成方法,我们以faster rcnn为例,首先配置所需的环境
为了支持大文件的下载,需要安装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
OSS是tensorrt的一个插件,目的是为了在SSD\DSSD\RetinaNet\yolov3推理时提供一些操作支持,我们这里也总结下安装过程。
OSS支持两种平台:Jetson和X86,我们以X86为例,Jetson平台类似,可以参考官方安装方法
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
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替换为自己显卡的计算能力
这一步容易出现问题,注意只替换真实文件就行,不要替换软链接
// 备份原动态库
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
替换为后效果如下
如果有问题,可参考这篇帖子进行修改
export DS_SRC_PATH="/opt/nvidia/deepstream/deepstream-5.0"
export CUDA_VER=10.2
make -j$(nproc)
将我们用迁移学习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 [-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训练导出的模型。