本系列的第一篇文章介紹了在 NVIDIA 遷移學(xué)習(xí)工具箱中使用開源 COCO 數(shù)據(jù)集和 BodyPoseNet 應(yīng)用程序的 如何訓(xùn)練二維姿態(tài)估計(jì)模型 。
在本文中,您將學(xué)習(xí)如何在 NVIDIA 遷移學(xué)習(xí)工具箱中優(yōu)化姿勢(shì)估計(jì)模型。它將引導(dǎo)您完成模型修剪和 INT8 量化的步驟,以優(yōu)化用于推理的模型。
模型優(yōu)化和導(dǎo)出
本節(jié)介紹模型優(yōu)化和導(dǎo)出的幾個(gè)主題:
修剪
INT8 量化
提高速度和準(zhǔn)確性的最佳實(shí)踐
修剪
BodyPoseNet 支持模型修剪以刪除不必要的連接,從而將參數(shù)數(shù)量減少一個(gè)數(shù)量級(jí)。這將產(chǎn)生一個(gè)優(yōu)化的模型體系結(jié)構(gòu)。
修剪模型
要修剪模型,請(qǐng)使用以下命令:
tlt bpnet prune -m $USER_EXPERIMENT_DIR/models/exp_m1_unpruned/bpnet_model.tlt \ -o $USER_EXPERIMENT_DIR/models/exp_m1_pruned/bpnet_model.pruned-0.05.tlt \ -eq union \ -pth 0.05 \ -k $KEY
通常,您只需調(diào)整-pth
(閾值)以進(jìn)行精度和模型大小的權(quán)衡。對(duì)于一些內(nèi)部研究,我們注意到pth
值介于[0 . 05 , 3 . 0]之間是 BodyPoseNet 模型的良好起點(diǎn)。
重新訓(xùn)練修剪模型
在模型被刪減之后,由于一些以前有用的權(quán)值可能已經(jīng)被刪除,因此 MIG 的精度可能會(huì)略有下降。為了重新獲得準(zhǔn)確度,我們建議在相同的數(shù)據(jù)集上重新訓(xùn)練這個(gè)修剪過(guò)的模型。您可以按照列車試驗(yàn)配置文件部分中的相同說(shuō)明進(jìn)行操作?,F(xiàn)在主要的更改是指定pretrained_weights
作為修剪模型的路徑,并啟用load_graph
。因?yàn)槟P褪怯眉糁Φ哪P蜋?quán)重初始化的,所以模型收斂得更快。
# Retraining using the pruned model as model graph tlt bpnet train -e $SPECS_DIR/bpnet_retrain_m1_coco.yaml \ -r $USER_EXPERIMENT_DIR/models/exp_m1_retrain \ -k $KEY \ --gpus $NUM_GPUS
您可以按照Evaluation和模型驗(yàn)證部分中的類似說(shuō)明來(lái)評(píng)估和驗(yàn)證修剪后的模型。在用pth 0.05
重新訓(xùn)練修剪后的模型之后,您可以觀察到多尺度推理的精度為 56 . 1% 的 AP 。以下是 COCO 驗(yàn)證集的指標(biāo):
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets= 20 ] = 0.561 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets= 20 ] = 0.776 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets= 20 ] = 0.609 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets= 20 ] = 0.567 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets= 20 ] = 0.556 ...
導(dǎo)出. etlt 模型
推理吞吐量和創(chuàng)建有效模型的速度是部署深度學(xué)習(xí)應(yīng)用程序的兩個(gè)關(guān)鍵指標(biāo),因?yàn)樗鼈冎苯佑绊懙缴鲜袝r(shí)間和部署成本。 TLT 包含一個(gè) export 命令,用于導(dǎo)出和準(zhǔn)備 TLT 模型以進(jìn)行部署。
模型將導(dǎo)出為. etlt (加密的 TLT )文件。 TLT CV 推斷可以使用該文件,它解密模型并將其轉(zhuǎn)換為 TensorRT 引擎。導(dǎo)出模型將訓(xùn)練過(guò)程與推理分離,并允許轉(zhuǎn)換到 TLT 環(huán)境之外的 TensorRT 引擎 TensorRT 引擎特定于每個(gè)硬件配置,應(yīng)該為每個(gè)獨(dú)特的推理環(huán)境生成。下面的代碼示例顯示了經(jīng)過(guò)修剪、重新訓(xùn)練的模型的導(dǎo)出。
tlt bpnet export -m $USER_EXPERIMENT_DIR/models/exp_m1_retrain/bpnet_model.tlt \ -e $SPECS_DIR/bpnet_retrain_m1_coco.yaml \ -o $USER_EXPERIMENT_DIR/models/exp_m1_final/bpnet_model.etlt \ -k $KEY \ -t tfonnx
export 命令可以選擇生成校準(zhǔn)緩存,以便以 INT8 精度運(yùn)行推斷。這將在后面的章節(jié)中詳細(xì)描述。
INT8 量化
BodyPoseNet 模型支持 TensorRT 中的 int8 推理模式。為此,首先對(duì)模型進(jìn)行校準(zhǔn),以運(yùn)行 8 位推斷。要校準(zhǔn)模型,需要一個(gè)目錄,其中包含用于校準(zhǔn)的一組采樣圖像。
我們提供了一個(gè)助手腳本,可以解析注釋并根據(jù)指定的標(biāo)準(zhǔn)(如圖像中的人數(shù)、每人的關(guān)鍵點(diǎn)數(shù)量等)隨機(jī)抽取所需數(shù)量的圖像。
# Number of calibration samples to use export NUM_CALIB_SAMPLES=2000 python3 sample_calibration_images.py \ -a $LOCAL_EXPERIMENT_DIR/data/annotations/person_keypoints_train2017.json \ -i $LOCAL_EXPERIMENT_DIR/data/train2017/ \ -o $LOCAL_EXPERIMENT_DIR/data/calibration_samples/ \ -n $NUM_CALIB_SAMPLES \ -pth 1 \ --randomize
生成 INT8 校準(zhǔn)緩存和引擎
下面的命令將經(jīng)過(guò)修剪、重新訓(xùn)練的模型導(dǎo)出為. etlt 格式,執(zhí)行 INT8 校準(zhǔn),并為當(dāng)前硬件生成 INT8 校準(zhǔn)緩存和 TensorRT 引擎。
# Set dimensions of desired output model for inference/deployment export IN_HEIGHT=288 export IN_WIDTH=384 export IN_CHANNELS=3 export INPUT_SHAPE=288x384x3 # Set input name export INPUT_NAME=input_1:0 tlt bpnet export \ -m $USER_EXPERIMENT_DIR/models/exp_m1_retrain/bpnet_model.tlt \ -o $USER_EXPERIMENT_DIR/models/exp_m1_final/bpnet_model.etlt \ -k $KEY \ -d $IN_HEIGHT,$IN_WIDTH,$IN_CHANNELS \ -e $SPECS_DIR/bpnet_retrain_m1_coco.yaml \ -t tfonnx \ --data_type int8 \ --engine_file $USER_EXPERIMENT_DIR/models/exp_m1_final/bpnet_model.$IN_HEIGHT.$IN_WIDTH.int8.engine \ --cal_image_dir $USER_EXPERIMENT_DIR/data/calibration_samples/ \ --cal_cache_file $USER_EXPERIMENT_DIR/models/exp_m1_final/calibration.$IN_HEIGHT.$IN_WIDTH.bin \ --cal_data_file $USER_EXPERIMENT_DIR/models/exp_m1_final/coco.$IN_HEIGHT.$IN_WIDTH.tensorfile \ --batch_size 1 \ --batches $NUM_CALIB_SAMPLES \ --max_batch_size 1 \ --data_format channels_last
確保 --cal_image_dir 中提到的目錄中至少有( batch_size * batches )個(gè)圖像。要為當(dāng)前硬件生成 F16 引擎,請(qǐng)將 --data_type 指定為 FP16 。有關(guān)此處使用的參數(shù)的更多信息,請(qǐng)參閱 INT8 模型概述 。
評(píng)估 TensorRT 發(fā)動(dòng)機(jī)
此評(píng)估主要用于對(duì)導(dǎo)出的 TRT ( INT8 / FP16 )模型進(jìn)行健全性檢查。這并不能反映模型的真實(shí)準(zhǔn)確性,因?yàn)檫@里的輸入縱橫比可能與驗(yàn)證集中圖像的縱橫比有很大差異。這套設(shè)備有一組不同分辨率的圖像。在這里,您保留嚴(yán)格的輸入分辨率,并填充圖像以重新訓(xùn)練縱橫比。因此,這里的精度 MIG ht 根據(jù)縱橫比和您選擇的網(wǎng)絡(luò)分辨率而變化。
您也可以在嚴(yán)格模式下運(yùn)行 .tlt 模型的評(píng)估,以便與 INT8 / FP16 / FP32 模型的精度進(jìn)行比較,以確定精度是否下降。在這一步中,與 .tlt 型號(hào)相比, FP16 和 FP32 型號(hào)的精度應(yīng)無(wú)下降或下降最小。 INT8 模型的精度與 .tlt 模型相似(或在 2-3%AP 范圍內(nèi)可比)。
您可以按照 Evaluation 和 模型驗(yàn)證 部分中的類似說(shuō)明來(lái)評(píng)估和驗(yàn)證模型。一個(gè)改變就是你現(xiàn)在使用 $SPECS_DIR/infer_spec_retrained_strict.yaml as inference_spec 和要使用的模型將是經(jīng)過(guò)修剪的 TLT 模型、 INT8 引擎或 FP16 引擎。
可部署模型導(dǎo)出
在驗(yàn)證了 INT8 / FP16 / FP32 模型之后,您必須重新導(dǎo)出該模型,以便它可以用于在 TLT-CV 推理等推理平臺(tái)上運(yùn)行。您使用的準(zhǔn)則與前幾節(jié)中相同,但必須將 --sdk_compatible_model 標(biāo)志添加到 export 命令中,這將向模型中添加一些不可訓(xùn)練的后期處理層,以實(shí)現(xiàn)與推理管道的兼容性。重用前面步驟中生成的校準(zhǔn)張量文件( cal_data_file )以保持一致,但必須重新生成 cal_cache_file 和 .etlt 模型。
tlt bpnet export -m $USER_EXPERIMENT_DIR/models/exp_m1_retrain/bpnet_model.tlt -o $USER_EXPERIMENT_DIR/models/exp_m1_final/bpnet_model.deploy.etlt -k $KEY -d $IN_HEIGHT,$IN_WIDTH,$IN_CHANNELS -e $SPECS_DIR/bpnet_retrain_m1_coco.txt -t tfonnx --data_type int8 --cal_image_dir $USER_EXPERIMENT_DIR/data/calibration_samples/ --cal_cache_file $USER_EXPERIMENT_DIR/models/exp_m1_final/calibration.$IN_HEIGHT.$IN_WIDTH.deploy.bin --cal_data_file $USER_EXPERIMENT_DIR/models/exp_m1_final/coco.$IN_HEIGHT.$IN_WIDTH.tensorfile --batch_size 1 --batches $NUM_CALIB_SAMPLES --max_batch_size 1 --data_format channels_last --engine_file $USER_EXPERIMENT_DIR/models/exp_m1_final/bpnet_model.$IN_HEIGHT.$IN_WIDTH.int8.deploy.engine --sdk_compatible_model
提高速度和準(zhǔn)確性的最佳實(shí)踐
在本節(jié)中,我們將介紹一些用于提高模型性能和準(zhǔn)確性的最佳實(shí)踐。
部署的網(wǎng)絡(luò)輸入分辨率
模型的網(wǎng)絡(luò)輸入分辨率是決定自底向上方法精度的主要因素之一。自下而上的方法必須一次提供整個(gè)圖像,從而使每個(gè)人的分辨率更小。因此,更高的輸入分辨率產(chǎn)生更好的精度,特別是在中小型人員的圖像比例方面。但是,隨著輸入分辨率的提高, CNN 的運(yùn)行時(shí)間也會(huì)提高。因此,準(zhǔn)確度/運(yùn)行時(shí)權(quán)衡應(yīng)該由目標(biāo)用例的準(zhǔn)確度和運(yùn)行時(shí)需求來(lái)決定。
如果您的應(yīng)用程序涉及到一個(gè)或多個(gè)靠近相機(jī)的人的姿勢(shì)估計(jì),使得該人的比例相對(duì)較大,那么您可以使用較小的網(wǎng)絡(luò)輸入高度。如果你的目標(biāo)是為相對(duì)規(guī)模較小的人使用網(wǎng)絡(luò),比如擁擠的場(chǎng)景,你需要更高的網(wǎng)絡(luò)輸入高度。凍結(jié)網(wǎng)絡(luò)高度后,可以根據(jù)部署期間使用的輸入數(shù)據(jù)的縱橫比來(lái)決定寬度。
不同分辨率的精度/運(yùn)行時(shí)變化說(shuō)明
這些是筆記本中使用的默認(rèn)體系結(jié)構(gòu)和規(guī)范的近似運(yùn)行時(shí)和精度。對(duì)架構(gòu)或參數(shù)的任何更改都會(huì)產(chǎn)生不同的結(jié)果。這主要是為了更好地了解哪種解決方案適合您的需要。
從 224 英鎊開始,預(yù)計(jì) area=medium 類別的應(yīng)付賬款將增長(zhǎng) 7-10% × 320 至 288 × 384 和額外的 7-10%AP 當(dāng)你選擇 320 × 448 。在這些分辨率中, area=large 的精度幾乎保持不變,所以如果需要的話,可以選擇較低的分辨率。根據(jù) COCO 關(guān)鍵點(diǎn)評(píng)估 , medium 區(qū)域被定義為居住面積在 36 ^ 2 到 96 ^ 2 之間的人。居住面積在 36 ^ 2 到 96 ^ 2 之間的人被歸類為 large 。
我們使用默認(rèn)大小 288 × 384 在這個(gè)崗位上。要使用不同的分辨率,需要進(jìn)行以下更改:
用所需形狀更新 INT8 量化 中提到的 env 變量。
更新 infer_spec_retrained_strict.yaml 中的 input_shape ,這使您能夠?qū)?dǎo)出的 TRT 模型進(jìn)行健全性評(píng)估。默認(rèn)設(shè)置為[288384]。
高度和寬度應(yīng)為 8 的倍數(shù),最好為 16 / 32 / 64 的倍數(shù)。
網(wǎng)絡(luò)中的細(xì)化階段數(shù)
圖 1 顯示了模型體系結(jié)構(gòu)包括細(xì)化階段,每個(gè)階段細(xì)化前一階段的結(jié)果。您可以使用 model 部分下的 stages 參數(shù)來(lái)配置它 stages 包括初始預(yù)測(cè)階段和細(xì)化階段。我們建議使用最少一個(gè)細(xì)化階段,最多六個(gè)細(xì)化階段,對(duì)應(yīng)于[2 , 7]范圍內(nèi)的 stages 。
當(dāng)您使用更多的細(xì)化階段時(shí),這可能有助于提高準(zhǔn)確性,但請(qǐng)記住,這將導(dǎo)致推理時(shí)間的增加。在這篇文章中,我們使用了默認(rèn)的兩個(gè)細(xì)化階段( stages=3 ),這是為了獲得最佳的性能和準(zhǔn)確性而進(jìn)行的調(diào)整。要獲得更快的性能,請(qǐng)使用 stages=2 。
修剪和正則化
修剪有助于顯著減少參數(shù)數(shù)量,并在保持精度的同時(shí)最大限度地提高速度,或者以精度下降為代價(jià)。剪枝閾值越高,模型越小,推理速度越快,但 MIG ht 會(huì)導(dǎo)致精度下降。
要使用的閾值取決于數(shù)據(jù)集。如果再培訓(xùn)的準(zhǔn)確性是好的,你可以增加這個(gè)值得到更小的模型。否則,請(qǐng)降低此值以獲得更好的精度。我們建議使用 prune-retain 循環(huán)進(jìn)行迭代,直到您滿意精度和速度的折衷。在修剪之前訓(xùn)練模型時(shí),也可以使用更高的 L1 正則化權(quán)重。它會(huì)將更多的權(quán)重推向零,從而更容易刪減網(wǎng)絡(luò)權(quán)重。
模型精度和性能
在本節(jié)中,我們將深入探討模型的準(zhǔn)確性和性能,并將其與最新技術(shù)和跨平臺(tái)進(jìn)行比較。
與 OpenPose 的比較
我們將此方法與 OpenPose 進(jìn)行比較,因?yàn)榇朔椒ㄗ裱愃频膯未巫缘紫蛏戏椒?。圖 4 顯示,與 OpenPose 模型相比,您實(shí)現(xiàn)了更好的精度性能折衷。準(zhǔn)確率較低約 8%AP ,而您實(shí)現(xiàn)了接近 9 倍的加速模型訓(xùn)練與默認(rèn)參數(shù)在這篇文章中提供。
跨設(shè)備的獨(dú)立性能
下表顯示了使用默認(rèn)參數(shù)使用 TLT 訓(xùn)練的 BodyPoseNet 模型的推理性能。我們使用 TensorRT 的 trtexec 命令分析了模型推理。
結(jié)論
在本文中,您學(xué)習(xí)了如何使用 TLT 中的 BodyPoseNet 應(yīng)用程序優(yōu)化身體姿勢(shì)模型。文章展示了如何使用一個(gè)開源的 COCO 數(shù)據(jù)集和 NGC 的一個(gè)預(yù)訓(xùn)練主干來(lái)訓(xùn)練和優(yōu)化一個(gè) TLT 模型。有關(guān)模型部署的信息,請(qǐng)參閱 TLT CV 推斷管道 快速啟動(dòng)腳本 和 Deployment 說(shuō)明。
與 OpenPose 相比,使用此模型,您的推理性能可以提高 9 倍,甚至可以幫助您在嵌入式設(shè)備上實(shí)現(xiàn)實(shí)時(shí)性能。修剪加上 INT8 精度可以在邊緣設(shè)備上提供最高的推理性能。
關(guān)于作者
Sakthivel Sivaraman 是 NVIDIA 的高級(jí)軟件工程師,專注于開發(fā)深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)解決方案,并將其部署到邊緣。在 2018 參加“ ZVK3]之前,他從賓夕法尼亞大學(xué)獲得機(jī)器人學(xué)博士學(xué)位。他的研究興趣包括計(jì)算機(jī)視覺(jué)、深度學(xué)習(xí)和機(jī)器人技術(shù)。
Rajath Shetty 是 NVIDIA 的工程經(jīng)理,負(fù)責(zé)在汽車和醫(yī)療保健領(lǐng)域應(yīng)用深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)的項(xiàng)目。他的興趣涉及邊緣計(jì)算、算法和人工智能應(yīng)用軟件棧。他擁有喬治亞理工學(xué)院的電子和計(jì)算機(jī)工程碩士學(xué)位。
Chintan Shah 是 NVIDIA 的產(chǎn)品經(jīng)理,專注于智能視頻分析解決方案的 AI 產(chǎn)品。他管理工具箱,用于有效的深度學(xué)習(xí)培訓(xùn)和實(shí)時(shí)推理。在他之前的工作中,他正在為 NVIDIA GPU 開發(fā)硬件 IP 。他擁有北卡羅來(lái)納州立大學(xué)電氣工程碩士學(xué)位。
Niral Pathak 是 NVIDIA 的軟件工程師,致力于計(jì)算機(jī)視覺(jué)解決方案的部署。他擁有加州大學(xué)圣地亞哥分校電子和計(jì)算機(jī)工程碩士學(xué)位。他的興趣包括計(jì)算機(jī)視覺(jué)、深度學(xué)習(xí)和機(jī)器人技術(shù)。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4986瀏覽量
103066 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7494瀏覽量
87961 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121169
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論