## NVIDAI 迁移学习工具TLT使用教程

1、 TLT安装&运行

TLT需要在docker中运行,因此第一步拉取镜像

首先登陆NGC,如果你是第一次注册NGC,你需要获得一个API KEY,这个值需要保存下来,因为他只会显示一次,并且以后会经常用到

拉取镜像

docker pull nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3

启动镜像

sudo docker run -it -v /home/zhaobing/data:/data --gpus all nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3

2、准备数据集

2.1准备KITTI格式数据集

对于目标检测任务,TLT支持的数据集形式为KITTI数据集形式,训练前,需要将该形式的数据集转化为TFRecords.

KITTI数据集形式

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"><v:formulas></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path></v:stroke></v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1038" type="#_x0000_t75" style="width:415.5pt;height:196.5pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" o:title=""></v:imagedata></v:shape>TLT要求图像分辨率统一,不支持多分辨率图像自动resize训练.需要自行将图像分辨率统一并对应修改label文件中bbox位置。labels标注为每张图片对应一个txt文档,对于每个标注目标,标注信息包括15个元素。对于2D目标检测,第1个元素为目标类别,5-8为四个座标值。目前官方未提供常见的数据集格式如VOC,COCO数据集转换为KITTI数据集形式的脚本,整理了二者转换为KITTI格式的脚本如下。

<v:shape id="图片_x0020_2" o:spid="_x0000_i1037" type="#_x0000_t75" style="width:415pt;height:38pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png" o:title=""></v:imagedata></v:shape>

<v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:63pt;height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.emz" o:title=""></v:imagedata></v:shape><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:70pt;
height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.emz" o:title=""></v:imagedata></v:shape>

2.2转tfrecord

生成训练集tfrecord格式文件,需先准备.config配置文件,例如将如下信息生成为train.config

<v:shape id="_x0000_i1027" type="#_x0000_t75" style="width:61.5pt;height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.emz" o:title=""></v:imagedata></v:shape>

image_directory_path设置与root_directory_path相同。

执行转换命令:

tlt-dataset-convert -d <path_to_tfrecords_conversion_spec> -o <path_to_output_tfrecords>

测试集同理。

3.生成实验配置文件

各种目标检测网络实验配置文件写法不同,根据自己选择的目标检测算法,定义相应配置文件,参考

https://docs.nvidia.com/metropolis/TLT/tlt-getting-started-guide/index.html#spec_file_yolov3_topic

7.2-7.9.

Yolov3配置文件spec.txt内容如下所示。

<v:shape id="_x0000_i1028" type="#_x0000_t75" style="width:58.5pt;height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.emz" o:title=""></v:imagedata></v:shape>

推荐将自己想要训练集的所有类别填到target_class_mapping,可以默认设置一个key,一个value对应一个类别,也可以多个key对应一个value,这样训练时多个类别将合并为一个value类进行训练。

4.模型训练

tlt-train yolo --gpus 0 -e /data/tlt/spec.txt -r /data/tlt/output_yolov3 -k tlt_encode

其中,

-e spec.txt配置文件位置

-r 实验结果存放位置

-k 加密模型的key,设置为tlt_encode

注意两个特殊选项

量化感知训练:对于DetectNet_v2, SSD, DSSD, YOLOv3, RetinaNet and FasterRCNN,tlt支持采用量化感知进行训练。

量化感知训练,就是在量化的过程中,对网络进行训练,从而让网络参数能更好地适应量化带来的信息损失。这种方式的准确性普遍比训练后进行量化要高。

将spec.txt中的enable_qat 参数设置为 True即可

自动混合精度:训练阶段混合使用FP32和FP16.

开启方法,tlt-train训练时,export 一个环境变量即可。

export tf_enable_auto_mixed_precision=1

5.模型验证

tlt-evaluate yolo -e /data/tlt/spec.txt \

-m /data/tlt/output_yolov3/weights/yolo_darknet53_epoch_002.tlt \

-k tlt_encode

6.模型推理

tlt-infer yolo -i /data/tlt/000158.jpg \ -o /data/tlt/000158.jpg \ -e /data/tlt/spec.txt \

-m /data/tlt/output_yolov3/weights/yolo_darknet53_epoch_003.tlt \ -k tlt_encode

7.模型裁剪

tlt-prune [-h] -m <pretrained_model>

-o <output_file> -k <key>

[-n <normalizer>]

[-eq <equalization_criterion>]

[-pg <pruning_granularity>]

[-pth <pruning threshold>]

[-nf <min_num_filters>]

[-el [<excluded_list>]

示例:

tlt-prune -m /data/tlt/output_voc/weights/yolo_darknet53_epoch_006.tlt \

-o /data/tlt/output_voc/yolo_prune.tlt \

-eq union \

-pth 0.7 -k tlt_encode

pth设置越大,模型裁剪后体积越小。

8.模型导出

将训练生成.tlt模型导出成INT8、FP16、FP32模型(.etlt),用于后续Deepstream的部署。

8.1 导出为FP16、FP32模型

<v:shape id="图片_x0020_5" o:spid="_x0000_i1036" type="#_x0000_t75" style="width:389.5pt;height:112pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png" o:title=""></v:imagedata></v:shape>

tlt-export [-h] {classification, detectnet_v2, ssd, dssd, faster_rcnn, yolo, retinanet}

-m <path to the .tlt model file generated by tlt train>

-k <key>

[-o <path to output file>]

[--cal_data_file <path to tensor file>]

[--cal_image_dir <path to the directory images to calibrate the model]

[--cal_cache_file <path to output calibration file>]

[--data_type <Data type for the TensorRT backend during export>]

[--batches <Number of batches to calibrate over>]

[--max_batch_size <maximum trt batch size>]

[--max_workspace_size <maximum workspace size]

[--batch_size <batch size to TensorRT engine>]

[--experiment_spec <path to experiment spec file>]

[--engine_file <path to the TensorRT engine file>]

[--verbose Verbosity of the logger]

[--force_ptq Flag to force PTQ]

示例:

tlt-export yolo -m /data/tlt/output_yolov3/yolo_pruned.tlt -k tlt_encode -o /data/tlt/output_yolov3/yolo_prune.etlt --data_type fp32 -e /data/tlt/spec.txt

注意----data_type 说明想要导出的模型类型,此时可选择fp32或者fp16.

8.2 导出为INT8模型

INT8格式模型推荐转换模式,需要训练数据参与,还会生成.bin文件

<v:shape id="图片_x0020_4" o:spid="_x0000_i1035" type="#_x0000_t75" style="width:415pt;height:180pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png" o:title=""></v:imagedata></v:shape>

示例:

tlt-export yolo \

-m /data/tlt/output_yolov3/yolo_pruned.tlt \

-o /data/tlt/output_yolov3/yolo_prunedint8.tlt \

-k tlt_encode \

--data_type int8 \

--cal_cache_file /data/tlt/output_yolov3/calibration.bin \

-e /data/tlt/spec.txt \

--cal_image_dir /data/tlt/train_dataset/images

注意:FP32,FP16,INT8导出过程中,均可以导出engine文件,但是由于engine与gpu型号相关,除非到处环境与未来应用GPU相同,否则无意义。

9.使用Deepstream部署

<v:shape id="图片_x0020_6" o:spid="_x0000_i1034" type="#_x0000_t75" alt="../_images/dstream_deploy_options.png" style="width:415pt;height:252pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png" o:title="dstream_deploy_options"></v:imagedata></v:shape>

模型部署在x86或者jetson卡上,除了nv自研Detectnet_v2比较简单外,其他目标检测模型都需要结合TensorRT OSS在目标环境下转换为engine,再进行部署。

9.1 TensorRT OSS安装

l TensorRT OSS on X86

1. Install 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. Get GPU Arch.****获得算力数值

cd /usr/local/cuda/samples/1_Utilities/deviceQuery

sudo make

./deviceQuery

T4的话,该值为75

3. Build TensorRT OSS

git clone -b release/7.0 https://github.com/nvidia/TensorRT

cd TensorRT/

git submodule update --init --recursive

export TRT_SOURCE=pwd

cd $TRT_SOURCE

mkdir -p build && cd build

/usr/local/bin/cmake .. -DGPU_ARCHS=xy -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.****替换原始的TensorRT的原始libnvinfer_plugin.so*

sudo mv /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.x.y ${HOME}/libnvinfer_plugin.so.7.x.y.bak // backup original libnvinfer_plugin.so.x.y

sudo cp $TRT_SOURCE/pwd/out/libnvinfer_plugin.so.7.m.n /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.x.y

sudo ldconfig

此步容易出错,参考下文jetson做法。

l TensorRT OSS on Jetson

1.****安装Cmake(>=3.13)

<pre>sudo apt remove --purge --auto-remove cmake</pre>

<pre>wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz</pre>

<pre>tar xvf cmake-3.13.5.tar.gz</pre>

<pre>cd cmake-3.13.5/</pre>

<pre>./configure</pre>

<pre>make -j$(nproc)</pre>

<pre>sudo make install</pre>

<pre>sudo ln -s /usr/local/bin/cmake /usr/bin/cmake</pre>

2.build TensorRT OSS

<pre>git clone -b release/7.0 https://github.com/nvidia/TensorRT</pre>

<pre>cd TensorRT/</pre>

<pre>git submodule update --init --recursive</pre>

<pre>export TRT_SOURCE=pwd</pre>

<pre>cd $TRT_SOURCE</pre>

<pre>mkdir -p build && cd build</pre>

<pre>/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</pre>

<pre>make nvinfer_plugin -j$(nproc)</pre>

<v:shape id="图片_x0020_7" o:spid="_x0000_i1033" type="#_x0000_t75" style="width:220pt;height:100pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.png" o:title=""></v:imagedata></v:shape>

GPU_ARCH根据型号选择填写。

libnvinfer_plugin.so*文件将生成到`pwd`/out/文件夹

<v:shape id="图片_x0020_9" o:spid="_x0000_i1032" type="#_x0000_t75" style="width:151.5pt;height:97pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png" o:title="ce42db35c91a0bae1b2c27d59a66dd8"></v:imagedata></v:shape>

3.****替换原始的TensorRT的原始libnvinfer_plugin.so*

<pre>sudo mv /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.7.x.y ${HOME}/libnvinfer_plugin.so.7.x.y.bak // backup original libnvinfer_plugin.so.x.y</pre>

<pre>sudo cp pwd/out/libnvinfer_plugin.so.7.m.n /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.7.x.y</pre>

<pre>sudo ldconfig</pre>

<pre>注意,此处无需按照上述官方操作,以jetson nx为例,原始tensorrt的libnvinfer_plugin.so*文件在/usr/lib/aarch64-linux-gnu/路径下,如libnvinfer_plugin.so,libnvinfer_plugin.so.7.1.3,libnvinfer_plugin.so.7.1.0.将这三个文件备份后删除,将新生成的文件拷贝至此文件夹即可。</pre>

9.2将TLT模型整合到Deeepstream

1. 下载官方部署示例源码

git clone https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps.git
  1. Build Sample Application

<v:shape id="图片_x0020_8" o:spid="_x0000_i1031" type="#_x0000_t75" style="width:415.5pt;height:44.5pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.png" o:title=""></v:imagedata></v:shape>

3. 部署官方模型示例

Wget https://nvidia.box.com/shared/static/8k0zpe9gq837wsr0acoy4oh3fdf476gq.zip -O models.zip

Models文件夹中含有NV官方训练好的faster rcnn,yolov3,ssd,detecnet_v2等目标检测网络训练.etlt模型。

以yolov3为例,pgie_yolov3_tlt_config.txt和nvdsinfer_customparser_yolo_tlt目录下yolo_labels.txt无需修改,分别运行下面两行命令,可生成对应engine,并对engine进行性能测试。

<v:shape id="_x0000_i1029" type="#_x0000_t75" style="width:415.5pt;height:217pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.emz" o:title=""></v:imagedata></v:shape>

3****.自己训练的.etlt转换为engine

将TLT训练的.etlt文件拷贝到该目录下(yolo_fp16.etlt)

修改nvdsinfer_customparser_yolo_tlt目录下yolo_labels.txt修改为自己任务类别,加上background类别。

修改pgie_yolov3_tlt_config.txt文件,指定模型路径和秘钥,注意密钥要和TLT训练时设定的密钥相同,如本项目中,设定的密钥为tlt_encode,要修改才能读取。

tlt-encoded-model=./ yolo_fp16.etlt

tlt-model-key=nvidia_tlt

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

network-mode=2

修改类别数,记得要加background

num-detected-classes=21

转化为engine及性能测试与上节命令相同。

参考:

官方文档

https://docs.nvidia.com/metropolis/TLT/tlt-getting-started-guide/text/deploying_to_deepstream.html#tensorrt-open-source-software-oss

2,deepstream_tlt_apps

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

3.示例

https://blog.csdn.net/zong596568821xp/article/details/107386744

https://zongxp.blog.csdn.net/article/details/107709786

<v:shape id="图片_x0020_3" o:spid="_x0000_i1030" type="#_x0000_t75" style="width:415.5pt;height:178pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.png" o:title=""></v:imagedata></v:shape>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章