参考文章:链接在这里!
前言
Tip:Mask R-CNN是在Faster R-CNN的基础上进行了改进。(roi pooling 换为了roi align层)
一、Mask R-CNN结构
mask rcnn是一个实例分割框架,对faster rcnn进行改进,增加了一个分支用于分割。实例分割要找到目标并对其进行分割,是目标检测和语义分割的结合。
模型结构:
灰色部分:
Faster RCNN 结合 ResNet or FPN 的网络,黑色部分:新添加的并联 Mask层,泛化能力强。
网络结构:
Fater R-CNN with ResNet/ResNeXt:使用resnet-c4作为前面的卷积网络,将rpn生成的roi映射到C4的输出,并进行roi pooling,最后进行分叉预测三个目标。
faster rcnn with FPN。
作为特征提取器。底层检测的是低级特征(边缘和角等),较高层检测的是更高级的特征(汽车、人、天空等)。
二、强在哪里
1.与unet对比:
虽然 UNet 和 Mask RCNN 都是处理分割,但前者又称为 semantic segmentation,后者称为 instance segmentation。两者的区别可以用下面这张图体现。instance segmentation 由于需要单独分割每个个体,因此基本上所有针对 instance segmentation 的方法都需要先用一个候选框把物体找出来,之后再分割。
2.roi pooling 的局限
ROIPool用以解决将不同尺度的ROI提取成相同尺度的特征大小的问题。
ROIPool首先将候选框边界量化为整数点坐标值(800x800 (边界框)665/32=20.78–>20),然后将量化后的边界区域平均分割成 k x k 个单元(bin), 对每一个单元的边界进行量化(池化–20/7–>2),每个bin使用max pooling。
经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。
3.roi align:
ROI Align的思路:(小目标影响更大)
1.遍历每一个候选区域,保持浮点数边界不做量化。
2.将候选区域分割成k x k个单元,每个单元的边界也不做量化。
3.在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
小贴士:固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。
双线性内插(双线性插值):
三、改进
主要改进点:
- 基础网络的增强,ResNeXt-101+FPN的组合;
- 分割 loss 的改进,由原来的 FCIS 的 基于单像素softmax的多项式交叉熵变为了基于单像素sigmod二值交叉熵。softmax会产生FCIS的 ROI inside map与ROI outside map的竞争。二值交叉熵会使得每一类的 mask 不相互竞争,而不是和其他类别的 mask 比较 ;
- ROIAlign解决Misalignment 的问题,说白了就是对 feature map 的插值。直接的ROIPooling的那种量化操作会使得得到的mask与实际物体位置有一个微小偏移。
训练过程:
1)输入图像;
2)将整张图片输入CNN,进行特征提取;
3)用FPN生成建议窗口(proposals),每张图片生成N个建议窗口;
4)把建议窗口映射到CNN的最后一层卷积feature map上;
5)通过RoI Align层使每个RoI生成固定尺寸的feature map;
6)最后利用全连接分类,边框,mask进行回归。