Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mask-RCNN详解

Mask-RCNN详解

作者头像
h3110_w0r1d
发布于 2025-02-04 02:25:24
发布于 2025-02-04 02:25:24
20600
代码可运行
举报
运行总次数:0
代码可运行

ROI Pooling 和 ROI Align 的区别

Understanding Region of Interest — (RoI Align and RoI Warp)

Mask R-CNN 网络结构

Mask RCNN 继承自 Faster RCNN 主要有三个改进:

  • feature map 的提取采用了 FPN 的多尺度特征网络
  • ROI Pooling 改进为 ROI Align
  • RPN 后面,增加了采用 FCN 结构的 mask 分割分支

网络结构如下图所示:

可以看出,Mask RCNN 是一种先检测物体,再分割的思路,简单直接,在建模上也更有利于网络的学习。

骨干网络 FPN

卷积网络的一个重要特征:深层网络容易响应语义特征,浅层网络容易响应图像特征。Mask RCNN 的使用了 ResNetFPN 结合的网络作为特征提取器。

FPN 的代码出现在 ./mrcnn/model.py中,核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if callable(config.BACKBONE):
    _, C2, C3, C4, C5 = config.BACKBONE(input_image, stage5=True,
                                        train_bn=config.TRAIN_BN)
else:
    _, C2, C3, C4, C5 = resnet_graph(input_image, config.BACKBONE,
                                        stage5=True, train_bn=config.TRAIN_BN)
# Top-down Layers
# TODO: add assert to varify feature map sizes match what's in config
P5 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c5p5')(C5)
P4 = KL.Add(name="fpn_p4add")([
    KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5),
    KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c4p4')(C4)])
P3 = KL.Add(name="fpn_p3add")([
    KL.UpSampling2D(size=(2, 2), name="fpn_p4upsampled")(P4),
    KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c3p3')(C3)])
P2 = KL.Add(name="fpn_p2add")([
    KL.UpSampling2D(size=(2, 2), name="fpn_p3upsampled")(P3),
    KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c2p2')(C2)])
# Attach 3x3 conv to all P layers to get the final feature maps.
P2 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding="SAME", name="fpn_p2")(P2)
P3 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding="SAME", name="fpn_p3")(P3)
P4 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding="SAME", name="fpn_p4")(P4)
P5 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding="SAME", name="fpn_p5")(P5)
# P6 is used for the 5th anchor scale in RPN. Generated by
# subsampling from P5 with stride of 2.
P6 = KL.MaxPooling2D(pool_size=(1, 1), strides=2, name="fpn_p6")(P5)

# Note that P6 is used in RPN, but not in the classifier heads.
rpn_feature_maps = [P2, P3, P4, P5, P6]
mrcnn_feature_maps = [P2, P3, P4, P5]

其中 resnet_graph 函数定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def resnet_graph(input_image, architecture, stage5=False, train_bn=True):
    """Build a ResNet graph.
        architecture: Can be resnet50 or resnet101
        stage5: Boolean. If False, stage5 of the network is not created
        train_bn: Boolean. Train or freeze Batch Norm layers
    """
    assert architecture in ["resnet50", "resnet101"]
    # Stage 1
    x = KL.ZeroPadding2D((3, 3))(input_image)
    x = KL.Conv2D(64, (7, 7), strides=(2, 2), name='conv1', use_bias=True)(x)
    x = BatchNorm(name='bn_conv1')(x, training=train_bn)
    x = KL.Activation('relu')(x)
    C1 = x = KL.MaxPooling2D((3, 3), strides=(2, 2), padding="same")(x)
    # Stage 2
    x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1), train_bn=train_bn)
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='b', train_bn=train_bn)
    C2 = x = identity_block(x, 3, [64, 64, 256], stage=2, block='c', train_bn=train_bn)
    # Stage 3
    x = conv_block(x, 3, [128, 128, 512], stage=3, block='a', train_bn=train_bn)
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='b', train_bn=train_bn)
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='c', train_bn=train_bn)
    C3 = x = identity_block(x, 3, [128, 128, 512], stage=3, block='d', train_bn=train_bn)
    # Stage 4
    x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a', train_bn=train_bn)
    block_count = {"resnet50": 5, "resnet101": 22}[architecture]
    for i in range(block_count):
        x = identity_block(x, 3, [256, 256, 1024], stage=4, block=chr(98 + i), train_bn=train_bn)
    C4 = x
    # Stage 5
    if stage5:
        x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a', train_bn=train_bn)
        x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b', train_bn=train_bn)
        C5 = x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c', train_bn=train_bn)
    else:
        C5 = None
    return [C1, C2, C3, C4, C5]

anchor 锚框生成规则

在 Faster-RCNN 中可以将 SCALE 也可以设置为多个值,而在 Mask RCNN 中则是每一特征层只对应着一个SCALE 即对应着上述所设置的 16。

实验

何凯明在论文中做了很多对比单个模块试验,并放出了对比结果表格。

从上图表格可以看出:

  • sigmoidsoftmax 对比,sigmoid 有不小提升;
  • 特征网络选择:可以看出更深的网络和采用 FPN 的实验效果更好,可能因为 FPN 综合考虑了不同尺寸的 feature map 的信息,因此能够把握一些更精细的细节。
  • RoI AlignRoI Pooling 对比:在 instance segmentation 和 object detection 上都有不小的提升。这样看来,RoIAlign 其实就是一个更加精准的 RoIPooling,把前者放到 Faster RCNN 中,对结果的提升应该也会有帮助。

参考资料

Mask R-CNN 论文

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【从零开始学Mask RCNN】三,Mask RCNN网络架构解析及TensorFlow和Keras的交互
上一节把握了一下Mask RCNN项目的整体逻辑,这一节主要从TensorFlow和Keras的交互以及Mask RCNN的网络结构入手来分析一下。
BBuf
2020/07/02
1.8K0
Maskrcnn中resnet50改为resnet34「建议收藏」
找到很多关于maskrcnn具体用法的代码,但是全是基于resnet50/101的,因需要训练的数据集并不复杂,resnet50的结构有点冗余,于是就把maskrcnn的backbone从resnet50改为resnet34结构。 找到model文件,将resnet50(侵删)部分代码做一定的修改,就可以得到resnet34的相关代码 下面是相关代码:
全栈程序员站长
2022/11/08
4910
【目标检测系列】CNN中的目标多尺度处理方法
【导读】本篇博文我们一起来讨论总结一下目标检测任务中用来处理目标多尺度的一些算法。视觉任务中处理目标多尺度主要分为两大类:
深度学习技术前沿公众号博主
2020/06/10
1.9K0
【目标检测系列】CNN中的目标多尺度处理方法
目标检测算法之FPN(附FPN代码实现)
针对小目标检测网络,CV领域一般用的是特征金字塔。即将原图以不同的比例采样,然后得到不同分辨率的图像进行训练和测试,在多数情况下是有效的。但是特征金字塔的计算、内存和时间开销都非常大,导致在工程中应用是及其困难。FPN(即特征金字塔)提出了一个独特的特征金字塔网络来避免图像金字塔产生的超高计算量,同时可以较好的处理目标检测中的尺度变化问题,对于小目标检测具有很强的鲁棒性。
墨明棋妙27
2022/09/23
9320
如何使用MaskRCNN模型进行图像实体分割
目标检测是计算机视觉和模式识别的重要研究方向,主要是确定图像中是否有感兴趣的目标存在,并对其进行探测和精确定位。传统的目标检测流程采用滑动窗口进行区域选择,然后采用 SIFT、HOG 等方法进行特征提取,最后采用 SVM、Adaboost 进行类别判断。但是传统的目标检测方法面临的主要问题有:特征提取鲁棒性差,不能反应光照变化、背景多样等情况;区域选择没有针对性,时间复杂度高,窗口冗余。基于深度学习的目标检测模型有 Faster RCNN,Yolo 和 Yolo2,SSD 等,对图片中的物体进行目标检测的应用示例如下所示:
啦啦啦
2018/11/20
3.1K0
如何使用MaskRCNN模型进行图像实体分割
FPN论文阅读笔记
FPN(feature pyramid networks) 是何凯明等作者提出的适用于多尺度目标检测算法。原来多数的 object detection 算法(比如 faster rcnn)都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。
嵌入式视觉
2022/09/05
5060
FPN论文阅读笔记
mask scoring rcnn_faster rcnn详解
对应着图像中的CNN部分,其对输入进来的图片有尺寸要求,需要可以整除2的6次方。在进行特征提取后,利用长宽压缩了两次、三次、四次、五次的特征层来进行特征金字塔结构的构造。Mask-RCNN使用Resnet101作为主干特征提取网络
全栈程序员站长
2022/11/10
3520
mask scoring rcnn_faster rcnn详解
『深度概念』原理图解代码FPN Feature Pyramid Networks
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
小宋是呢
2019/12/02
2.5K0
FPN(特征图金字塔网络)理论基础与具体实现
论文地址:Feature Pyramid Networks for Object Detection
全栈程序员站长
2022/09/06
1.2K0
FPN(特征图金字塔网络)理论基础与具体实现
涨分利器!攻克目标检测难点秘籍之多尺度检测
在前面的秘籍一:模型加速之轻量化网络和秘籍二:非极大抑制算法和回归损失优化之路中,我们主要关注了轻量化网络,非极大值抑制算法、回归损失优化。但是要想获得较好的检测性能,检测算法的多尺度检测也极为重要。
BBuf
2020/02/21
1.3K0
涨分利器!攻克目标检测难点秘籍之多尺度检测
Mask-RCNN最详细解读
最近在做一个目标检测项目,用到了Mask RCNN。我仅仅用了50张训练照片,训练了1000步之后进行测试,发现效果好得令人称奇。就这个任务,很久之前用yolo v1训练则很难收敛。不过把它们拿来比当然不公平,但我更想说的是,mask RCNN效果真的很好。
小草AI
2019/06/02
10.5K1
目标检测 | 盘点目标检测中的特征融合技巧(根据YOLO v4总结)
在深度学习的很多工作中(例如目标检测、图像分割),融合不同尺度的特征是提高性能的一个重要手段。低层特征分辨率更高,包含更多位置、细节信息,但是由于经过的卷积更少,其语义性更低,噪声更多。高层特征具有更强的语义信息,但是分辨率很低,对细节的感知能力较差。如何将两者高效融合,取其长处,弃之糟泊,是改善分割模型的关键。
AI算法修炼营
2020/05/22
3.4K0
keras TensorFlow_tensorflow 安装
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
8660
目标检测算法综述之FPN优化篇
目标检测(Object Detection)的任务是找出图像或视频中的感兴趣目标,同时实现输出检测目标的位置和类别信息,是计算机视觉领域的核心问题之一。随着2012年ImageNet兴起的CNN,目标测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术。在网络结构的设计上,从 two stage 到 one stage,从 bottom-up only 到 Top-Down,从 single scale network 到 feature pyramid network,各路大仙在backbone和特征提取、损失函数、NMS[1]、Anchor生成(free or no free)、IoU设计等各个环节分析短板,不断提高目标检测的性能。
SIGAI学习与实践平台
2019/05/07
4.7K0
目标检测算法综述之FPN优化篇
特征金字塔特征用于目标检测
前言: 这篇文章主要使用特征金字塔网络来融合多层特征,改进了CNN特征提取。作者也在流行的Fast&Faster R-CNN上进行了实验,在COCO数据集上测试的结果现在排名第一,其中隐含的说明了其在小目标检测上取得了很大的进步。其实整体思想比较简单,但是实验部分非常详细和充分。 摘要: 特征金字塔是多尺度目标检测系统中的一个基本组成部分。近年来深度学习目标检测特意回避金字塔特征表示,因为特征金字塔在计算量和内存上很昂贵。所以作者利用了深度卷积神经网络固有的多尺度、多层级的金字塔结构去构建特征金字塔网络。
计算机视觉研究院
2018/04/17
1.8K0
特征金字塔特征用于目标检测
目标检测之FPN网络详解
特征图金字塔网络FPN(Feature Pyramid Networks)是2017年提出的一种网络,FPN主要解决的是物体检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小物体检测的性能。
小白学视觉
2022/02/14
2.6K0
目标检测之FPN网络详解
目标检测FPN
《Feature Pyramid Networks for Object Detection》这篇文章主要是用来解决Faster RCNN物体检测算法在处理多尺度变化问题时的不足。Faster RCNN中无论是RPN网络还是Fast RCNN网络,都是基于单个高层特征。这种做法一个明显的缺陷是对小物体不友好。为了处理小物体,经典的方式是采用图像金字塔的方式在训练或测试阶段对图片进行多尺度变化增强,但是这样带来了极大的计算量。本文方法通过构造一种独特的特征金字塔来避免图像金字塔的计算量过高的问题,同时能较好的处理物体检测中的多尺度变化问题。
SIGAI学习与实践平台
2019/04/26
1.7K0
目标检测FPN
FPN总结[通俗易懂]
经典的two stage检测网络有:faster RCNN和SSD,它们用于做bbox regression的模型各有不同,faster RCNN是VGG,feature map经过不断地下采样,最后的feature map送入RPN层,这样不断地下采样使得小检测框的像素非常小,无法进行训练的到,得到很好的结果。而SSD则是分别对不同尺寸的feature map进行bbox regression,这就导致尺寸较大的feature map没有高级语义,对于全局语义没有很好地提取,无法判断出物体的位置和大小,同样对小检测框没有很好的检测效果。FPN则解决了这个问题。
全栈程序员站长
2022/08/15
9050
FPN总结[通俗易懂]
Build Residual Networks
我们将使用残差网络建立一个很深的卷积神经网络,理论上而言越深的网络可以表示更加复杂的函数,但是训练也更加困难。Residual Networks可以让我们训练更深的网络。
小飞侠xp
2018/08/29
1.1K0
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(二)
 机器之心专栏 本专栏由机器之心SOTA!模型资源站出品,每周日于机器之心公众号持续更新。 本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过 SOTA 的经典模型逐一详解。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。 本文将分 3 期进行连载,共介绍 17 个在目标检测任务上曾取得 SOTA 的经典模型。 第 1 期:R-CNN、SPP-Net、Fast R-CNN、Faster R-C
机器之心
2023/03/29
1.3K0
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(二)
相关推荐
【从零开始学Mask RCNN】三,Mask RCNN网络架构解析及TensorFlow和Keras的交互
更多 >
LV.1
曲阜师范大学
作者相关精选
加入讨论
的问答专区 >
1先锋会员擅长2个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验