Mask R-CNN阅读笔记
这是应用maskrcnn参加的阿里举办的一个比赛,效果还可以,不过有人做的更好,工程链接:https://github.com/huaifeng1993/FashionAI_Key_Points_Detection
摘要: 作者基于Faster R-CNN提出一种灵活的网络结构–Mask R-CNN用于物体分割。这种网络结构只比Faster R-CNN多了一个输出物体mask的分支,而且容易训练和拓展到其它任务上例如人体姿态检测。下面是我们用mask做关键点检测的一个效果图。
1.Intrduction
物体检测和语义分割(semantic segmentation)发展很快,像用于物体检测的Fast/Faster R-CNN,和用于语义分割的FCN。这些方法在概念上直观并且具有灵活性和健壮性,以及快速训练和计算输出的特性。
物体分割比较有挑战性,因为它需要正确的检测到物体并且能够精确的分割图中的每一个物体。因此物体分割需要把计算机视觉的经典任务–物体检测结合进来,其目的是能够分清并用边界框定位每一个物体,同时语义分割的目的是把每个像素分为固定的类别而不用区分目标物体。如果要实现上述目的看起来挺复杂,而作者只通过简单的灵活快速的系统即可取得物体分割的state-of-the-art。
Mask R-CNN,通过在每个感兴趣区域(RoI)上添加一个预测分割掩模的分支,并与现有分支并行进行分类和边界框回归(图1),从而扩展Faster R-CNN。mask分支是在RoI应用小的FCN以pixel-to-pixel的方式预测分割mask。另外,mask分支只会增加一个小的计算开销,但能实现快速系统和快速实验。
原则上,Mask R-CNN是R-CNN的直观扩展,但正确构建mask分支对于获得好的结果至关重要。
最重要的是,Faster RCNN并非针对网络输入和输出之间的pixel-to-pixel alignment 而设计的。这点可以在attending to instances的核心操作–RoIPool中得到证明。RoIPool为特征提取执行粗略的空间量化。为了解决RoIPool错位问题,作者提出了一个简单的,无量化的层,称为RoIAlign,切实地保留了确切的空间位置。
RoIAlign 改动虽小,但是对mask分割的精度影响很大,可以改善10%-%50%。其次,作者发现解耦mask和class预测至关重要:作者预测每个类别的独立二进制掩码,而不需要在类别间进行竞争,并依靠网络的RoI分类分支来预测类别。与之相比的是,FCN通常执行每个像素多类别分类,其将分割和分类结合起来,但作者实验发现这种操作在分割的情况下效果不佳。
毫无意外,Mask R-CNN在COCO数据集的物体分割上取得了state-of-the-art。
最后,作者通过COCO关键点数据集上的人体姿态估计任务展示了我们框架的泛化性。通过将每个关键点视为0-1值的mask(one-hot binary mask),并进行最小限度的修改Mask R-CNN即可用于检测物体的特定姿势。
2.Related Work
R-CNN: 基于区域的卷积神经网络,用来做带边界框的物体检测,代表Faster R-CNN。
Instance Segmentation: 其它物体分割方法还行,但都有缺点,没“我”的好。
3.Mask R-CNN
Mask R-CNN概念简单:Faster R-CNN对于每个候选对象具有两个输出,一个类别标签和一个边界框(bounding-box)偏移;作者在此基础上添加了第三个分之用来输出物体的mask。但是不同与分类和b边界框(Faster R-CNN只做了粗略的空间量化),mask的输出需要更精确的物体空间布局。下面介绍MaskR-CNN的关键部分,也是Fast/Faster R-CNN缺失的一块—-像素到像素的对齐。
Faster R-CNN: Faster R-CNN由两阶段组成。第一节段为RPN,输出物体物体边界框的坐标。第二阶段本质上是Fast R-CNN ,使用每个候选框中的RoIPool提取特征,并执行分类和边界框回归。两个阶段使用的特征可以共享以加快推断速度。
Mask R-CNN: Mask R-CNN第一阶段(RPN)与Faster R-CNN相同。第二阶段在输出类别和框偏移的同时也对每个RoI输出一个二值Mask。这与其它大多数方法形成了鲜明对比,作者的方法遵循Fast R-CNN 的精神,Fast R-CNN采用边界框分类和回归并行的方法。
在训练期间,作者把每个抽样的RoI的多任务损失函数定义为
L=Lcls+Lbox+Lmask
L
=
L
c
l
s
+
L
b
o
x
+
L
m
a
s
k
. 分类损失函数
Lcls
L
c
l
s
和边界框损失函数
Lbox
L
b
o
x
和《FAST R-CNN》 中定义的一样。对于每个RoI mask分支有
Km2
K
m
2
维度输出,m×m像素的k个二值mask,K个类别的每一个类对应一个mask。为此,对每个像素应用sigmoid函数,并将
Lmask
L
m
a
s
k
定义二值交叉熵损失的均值。 对于与gorund-turth类别k相关的RoI,
Lmask
L
m
a
s
k
仅在第k个mask上定义(其他mask输出不会造成损失)。
作者使用的
Lmask
L
m
a
s
k
允许网络为每一个类别生成mask而不用与其他类别之间相竞争。依靠专用的分类分支来产生用于选择输出mask类别的标签。这样可以将mask和类别的预测分开进行。这与将FCN 应用于语义分割时的常见做法不同,FCN通常对每像素进行softmax分类和多项叉熵损失。FCN那种处理方法下,会出现跨类别竞争;而在作者使用的方法中,对每个像素使用sigmoid函数和binary loss,不会出现上述情况。
具体而言,我们使用FCN预测来自每个RoI的m×m mask。这允许mask分支中的每个层保持明确的m×m对象空间布局,而不将其折叠成缺少空间维度信息的向量表示。使用这种方法可以使预测mask分支的参数更少,并且更准确。
RoIAlign: RoIPool是一个从RoI提取小特征图的标准操作。RoIPool首先把浮点数RoI量化(浮点数取整?),然后通常使用最大池将任何有效感兴趣区域内的特征转换为具有固定空间范围H×W(例如7×7)的小特征图,其中H和W是层超参数独立于任何特定的RoI。每个RoI由四元组(r,c,h,w)定义,该四元组指定其左上角(r,c)及其高度和宽度(h,w)。通过将h×wRou窗口划分为近似大小为h / H×w / W(对浮点数进行舍入)的子窗口的H×W网格,然后将每个子窗口中的最大值化为对应的输出网格单元。在RoIPool过程中执行的量化操作导致RoI和提取特征之间有误差,这个误差或许不会影响分类,但是对预测像素级的mask会有很大的负面影响。
为了解决上述问题,作者构建了RoIAlign层,此改动虽然简单,但避免RoIPool中粗略的量化(取整操作),使提取的特征与输入的图片对齐。与Faster RCNN相比,作者避免了量化操作,并且引入了双线性插值法来计算每个采样点的值。如下图所示,虚线网格表示ffeatrue map,实线表示一个2×2单元的RoI,其中的点表示每个单元中的四个采样点。每个采样点是由RoIAlign通过feature map附近的4个点通过双线性插值计算得来。
Network Architecture:
作者把各种网络作为backbone进行对比,发现使用ResNet-FPN作为特征提取的backbone具有更高的精度和更快的运行速度。
而头部结构则像前文提出的一样,添加了一个全卷积网络来预测mask的分支,如图1。
3.1. Implementation Details
超参数的设置作者遵循Fast/Faster R-CNN所设置的参数。尽管这些参数在原论文中是为了物体检测而设置,但是在物体分割系统中同样适用。
Training:
与Fast R-CNN一样,如果RoI与gt-box的IoU大于0.5则认为此RoI为正样本否则为负样本。mask 损失
Lmask
L
m
a
s
k
只基于正样本的RoI计算。
图像被resized从而使短边为800像素,每个mini-batchGPU处理两张图片,每张图片产生N个RoI,其正负样本比例为1:3。使用C4作为backbone,N为64,使用FPN作为backbone则N为512。作者在8个GPU上进行训练所以batch大小为16,学习率在120k迭代次数之前设置为0.02,之后降10倍。权重衰减率为0.0001冲量设为0.9.在ResNeXt上,每个GPU处理一张图片,学习率初始设为0.01。
Inference: 在测试时,对于C4 backbone ,候选区域数量为300对于FPN为backbone 候选区数量为1000。作者使用非极大值抑制在这些候选区域上进行box预测。mask 分之则在得分最高的100个boxes上进行。虽然这与训练中使用的并行计算不同,但它加快了推理速度并提高了准确性(由于使用了更少,更准确的RoI)。在每一个RoI上mask分支输出K个mask,但作者只使用地k个mask其中k是分类分支预测的类别。然后把为m×m大小为浮点数mask调整为RoI的大小,并以0.5为分界点进行二值化处理。
4.实验结果
4.1 Main Results
(⊙v⊙)嗯。。。很好,各种state-of-the-art。
5.Mask R-CNN for Human pose Estimation
此框架很容易用来做人体姿态估计。作者将关键点的位置建模为一个单独的one-hot mask,并采用Mask R-CNN预测K个mask,每个K个关键点类型(例如,左肩,右肘)都有一个mask。
Implementation Details: 作者在为关键点任务对分割系统进行了细微的修改。对于一个实例的K个关键点,训练目标是一个热点m×m二进制掩码,其中只有一个像素标记为前景(一个关键点对应一个mask,mask中只有关键点的位置设置为1其它设置为0)。在训练期间,对于一个gt-keypoint,对m×m个点采用softmax进行输出,并采用交叉熵损失函数。
关键点head由8个3×3 512-d的conv层组成,其后是deconv层和2× bilinear upscaling,产生56×56的输出分辨率。与掩模相比对于关键点级别的定位精度需要相对较高的分辨率输出。
emm…..水平有限,如有错误望批评指正。