图像分割(六):模型(MaskRCNN)

文章目录

      • 三、图像分割的模型
        • 6.Mask RCNN

三、图像分割的模型

6.Mask RCNN

原论文

Mask RCNN其实就相当于Faster RCNN + Mask(FCN),也就是在Faster RCNN的基础上,增加了一个分支用作图像分割。

模型结构为:

图像分割(六):模型(MaskRCNN)_第1张图片


同样是two-stage的模型,相较于Faster RCNN的区别:

图像分割(六):模型(MaskRCNN)_第2张图片
  1. 增加了一个分支mask,用于图像分割:对于Faster RCNN输出的每一个建议框,都使用FCN做语义分割,分类、回归、分割三个任务同时进行。
  2. 使用ROI Align替换了ROI Pooling。


为什么使用ROI Align?

因为ROI Pooling的量化操作(四舍五入取整)会导致原图生的ROI和特征图不对齐(分割无法与输入对应),像素会有偏移。

ROI Pooling应用了两次取整操作:

  1. 输入图片到特征图时(建议框的x、y、w、h一般会是小数,但为了方便操作而进行取整)
  2. 特征图转化为固定大小的维度时(后面要进全连接)

这种取整操作对ROI分类或是回归的影响不大,但对像素级别的图像分割却有很大影响。


ROI Align操作:

图像分割(六):模型(MaskRCNN)_第3张图片

这种操作的改进:

  1. 取消了上文第一次取整。
  2. 取消了第二次取整,而使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。

流程(如图):

  1. 遍历每个候选区域,保持浮点数不取整(图中下面大的整块虚线区域为一个候选区,也就是一张特征图)
  2. 将每个候选区分成 k x k 个单元(图中为2 x 2),每个单元边界同样不取整
  3. 每个单元又同样分成4个格子,计算每个格子的中心点像素,也就是那4个蓝点(这是虚拟的坐标位置,像素坐标都是整数没有浮点数,使用双线性插值,依靠相邻4个真实像素的值计算得来),最后对4个点进行maxpooling,得到这个单元最终的值。

关于双线性插值:

概念可以自行百度,说得很清楚,大概原理可以看下这些博客(与OpenCV中使用的方法还是有区别的):

https://zhuanlan.zhihu.com/p/49832888

https://blog.csdn.net/qq_37577735/article/details/80041586

https://blog.csdn.net/xiaqunfeng123/article/details/17362881

https://blog.csdn.net/siyue0211/article/details/92660001

关于网络架构

图像分割(六):模型(MaskRCNN)_第4张图片


将网络分成了两部分:

  1. Backbone:卷积主干用于提取特征(论文中使用了resnet-50,resnet-101,resnext-50,resnext-101,还有FPN),经过对比,作者发现使用ResNet-FPN更快、精度更高。
  2. Head Architecture:网络头用于bbox识别(分类、回归)和mask预测。

训练:

  1. 与之前相同,IoU > 0.5 时,才会纳入 L m a s k L_{mask} Lmask进行计算
  2. RPN的anchors有5种scale,3种ratios


损失(三个损失加起来优化):
L = L c l s + L b o x + L m a s k L=L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask
L c l s L_{cls} Lcls L b o x L_{box} Lbox跟Faster RCNN一样, L m a s k L_{mask} Lmask使用的是sigmoid+BCE。

L m a s k L_{mask} Lmask:mask分支使用FCN,如果一共K个类别,则mask分割分支的输出维度是 K ∗ m ∗ m K*m*m Kmm(m表示RoI Align之后的特征图大小)。

对于中的其中 m ∗ m m*m mm 每个点,都会输出K个二值Mask(0或1)。

根据当前RoI区域预测的分类,取第k(属于哪个类别,通过分类分支预测得到)个特征层,对每个像素应用sigmoid,取RoI上所有像素的交叉熵平均值作为 L m a s k L_{mask} Lmask

图像分割(六):模型(MaskRCNN)_第5张图片

如图所示,计算loss的时候,并不是每个类别的输出都参与计算,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失。

并且在测试的时候,也是这样通过分类分支预测的类别来选择相应的mask预测。


结果与评估:

图像分割(六):模型(MaskRCNN)_第6张图片

图像分割(六):模型(MaskRCNN)_第7张图片

可以看到,这个数据集其实不太平衡:

truck,bus,train的数据量很少,所以验证数据集val和测试数据集test AP的差距较大。

时至如今,MaskRCNN仍然是一个较好的网络,实际上不止实例分割,在目标检测、人体关键点检测任务上,它都取得了很好的成绩,不够整体结构依然稍显臃肿。

相关代码:

TensorFlow

Pytorch

你可能感兴趣的:(计算机视觉,图像分割,深度学习,深度学习,计算机视觉,cv,神经网络,人工智能)