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