蔡不菜和他的uU们

  • 首页
  • 字贴生成器
  • cC' nav
  • 新鲜出炉
  • 我的记录
  • 我的动态
  • 我和uU
  • 好用分享
  • 关于与留言
志合者,不以山海为远;道乖者,不以咫尺为近
  1. 首页
  2. 新鲜出炉
  3. 正文

搞清mask分支,Mask R-CNN 论文阅读与代码理解

2023年8月6日 125人阅读 0人点赞 0条评论 最后更新:2023年8月6日

Abstract

mask rcnn 是在 Faster r-cnn 基础上增加了一个 mask预测分支,因此被命名

检测速度大概 在 5fps

mask rcnn 也适用于其他任务,如人体姿态估计

Introduction

视觉社区在很短的时间内,对目标检测和语义分割的结果进行了迅速改进。

在很大程度上,这些进步是由强大的 baseline system 驱动的,例如,Fast/Faster R-CNN 和 FCN 分别用于物体检测和语义分割。这些方法在概念上是直观的,并提供了灵活性和稳健性,同时还有快速的训练和推理时间。我们在这项工作中的目标是开发一个具有可比性的框架,以实现实例分割。

实例分割是具有挑战性的,因为他不仅需要正确的检测出图片中的目标,还要精准地分割每一个实例。它结合了 目标检测(对单个目标进行分类,并使用边界框对每个对象进行定位)和语义分割(目标是将每个像素分类到一组固定地类别,没有区分物体的实例)

我们的方法被称为Mask R-CNN,通过增加一个预测分割掩码的分支来扩展Faster R-CNN[29],每个感兴趣的区域(RoI),与现有的用于分类和边界盒回归的分支并行(图1)。掩码分支是一个应用于每个RoI的小型FCN,以像素对像素的方式预测一个分割掩码。考虑到Faster R-CNN框架,Mask R-CNN的实现和训练都很简单,这有利于广泛的灵活架构设计。此外,掩码分支只增加了少量的计算开销,使快速系统和快速实验成为可能。

原则上,Mask R-CNN是Faster R-CNN的一个直观的扩展,然而正确地构建掩码分支对于良好的结果至关重要。最重要的是,Faster R-CNN不是为网络工作输入和输出之间的像素对齐而设计的。这一点在RoIPool 中最为明显,它是关注实例的事实上的核心操作,为特征提取进行粗略的空间量化。为了解决错位问题,我们提出了一个简单的、无量化的层,称为RoIAlign,忠实地保留了精确的空间位置。【对齐特征层,并对特征层进行 精细地 裁剪 resize】

尽管似乎是一个很小地改变,但 RoIAlign 却影响巨大,将 mask 地准确率相对提升了10%到 50%,在严格地定位指标下 显示出更大的收益

其次,作者认为 将类别预测和掩码预测 进行解耦 十分重要:mask rcnn 为每一个类别独立预测一个二进制掩码,类别之间没有竞争,依靠 RoIclassification 分支来预测类别。相比之下,FCN 通常进行逐像素的多类分类,这种分割于分类相结合,从我们的实验来看,实例分割的效果很差

mask rcnn 每帧 200ms 在一块 GPU上,训练 COCO 任务 在一个 8GPU的服务器上用了1-2天

mask rcnn 还进行了 coco的关键点任务

Related Work

R-CNN:基于区域的CNN 方法,用于对边界框目标检测,关注一定可管理数目的候选目标区域,然后在每一个个ROI上独立进行 卷积网络评估。R-CNN被扩展允许对特征图上ROI使用ROIpool,提高了速度和精度。Faster r-cnn 通过 区域提议网络 RPN 注意力机制,推进了这一进程。Faster R-CNN 是灵活和鲁棒行的,对于之后的许多改进,是目前几个基准中领先的框架

Instance Segmentation,受到R-CNN高效性的驱动,许多用于实例分割的方法基于 segment proposal,【举例子。。。。】

最近,Li等,将 segment proposal 系统和目标检测系统 结合在 fully convolution instance segmentation FCIS 中。共同的思想是 【完全卷积地预测一组位置敏感地输出通道,这些通道可以同时处理物体类别,边界框,mask,使得系统快速】。但是 FCIS 在 重叠地实例上表现出系统错误,并产生了虚假地边,表明它受到了实例分割地基础行困难

Mask R-CNN

Mask R-CNN 在概念上很简单。Faster R-CNN对每个候选对象都有两个输出,一个类标签和一个bounding-box offset;为此我们增加了第三个分支,输出对象掩码。因此,Mask R-CNN是一个自然和直观的想法。但是,额外的掩码输出与类别和边界框输出不同,需要提取物体的更多精细的空间布局。接下来,我们介绍Mask R-CNN的关键元素,包括像素到像素的对齐,这是Fast/Faster R-CNN的主要缺失部分。

Faster R-CNN,简单回顾一下 Faster R-CNN,其由两部分组成。第一阶段,区域提议网络 RPN,提取 候选的物体边界框。第二阶段,实质上是 Faster R-CNN 使用 ROIPool 从每一个候选框中提取特征,并进行分类和边界框回归。被两个阶段使用的特征可以被共享 用于更快的推断。

Mask R-CNN ,采用了相同的两阶段,第一阶段是相同的 RPN 网络,在第二阶段,在预测类别和box offset 的同时,Mask R-CNN 也输出一个 二值的 mask 为每一个 ROI。 这和大多数最近胸痛相反,他们的分类依靠 mask 预测。我们的方法 遵循 Faster R-CNN的 精神,即并行应用边界框分类和回归,其证明 很大程度上简化了 原始 R-CNN的多阶段 pipeline

形式上,我们定义了一个多任务损失 在每一个 ROI上

$L = L{cls}+L{box}+L_{mask}$


mask 分支 针对每一个 ROI 都有 Km^2 维度的输出 ,编码 K个 mxm 的mask ,每一个是k个类别之一,对此,我们应用了一个 逐 像素的 sigmoid,并且 定义 mask loss 为 平均 二分类损失。对于一个ROI 关联的 真实类别 k, mask loss 只定义在 第k个 mask 上 (其他 mask 输出不贡献损失)【也就是 每一个 ROI 真实类别 的 mask 与 预测 的对应真实类别的 mask 进行损失计算,预测的其他类别的 mask 不参与计算】

我们对mask loss的定义允许网络为每个类别生成mask,而不需要在类别之间进行竞争;我们依靠专门的分类分支来预测用于选择输出掩码的类别标签。解耦掩码和类别预测。这与将FCN应用于语义分割时的常见做法不同,后者通常使用per pixel sigmoid 和一个 multinomial cross-entropy损失。在这种情况下,不同类别的掩码会相互竞争;在我们的案例中,对于每像素的sigmoid 和一个 binary loss,它们不会。我们通过实验表明,这种形式化是获得良好实例分割结果的关键。

Mask Representation:一个mask 编码一个输入物体的空间布局。因此,不像 被 全连接层 不可避免 折叠成短的 输出向量的 类别标签 或者 边界框偏移, 可以通过卷积提供的像素对像素的关系自然解决

具体来说,我们使用FCN从每个RoI预测一个m×m 的mask。这使得掩码分支中的每一层都能保持明确的m×m 目标空间布局,而不需要将其折叠成缺乏空间维度的向量表示。与之前借助fc layers进行掩膜预测的方法不同,我们的全卷积表示法需要更少的参数,而且更准确,正如实验所证明的那样。

这种像素到像素的行为要求我们的RoI特征(本身就是小的特征图)能够很好地对齐,以忠实地保留明确的每像素空间对应关系。这促使我们开发了以下RoIAlign 层,它在掩码预测中起着关键作用。


ROIAlign,RoIPool是一个标准操作,用于从每个RoI中提取一个小的特征图(例如7×7)。RoIPool首先将float的RoI量化为特征图的离散粒度,然后将这个量化的RoI细分为本身被量化的空间bin,最后将每个bin覆盖的特征值汇总(通常通过最大集合)。量化是通过计算[x/16]在一个连续的坐标x上进行的,其中16是一个特征图的跨度,[/]是四舍五入 【也就是说将一个浮点数 变成了一个整数 】;同样,量化是在划分为bin时进行的(例如,7×7)。这些量化在RoI和提取的特征之间引入了错位。虽然这可能不会影响到对小平移具有鲁棒性的分类,但它对预测 像素精确的掩码有很大的负面影响。

为了解决这个问题,我们提出了一个RoIAlign 层,它重新移动了RoIPool的苛刻量化,使提取的特征与输入正确对齐。我们建议的变化很简单:我们避免对RoI边界或bin进行任何量化(即我们使用x/16而不是[x/16] 【没有把浮点数 变成 整数】)。我们使用双线性插值[18]来计算每个RoI bin中四个有规律采样的位置 的输入特征的精确值,并将结果汇总(使用最大或平均)。【使用双线性插值来 对 bin 中选取的 四个 位置 计算特征精确值,再用 平均或者取最大 来得到 bin 中的精确的输入特征值】

image-20230806151146085

RoIAlign导致了很大的改进。我们还与[7]中提出的RoIWarp操作进行了比较。与RoIAlign不同,RoIWarp忽略了对齐问题,在[7]中被实现为像RoIPool一样对RoI进行量化。因此,尽管RoIWarp也采用了由[18]激发的双线性重采样,但它的表现与RoIPool相当,正如实验所显示的那样(更多细节见表 2c),证明了对齐的关键作用。

Network Architecture : 为了证明我们方法的通用性,我们将Mask R-CNN 实例化为多架构。为了清楚起见,我们区分了:(1)用于对整个图像进行特征提取的卷积骨架,以及(2)分别应用于每个RoI的边界盒识别(分类和回归)和掩码预测的网络头。

使用了不同的 backbone:resnet-50,resnet-101,resnext-50,resnext-101;

使用了不同的 head Architecture:Faster RCNN使用resnet50时,从Block 4导出特征供RPN使用,这种叫做ResNet-50-C4

作者使用除了使用上述这些结构外,还使用了一种更加高效的backbone:FPN(特征金字塔网络)

对于网络头,我们严格遵循以前工作中提出的架构,其中我们增加了一个完全卷积的掩码预测分支。具体来说,我们对ResNet[15]和FPN[22]论文中的Faster R-CNN盒头进行了扩展。详情见图3。ResNet-C4骨干网的头部包括ResNet的第5阶段(即9层的Latherres5推理[15]),这是计算密集型的。对于FPN,骨干网已经包括了res5,因此可以得到一个更有效的头,使用更少的过滤器。

我们注意到,我们的掩码分支有一个straight forward 直接的结构。更复杂的设计有可能提高性能,但不是这项工作的重点。

Implementation details

我们按照现有的Fast/FasterR-CNN工作[9,29,22]设置超参数。尽管这些决定是在原始论文[9,29,22]中为物体检测做出的,但我们发现我们的实例分割系统对它们是稳健的。

training :与快速R-CNN一样,如果一个RoI的IoU与ground truth 框至少为0.5,则被认为是积极的,否则就是消极的。掩码损失loss mask只定义在阳性RoI上。掩码目标是RoI和其相关的地面真实掩码之间的交集。

我们采用以图像为中心的训练[9]。图像被调整大小,使其比例(短边缘)为800像素[22]。每个mini-batch每个GPU有2张图像,每张图像有N个采样的RoI,阳性与阴性的比例为1:3

C4骨干网的N 是 64和 FPN 是 512。我们在8个GPU上训练(所以有效的 ,mini-batch为16),进行16万次迭代,学习率为0.02,在12万次迭代时减少10。我们使用0.0001的权重衰减和0.9的动量。

RPN 锚 跨越 5个尺度和3个长宽比。为了方便消融实验,RPN是单独训练的,不与Mask R-CNN共享特征,不明确。对于本文中的每个entry,RPN 和Mask R-CNN都有相同的骨干,因此它们是可共享的。

Inference :在测试时,C4骨干网的 proposal number 为300,FPN为1000 。我们在这些建议区域上运行box预测分支,然后进行非最大抑制[11]。然后,mask分支被应用于得分最高的100个检测盒。尽管这与训练中使用的并行计算不同,但它加快了推理速度并提高了准确性(由于使用了更少、更准确的RoI)。mask分支可以预测每个RoI的k个mask,但我们只使用第k个mask,即分类分支预测的类别。然后,m×m floating-number mask 输出被调整为RoI大小,并以0.5的门槛进行二进制化。

注意,由于我们只在前100个检测框上计算掩码,Mask R-CNN对其Faster R-CNN counterpart(例如,在典型模型上∼20%)增加了少量开销。

Experiments: Instance Segmentation

Mask R-CNN for Human Pose Estimation

略

Mask head 代码

Mask R-cnn 的 mask 分支【代码来源于 mmdetection】

# mask head config
mask_head=dict(
            type='FCNMaskHead',
            num_convs=4,
            in_channels=256,
            conv_out_channels=256,
            num_classes=80,
            loss_mask=dict(
                type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))

# mask head forward()
for conv in self.convs:
    x = conv(x)
if self.upsample is not None:
    x = self.upsample(x)
    if self.upsample_method == 'deconv':
        x = self.relu(x)
mask_preds = self.conv_logits(x)
return mask_preds

在 mask 分支上 仍然是 进行多次卷积,然后进行一次上采样,【到这里依然是特征图】最后得到 各个类的mask 是将特征图 送入一个 conv_logits() 函数得到

logits是指未归一化的对数概率。也就是说,logits是一个向量,它的每个元素表示某个类别的对数概率,但是这些元素的和不一定等于1。通常,logits会作为输入传给一个归一化函数,比如softmax函数,来得到每个类别的概率。

self.conv_logits = build_conv_layer(self.predictor_cfg,                                       logits_in_channel, out_channels, 1)
# self.conv_logits = build_conv_layer('Conv',                                       logits_in_channel, out_channels, 1)

可以看到,conv_logits 也是一个 卷积层,参数为 输入的 通道数,输出通道数,1 应该为卷积核 size

标签: 暂无
最后更新:2023年8月6日

Csy

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复
文章目录
  • Abstract
  • Introduction
  • Related Work
  • Mask R-CNN
    • Implementation details
  • Experiments: Instance Segmentation
  • Mask R-CNN for Human Pose Estimation
  • Mask head 代码

COPYRIGHT © 2021 caibucai.top. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

豫ICP备2021018055号