• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    數據科學

    基于 NVIDIA 遷移學習工具箱的 Mask R-CNN 訓練實例分割模型

    ?

    為了將像素轉換為可操作的洞察力,計算機視覺依賴于 深度學習 來提供對環境的理解。目標檢測是一種常用的技術來識別幀中的單個對象,例如識別人或汽車。雖然對象檢測對于某些應用程序是有益的,但是當您希望在像素級理解對象時,它就不夠了。

    實例分割是一種流行的計算機視覺技術,它有助于在像素級識別幀中多個對象的每個實例。除了邊界框之外,實例分段還創建了一個細粒度的分段掩碼。分割有助于在對象和背景之間進行描繪,例如在 AI 驅動的綠色屏幕中,您希望模糊或更改幀的背景,或者分割幀中的道路或天空。或者你可能想在顯微鏡下找出制造缺陷或細胞核分割。圖 1 顯示了對檢測到的對象進行分段掩碼的示例。

    This image shows the bounding box and segmentation mask generated for the five cars detected on the streets.
    圖 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

    整個工作流包括以下步驟:

    1. 準備數據。
    2. 正在配置規范文件。
    3. 訓練模特。
    4. 驗證模型。
    5. 導出模型。
    6. 使用 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_configmaskrcnn_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: Truefreeze_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 訓練數據不同的圖像是魯棒的。

    This image shows a scene on the street with cars before we run the inference.
    圖 2 。原始圖像。
    This annotated image shows a scene on the street with cars with predicted bounding boxes and instance masks generated after we run the inference.
    圖 3 。原始圖像的注釋輸出:使用訓練模型進行推理。

    導出模型

    推斷吞吐量和創建有效模型的速度是部署 深度學習 應用程序的兩個關鍵指標,因為它們直接影響上市時間和部署成本。 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 中的批處理數是從 batchesbatch_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 運行。
    圖 4 。基于 DeepStream 的 Mask R-CNN 模型性能分析。

    結論

    在這篇文章中,您學習了如何使用 maskr-CNN 架構和 TLT 訓練實例分割模型。這篇文章展示了使用 NGC 的一個預先訓練過的模型的開源 COCO 數據集,使用 TLT 進行訓練和優化,然后使用 deepstreamsdk 將模型部署到邊緣。

    您可以應用這些步驟來訓練和部署您自己的自定義網絡。訓練可以在多個 GPUs 上進行,以并行運行并加快訓練速度。也可以生成 INT8 校準文件,以 INT8 精度運行推斷。以 INT8 精度運行可以提高邊緣設備的推理性能。

    有關更多信息,請參閱以下資源:

    ?

    +1

    標簽

    人人超碰97caoporen国产