為了將像素轉(zhuǎn)換為可操作的洞察力,計(jì)算機(jī)視覺(jué)依賴于 深度學(xué)習(xí) 來(lái)提供對(duì)環(huán)境的理解。目標(biāo)檢測(cè)是一種常用的技術(shù)來(lái)識(shí)別幀中的單個(gè)對(duì)象,例如識(shí)別人或汽車。雖然對(duì)象檢測(cè)對(duì)于某些應(yīng)用程序是有益的,但是當(dāng)您希望在像素級(jí)理解對(duì)象時(shí),它就不夠了。
實(shí)例分割是一種流行的計(jì)算機(jī)視覺(jué)技術(shù),它有助于在像素級(jí)識(shí)別幀中多個(gè)對(duì)象的每個(gè)實(shí)例。除了邊界框之外,實(shí)例分段還創(chuàng)建了一個(gè)細(xì)粒度的分段掩碼。分割有助于在對(duì)象和背景之間進(jìn)行描繪,例如在 AI 驅(qū)動(dòng)的綠色屏幕中,您希望模糊或更改幀的背景,或者分割幀中的道路或天空。或者你可能想在顯微鏡下找出制造缺陷或細(xì)胞核分割。圖 1 顯示了對(duì)檢測(cè)到的對(duì)象進(jìn)行分段掩碼的示例。
轉(zhuǎn)移學(xué)習(xí)是訓(xùn)練專門的深層神經(jīng)網(wǎng)絡(luò)( DNN )模型的常用方法。 NVIDIA 轉(zhuǎn)移學(xué)習(xí)工具包 ( TLT )使轉(zhuǎn)移學(xué)習(xí)變得更加容易,這是一個(gè)零編碼框架,用于訓(xùn)練精確和優(yōu)化的 DNN 模型。隨著 tlt2 。 0 的發(fā)布, NVIDIA 使用 面具 R-CNN 增加了對(duì)實(shí)例分段的訓(xùn)練支持。你可以訓(xùn)練面具 R-CNN 模型使用幾個(gè) ResNet 主干之一。 NGC 中提供了為 ResNet10 / 18 / 50 / 101 訓(xùn)練的預(yù)訓(xùn)練權(quán)重,可以作為遷移學(xué)習(xí)的起點(diǎn)。
在這篇文章中,我將向您展示如何使用 TLT 訓(xùn)練一個(gè) 90 級(jí) COCO Mask R-CNN 模型,并使用 TensorRT 將其部署到 NVIDIA DeepStream SDK 上。您將學(xué)習(xí)如何訪問(wèn)和使用來(lái)自 NGC 的預(yù)訓(xùn)練模型,以最小的工作量訓(xùn)練 Mask R-CNN 模型,并將其部署到 GPU 上進(jìn)行推理。這些步驟可用于構(gòu)建任何自定義掩碼 R-CNN 模型。
Mask R-CNN 與 DeepStream SDK 本機(jī)集成, DeepStream SDK 是一個(gè)用于構(gòu)建智能視頻分析應(yīng)用程序的流分析工具包。有關(guān) Mask R-CNN 如何與 DeepStream 集成的更多信息,請(qǐng)參閱 使用 NVIDIA DeepStream 5 。 0 構(gòu)建智能視頻分析應(yīng)用程序(已為 GA 更新) 。
用 COCO 訓(xùn)練面具 R-CNN 模型
Mask R-CNN 是 2017 年推出的兩階段目標(biāo)檢測(cè)和分割模型。由于其模塊化設(shè)計(jì),它是一個(gè)優(yōu)秀的體系結(jié)構(gòu),適用于各種應(yīng)用。在本節(jié)中,我將引導(dǎo)您通過(guò)可復(fù)制的步驟從 NGC 和一個(gè)開(kāi)源 COCO 數(shù)據(jù)集獲取預(yù)訓(xùn)練的模型,然后使用 TLT 訓(xùn)練和評(píng)估模型。
要開(kāi)始,請(qǐng)?jiān)O(shè)置一個(gè) NVIDIA NGC 帳戶,然后拉出 TLT 容器:
docker pull nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3
接下來(lái),下載經(jīng)過(guò)預(yù)訓(xùn)練的模型。使用 NGC 命令列出可用型號(hào):
ngc registry model list nvidia/tlt_instance_segmentation:*
要下載所需的模型,請(qǐng)使用以下命令。在這篇文章中,我使用了 ResNet50 主干網(wǎng),但是您可以自由使用任何受支持的主干網(wǎng)。
ngc registry model download-version nvidia/tlt_instance_segmentation:resnet50 --dest $model_path
整個(gè)工作流包括以下步驟:
準(zhǔn)備數(shù)據(jù)。
正在配置規(guī)范文件。
訓(xùn)練模特。
驗(yàn)證模型。
導(dǎo)出模型。
使用 DeepStream 部署。
準(zhǔn)備數(shù)據(jù)
maskr-CNN 希望有一個(gè) COCO 格式的用于培訓(xùn)、驗(yàn)證和注釋的圖像目錄。 TFRecords 用于管理數(shù)據(jù)并幫助加快迭代速度。為了下載 COCO 數(shù)據(jù)集并將其轉(zhuǎn)換為 TFRecords , TLT 容器中的 Mask R-CNN iPython 筆記本提供了一個(gè)名為 download_and_preprocess_coco.sh 的腳本。如果使用的是自定義數(shù)據(jù)集,則必須先將注釋轉(zhuǎn)換為 COCO ,然后再將其與 TLT 一起使用。有關(guān)更多信息,請(qǐng)參見(jiàn) COCO data format。
下載 COCO 數(shù)據(jù)集并轉(zhuǎn)換為 TFRecords :
bash download_and_preprocess_coco.sh $DATA_DIR
這將下載原始 COCO17 數(shù)據(jù)集并將其轉(zhuǎn)換為$ DATA \ u DIR 中的 TFRecords 。
配置等級(jí)庫(kù)文件
下一步是為培訓(xùn)配置 spec 文件。實(shí)驗(yàn)規(guī)范文件是必不可少的,因?yàn)樗幾g了實(shí)現(xiàn)一個(gè)好模型所需的所有超參數(shù)。 Mask R-CNN 規(guī)范文件有三個(gè)主要組件:頂層實(shí)驗(yàn)配置、 data_config 和 maskrcnn_config 。 spec 文件的格式是 protobuf text ( prototxt )消息,其每個(gè)字段可以是基本數(shù)據(jù)類型,也可以是嵌套消息。
頂層實(shí)驗(yàn)配置包括實(shí)驗(yàn)的基本參數(shù),如學(xué)習(xí)速率、迭代次數(shù)、是否使用混合精度訓(xùn)練等。每個(gè) num_steps_per_eval 值保存一個(gè)加密的檢查點(diǎn),然后對(duì)驗(yàn)證集運(yùn)行求值。
此處為 8- GPU 培訓(xùn)作業(yè)設(shè)置 init_learning_rate 值。如果使用不同數(shù)量的 GPUs ,請(qǐng)按照線性縮放規(guī)則調(diào)整學(xué)習(xí)速率。
use_amp: False warmup_steps: 1000 checkpoint: "$PRETRAINED_MODEL_PATH" learning_rate_steps: "[60000, 80000, 90000]" learning_rate_decay_levels: "[0.1, 0.01, 0.001]" total_steps: 100000 train_batch_size: 3 eval_batch_size: 8 num_steps_per_eval: 10000 momentum: 0.9 l2_weight_decay: 0.00002 warmup_learning_rate: 0.0001 init_learning_rate: 0.02
data_config
值指定輸入數(shù)據(jù)源和維度。augment_input_data
僅在培訓(xùn)期間使用,建議用于實(shí)現(xiàn)更高的精度。num_classes
值是基本真理中的類別數(shù)加上背景類的 1 。輸入圖像將調(diào)整大小并填充到image_size
,同時(shí)保持縱橫比。
data_config{ image_size: "(832, 1344)" augment_input_data: True eval_samples: 5000 training_file_pattern: " $DATA_DIR/train*.tfrecord" validation_file_pattern: "$DATA_DIR/val*.tfrecord" val_json_file: "$DATA_DIR/annotations/instances_val2017.json" num_classes: 91 skip_crowd_during_training: True }
maskrcnn_config 值指定模型結(jié)構(gòu)和損失函數(shù)相關(guān)的超參數(shù)。目前, Mask R-CNN 支持 TLT 中的所有 ResNet 主干。在這個(gè)實(shí)驗(yàn)中,您選擇 ResNet50 作為主干,它的前兩個(gè)卷積塊被凍結(jié),所有批處理規(guī)范化( BN )層都被凍結(jié),正如 freeze_bn: True 和 freeze_blocks: “[0,1]” 所指定的那樣。在一個(gè)凍結(jié)的任務(wù)層,不要改變一個(gè)卷積層的權(quán)重。這在遷移學(xué)習(xí)中尤其有用,因?yàn)橐话闾卣饕呀?jīng)在淺層中捕獲。您不僅可以重用所學(xué)的功能,還可以減少培訓(xùn)時(shí)間。有關(guān)每個(gè)字段的詳細(xì)信息,請(qǐng)參閱 TLT 入門指南 。
maskrcnn_config { nlayers: 50 arch: "resnet" freeze_bn: True freeze_blocks: "[0,1]" gt_mask_size: 112 # Region Proposal Network rpn_positive_overlap: 0.7 rpn_negative_overlap: 0.3 rpn_batch_size_per_im: 256 rpn_fg_fraction: 0.5 rpn_min_size: 0. # Proposal layer. batch_size_per_im: 512 fg_fraction: 0.25 fg_thresh: 0.5 bg_thresh_hi: 0.5 bg_thresh_lo: 0. # Faster-RCNN heads. fast_rcnn_mlp_head_dim: 1024 bbox_reg_weights: "(10., 10., 5., 5.)" # Mask-RCNN heads. include_mask: True mrcnn_resolution: 28 # training train_rpn_pre_nms_topn: 2000 train_rpn_post_nms_topn: 1000 train_rpn_nms_threshold: 0.7 # evaluation test_detections_per_image: 100 test_nms: 0.5 test_rpn_pre_nms_topn: 1000 test_rpn_post_nms_topn: 1000 test_rpn_nms_thresh: 0.7 # model architecture min_level: 2 max_level: 6 num_scales: 1 aspect_ratios: "[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]" anchor_scale: 8 # localization loss rpn_box_loss_weight: 1.0 fast_rcnn_box_loss_weight: 1.0 mrcnn_weight_loss_mask: 1.0 }
訓(xùn)練模型
數(shù)據(jù)和等級(jí)庫(kù)文件準(zhǔn)備就緒后,可以使用以下命令開(kāi)始培訓(xùn):
tlt-train mask_rcnn -e $spec_file_path -r $experiment_dir -k $KEY --gpus N
使用更多 GPUs 進(jìn)行培訓(xùn)可以讓網(wǎng)絡(luò)更快地接收更多數(shù)據(jù),從而在開(kāi)發(fā)過(guò)程中為您節(jié)省寶貴的時(shí)間。 TLT 支持 multi- GPU 訓(xùn)練,這樣您就可以用多個(gè) GPUs 并行訓(xùn)練模型。如果自動(dòng)混合精度( AMP )通過(guò)將enable_amp
設(shè)置為 True 啟用訓(xùn)練,與 F32 訓(xùn)練相比,您可以預(yù)期速度提升 20 – 50% 。在訓(xùn)練期間,一個(gè)詳細(xì)的日志記錄每五次迭代的訓(xùn)練損失和驗(yàn)證集上的評(píng)估指標(biāo)。
throughput: 34.4 samples/sec ==================== Metrics ===================== FastRCNN box loss: 0.27979 FastRCNN class loss: 0.11633 FastRCNN total loss: 0.39612 L2 loss: 0.83087 Learning rate: 0.00014 Mask loss: 1.3277 RPN box loss: 0.03868 RPN score loss: 0.60576 RPN total loss: 0.64443 Total loss: 3.19912
如果由于任何原因,培訓(xùn)過(guò)程中斷,您可以通過(guò)執(zhí)行相同的命令來(lái)恢復(fù)培訓(xùn)。它會(huì)自動(dòng)從上次保存的檢查點(diǎn)提取。
評(píng)估模型
要評(píng)估模型,請(qǐng)使用以下命令:
tlt-evaluate mask_rcnn -e $spec_file_path -m $model_path -k $KEY
面具 R-CNN 報(bào)道可可的 檢測(cè)評(píng)估指標(biāo) 。例如, AP50 表示 IoU 設(shè)置為 50% 時(shí)的平均精度( AP )。
所有的檢測(cè)框架都使用 mAP 作為一個(gè)共享的度量,采用了 Pascal VOC ,與 AP50 相當(dāng)。該分類模型支持各種度量,包括 Top K 準(zhǔn)確度、精確度和召回率以及混淆矩陣。
使用 8 GPUs 訓(xùn)練 100K 次迭代后,您可以觀察到以下指標(biāo):
=========== Metrics =========== AP: 0.334154785 AP50: 0.539312243 AP75: 0.358969182 APl: 0.453923374 APm: 0.354732722 APs: 0.181649670 ARl: 0.661920488 ARm: 0.533207536 ARmax1: 0.297426522 ARmax10: 0.477609098 ARmax100: 0.503548384 ARs: 0.317135185 mask_AP: 0.307278961 mask_AP50: 0.505144179 mask_AP75: 0.325496018 mask_APl: 0.432014465 mask_APm: 0.327025950 mask_APs: 0.151430994 mask_ARl: 0.626315355 mask_ARm: 0.492682129 mask_ARmax1: 0.281772077 mask_ARmax10: 0.439913362 mask_ARmax100: 0.461205393 mask_ARs: 0.271702766
KPI 是通過(guò)對(duì) NGC 的預(yù)訓(xùn)練模型進(jìn)行微調(diào)獲得的, NGC 最初是在開(kāi)放圖像數(shù)據(jù)集的子集上進(jìn)行訓(xùn)練的。如果使用 ImageNet 預(yù)訓(xùn)練權(quán)重進(jìn)行訓(xùn)練,或者使用更大的迭代次數(shù)進(jìn)行訓(xùn)練,則 KPI MIG 將有所不同。
驗(yàn)證模型
現(xiàn)在您已經(jīng)訓(xùn)練了模型,運(yùn)行推斷并驗(yàn)證預(yù)測(cè)。要用 TLT 直觀地驗(yàn)證模型,請(qǐng)使用 tlt-infer 命令。 tlt-infer 命令支持對(duì)。 tlt 模型和 TensorRT 引擎的推理。 tlt-infer 生成帶有邊框的帶注釋圖像。或者,您還可以可視化分段掩碼或以 cocojson 格式序列化輸出元數(shù)據(jù)。例如,要使用。 tlt 文件運(yùn)行推理,請(qǐng)運(yùn)行以下命令:
tlt-infer mask_rcnn -i $input_images_dir -o $annotated_images_dir -e $spec_file -m $tlt_model -l $json_label -t $threshold --include_mask
圖 2 所示的原始圖像與圖 3 中所示的帶注釋圖像進(jìn)行了比較。如您所見(jiàn),該模型對(duì)與 COCO 訓(xùn)練數(shù)據(jù)不同的圖像是魯棒的。
導(dǎo)出模型
推斷吞吐量和創(chuàng)建有效模型的速度是部署 深度學(xué)習(xí) 應(yīng)用程序的兩個(gè)關(guān)鍵指標(biāo),因?yàn)樗鼈冎苯佑绊懮鲜袝r(shí)間和部署成本。 TLT 包括一個(gè) tlt-export 命令,用于導(dǎo)出和準(zhǔn)備 TLT 模型以進(jìn)行部署。 tlt-export 命令可以選擇性地生成校準(zhǔn)緩存,以便以 INT8 精度運(yùn)行推斷。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn) 用 NVIDIA TensorRT 部署深度神經(jīng)網(wǎng)絡(luò) 。
模型導(dǎo)出為。 etlt (加密的 TLT )文件。文件可由 DeepStream 軟件開(kāi)發(fā)工具包 使用,它解密模型并將其轉(zhuǎn)換為 TensorRT 引擎。導(dǎo)出模型將訓(xùn)練過(guò)程與推理分離,并允許轉(zhuǎn)換到 TLT 環(huán)境外的 TensorRT 引擎。 TensorRT 引擎特定于每個(gè)硬件配置,應(yīng)該為每個(gè)唯一的推理環(huán)境生成。
例如,要在 INT8 中導(dǎo)出模型,請(qǐng)使用以下命令:
tlt-export mask_rcnn -m $model_path -o $int8_etlt_file -e $spec_file -k $KEY --cal_image_dir $calibration_image_dir --batch_size N --batches $num_cal_batches --cal_cache_file $calibration_table --cal_data_file $calibration_data_cache --data_type int8
這將生成一個(gè) INT8 校準(zhǔn)表和。 etlt 文件。要將模型量化為 INT8 ,必須提供一個(gè)要在其上進(jìn)行校準(zhǔn)的數(shù)據(jù)集,該數(shù)據(jù)集由 --cal_image_dir 和 --cal_data_file 參數(shù)提供。這些參數(shù)指定校準(zhǔn)所需的圖像目錄和 tensorfile 。 tensorfile 中的批處理數(shù)是從 batches 和 batch_size 值獲得的。確保 --cal_image_dir 中提到的目錄中至少有 (batch_size * batches) 個(gè)映像。
使用 DeepStream 部署
在 DeepStream 中集成 Mask R-CNN 模型很簡(jiǎn)單,因?yàn)?DeepStream 5 。 0 默認(rèn)支持實(shí)例分段網(wǎng)絡(luò)。 SDK 中提供了模型的配置文件和標(biāo)簽文件。這些文件可以用于生成的模型以及您自己的訓(xùn)練模型。在 GitHub 中提供了一個(gè)在一個(gè)類數(shù)據(jù)集上訓(xùn)練的樣本掩碼 R-CNN 模型。默認(rèn)情況下,配置和標(biāo)簽文件應(yīng)該適用于該模型。對(duì)于您在這篇文章中培訓(xùn)的模型,需要進(jìn)行一些小的修改。
從 正在下載 和 installing 啟動(dòng) DeepStream SDK 。自述文件中提供了使用 DeepStream 運(yùn)行 TLT 模型的說(shuō)明:
/opt/nvidia/deepstream/deepstream-5.0/samples/configs/tlt_pretrained_models
下面是運(yùn)行 Mask R-CNN 模型的關(guān)鍵配置文件:
/opt/nvidia/deepstream/deepstream-5.0/samples/configs/tlt_pretrained_models/deepstream_app_source1_mrcnn.txt /opt/nvidia/deepstream/deepstream-5.0/samples/configs/tlt_pretrained_models/config_infer_primary_mrcnn.txt
/deepstream_app_source1_mrcnn.txt 文件是 deepstream 應(yīng)用程序使用的主要配置文件。此文件配置整個(gè)視頻分析管道的參數(shù)。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn) 引用應(yīng)用程序配置 。有關(guān) DeepStream 中 Mask R-CNN 推理管道的更多信息,請(qǐng)參見(jiàn) 使用 NVIDIA DeepStream 5 。 0 構(gòu)建智能視頻分析應(yīng)用程序(已為 GA 更新) 。
/config_infer_primary_mrcnn.txt 文件是一個(gè)推理配置文件,用于設(shè)置掩碼 R-CNN 推理的參數(shù)。此文件由主 deepstream_app_source1_mrcnn.txt 配置調(diào)用。以下是根據(jù)模型修改的關(guān)鍵參數(shù):
tlt-model-key= tlt-encoded-model= labelfile-path= int8-calib-file= infer-dims= num-detected-classes=<# of classes if different than default>
下面是一個(gè)例子:
[property] gpu-id=0 net-scale-factor=0.017507 offsets=123.675;116.280;103.53 model-color-format=0 tlt-model-key= tlt-encoded-model= output-blob-names=generate_detections;mask_head/mask_fcn_logits/BiasAdd parse-bbox-instance-mask-func-name=NvDsInferParseCustomMrcnnTLT custom-lib-path=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_infercustomparser.so network-type=3 ## 3 is for instance segmentation network labelfile-path= int8-calib-file= infer-dims= num-detected-classes=<# of classes if different than default> uff-input-blob-name=Input batch-size=1 0=FP32, 1=INT8, 2=FP16 mode network-mode=2 interval=0 gie-unique-id=1 no cluster 0=Group Rectangles, 1=DBSCAN, 2=NMS, 3= DBSCAN+NMS Hybrid, 4 = None(No clustering) MRCNN supports only cluster-mode=4; Clustering is done by the model itself cluster-mode=4 output-instance-mask=1
它在 SDK 中提供的剪輯上運(yùn)行。要嘗試自己的源代碼,請(qǐng)?jiān)?/deepstream_app_source1_mrcnn.txt 中修改 [source0] 。
圖 4 顯示了在不同平臺(tái)上使用 deepstream-app 可以預(yù)期的端到端性能。性能以 deepstream-app 處理的每秒幀數(shù)( FPS )來(lái)衡量。
推理分辨率為 1344 × 832
在 NVIDIA Jetson Nano 和 DLAs 上,它的批處理大小為 1 。
在 Jetson AGX Xavier 和 Xavier NX 上,運(yùn)行的批處理大小為 2 。
在 T4 上,它以批大小 4 運(yùn)行。
圖 4 基于 DeepStream 的 Mask R-CNN 模型性能分析。
結(jié)論
在這篇文章中,您學(xué)習(xí)了如何使用 maskr-CNN 架構(gòu)和 TLT 訓(xùn)練實(shí)例分割模型。這篇文章展示了使用 NGC 的一個(gè)預(yù)先訓(xùn)練過(guò)的模型的開(kāi)源 COCO 數(shù)據(jù)集,使用 TLT 進(jìn)行訓(xùn)練和優(yōu)化,然后使用 deepstreamsdk 將模型部署到邊緣。
您可以應(yīng)用這些步驟來(lái)訓(xùn)練和部署您自己的自定義網(wǎng)絡(luò)。訓(xùn)練可以在多個(gè) GPUs 上進(jìn)行,以并行運(yùn)行并加快訓(xùn)練速度。也可以生成 INT8 校準(zhǔn)文件,以 INT8 精度運(yùn)行推斷。以 INT8 精度運(yùn)行可以提高邊緣設(shè)備的推理性能。
關(guān)于作者
Yu Wang 是智能視頻分析團(tuán)隊(duì)的高級(jí)工程師,致力于創(chuàng)建深度學(xué)習(xí)管道/模型并將其部署到邊緣。 2017 年加入 NVIDIA 之前,他在普渡大學(xué)電子與計(jì)算機(jī)工程學(xué)院獲得博士學(xué)位。他的研究興趣是圖像處理、計(jì)算機(jī)視覺(jué)和深度學(xué)習(xí)。
審核編輯:郭婷
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4765瀏覽量
100566 -
NVIDIA
+關(guān)注
關(guān)注
14文章
4949瀏覽量
102827 -
SDK
+關(guān)注
關(guān)注
3文章
1029瀏覽量
45782
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論