深度学习第36讲:图像实例分割经典论文研读之 Mask R-CNN

      在上两讲中,笔者和大家一起学习了图像语义分割的基本框架 FCN 以及基于 FCN 的语义分割流行框架 u-net。虽然之后也有一些新的语义分割模型,但基本都是在 u-net 的基础上进行了简单的调整,故不再继续深入讲述。本节笔者将继续分享 CNN 和图像分割的最后一个主题——实例分割(Instance Segementation)。基于此前的学习,我们知道相较于语义分割,实例分割要求分割网络能够检测出不同的对象实例,这对于分割模型提出了更高的要求。

Mask R-CNN 

      从目标检测的角度来看,图像分割就是一种像素级别的检测算法。基于此前在目标检测和语义分割的积累和创新,何恺明团队继往开来,在此前的两阶段目标检测算法巅峰之作 Faster R-CNN 和语义分割算法基本框架 FCN 的基础上提出了两阶段图像实例分割算法 Mask R-CNN。其关键除了融会贯通此前的检测和分割算法之外,最大的亮点在于提出了一种称之为 RoIAlign 的使得像素对齐的层,这使得分割准确率变得极为精确。

640?wx_fmt=png

      一句话总结 Mask R-CNN 就是  Mask R-CNN = Faster R-CNN + FCN + RoIAlign。其中 Faster R-CNN 用于快速准确的对目标进行检测定位,而 FCN 则是在 Faster R-CNN 的基础之上进行像素级的语义分割。因为 Faster R-CNN 中的兴趣区域 RoI 池化之后存在的像素偏差问题,又提出了 RoIAlign 层来进行像素对齐,三者同心协力使得 Mask R-CNN 得以实现极高的分割准确率。

640?wx_fmt=png

RoIAlign 层

      由于 Mask R-CNN = Faster R-CNN + FCN + RoIAlign,明显是站着巨人肩膀上的飞跃性成果,对于 

      在谈 RoIAlign 之前我们先来说一下 RoI Pooling。RoI Pooling 是从 RoI 中提取特征图的标准操作。从输入图像开始算起的话,我们提取高精度的特征图需要经过两个阶段的过渡,一是由输入图像到一般特征图的过渡,再就是由一般特征图到 RoI 特征图的过渡。在进行卷积操作得到特征图的过程中,由于池化层的存在即使我们对输入做了 padding 填充,最后得到的特征图一定是小于原图尺寸的。假设输入图像大小为 800x800,图像中目标物体的边界框大小为 665x665,使用步长为 32 的卷积操作得到的特征图大小为 800/32x800/32 = 25x25,相应的特征图上目标物体的大小就变为 665/32x665/32 = 20.78x20.78,像素结果为小数值,但小数值不方便操作,于是就对其进行取整操作直接变成 20x20,这里第一次产生了像素误差。再者特征图中也有不同大小的 RoI,为了迎合后面网络的相同尺寸的输入要求,假设将 RoI 大小统一为 7x7,则结果又变成了 20/7x20/7 = 2.86x2.86,又产生了小数,继续采取取整策略,假设取为 2,这样就产生第二次的像素误差。这个第二次的 0.86 的像素误差看起来无关紧要,但对应到原图中去就是 0.86x32 = 27.52,这样大的误差对于分类可能无所谓,但对于讲究像素级的实例分割而言,就有点不能承受之重的意味了。

      所以对于上述问题,RoIAlign 的解决方法是不取整,从源头上控制误差的产生。比如说做第一次特征图计算时 665/32 = 20.78,就直接使用 20.78,第二次 20.78/7 = 2.97,就直接是 2.97。那么这些由计算产生的浮点数接下来如何处理呢?论文中解决办法为双线性插值法。所谓双线性插值法就是用 20.78 这个像素值四周的整数像素值来对其进行估计的方法。

640?wx_fmt=png

      如上图所示:大的蓝色虚线框为卷积后获得的特征图,黑色实线框为 RoI 特征图,假设最后目标输出大小为 2x2,那么就可以使用双线性插值来估计图中的蓝色像素坐标点所对应的像素值。通过对橘黄色区域进行最大池化或平均池化操作最终即可获得 2x2 的输出,整个过程没有误差产生。这便是 Mask R-CNN 高精度分割准确率的由来。

640?wx_fmt=png

网络结构

      论文为了验证 Mask R-CNN 方法策略的有效性,构造了多种不同结构的网络结构。具体来说就是使用不同的用于整个图像特征提取的卷积 backbone 网络和使用不同的用于边界框识别和掩模预测的 head 网络。

640?wx_fmt=png

      为了能产生对应的 Mask,论文种试验了上图左边的 Faster R-CNN/ResNet 和右边的 Faster R-CNN/FPN 结构。

      Mask R-CNN 的训练细节和损失函数笔者这里就不详细描述了,具体感兴趣的朋友可参考论文原文。损失函数除了常规的分类损失和定位损失之外,因为是分割任务,还加了个 mask 掩模损失。

分割表现

      至于 Mask R-CNN 的效果,自然是 state of the art 级别的。

      在 COCO 测试数据集上的分割效果:

640?wx_fmt=png

      RoIAlign 与 RoIPooling 的网络分割平均准确率对比:

640?wx_fmt=png

      可见使用了 RoIAlign 的像素对齐策略之后使得平均准确率都有较大的提升。

      Mask R-CNN 在人体姿态检测分割上的效果:

640?wx_fmt=png

论文原文:Mask R-CNN

Mask R-CNN 参考实现代码:https://github.com/matterport/Mask_RCNN

参考资料:

He K, Gkioxari G, Dollar P, et al. Mask R-CNN.[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017, PP(99):1-1.

https://blog.csdn.net/WZZ18191171661/article/details/79453780

往期精彩:


一个数据科学从业者的学习历程

640?

640?wx_fmt=jpeg

长按二维码.关注数据科学家养成记

640?wx_fmt=jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值