物件檢測 (objectdetection) 或物件定位 (object location) 是目前普及度最高的人工智能應(yīng)用,也是過去幾年中神經(jīng)網(wǎng)絡(luò)發(fā)展最迅猛的領(lǐng)域,短短幾年之中創(chuàng)造出非常多優(yōu)異的經(jīng)典算法,并且各有所長,如今在數(shù)量與質(zhì)量上都還持續(xù)進(jìn)化中,這現(xiàn)象其實(shí)也是造成使用者很大困擾之處,因?yàn)榫烤鼓姆N神經(jīng)網(wǎng)絡(luò)最適合您的使用場景,最終還是得經(jīng)過實(shí)際驗(yàn)證之后才能確認(rèn)。
TAO 工具非常高效地協(xié)助我們解決這個(gè)難題,讓我們在不了解各種神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)與算法、也不熟悉 Tensorflow 或 Pytorch 這些復(fù)雜框架之前,不用撰寫任何 C++ 或 Python 代碼,就能非常輕易地訓(xùn)練好深度學(xué)習(xí)模型,并且快速驗(yàn)證不同網(wǎng)絡(luò)模型的性能與效果,這估計(jì)能減少能降低 80% 以上的前期學(xué)習(xí)與評估的時(shí)間成本。
在 TAO 的 cv_samples 里提供多個(gè)物件檢測算法,包括 detectnet_v2、dssd、ssd、facenet、fast_rcnn、lprnet、mask_rcnn、retinanet、unet、ssd、yolo_v4等十多個(gè)物件檢測范例,每一個(gè)流程與本系列前一個(gè) “圖像分類的模型訓(xùn)練” 的范例是一致的,因此這里只挑選目前普及度較高的 ssd 神經(jīng)網(wǎng)絡(luò)進(jìn)行示范就行。
首先進(jìn)入 Jupyter 操作界面,打開 cv_samples/ssd/ssd.ipynb腳本,然后按照以下步驟逐步執(zhí)行:
0. 環(huán)境變量配置與路徑映射(Setup env variables and map drives):
在系列文章 “視覺類訓(xùn)練腳本的環(huán)境配置” 內(nèi)有詳細(xì)的講解,這里只要對下面兩變量進(jìn)行處理就可以:
-
%env KEY=<您的NGC秘鑰>
-
將“%envLOCAL_PROJECT_DIR=YOUR_LOCAL_PROJECT_DIR_PATH”改成“os.environ["LOCAL_PROJECT_DIR"] = os.getcwd()”
然后執(zhí)行這部分的 4 個(gè)指令塊
-
安裝 TAO 啟動器(Install the TAO launcher):
跳過第一個(gè)安裝指令塊,執(zhí)行“!tao info”指令塊就行。
2. 準(zhǔn)備數(shù)據(jù)集與預(yù)訓(xùn)練模型(Preparedataset and pre-trained model)
數(shù)據(jù)集處理通常是模型訓(xùn)練過程比較消耗人力的步驟。這里推薦不使用腳本里的步驟去下載與解壓縮,因?yàn)檫@里指向的下載位置在國外網(wǎng)站,這對大部分使用者是很困擾的,因此最好自行手動下載處理。
(1) TAO 的物件檢測模型訓(xùn)練支持 KITTI 標(biāo)注格式,這里使用的范例數(shù)據(jù)集與系列文章“視覺數(shù)據(jù)格式處理與增強(qiáng)”是同一套,如果前面實(shí)驗(yàn)已將下載的話就復(fù)制一份過來就行,也可以重新在https://pan.baidu.com/s/1WcRt9ONqsYhLRmL8Rg8_YQ(密碼855n),下載 data_object_image_2.zip 與 data_object_label_2.zip 到 ssd.ipynb 相同目錄下,然后執(zhí)行以下指令進(jìn)行解壓縮:
cd ~/tao/cv_samples/ssd # 請根據(jù)您實(shí)際路徑
unzip -u data_object_image_2.zip -d data
unzip-udata_object_label_2.zip-ddata
會在這個(gè)工作目錄下生成 data/training/image_2、data/training/label_2 與 data/testing三個(gè)子目錄,其中訓(xùn)練用數(shù)據(jù)量為 7481 張圖片、測試數(shù)據(jù)量為 7518 張。
如果有自己的數(shù)據(jù)集想要轉(zhuǎn)到 TAO 來進(jìn)行訓(xùn)練,除了先將標(biāo)注格式轉(zhuǎn)成 KITTI 之外,最好也遵循上面的路徑結(jié)構(gòu),這樣就不需修改 spec 目錄下相關(guān)配置文件里面的設(shè)定值,對初學(xué)者是最便利的方式。
(1) 接著調(diào)用 generate_val_dataset.py,從訓(xùn)練數(shù)據(jù)中提取 10% 內(nèi)容作為校驗(yàn)用途,存放在 data/val 目錄,于是在 data/training 下面的圖像與標(biāo)注文件數(shù)量就剩下 6733 個(gè)。然后執(zhí)行 “2.3Generate tfrecords” 指令塊,將訓(xùn)練與校驗(yàn)數(shù)據(jù)集都轉(zhuǎn)成 tfrecords 格式,分別存放在對應(yīng)的路徑之下。
(2) 如果要配合遷移學(xué)習(xí)功能的話,接下來就是從 NGC 下載合適的預(yù)訓(xùn)練模型。這里選擇的是 “nvidia/tao/pretrained_object_detection:resnet18”,最終下載的模型文件為 89MB 大小的 resnet_18.hdf5 模型文件。
只要這個(gè)數(shù)據(jù)集整理步驟做得完整,后面的部分就會很簡單。
3. 提供訓(xùn)練用配置文件(Providetraining specification)
在 TAO 所有范例里,配置文件是所有內(nèi)容的精華之處,這必須由專業(yè)算法工程師群進(jìn)行調(diào)試,不僅要這些神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與算法有足夠深入的了解,還需要經(jīng)過足夠長的重復(fù)調(diào)試過程,才能調(diào)試出一個(gè)夠完整的優(yōu)化參數(shù)組合,這部分是英偉達(dá)非常龐大精英人力與成本的所提煉出來的精髓。
物件檢測應(yīng)用的設(shè)定組,比前面的圖像分類要復(fù)雜很多,雖然初學(xué)者沒有能力去做細(xì)節(jié)參數(shù)的調(diào)整,但還是得了解一下主要結(jié)構(gòu),對于學(xué)習(xí)深度神經(jīng)網(wǎng)絡(luò)會有很大的幫助。
在 ssd 項(xiàng)目的 specs 目錄下有 5 個(gè)配置文件,其中與訓(xùn)練相關(guān)的有 4 個(gè),但實(shí)際使用到的就是ssd_train_resnet18_kitti.txt與ssd_retrain_resnet18_kitti.txt這兩個(gè)配置文件。
前者是提供給首次訓(xùn)練模型時(shí)使用,后者是對修剪過的模型進(jìn)行再訓(xùn)練時(shí)使用,兩者的內(nèi)容幾乎一樣,主要差異在配合遷移學(xué)習(xí)功能的部分,前者使用“pretrain_model_path”指向從NGC下載的預(yù)訓(xùn)練模型,后者使用“pruned_model_path”指向后面會操作的 “修剪過的模型”,其他參數(shù)都一樣。
現(xiàn)在就以 ssd_train_resnet18_kitti.txt 配置文件來做說明,里面總共有 6 個(gè)參數(shù)組:
(1) ssd_config:
這是根據(jù)網(wǎng)絡(luò)種類所命名,不同網(wǎng)絡(luò)的配置組內(nèi)容都不太一樣,例如 yolov3 范例的配置組為 “yolov3_config”,以此類推。每種神經(jīng)網(wǎng)絡(luò)都有截然不同的參數(shù)內(nèi)容,在 ssd 網(wǎng)絡(luò)有 12 個(gè)參數(shù)的設(shè)定,而 yolo_v4 網(wǎng)絡(luò)有將近 20 個(gè),所以網(wǎng)絡(luò)之間的配置是不能套用或互換的。如果未來要開發(fā)自己的特殊模型,最好從現(xiàn)有的 20 范例里面去挑選,就能以該網(wǎng)絡(luò)的配置文件為基礎(chǔ)進(jìn)行修改。
關(guān)于這個(gè)配置組的內(nèi)容就不多時(shí)間去說明,初學(xué)者先不要貿(mào)然去修改,以免訓(xùn)練過程發(fā)生不可預(yù)期的錯(cuò)誤,或者模型效果不好。
(2) training_config:
執(zhí)行訓(xùn)練時(shí)的一些參數(shù)設(shè)定,這是使用者能進(jìn)行調(diào)整的部分,包括以下部分:
-
batch_size_per_gpu:根據(jù)執(zhí)行訓(xùn)練的GPU總顯存進(jìn)行調(diào)整
-
num_epochs:訓(xùn)練回合數(shù),這里設(shè)定為80
-
enable_qat:開啟QAT訓(xùn)練模式,這里預(yù)設(shè)值為 ”false”,表示不開啟
-
checkpoint_interval:每多少回合生成一次模型文件,這里預(yù)設(shè)值為1
-
learning_rate、regularizer 與 optimizer:如果對 ssd 有深入了解的,可以進(jìn)一步調(diào)整。
(3) evaluation_config:
這些存放模型評估的一些參數(shù),可以根據(jù)計(jì)算設(shè)備的顯存值調(diào)整 batch_size 大小,不過這些并不影響訓(xùn)練的結(jié)果。
(4) nms_config:
NMS (Non-maximumsuppression) 非極大抑制應(yīng)用的目的,是要消除多余的框,找到最佳的物體檢查位置。
(5) augmentation_config:
這部分的參數(shù)內(nèi)容請參考系類文章 “視覺類的數(shù)據(jù)增強(qiáng)”,有詳細(xì)的說明。雖然沒辦法進(jìn)入 TAO 源碼(未開放)去確認(rèn),但這項(xiàng)參數(shù)設(shè)定組應(yīng)該顯示在物件檢測模型訓(xùn)練過程中,并將“數(shù)據(jù)增強(qiáng)”功能加進(jìn)來,這對提高模型精準(zhǔn)度會起到很大的效果。
(6) dataset_config:
這里最主要配置數(shù)據(jù)源的路徑,以及類別 “key:value” 對的映射關(guān)系;
-
一組 data_source:
里面包含 tfrecords_path 與 image_directory_path 兩個(gè)路徑設(shè)定;
-
多組 target_class_mapping:
每一組對應(yīng)的 “key” 是數(shù)據(jù)集的原始類別名稱,后面映射的 “value” 是訓(xùn)練后模型的識別分類。
例如這里使用的 KITTI 數(shù)據(jù)集中,原始分類有 “car/ van/cyclist/ person_sitting/ pedestrian/ DontCare/ tram/ truck/ misc” 等 9 種分類,經(jīng)過映射后只保留 “Car/cyclist/ pedestrian” 三個(gè)分類,沒有在映射組里的分類就會忽略,例如 truck、misc 等。
如果使用自己的數(shù)據(jù)集訓(xùn)練模型,這部分需要自行調(diào)整到合適的類別對應(yīng),否則訓(xùn)練的結(jié)果也不能實(shí)現(xiàn)您要達(dá)到的識別效果。
-
一組 validation_data_sources:
包括 label_directory_path 與 label_directory_path,存放校驗(yàn)數(shù)據(jù)集的圖像與標(biāo)注路徑。
以上 6 組配置在每個(gè)物件檢測模型的配置文件中都有,但是配置內(nèi)容不盡相同, TAO 已經(jīng)為所支持的網(wǎng)絡(luò)都提供優(yōu)化過的參數(shù)內(nèi)容,初學(xué)者只要直接使用就可以,等日后有更深入的掌握,再試著去修改這些參數(shù)。
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(61):物件檢測的模型訓(xùn)練與優(yōu)化
文章出處:【微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4773瀏覽量
100878 -
檢測
+關(guān)注
關(guān)注
5文章
4496瀏覽量
91543 -
模型
+關(guān)注
關(guān)注
1文章
3255瀏覽量
48907
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(61):物件檢測的模型訓(xùn)練與優(yōu)化
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論