本文源自b站博主霹雳吧啦Wz的学习视频:
Mask R-CNN是一种目标检测算法,它在 Faster R-CNN 的基础上进行了改进,可以同时实现目标检测和语义分割。Mask R-CNN实现的最主要的功能是他可以对图像进行实例分割。
由上图不难看出,语义分割是可以将同一类物体从背景中分割出来并生成物体掩码,而实例分割则对物体进行了更精细的划分,针对不同的物体我们可以看到分割出来的蒙版颜色是不同的,Mask R-CNN能够对每个类别不同的个体实现实例级分割。
1.Mask R-CNN
从图中我们可以看到,Mask R-CNN实际上是在Faster R-CNN的结构上又并联了一个分支(Mask分支),那么就是通过这个分支来实现对检测对象生成一个Mask分割蒙版。
2.RoIAlign
1.RoIpooling
如图,假设检测目标对应左上角左上角点(原图)为(10,10),右下角点(原图)为(124,124),特征层相对原图步距为32,那么我们想得到目标在特征图上的位置信息就得进行这样一个计算:用原图的坐标除以步距,这时候我们发现大多数情况都是不可以整除的,那么RoIpooling在这里的做法是进行一个取整(四舍五入)。得到特征图上的目标后,假设要输出为2x2,我们观察图像发现,事实上在划分时我们也得不到一个均分的结果。因此,经过多次的取整和划分,特征图上的坐标实际要比原图的坐标要进行一个相对的偏移。
这里多说一嘴:得到输出为2x2的操作是对划分的每个区域进行Maxpooling操作,Max pooling 是一种常用的池化操作,通常应用于卷积神经网络(CNN)中,用于减小特征图的空间尺寸。Maxpooling的操作步骤通常如下:
-
将输入特征图分割成不重叠的矩形区域,通常为 2x2 或 3x3 大小的窗口。
-
在每个窗口中,选择窗口内的最大值作为池化后的输出值。
-
重复步骤 1 和步骤 2,将窗口移动到下一个位置,并继续进行最大值选择,直到覆盖整个特征图。
2.RoIAlign
总的来说,RoIAlign相较于RoIpooling是没有取整这一做法的。如上图所示(假设条件与RoIpooling一样),直接用原图坐标除以步距得到目标在特征图上的位置。在进行池化操作时同样也是没有取整的,而是直接对特征图进行均分,如图要求输出为2x2,则将特征图均分为四个部分。那么在每个部分中,采取设置采样的点的方式来得到输出,这里有个参数叫做samping ratio,那么采样点的个数就等于sampling ratio的平方(例设sampling ratio为2,则采样点个数为4)。 再然后求取采样点的值即可。
图中给了当sampling ratio为1是采样点值的求法(采用的是双线型插值法来求取)。
3.RoIAlign的提升
3.Mask分支
值得注意的是,在Mask R-CNN中Faster R-CNN分支与mask分支是不共用RoIAlign的。如上图,Faster R-CNN分支采用的RoIAlign得到的RoI大小是7x7的,而mask分支采用的RoIAlign得到的RoI大小却是14x14的。这是因为对于分割任务而言要求分割结果的精度要更高一些,因此mask分支所采取的RoIAlign要保留更多的细节信息。
在Mask R-CNN中,对预测Mask以及Class进行解耦。
训练网络的时候输入Mask分支的目标是由RPN提供的,即Proposal(正样本)
但是在预测的时候输入Mask分支的目标是由Fast R-CNN提供的