為了將像素轉換為可操作的洞察力,計算機視覺依賴于 深度學習 來提供對環境的理解。目標檢測是一種常用的技術來識別幀中的單個對象,例如識別人或汽車。雖然對象檢測對于某些應用程序是有益的,但是當您希望在像素級理解對象時,它就不夠了。
實例分割是一種流行的計算機視覺技術,它有助于在像素級識別幀中多個對象的每個實例。除了邊界框之外,實例分段還創建了一個細粒度的分段掩碼。分割有助于在對象和背景之間進行描繪,例如在 AI 驅動的綠色屏幕中,您希望模糊或更改幀的背景,或者分割幀中的道路或天空。或者你可能想在顯微鏡下找出制造缺陷或細胞核分割。圖 1 顯示了對檢測到的對象進行分段掩碼的示例。

轉移學習是訓練專門的深層神經網絡( DNN )模型的常用方法。 NVIDIA 轉移學習工具包 ( TLT )使轉移學習變得更加容易,這是一個零編碼框架,用于訓練精確和優化的 DNN 模型。隨著 tlt2 . 0 的發布, NVIDIA 使用 面具 R-CNN 增加了對實例分段的訓練支持。你可以訓練面具 R-CNN 模型使用幾個 ResNet 主干之一。 NGC 中提供了為 ResNet10 / 18 / 50 / 101 訓練的預訓練權重,可以作為遷移學習的起點。
在這篇文章中,我將向您展示如何使用 TLT 訓練一個 90 級 COCO Mask R-CNN 模型,并使用 TensorRT 將其部署到 NVIDIA DeepStream SDK 上。您將學習如何訪問和使用來自 NGC 的預訓練模型,以最小的工作量訓練 Mask R-CNN 模型,并將其部署到 GPU 上進行推理。這些步驟可用于構建任何自定義掩碼 R-CNN 模型。
Mask R-CNN 與 DeepStream SDK 本機集成, DeepStream SDK 是一個用于構建智能視頻分析應用程序的流分析工具包。有關 Mask R-CNN 如何與 DeepStream 集成的更多信息,請參閱 使用 NVIDIA DeepStream 5 . 0 構建智能視頻分析應用程序(已為 GA 更新) 。
用 COCO 訓練面具 R-CNN 模型
Mask R-CNN 是 2017 年推出的兩階段目標檢測和分割模型。由于其模塊化設計,它是一個優秀的體系結構,適用于各種應用。在本節中,我將引導您通過可復制的步驟從 NGC 和一個開源 COCO 數據集獲取預訓練的模型,然后使用 TLT 訓練和評估模型。
要開始,請設置一個 NVIDIA NGC 帳戶,然后拉出 TLT 容器:
docker pull nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3
接下來,下載經過預訓練的模型。使用 NGC 命令列出可用型號:
ngc registry model list nvidia/tlt_instance_segmentation:*
要下載所需的模型,請使用以下命令。在這篇文章中,我使用了 ResNet50 主干網,但是您可以自由使用任何受支持的主干網。
ngc registry model download-version nvidia/tlt_instance_segmentation:resnet50 --dest $model_path
整個工作流包括以下步驟:
- 準備數據。
- 正在配置規范文件。
- 訓練模特。
- 驗證模型。
- 導出模型。
- 使用 DeepStream 部署。
準備數據
maskr-CNN 希望有一個 COCO 格式的用于培訓、驗證和注釋的圖像目錄。 TFRecords 用于管理數據并幫助加快迭代速度。為了下載 COCO 數據集并將其轉換為 TFRecords , TLT 容器中的 Mask R-CNN iPython 筆記本提供了一個名為 download_and_preprocess_coco.sh
的腳本。如果使用的是自定義數據集,則必須先將注釋轉換為 COCO ,然后再將其與 TLT 一起使用。有關更多信息,請參見 COCO data format。
下載 COCO 數據集并轉換為 TFRecords :
bash download_and_preprocess_coco.sh $DATA_DIR
這將下載原始 COCO17 數據集并將其轉換為$ DATA \ u DIR 中的 TFRecords 。
配置等級庫文件
下一步是為培訓配置 spec 文件。實驗規范文件是必不可少的,因為它編譯了實現一個好模型所需的所有超參數。 Mask R-CNN 規范文件有三個主要組件:頂層實驗配置、 data_config
和 maskrcnn_config
。 spec 文件的格式是 protobuf text ( prototxt
)消息,其每個字段可以是基本數據類型,也可以是嵌套消息。
頂層實驗配置包括實驗的基本參數,如學習速率、迭代次數、是否使用混合精度訓練等。每個 num_steps_per_eval
值保存一個加密的檢查點,然后對驗證集運行求值。
此處為 8- GPU 培訓作業設置 init_learning_rate
值。如果使用不同數量的 GPUs ,請按照線性縮放規則調整學習速率。
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
值指定輸入數據源和維度。 augment_input_data
僅在培訓期間使用,建議用于實現更高的精度。 num_classes
值是基本真理中的類別數加上背景類的 1 。輸入圖像將調整大小并填充到 image_size
,同時保持縱橫比。
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
值指定模型結構和損失函數相關的超參數。目前, Mask R-CNN 支持 TLT 中的所有 ResNet 主干。在這個實驗中,您選擇 ResNet50 作為主干,它的前兩個卷積塊被凍結,所有批處理規范化( BN )層都被凍結,正如 freeze_bn: True
和 freeze_blocks: "[0,1]"
所指定的那樣。在一個凍結的任務層,不要改變一個卷積層的權重。這在遷移學習中尤其有用,因為一般特征已經在淺層中捕獲。您不僅可以重用所學的功能,還可以減少培訓時間。有關每個字段的詳細信息,請參閱 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 }
訓練模型
數據和等級庫文件準備就緒后,可以使用以下命令開始培訓:
tlt-train mask_rcnn -e $spec_file_path -r $experiment_dir -k $KEY --gpus N
使用更多 GPUs 進行培訓可以讓網絡更快地接收更多數據,從而在開發過程中為您節省寶貴的時間。 TLT 支持 multi- GPU 訓練,這樣您就可以用多個 GPUs 并行訓練模型。如果 自動混合精度 ( AMP )通過將 enable_amp
設置為 True 啟用訓練,與 F32 訓練相比,您可以預期速度提升 20 – 50% 。在訓練期間,一個詳細的日志記錄每五次迭代的訓練損失和驗證集上的評估指標。
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
如果由于任何原因,培訓過程中斷,您可以通過執行相同的命令來恢復培訓。它會自動從上次保存的檢查點提取。
評估模型
要評估模型,請使用以下命令:
tlt-evaluate mask_rcnn -e $spec_file_path -m $model_path -k $KEY
面具 R-CNN 報道可可的 檢測評估指標 。例如, AP50 表示 IoU 設置為 50% 時的平均精度( AP )。
所有的檢測框架都使用 mAP 作為一個共享的度量,采用了 Pascal VOC ,與 AP50 相當。該分類模型支持各種度量,包括 Top K 準確度、精確度和召回率以及混淆矩陣。
使用 8 GPUs 訓練 100K 次迭代后,您可以觀察到以下指標:
=========== 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 是通過對 NGC 的預訓練模型進行微調獲得的, NGC 最初是在開放圖像數據集的子集上進行訓練的。如果使用 ImageNet 預訓練權重進行訓練,或者使用更大的迭代次數進行訓練,則 KPI MIG 將有所不同。
驗證模型
現在您已經訓練了模型,運行推斷并驗證預測。要用 TLT 直觀地驗證模型,請使用 tlt-infer
命令。 tlt-infer
命令支持對. tlt 模型和 TensorRT 引擎的推理。 tlt-infer
生成帶有邊框的帶注釋圖像。或者,您還可以可視化分段掩碼或以 cocojson 格式序列化輸出元數據。例如,要使用. tlt 文件運行推理,請運行以下命令:
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 中所示的帶注釋圖像進行了比較。如您所見,該模型對與 COCO 訓練數據不同的圖像是魯棒的。


導出模型
推斷吞吐量和創建有效模型的速度是部署 深度學習 應用程序的兩個關鍵指標,因為它們直接影響上市時間和部署成本。 TLT 包括一個 tlt-export
命令,用于導出和準備 TLT 模型以進行部署。 tlt-export
命令可以選擇性地生成校準緩存,以便以 INT8 精度運行推斷。有關詳細信息,請參見 用 NVIDIA TensorRT 部署深度神經網絡 。
模型導出為. etlt (加密的 TLT )文件。文件可由 DeepStream 軟件開發工具包 使用,它解密模型并將其轉換為 TensorRT 引擎。導出模型將訓練過程與推理分離,并允許轉換到 TLT 環境外的 TensorRT 引擎。 TensorRT 引擎特定于每個硬件配置,應該為每個唯一的推理環境生成。
例如,要在 INT8 中導出模型,請使用以下命令:
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
這將生成一個 INT8 校準表和. etlt 文件。要將模型量化為 INT8 ,必須提供一個要在其上進行校準的數據集,該數據集由 --cal_image_dir
和 --cal_data_file
參數提供。這些參數指定校準所需的圖像目錄和 tensorfile 。 tensorfile 中的批處理數是從 batches
和 batch_size
值獲得的。確保 --cal_image_dir
中提到的目錄中至少有 (batch_size * batches)
個映像。
使用 DeepStream 部署
在 DeepStream 中集成 Mask R-CNN 模型很簡單,因為 DeepStream 5 . 0 默認支持實例分段網絡。 SDK 中提供了模型的配置文件和標簽文件。這些文件可以用于生成的模型以及您自己的訓練模型。在 GitHub 中提供了一個在一個類數據集上訓練的樣本掩碼 R-CNN 模型。默認情況下,配置和標簽文件應該適用于該模型。對于您在這篇文章中培訓的模型,需要進行一些小的修改。
從 正在下載 和 installing 啟動 DeepStream SDK 。自述文件中提供了使用 DeepStream 運行 TLT 模型的說明:
/opt/nvidia/deepstream/deepstream-5.0/samples/configs/tlt_pretrained_models
下面是運行 Mask R-CNN 模型的關鍵配置文件:
/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 應用程序使用的主要配置文件。此文件配置整個視頻分析管道的參數。有關詳細信息,請參見 引用應用程序配置 。有關 DeepStream 中 Mask R-CNN 推理管道的更多信息,請參見 使用 NVIDIA DeepStream 5 . 0 構建智能視頻分析應用程序(已為 GA 更新) 。
/config_infer_primary_mrcnn.txt
文件是一個推理配置文件,用于設置掩碼 R-CNN 推理的參數。此文件由主 deepstream_app_source1_mrcnn.txt
配置調用。以下是根據模型修改的關鍵參數:
tlt-model-key= tlt-encoded-model= labelfile-path= int8-calib-file= infer-dims= num-detected-classes=<# of classes if different than default>
下面是一個例子:
[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 中提供的剪輯上運行。要嘗試自己的源代碼,請在 /deepstream_app_source1_mrcnn.txt
中修改 [source0]
。
圖 4 顯示了在不同平臺上使用 deepstream-app
可以預期的端到端性能。性能以 deepstream-app
處理的每秒幀數( FPS )來衡量。
- 推理分辨率為 1344 × 832
- 在 NVIDIA Jetson Nano 和 DLAs 上,它的批處理大小為 1 。
- 在 Jetson AGX Xavier 和 Xavier NX 上,運行的批處理大小為 2 。
- 在 T4 上,它以批大小 4 運行。

結論
在這篇文章中,您學習了如何使用 maskr-CNN 架構和 TLT 訓練實例分割模型。這篇文章展示了使用 NGC 的一個預先訓練過的模型的開源 COCO 數據集,使用 TLT 進行訓練和優化,然后使用 deepstreamsdk 將模型部署到邊緣。
您可以應用這些步驟來訓練和部署您自己的自定義網絡。訓練可以在多個 GPUs 上進行,以并行運行并加快訓練速度。也可以生成 INT8 校準文件,以 INT8 精度運行推斷。以 INT8 精度運行可以提高邊緣設備的推理性能。
有關更多信息,請參閱以下資源:
- 遷移學習工具包 和預訓練車型
- DeepStream 軟件開發工具包
- 使用 NVIDIA DeepStream 5 . 0 構建智能視頻分析應用程序(已為 GA 更新) 項目
- TLT 開發者論壇 或 DeepStream 開發者論壇 用于提問或反饋
- Jetson 開發者社區項目 使用 TLT 和 DeepStream
?