FAST_RCNN 和 MASK_RCNN对比

MASK_RCNN = FAST_RCNN + FCN

MASK_RCNN算法是由FAST_RCNN和语义分割算法FCN组成。FAST_RCNN负责完成目标检测任务,FCN负责完成语义分割的任务。在原始的FAST_RCNN的层面上面增加了FCN模块来产生对应的MASK分支,负责在像素层面进行分类。

FAST_RCNN:Backbone+FPN(可选)+RPN+ROI Pooling + 检测头

MASK_RCNN:Backbone+FPN(可选)+RPN+ROI Align + 检测头

两者在经过RPN模块后的处理办法不一样

其实RoIAlign就是在RoI pooling上稍微改动过来的,可以说ROI Align是为了更好的在像素层面上进行分类。

FAST_RCNN 和 MASK_RCNN对比_第1张图片

从图书可以看出来

FAST_RCNN 和 MASK_RCNN对比_第2张图片                               FAST_RCNN 和 MASK_RCNN对比_第3张图片

 

左图ROI Pooling                           右图ROI Align

在 ROI Pooling使用了两次取整操作, 分别在图的宽和高两个维度。虽然单次取整的误差只在0.78,但是在还原到原图的时候,会造成0.78*32=24.96,第一次取整后整整25个像素的误差,再次取整后误差将会更大,这对于语义分割的层面来说是完全不能接受的。因为MASK出现没对齐的话在视觉上是很明显的。而RoIAlign的提出就是为了解决这个问题,解决不对齐的问题。

在原论文中作者试了3种不同的处理方式

FAST_RCNN 和 MASK_RCNN对比_第4张图片

分别是 ROI Pooling,ROI Align, PrROI Pooling。

ROI Pooling

1.图像坐标——特征图坐标 出现小数后,取整,第一次量化
2.特征图坐标——ROI特征坐标 出现小数,取整,第二次量化

ROI Align

在ROI Pooling的基础上当出现小数的时候,不进行取整, 而是进行双线性插值方法来解决像素浮点数问题。也就是说,利用原图中的虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即20.56浮点数像素值的虚拟位置点对应的像素值估计出来。

PrROI Pooling

PrPool的主要计算思想是对ROI区域内的数值进行求和,然后除以ROI的面积。

在论文中作者实际对比下来,ROI Align的效果是最好的。

在传统图像算法当中,也用到了双线性插值的办法,来处理边缘或者放大缩小后的图像精度问题,最常见的处理办法不仅仅有双线性插值,还要有最近邻近插值法,高阶插值,在选择何种插值时,不仅要考虑到图像的显示要求以及计算量,还要考虑插值的结果对结论分析的影响。

MASK预测

在检测头的部分,MASK_RCNN比FAST_RCNN 多了一个,mask的预测。

宏观上来看,mask预测是对物体在场景中进行了分割,但是在像素层面去理解,分割其实是一个二值分类的问题,分为背景和目标。所以在,mask部分的损失函数用的是交叉熵的损失去处理。

 mask的预测也是在ROI之后的,通过FCN来进行的。但是要注意的是,这里是语义分割而不是实例分割。但是因为每个ROI只对应一个物体,只需对其进行语义分割就好,相当于了实例分割了,这也是Mask-RCNN与其他分割框架的不同,是先分类再分割。
 

对于原论文当中使用的coco数据集来说, 对于每一个ROI的mask都有80类,因为coco上的数据集是80个类别,并且这样做的话是为了减弱类别间的竞争,从而得到更加好的结果。

你可能感兴趣的:(深度学习,人工智能)