文章目录
三、图像分割的模型
6.Mask RCNN
Mask RCNN其实就相当于Faster RCNN + Mask(FCN),也就是在Faster RCNN的基础上,增加了一个分支用作图像分割。
其模型结构为:
同样是two-stage的模型,相较于Faster RCNN的区别:
- 增加了一个分支mask,用于图像分割:对于Faster RCNN输出的每一个建议框,都使用FCN做语义分割,分类、回归、分割三个任务同时进行。
- 使用ROI Align替换了ROI Pooling。
为什么使用ROI Align?
因为ROI Pooling的量化操作(四舍五入取整)会导致原图生的ROI和特征图不对齐(分割无法与输入对应),像素会有偏移。
ROI Pooling应用了两次取整操作:
- 输入图片到特征图时(建议框的x、y、w、h一般会是小数,但为了方便操作而进行取整)
- 特征图转化为固定大小的维度时(后面要进全连接)
这种取整操作对ROI分类或是回归的影响不大,但对像素级别的图像分割却有很大影响。
ROI Align操作:
这种操作的改进:
- 取消了上文第一次取整。
- 取消了第二次取整,而使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。
流程(如图):
- 遍历每个候选区域,保持浮点数不取整(图中下面大的整块虚线区域为一个候选区,也就是一张特征图)
- 将每个候选区分成 k x k 个单元(图中为2 x 2),每个单元边界同样不取整
- 每个单元又同样分成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
关于网络架构:
将网络分成了两部分:
- Backbone:卷积主干用于提取特征(论文中使用了resnet-50,resnet-101,resnext-50,resnext-101,还有FPN),经过对比,作者发现使用ResNet-FPN更快、精度更高。
- Head Architecture:网络头用于bbox识别(分类、回归)和mask预测。
训练:
- 与之前相同,IoU > 0.5 时,才会纳入 L m a s k L_{mask} L