©作者 |小欣
01 简述
实例分割(instance segmentation)是机器视觉研究中比较重要、复杂和具有挑战性的领域之一。在机器人,自动驾驶,监视等领域均有应用。
不同于语义分割(semantic segmentation),实例分割的要求更难,具体如下所示,下图(a)为语义分割,它需要预测每个像素的类别,比如分辨下图的人,羊,背景,狗;而实例分割的要求更进一步,它还需要在预测类别的基础上区分开每一个实例。
02 模型简述
在实例分割领域中,代表性的模型有Mask R-CNN等。Mask R-CNN是R-CNN系列模型的集大成者,它在Faster R-CNN的基础上进行了改进,使得它不仅能更好地解决目标检测问题,还可以用来做实例分割。
简单的来说,在理想情况下,像Mask R-CNN这种实例分割模型,它首先需要先找到一张图中哪些位置可能有物体存在,把它们从原图中找出来,称之为候选框,这里涉及到的部分是模型中的backbone, RPN (Region Proposal Network)和ROI Align层。
然后再进一步进行处理,判断找到的候选框是什么类别的,并判断候选框内中哪些像素是物体,哪些像素只是单纯的背景,模型剩下的部分就是为了实现这个目的。按照这种思路,在通过反向传播的技术进行梯度下降,能实现目标检测和实例分割的功能。
对于如Mask R-CNN这类分成两个步骤去做的模型,被称为二阶段(two-stage)模型,它们一般速度较慢,但都有较好的性能。
虽然Mask R-CNN是2016年提出的实例分割模型,但其强劲的性能使得它仍然在许多比赛中出现,也常被人们当作baseline,而后续慢慢涌现的性能更好的Cascade Mask R-CNN, HTC等模型,事实上都是在Mask R-CNN的基础上进行改良的,所以理解它对于未来的进一步学习是有巨大帮助的。
这里接下来将对它做一个简单的介绍,Mask R-CNN的细节之处很多,推荐看它的源码和论文,若是想更详细的知道Mask R-CNN的前世今生,还需要从R-CNN开始看起。
这里将从较宏观的层面上对Mask R-CNN进行解释,希望对小白起到帮助,在心里有个大体的模型流程后再去看更具体的代码实现,也能更加流畅。
03 模型详解
整体上,该模型的流程图如下所示,Mask R-CNN可以分成四块部分进行讲解:backbone,RPN,ROIAlign和最后的prediction head。
Backbone
首先,我们输入图片,假设它是224X224的尺寸,进入模型的backbone,这个backbone一般是图像分类模型去掉最后的全连接层得到的骨干框架,用于得到原图中具有高度语义信息的特征图,这个特征图内蕴含着各个物体的信息,因为backbone里面会都有pooling层缩小特征图尺寸,假设此时最后输出的特征图尺寸为28X28X256,则说明原图和特征图之间的比例为8倍,可以理解成特征图一个像素蕴含了原图八个像素的信息。
RPN层
RPN层比较创新,是Faster R-CNN的核心,只看代码可能不明白它的原理,希望这里的文字解释能对读者后续细读代码起到帮助。
通过backbone得到的特征图,会进入下方RPN层。RPN层就是一个小型的神经网络,它的作用是让模型自己去原图中寻找哪些地方可能存在物体。
继续引用上面的例子,在这一层里,由前面可知,特征图和原图的尺寸存在一个倍的关系,所以模型在原图中每隔个像素会生成若干个bbox,假设生成9个,这九个bbox和特征图对应的那个像素有关,这时一张图就有(28x28x9)个bbox了,一个bbox的坐标可以由它的左上角和右下角的坐标进行表示,即(x1,y1,x2,y2)这种形式。
然后将特征图传入3X1,1X1卷积中,两条分支的输出尺寸分别为28X28X36,28X28X18 , 前者的36可以被理解成9X4,也就是特征图该像素对应的bbox的四个坐标的预测偏移量,而后者的18可以被理解成9X2,代表的就是该像素对应的bbox属于前景/背景的预测概率,根据输出的预测偏移量对bbox进行偏移,并确定它们是否为背景,然后从这若干个bbox中按概率排序,去除部分无用的bbox,剩下的bbox将根据一定的采样方式取出,传入到下一步骤去使用。到这一步骤,模型知道了哪些位置可能有物体,哪些位置可能没物体。
总而言之,RPN的作用就是让模型自己去学原图中哪些地方有物体,哪些地方没有物体。但是若让它凭空就学,难度太高了,所以一开始我们创建了(28X28X9)个bbox,这也称之为先验框,放统计学的贝叶斯角度,就是引入了先验知识。
因为模型有了先验知识,我们只需要让RPN网络去学先验框的偏移量和是否有物体的概率,这比凭空去学简单了不少,最后将这一块学出来的,模型觉得有概率有 物体的若干个bbox,传入下一个阶段,继续去学习。
ROI Align层
接下来进入ROI Align部分,它是Mask R-CNN的创新点之一。
在RPN阶段我们拿到了若干个原图中 可能有物体的bbox,但这些bbox肯定还不够准,还需要细调。
为了将bbox进行细调,Mask R-CNN需要将每个bbox映射到尺寸为的特征图上,至于怎么映射,就是ROI Align干的事了,它和早期的ROI pooling层的作用是一样的,但是更准确,能尽可能找到比较准确的位置。
映射过去之后的bbox其实都会很小,毕竟小了8倍,所以在这一层它内部还会进行插值的操作,最后得到的bbox都是统一尺寸的,比如7X7X256。
总的来说,通过ROI Align,能找到原图的bbox在特征图上的位置,这时候的bbox就完成了原图到特征图的映射,这个bbox蕴含高度的原图信息,可能包含物体。
Predicted Head
先不看右上方的mask head,随后的prediction head就是再次确定,映射后得到的bbox是否是真的有物体,并将它们的坐标再次进行细调。
具体做法就是将那些7X7X256的bbox,经过average pooling变成一维向量,经过全连接层,分别得到它们的坐标偏移量和类别概率,这个坐标偏移量和RPN一样,是预测的bbox的偏移量,但类别那一块,这时候就是具体地去预测这个bbox是什么类别,或者是背景,比RPN网络的预测更具体。
到这一步位置位置,其实基本就是广为人知的Faster R-CNN的模型流程,我们确定了RPN筛选过后的bbox具体是什么类别,并再对它们的bbox进行微调,得到更准确的位置。
事实上,这些步骤中还涉及到一个nms的技术,它能删除冗余的框,让输出的预测框更加的准确,不过这里就不再展开,它也是目标检测领域十分重要的技术。
最后再说一下mask分支,到了这一步,就是根据bbox,再进一步确定bbox内部的像素的类别。
但是我们的bbox只是7X7X256的尺寸,肯定与实际物体大小的不符,所以,这里又用到了一个全卷积层(FCN)和上采样的技术,将这个bbox进一步进行上采样,就是逐步恢复它的尺寸,再通过FCN确定 bbox位置的像素哪些位置可能是物体,哪些地方不是。
04 总结
综上,通过Mask R-CNN的这一套操作流程,我们顺利知道了原图哪些位置可能有目标,哪些像素属于什么类别,即到了实例分割!
对于这种复杂模型的创新,实在不容易做到,向这些优秀的学者致敬!
私信我领取目标检测与R-CNN/数据分析的应用/电商数据分析/数据分析在医疗领域的应用/NLP学员项目展示/中文NLP的介绍与实际应用/NLP系列直播课/NLP前沿模型训练营等干货学习资源。