0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何构建任何自定义掩码R-CNN模型

星星科技指导员 来源:NVIDIA 作者:Yu Wang 2022-04-28 14:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

为了将像素转换为可操作的洞察力,计算机视觉依赖于 深度学习 来提供对环境的理解。目标检测是一种常用的技术来识别帧中的单个对象,例如识别人或汽车。虽然对象检测对于某些应用程序是有益的,但是当您希望在像素级理解对象时,它就不够了。

实例分割是一种流行的计算机视觉技术,它有助于在像素级识别帧中多个对象的每个实例。除了边界框之外,实例分段还创建了一个细粒度的分段掩码。分割有助于在对象和背景之间进行描绘,例如在 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 运行。

图 4 基于 DeepStream 的 Mask R-CNN 模型性能分析。

结论

在这篇文章中,您学习了如何使用 maskr-CNN 架构和 TLT 训练实例分割模型。这篇文章展示了使用 NGC 的一个预先训练过的模型的开源 COCO 数据集,使用 TLT 进行训练和优化,然后使用 deepstreamsdk 将模型部署到边缘。

您可以应用这些步骤来训练和部署您自己的自定义网络。训练可以在多个 GPUs 上进行,以并行运行并加快训练速度。也可以生成 INT8 校准文件,以 INT8 精度运行推断。以 INT8 精度运行可以提高边缘设备的推理性能。

关于作者

Yu Wang 是智能视频分析团队的高级工程师,致力于创建深度学习管道/模型并将其部署到边缘。 2017 年加入 NVIDIA 之前,他在普渡大学电子与计算机工程学院获得博士学位。他的研究兴趣是图像处理、计算机视觉和深度学习。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4829

    浏览量

    106824
  • NVIDIA
    +关注

    关注

    14

    文章

    5496

    浏览量

    109116
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1094

    浏览量

    51209
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    强实时运动控制内核MotionRT750(九):内置C语言的自定义机械手模型实现

    内置C语言的自定义机械手模型实现。
    的头像 发表于 10-27 14:14 637次阅读
    强实时运动控制内核MotionRT750(九):内置C语言的<b class='flag-5'>自定义</b>机械手<b class='flag-5'>模型</b>实现

    请问K210可以同时加载几个自定义模型

    K210可以同时加载几个自定义模型
    发表于 07-18 06:20

    大彩讲堂:VisualTFT软件如何自定义圆形进度条

    VisualTFT软件如何自定义圆形进度条
    的头像 发表于 07-07 17:10 1233次阅读
    大彩讲堂:VisualTFT软件如何<b class='flag-5'>自定义</b>圆形进度条

    KiCad 中的自定义规则(KiCon 演讲)

    “  Seth Hillbrand 在 KiCon US 2025 上为大家介绍了 KiCad 的规则系统,并详细讲解了自定义规则的设计与实例。  ”   演讲主要围绕 加强 KiCad 中的自定义
    的头像 发表于 06-16 11:17 1497次阅读
    KiCad 中的<b class='flag-5'>自定义</b>规则(KiCon 演讲)

    HarmonyOS应用自定义键盘解决方案

    自定义键盘是一种替换系统默认键盘的解决方案,可实现键盘个性化交互。允许用户结合业务需求与操作习惯,对按键布局进行可视化重构、设置多功能组合键位,使输入更加便捷和舒适。在安全防护层面,自定义键盘可以
    的头像 发表于 06-05 14:19 1603次阅读

    如何使用自定义设置回调函数?

    你好,我正在尝试编写自己的自定义设置回调函数,并使用 fastEnum=false。 是否有任何代码示例或资料可供我参考? void CyU3PUsbRegisterSetupCallback
    发表于 05-21 06:11

    在IMX93自定义构建期间运行bitbake imx image full时遇到报错怎么解决?

    在 IMX93 自定义构建期间运行 bitbake imx image full 时,我们遇到错误。您能否尽早提供解决方案?我们使用的是 imx 6.6.52 版本。
    发表于 04-10 06:29

    LabVIEW运动控制(三):EtherCAT运动控制器的高效加工指令自定义封装

    LabVIEW高效加工指令自定义封装
    的头像 发表于 04-08 13:49 3278次阅读
    LabVIEW运动控制(三):EtherCAT运动控制器的高效加工指令<b class='flag-5'>自定义</b>封装

    如何添加自定义单板

    在开发过程中,用户有时需要创建自定义板配置。本节将通过一个实例讲解用户如何创建属于自己的machine,下面以g2l-test.conf为例进行说明。
    的头像 发表于 03-12 14:43 1096次阅读

    无法转换TF OD API掩码RPGA模型怎么办?

    无法转换重新训练的 TF OD API 掩码 RPGA 模型,该模型使用以下命令在 GPU 上工作: mo > --saved_model_dir
    发表于 03-06 06:44

    为什么无法将自定义EfficientDet模型从TensorFlow 2转换为中间表示(IR)?

    自定义 EfficientDet 模型从 TensorFlow* 2 转换 为 IR 时遇到错误: [ ERROR ] Exception occurred during running replacer \"REPLACEMENT_ID\" ()
    发表于 03-05 06:29

    如何快速创建用户自定义Board和App工程

    概述自HPM_SDKv1.7.0发布开始,在HPM_ENV中新增了user_template文件夹,以方便用户快速创建自定义的Board和App工程。user_template是用户模板工程,用户
    的头像 发表于 02-08 13:38 1007次阅读
    如何快速创建用户<b class='flag-5'>自定义</b>Board和App工程

    Altium Designer 15.0自定义元件设计

    电子发烧友网站提供《Altium Designer 15.0自定义元件设计.pdf》资料免费下载
    发表于 01-21 15:04 0次下载
    Altium Designer 15.0<b class='flag-5'>自定义</b>元件设计

    think-cell:自定义think-cell(四)

    C.5 设置默认议程幻灯片布局 think-cell 议程可以在演示文稿中使用特定的自定义布局来定义议程、位置和议程幻灯片上的其他形状,例如标题或图片。通过将此自定义布局添加到模板,您可以为整个组织
    的头像 发表于 01-13 10:37 886次阅读
    think-cell:<b class='flag-5'>自定义</b>think-cell(四)

    think-cell;自定义think-cell(一)

    本章介绍如何自定义 think-cell,即如何更改默认颜色和其他默认属性;这是通过 think-cell 的样式文件完成的,这些文件将在前四个部分中进行讨论。 第五部分 C.5 设置默认议程幻灯片
    的头像 发表于 01-08 11:31 1252次阅读
    think-cell;<b class='flag-5'>自定义</b>think-cell(一)