日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

Transfer Learning Toolkit (TLT) + DeepStream (DS)快速部署深度学习模型(以口罩检测为例)

發(fā)布時(shí)間:2023/12/8 pytorch 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Transfer Learning Toolkit (TLT) + DeepStream (DS)快速部署深度学习模型(以口罩检测为例) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 簡介
    • TLT
    • DS
  • 基于TLT進(jìn)行遷移學(xué)習(xí)
    • 環(huán)境準(zhǔn)備
    • 模型訓(xùn)練
  • 基于DS的模型部署
  • 總結(jié)

最近在做一個(gè)深度學(xué)習(xí)的橫向,被實(shí)時(shí)性搞的很頭疼,遂打算研究研究新的技術(shù)路線,做點(diǎn)技術(shù)儲(chǔ)備。TLT+DS的中文資料很少,本文以官方資料為基礎(chǔ)做了一點(diǎn)整理工作。

簡介

TLT

如何快速訓(xùn)練和部署深度學(xué)習(xí)模型是工業(yè)界關(guān)注的重點(diǎn)問題,英偉達(dá)推出的TLT+DS工具鏈為訓(xùn)練自有數(shù)據(jù)集進(jìn)而進(jìn)行快速部署提供了端到端的解決方案。
其中,TLT是英偉達(dá)遷移學(xué)習(xí)工具,提供對(duì)預(yù)訓(xùn)練模型的遷移訓(xùn)練、模型剪紙、量化,的一站式解決方案。文檔 指南
Nvidia在NGC倉庫中提供了一組為TLT工具維護(hù)的預(yù)訓(xùn)練模型,囊括了常見CV任務(wù)的經(jīng)典模型(人臉識(shí)別、目標(biāo)檢測(cè)、語義分割、人體姿態(tài)估計(jì)、分類等):

DS

DeepStream(DS)則是一套經(jīng)高度優(yōu)化的推理系統(tǒng),提供完整的檢測(cè)流水線實(shí)現(xiàn),包含高速編解碼器、預(yù)處理器、模板跟蹤器、TensorRT推理引擎等組件,并配套有完善的可視化、精度校驗(yàn)工具。

  • 文檔中包含了基本概念的介紹。
  • 手冊(cè)描述了DeepStream的配置方法及其提供的GStreamer插件的輸入、輸出和控制參數(shù)。
  • 宣傳PPT給出了DS的基本特性和DS配置文件的簡要編寫方法。
  • GStreamer是DeepStream的底層依賴,閱讀其文檔可以幫助理解DeepStream的相關(guān)概念。
  • 官方示例:
    (1)Creating a Human Pose Estimation Application with NVIDIA DeepStream

    (2) Building Intelligent Video Analytics Apps Using NVIDIA DeepStream 5.0 (Updated for GA)


    本文主要參照官方提供的口罩檢測(cè)demo對(duì)使用TLT+DS進(jìn)行深度學(xué)習(xí)模型訓(xùn)練、部署的方法進(jìn)行初步探索,并對(duì)demo缺少的細(xì)節(jié)進(jìn)行補(bǔ)充,修正demo的部分bug,添加部分配置文件。

基于TLT進(jìn)行遷移學(xué)習(xí)

環(huán)境準(zhǔn)備

使用Docker鏡像是獲取TLT和DS工具的最佳方式。
本文使用的運(yùn)行環(huán)境:

  • Ubuntu 18.04
  • Docker 19.04
  • nvidia-docker(提供GPU的Docker虛擬化支持)
  • GTX 2080Ti

首先拉取官方鏡像:

# TLT docker pull nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3 # DeepStream docker pull nvcr.io/nvidia/deepstream:5.0.1-20.09-samples

2021/3/13注:官方tlt鏡像已升級(jí)到3.0:鏈接

注冊(cè)一個(gè)NGC賬戶,并獲取一個(gè)API Key,API key將用于訪問NGC相關(guān)的服務(wù)(如預(yù)訓(xùn)練模型下載):

API key僅顯示一次,請(qǐng)注意保存,如丟失可以重新生成一個(gè)。

為便于陳述,下文使用xxx/tlt-demo指代項(xiàng)目根路徑,目錄結(jié)構(gòu)如下:

其中原始數(shù)據(jù)集data/raw_data、代碼部分face-mask-detection、最終訓(xùn)練好的模型data/experiment_dir_final和預(yù)訓(xùn)練模型data/pretrained_resnet18已經(jīng)打包上傳到網(wǎng)盤,其他文件可通過代碼生成。
鏈接:https://pan.baidu.com/s/1VCp5nPF5NHGtD00GNPmiPA
提取碼:7sxb

如已下載上面的文件,則下面git clone 和數(shù)據(jù)集下載兩步可跳過。
拉取demo項(xiàng)目(face-mask-detection)github倉庫到xxx/tlt-demo路徑

cd xxx/tlt-demo git clone https://github.com/NVIDIA-AI-IOT/face-mask-detection.git

下載數(shù)據(jù)集文件,存放到xxx/tlt_demo/data路徑下。
face-mask-detection同時(shí)使用了四個(gè)公共數(shù)據(jù)集作為訓(xùn)練數(shù)據(jù)。

模型訓(xùn)練

在啟動(dòng)容器前,先填一下API key,執(zhí)行:

docker login nvcr.io

填入:
Username: $oauthtoken
Password: 【Your Key】
啟動(dòng)TLT訓(xùn)練容器:

docker run --gpus all --name tlt_train -it -v "xxx/tlt-demo":"/tlt-demo" \-p 8888:8888 nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3 /bin/bash

參數(shù)解釋:

  • –gpus all 指定使用的GPU
  • -v “xxx/tlt-demo”:"/tlt-demo" 映射宿主機(jī)文件
  • -p 8888:8888 綁定8888端口方便訪問jupyter notebook

進(jìn)入容器后,首先運(yùn)行數(shù)據(jù)集轉(zhuǎn)換腳本。

cd /tlt-demo/face-mask-detection python data2kitti.py --kaggle-dataset-path /tlt-demo/data/raw_dataset/Kaggle-Medical-Mask-Dataset \--mafa-dataset-path /tlt-demo/data/raw_dataset/MAFA \--fddb-dataset-path /tlt-demo/data/raw_dataset/FDDB \--widerface-dataset-path /tlt-demo/data/raw_dataset/WiderFace \--kitti-base-path /tlt-demo/data/kitti_dataset \--train

該腳本將四種數(shù)據(jù)集合并,轉(zhuǎn)換為kitti數(shù)據(jù)格式,并存放在容器的/tlt-demo/data/kitti_dataset路徑(即宿主機(jī)xxx/tlt-demo/data/kitti_dataset路徑)下。轉(zhuǎn)換中產(chǎn)生的警告可忽略。

對(duì)data2kitti.py的補(bǔ)充說明:
用于目標(biāo)檢測(cè)的kitti數(shù)據(jù)集格式具有如下組織結(jié)構(gòu):

其中kitti_seq_to_map.json文件是可選的,用于描述訓(xùn)練集/測(cè)試集的劃分。
labels文件中每一行描述一個(gè)邊界框的信息,具有如下字段:

如:

Mask 0 0 0 5 299 121 465 0 0 0 0 0 0 0 No-Mask 0 0 0 386 17 425 53 0 0 0 0 0 0 0 Mask 0 0 0 280 14 336 51 0 0 0 0 0 0 0 No-Mask 0 0 0 544 94 584 132 0 0 0 0 0 0 0 No-Mask 0 0 0 499 121 557 167 0 0 0 0 0 0 0 Mask 0 0 0 633 52 687 104 0 0 0 0 0 0 0 Mask 0 0 0 443 196 508 257 0 0 0 0 0 0 0

在data2kitti.py腳本中,四個(gè)數(shù)據(jù)集的圖片被統(tǒng)一resize到(960,544),存儲(chǔ)為jpg格式文件。

下一步,啟動(dòng)jupyter-notebook并按照face-mask-detection.ipynb提供的指示進(jìn)行模型訓(xùn)練,本文網(wǎng)盤中的版本已對(duì)face-mask-detection.ipynb的bug進(jìn)行修正,并補(bǔ)充了一些內(nèi)容。

jupyter-notebook --ip 0.0.0.0 --no-browser --allow-root


啟動(dòng)后,訪問【宿主機(jī)ip】:8888即可。其中token可在jupyter-notebook的啟動(dòng)消息中獲得。

下面對(duì)face-mask-detection.ipynb中的主要步驟進(jìn)行簡要說明和補(bǔ)充。

設(shè)置一些環(huán)境變量,注意修改路徑和KEY:

執(zhí)行數(shù)據(jù)集轉(zhuǎn)換和切分:

其中使用的配置文件detectnet_v2_tfrecords_kitti_trainval.txt 內(nèi)容如下:

kitti_config {root_directory_path: "/tlt-demo/data/kitti_dataset/train/"image_dir_name: "images"label_dir_name: "labels"image_extension: ".jpg"partition_mode: "random"num_partitions: 2val_split: 20num_shards: 10 }

ref: https://docs.nvidia.com/metropolis/TLT/tlt-getting-started-guide/text/preparing_data_input.html#conversion-to-tfrecords
參數(shù)如下:

因此在detectnet_v2_tfrecords_kitti_trainval.txt 表示我們以數(shù)據(jù)集/tlt-demo/data/kitti_dataset/train/為輸入,切分20%作為驗(yàn)證集,其余為訓(xùn)練集。

下載與訓(xùn)練模型:

此處使用英偉達(dá)的detectnet_v2模型,鑒于數(shù)據(jù)集不大,任務(wù)也比較簡單,選用較為精簡的resnet18作為骨架網(wǎng)絡(luò)。

啟動(dòng)訓(xùn)練:

這里對(duì)配置文件detectnet_v2_train_resnet18_kitti.txt的內(nèi)容進(jìn)行簡單解釋。
配置文件約定所使用的數(shù)據(jù)增強(qiáng)方法和訓(xùn)練參數(shù),其參數(shù)說明見:
https://docs.nvidia.com/metropolis/TLT/tlt-getting-started-guide/text/creating_experiment_spec.html#specification-file-for-detectnet-v2

我僅修改了路徑相關(guān)的幾行:

筆者使用2塊2080Ti訓(xùn)練的用時(shí)為1:32:42.382548.

模型剪枝:

筆者此處設(shè)置剪紙閾值為0.1(參數(shù)越大,剪的越狠),效果不錯(cuò),精度沒有降低。

剪枝后還需要再重新訓(xùn)一下:

配置文件detectnet_v2_retrain_resnet18_kitti.txt的修改方法和detectnet_v2_train_resnet18_kitti.txt相似。
最終精度是

可視化檢查:
在宿主機(jī)xxx/tlt-demo/data/test_images路徑中放入待檢圖片。

對(duì)test_images中的圖片執(zhí)行推理:

可視化:

注意在箭頭處需加個(gè)int修復(fù)源程序bug。
可見訓(xùn)練效果非常理想。

最后,導(dǎo)出模型,格式為etlt,etlt格式可被轉(zhuǎn)換為trt或tensorRT的engine文件,亦可被DeepStream加載并自動(dòng)轉(zhuǎn)化為所需的trt格式模型。

我們也可進(jìn)一步將其轉(zhuǎn)換成TensorRT的engine文件:

上面導(dǎo)出的模型是Float32類型的,為了追求更快的推理速度,可將Float32類型的模型量化int8模型。為了解決解決參數(shù)轉(zhuǎn)換為int8類型后動(dòng)態(tài)范圍下降的問題,量化的一個(gè)關(guān)鍵步驟是確定float32到int8的量化映射,映射參數(shù)是根據(jù)模型對(duì)數(shù)據(jù)集的響應(yīng)進(jìn)行的,下面的命令抽取40個(gè)batch的數(shù)據(jù)生成calibration tensorfile。

隨后我們調(diào)用tlt-convert導(dǎo)出int8推理engine:

engine文件是平臺(tái)相關(guān)的,比如3080系顯卡上執(zhí)行tlt-convert導(dǎo)出的engine并不能在10系顯卡上運(yùn)行,需注意。Nvidia也提供了不同平臺(tái)的tlt-convert工具供使用。
至此我們已經(jīng)得到了如下文件:

  • /tlt-demo/data/experiment_dir_unpruned/下存放原始訓(xùn)練模型
  • /tlt-demo/data/experiment_dir_pruned/存放經(jīng)過剪枝的模型
  • /tlt-demo/data/experiment_dir_retrain/存放經(jīng)過再次訓(xùn)練后的剪枝模型
  • /tlt-demo/data/experiment_dir_final/存放導(dǎo)出模型,包括原始的resnet18_detector.etlt模型文件和經(jīng)過int8量化并轉(zhuǎn)化為tensorRT推理引擎的resnet18_detector_int8.engine文件,未經(jīng)過int8量化但轉(zhuǎn)化為tensorRT推理引擎的resnet18_detector.engine文件。還有保存有int8映射信息的calibration.bin文件。

2021/1/12注:為了查看不同剪枝閾值的影響,對(duì)pth=[0.15,0.2,0.25,0.3,0.35,0.45]分別進(jìn)行了實(shí)驗(yàn):

pthmaskno-maskmean AP
0.1584.797181.996783.3969
0.284.892881.591683.2422
0.2583.902981.954182.9285
0.384.643182.009283.3262
0.3584.979682.39483.6868
0.4583.947881.496682.7222

可見在本例中,對(duì)pth的裕度是很大的。但有些模型對(duì)pth很敏感,需仔細(xì)調(diào)整。

下一節(jié)將探討如何在DS框架上部署這些模型。

基于DS的模型部署

DeepStream SDK提供了完整的流分析工具鏈,可用于基于AI的視頻和圖像理解以及多傳感器處理。
如前所述,DeepStream的相關(guān)資料較少,尚未由較為詳細(xì)的中文技術(shù)博客對(duì)其進(jìn)行介紹,DS開發(fā)的主要的參考來源是官方文檔和例子:

  • 文檔中包含了基本概念的介紹。
  • 手冊(cè)描述了DeepStream的配置方法及其提供的GStreamer插件的輸入、輸出和控制參數(shù)。
  • 宣傳PPT給出了DS的基本特性和DS配置文件的簡要編寫方法。
  • python API
  • GStreamer是DeepStream的底層依賴,閱讀其文檔可以幫助理解DeepStream的相關(guān)概念。
    依舊通過容器運(yùn)行DeepStream,擺脫繁瑣的環(huán)境配置工作:
xhost + docker run --rm --gpus all --name ds_test --device=/dev/video0 -it -p 8554:8554 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -v "xxx/tlt-demo":"/tlt-demo" -w /tlt-demo/face-mask-detection/ds_configs nvcr.io/nvidia/deepstream:5.0.1-20.09-samples /bin/bash

其中xhost +用于開放宿主機(jī)圖形界面的接入權(quán)限
參數(shù)解釋:

  • –gpus all 指定容器可見的GPU
  • –device=/dev/video0 將攝像頭1映射進(jìn)入容器
  • -it -p 8554:8554 映射RTSPStreaming RTSP端口(可選)
  • -p 5400:5400/udp 映射RTSPStreaming UDP端口(可選)
  • -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 連接圖形界面到宿主機(jī)
  • -v “xxx/tlt-demo”:"/tlt-demo" 映射宿主機(jī)文件夾
  • -w /tlt-demo/face-mask-detection/ds_configs 設(shè)置進(jìn)入容器后開啟的路徑

注意這里使用的是deepstream:5.0.1-20.09-samples版本鏡像而非更精簡的deepstream:5.0.1-20.09-base,該鏡像包含重要的例程文件(deepstream-app)。

進(jìn)入容器后,我們運(yùn)行demo寫好的配置文件(有改動(dòng))。
通過指定的配置文件啟動(dòng)deepstream-app檢測(cè)程序:

deepstream-app -c deepstream_app_source1_camera_masknet_gpu_int8.txt

這個(gè)配置文件以640*480的分辨率,30fps的幀率從/dev/video0這個(gè)usb攝像頭讀入視頻流,進(jìn)行推理,跟蹤,并渲染檢測(cè)結(jié)果,最后推送到宿主機(jī)的圖形界面,同時(shí)發(fā)送RTSP流。
RTSP是流行的流傳輸協(xié)議,使用VLC,potplayer等視頻播放器均可訪問,其地址是

rtsp://[容器所在宿主機(jī)IP]:8554/ds-test

其他配置文件說明:

  • deepstream_app_source1_camera_masknet_gpu_fp32.txt 加載fp32推理模型、攝像頭0為輸入
  • deepstream_app_source1_camera_masknet_gpu_int8.txt 加載int8推理模型、攝像頭0為輸入
  • deepstream_app_source1_video_masknet_gpu_fp32.txt 加載fp32推理模型、/tlt-demo/test.mp4為輸入
  • deepstream_app_source1_video_masknet_gpu_int8.txt 加載int8推理模型、/tlt-demo/test.mp4為輸入

若一切正常,則可通過GUI或視頻瀏覽器看到標(biāo)注由檢測(cè)結(jié)果的輸出視頻流,整個(gè)檢測(cè)流水線運(yùn)行速度很快,顯卡的占用率也很低。

下面簡要分析一下demo中配置文件的編寫方法。

DeepStream的底層是GStreamer,GStreamer是用于創(chuàng)建流媒體應(yīng)用程序的極其強(qiáng)大且通用的框架。 GStreamer框架的核心優(yōu)點(diǎn)來自其模塊化,視頻處理的各個(gè)環(huán)節(jié)均有豐富的插件進(jìn)行支撐,基于GStreamer進(jìn)行開發(fā)的核心內(nèi)容就是合理的將各個(gè)環(huán)節(jié)的模塊串接為一個(gè)處理管線。GStreamer是純C編寫的,底層基于Glib庫,并使用G-object提供對(duì)C語言的面向?qū)ο笾С?#xff08;暗黑科技)。
DeepStream在GStreamer提供的基礎(chǔ)模塊(如編解碼,文件I/O,合成器等)的基礎(chǔ)上,又為深度學(xué)習(xí)的應(yīng)用場(chǎng)景實(shí)現(xiàn)了一組插件:

如nvinfer用于支持tensorRT推理,nvtracker用于邊界框的跟蹤,nvdsosd用于渲染檢測(cè)結(jié)果。

看DS提供的例程是學(xué)習(xí)DS開發(fā)的最佳途徑:

其中C語言版本位于容器的如下路徑:

/opt/nvidia/deepstream/deepstream-5.0/sources/apps/sample_apps

python語言版本可在這里下載。
更多例程可見這里。
其中一個(gè)很重要的例程是deepstream-test5 app。
除常規(guī)推理管道外,Test5應(yīng)用程序還支持以下功能:

  • 將消息發(fā)送到后端服務(wù)器。
  • 充當(dāng)使用者以從后端服務(wù)器接收消息。
  • 基于從服務(wù)器收到的消息觸發(fā)基于事件的記錄。
  • OTA模型更新。

除此之外。鑒于通過DS的底層C接口和Python接口構(gòu)建檢測(cè)流水線仍有些繁瑣,Nvidia針對(duì)最常見的深度學(xué)習(xí)模型處理流程提煉并設(shè)計(jì)了參考程序deepstream-app,該程序允許用戶通過傳入配置文件描述檢測(cè)流水線,deepstream-app會(huì)根據(jù)配置文件的描述調(diào)用相應(yīng)DS插件,構(gòu)建流水線。因此,雖然deepstream-app是個(gè)參考程序,但常被當(dāng)做DS的CLI工具使用
如下是deepstream-app提供的流水線的結(jié)構(gòu)框圖,其中很多組件是可選的(如secondary classifiers):
首先,前端使用decode插件讀入視頻流(來源可以是RTSP、文件、usb攝像頭等),多個(gè)攝像頭經(jīng)過MUX進(jìn)行合并,組成batch,送入主檢測(cè)器(目標(biāo)檢測(cè))獲得邊界框,隨后送入tracker進(jìn)行跟蹤,每個(gè)跟蹤的邊界框繼續(xù)送入次級(jí)檢測(cè)器(一般是分類器),檢測(cè)結(jié)果發(fā)送到tilter形成2D幀數(shù)組,進(jìn)而用osd插件渲染檢測(cè)結(jié)果。最后,要輸出結(jié)果(sink),DeepStream提供了各種選項(xiàng):在屏幕上用邊框顯示輸出,將輸出保存到本地磁盤,通過RTSP進(jìn)行流傳輸或僅將元數(shù)據(jù)發(fā)送到云。為了將元數(shù)據(jù)發(fā)送到云,DeepStream使用Gst-nvmsgconv和Gst-nvmsgbroker插件。 Gst-nvmsgconv將元數(shù)據(jù)轉(zhuǎn)換為架構(gòu)有效負(fù)載,而Gst-nvmsgbroker建立與云的連接并發(fā)送遙測(cè)數(shù)據(jù)。 有幾種內(nèi)置的代理協(xié)議,例如Kafka,MQTT,AMQP和Azure IoT。 可以創(chuàng)建自定義代理適配器。

deepstream-app的配置文件使用freedesktop格式,是一種非常精簡的鍵值對(duì)描述文件,形如:

# demo [Desktop Entry] Version=1.0 Type=Application Name=Foo Viewer Comment=The best viewer for Foo objects available! TryExec=fooview Exec=fooview %F Icon=fooview MimeType=image/x-foo; Actions=Gallery;Create;[Desktop Action Gallery] Exec=fooview --gallery Name=Browse Gallery[Desktop Action Create] Exec=fooview --create-new Name=Create a new Foo! Icon=fooview-new

描述文件由若干個(gè)組(Group )組成,[groupname]表示參數(shù)組的名字,每行用Key=Value的形式描述一個(gè)鍵值。使用“# ”表明注釋行。
deepstream-app的配置文件有如下可選的配置組。

本文的口罩檢測(cè)demo程序正是使用deepstream-app來構(gòu)建DS流水線的。我們以調(diào)用int8推理模型的配置文件為例進(jìn)行說明。
int8推理的配置包含兩個(gè)文件:

  • deepstream_app_source1_camera_masknet_gpu_int8.txt
  • config_infer_primary_masknet_gpu_int8.txt

前者描述流水線的配置情況,后者對(duì)流水線的nvinfer推理模塊進(jìn)行配置(因nvinfer參數(shù)比較多,故單獨(dú)拆分為一個(gè)配置文件),下面分別說明兩個(gè)文件中配置項(xiàng)的含義。
deepstream_app_source1_camera_masknet_gpu_int8.txt:

application配置組指定是否在命令行打印性能評(píng)估信息:

[application] enable-perf-measurement=1 perf-measurement-interval-sec=1


source組指定輸入源,這里指定兩個(gè)輸入源同時(shí)輸入:攝像頭和視頻文件

[source0] enable=1 #Type - 1=CameraV4L2 2=URI 3=MultiURI type=1 camera-width=640 camera-height=480 camera-fps-n=30 camera-fps-d=1 camera-v4l2-dev-node=0[source1] enable=0 #Type - 1=CameraV4L2 2=URI 3=MultiURI type=3 num-sources=1 uri=file:/tlt-demo/test.mp4 gpu-id=0

streammux組開啟mux插件,將兩個(gè)輸入源的圖像集成打包為batch,由于先前導(dǎo)出int8.engine時(shí)設(shè)置batch-size=4,故這里保持一致

[streammux] gpu-id=0 batch-size=4 batched-push-timeout=40000 ## Set muxer output width and height width=640 height=480

osd組指定檢測(cè)標(biāo)簽的渲染顏色、字體

[osd] enable=1 gpu-id=0 border-width=4 text-size=18 text-color=1;1;1;1; text-bg-color=0.3;0.3;0.3;1 font=Arial

primary-gie組設(shè)置主推理引擎,注意導(dǎo)入了config_infer_primary_masknet_gpu_int8.txt文件

[primary-gie] enable=1 gpu-id=0 # Modify as necessary # GPU engine file # model-engine-file=/tlt-demo/data/experiment_dir_final/resnet18_detector_int8.engine # batch-size=4 # Required by the app for OSD, not a plugin property bbox-border-color0=0;1;0;1 bbox-border-color1=1;0;0;1 #bbox-border-color2=0;0;1;1 # Blue #bbox-border-color3=0;1;0;1 gie-unique-id=1 config-file=config_infer_primary_masknet_gpu_int8.txt

tracker組使能邊界框跟蹤器,此處選擇klt跟蹤算法

[tracker] enable=1 tracker-width=640 tracker-height=384 #ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_mot_iou.so #ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_nvdcf.so ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_mot_klt.so #ll-config-file required for DCF/IOU only #ll-config-file=../deepstream-app/tracker_config.yml #ll-config-file=iou_config.txt gpu-id=0 #enable-batch-process applicable to DCF only enable-batch-process=1

tiled-display組將兩個(gè)視頻源的檢測(cè)結(jié)果分開,并排渲染為一個(gè)視頻流,故這里設(shè)置的輸出寬度為640*2=1280

[tiled-display] enable=1 rows=1 columns=2 width=1280 #640 height=480 #480 gpu-id=0

sink組指定了兩個(gè)輸出源,一是在GUI顯示,二是編碼并推流RTSP到8554端口

[sink0] enable=0 #Type - 1=FakeSink 2=EglSink 3=File type=2 sync=1 source-id=0 gpu-id=0 container=2 codec=1 bitrate=2000000 output-file=/tlt-demo/out.mp4[sink1] enable=1 #Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming type=4 #1=h264 2=h265 codec=1 sync=0 bitrate=4000000 # set below properties in case of RTSPStreaming rtsp-port=8554 #udp-port=5400

最后,tests組的含義設(shè)置視頻循環(huán)播放,方便調(diào)試時(shí)能夠?qū)Χ桃曨l文件持續(xù)反復(fù)的觀察

[tests] file-loop=1

config_infer_primary_masknet_gpu_int8.txt文件則有三個(gè)配置組。
property組對(duì)推理引擎進(jìn)行設(shè)置,包括engine文件路徑、推理模型類型、輸入大小、推理batch大小、int8映射文件路徑、分類閾值等。

[property] gpu-id=0 net-scale-factor=0.0039215697906911373 tlt-model-key=Z2doZm5wZmsyaTRqdTFpaTh2cTduNjdjbW46OWYwMzYyNDEtMWY0ZS00NmRjLTgxZDAtYjI0NjkzYTY0YjJk #tlt-encoded-model=/tlt-demo/data/experiment_dir_final/resnet18_detector_int8.etlt labelfile-path=labels_masknet.txt # GPU Engine File model-engine-file=/tlt-demo/data/experiment_dir_final/resnet18_detector_int8.engine # DLA Engine File # model-engine-file=/tlt-demo/data/experiment_dir_final/resnet18_detector_int8.engine input-dims=3;544;960;0 uff-input-blob-name=input_1 batch-size=4 model-color-format=0 ## 0=FP32, 1=INT8, 2=FP16 mode network-mode=1 int8-calib-file=/tlt-demo/data/experiment_dir_final/calibration.bin num-detected-classes=2 cluster-mode=3 interval=0 gie-unique-id=1 is-classifier=0 classifier-threshold=0.9 output-blob-names=output_bbox/BiasAdd;output_cov/Sigmoid

[class-attrs-all]組為所有類別配置檢測(cè)參數(shù),由于任務(wù)是目標(biāo)檢測(cè),故設(shè)置項(xiàng)主要包含極大值抑制算法的相關(guān)參數(shù)。

[class-attrs-0] pre-cluster-threshold=0.3 group-threshold=1 eps=0.5 #minBoxes=1 detected-min-w=0 detected-min-h=0 detected-max-w=0 detected-max-h=0[class-attrs-1] pre-cluster-threshold=0.3 group-threshold=1 eps=0.3 #minBoxes=1 detected-min-w=0 detected-min-h=0 detected-max-w=0 detected-max-h=0

關(guān)于字段的具體含義,可查詢文檔,這里不再贅述。

總結(jié)

總體來看,TLT和DS構(gòu)成的工具鏈將模型的訓(xùn)練和部署變得極為方便,唯一需要編程的部分僅僅是一些數(shù)據(jù)集轉(zhuǎn)換腳本。最關(guān)鍵的是,借助DS框架,算法可以達(dá)到極高的幀率,TLT+DS絕對(duì)是做工(heng)程(xiang)的利器!
當(dāng)然,使用deepstream-app+配置文件仍然有很多限制,后續(xù)有機(jī)會(huì)將探索DS的python接口的使用方法。

總結(jié)

以上是生活随笔為你收集整理的Transfer Learning Toolkit (TLT) + DeepStream (DS)快速部署深度学习模型(以口罩检测为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。