R-CNN系列(5)—— Mask R-CNN
1.Mask R-CNN简介
1.1.模型概述
Faster R-CNN是一个多任务模型,它的输出包括预测的目标框,以及每个目标框的置信度。Mask R-CNN在Faster R-CNN的基础上,加多一个任务:实例分割。这个分割任务与边框回归、(置信度)分类回归并行。也就是在经过CNN特征提取、RPN候选框提取、ROI的固定size池化之后,输出到三条路径上,每条路径分别代表一个任务。
Mask R-CNN的分割任务是在RoI上进行的而非整张图片,这样与FCN在整张图像上进行分割相比,无疑速度更加快和位置更加精确。RPN提出的RoI实际上已经为分割任务做出了一些初步的筛选工作。
1.2.对RoIPool的改进
与Faster R-CNN不同的是,Mask R-CNN采用RoIAlign对每个RoI进行固定size池化而非采用RoIPool。因为RoIPool在空间位置上的处理比较粗糙,而分割任务需要精确的位置信息,RoIAlign能达到这个要求。
1.3.损失函数
Mask R-CNN训练简单,只需要在Faster R-CNN的基础上增加一个较小的开销,就能为每个实例生成一个高质量的分隔掩码。在训练时,多任务损失被定义为:L = Lcls + Lbox + Lmask,即分类、边框预测、分割三个任务的损失值之和(也可以为每个任务损失值设定不同的权重)。
2.RoIAlign
因为分割任务需要更精确的空间信息,而RoIPool对空间信息的处理是粗糙的,因为有两次整数化的过程:(1)region proposal的x、y、w、h通常是小数,但是为了方便操作会把它整数化。(2)将整数化后的边界区域平均分割成k*k个单元,对每一个单元的边界进行整数化。两次整数化的过程如下图所示:
问题的关键在于RoIPool的位置信息需要整数化,但x、y、w、h通常是小数,那何不就直接采用小数?RoIAlgin的做法就是直接基于小数形式的x、y、w、h位置信息,对ROI进行固定size的池化:它先在特征图上精确定位ROI的位置(常常不落在不在格子的边框上),如下图。假如设置固定输出的size是2*2,那么就将ROI分成2*2的网格,然后再对每个格子进行采样,做法是对每个格子再进行划分,比如划分成2*2的小格子,然后利用双线插值法,计算出每个小格子中间位置的像素值作为该小格子的像素值,然后再取这2*2个小格子的最大值作为他们所属格子的池化后的值。这样最终每个ROI的输出就是2*2的矩阵。(这里2*2只是方便举例,实际可能更大。)
3.FCN分支
3.1.结构
某个RoI经过RoIAlign后得到固定size的输出,然后经过一两个卷积层之后,分别输入到三条分支中,其中一条就是FCN分割分支。对于最终的输出,普通的FCN是直接用一个矩阵就搞定了,比如m*m大小,其中每个像素点用softmax来决定属于哪一类,而Mask R-CNN中的FCN却是使用多个矩阵,假如目标种类有K个,那么输出就是K个m*m大小的矩阵,因此可以知道它是将不同类别的目标单独开来进行分割的,也就是说K个矩阵中,每个矩阵只单独分割某一种类的目标,因此避免了种类间的竞争。其中每个像素点用sigmiod函数决定它是否属于当前这一种类。如下面的模型是以COCO数据集为训练和测试数据集,COCO数据集有80个目标种类,因为FCN输出为80个矩阵。
3.2.损失值Lmask
FCN的损失值Lmask定义为二分交叉熵(二分类、sigmiod常用)。虽然每个像素要进行k个二分类,但对于一个RoI而言,它的损失值只统计它真实所属的那一类,而不是统计K个损失值之和。何为RoI真实所属的那一类?RoI与Ground True Box的IoU最高的那一类,且IoU要大于等于0.5,否则就被认为是背景,而背景不加入Lmask的统计当中,即Lmask只考虑Positive RoI。
4.训练与测试
4.1.训练
(1)参数配置:超参数仍然依照Faster R-CNN的设置,因为实验发现,分割效果比较好。
(2)数据集:与Ground True Box的IoU大于等于0.5的被认为是Positive RoI,否则被认为是Negative RoI。
(3)Lmask损失值:Lmask只考虑Positive RoI.
(4)Batch Size:两张图片每个GPU。每张图片采样N个RoI,其中正负RoI比例为1:3。
(5)RPN:anchor有5中scale和3个aspect ratio,因此每个点有15个anchor。
4.2.测试
(1)首先运行边框检测模块和分类模块
(2)然后进行NMS,然后挑选出100个最高分的边框
(3)再将100个最高分边框送去分割模块,得到K个二值化矩阵(K为目标种类数)
(4)将m*m大小的二值化矩阵resize成RoI对应的size
5.细节问题
(1)因为分割任务是每个类别单独出来,那么类别数是需要固定的,如果类别数有变化了,那么FCN网络输出也需要改变。
(2)谈谈为何Mask R-CNN中的FCN分支为何分离了分类任务和分割任务?因为它为每个类别单独进行分割任务。
(3)有个问题:FCN中有分类任务,与FCN并行的分支也有个分类任务,这样好像重复了,能否把这两个统一为一个?或者只留一个?
(4)三个分支中,边框回归和分割是独立的,也就是说分割不是基于边框回归后位置精修的边框,那岂不是目标检测的边框和分割的边框不一样啦?答案是:测试时,边框回归和分割不是并行的,是先边框回归,再NMS,最后再根据精修后的边框进行分割。
(5)实例分割比语义分割的要求更高,为什么Mask R-CNN能够进行实例分割?因为Mask R-CNN的分割是基于RoI的,在分割之前实际上已经获取到了每个实例的所在位置。
posted on 2020-10-31 14:15 ZhicongHou 阅读(183) 评论(0) 编辑 收藏 举报