yolo系列的算法在这里
本文主要介绍Mask RCNN。Mask RCNN在Faster RCNN的基础上多了一个分支,即mask对像素进行分类,先简单介绍RCNN、Fast RCNN、Faster RCNN。
1.RCNN:
选择性搜索Selective Search(SS):
step0:生成区域集R,具体参见论文《Efficient Graph-Based Image Segmentation》
step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空
网络分为四个部分:区域划分、特征提取、区域分类、边框回归
区域划分:使用selective search算法画出2k个左右候选框,送入CNN
特征提取:使用imagenet上训练好的模型,进行finetune
区域分类:从头训练一个SVM分类器,对CNN出来的特征向量进行分类
边框回归:使用线性回归,对边框坐标进行精修
2.Fast RCNN
Fast R-CNN框架与R-CNN有两处不同:
① 最后一个卷积层后加了一个ROI pooling layer;
② 损失函数使用了multi-task loss(多任务损失)函数,将边框回归直接加到CNN网络中训练。分类Fast R-CNN直接用softmax替代R-CNN用的SVM进行分类。
③Fast R-CNN是端到端(end-to-end)的。
3.Faster RCNN
由两部分组成:
①RPN候选框提取模块;
②Fast R-CNN检测模块。
4.三者对比:
区域建议网络Region Proposal Network(RPN):
RPN在m,n特征图上会产生m * n * 9个anchor,计算每个产生的anchor和标注框的交并比IoU,大于0.7为前景,小于0.3为背景,去除0.3-0.7之间的anchor。对剩下的anchor输入RoIPooling层。Roi pooling层的过程就是为了将proposal抠出来的过程,然后resize到统一的大小(14 * 14),然后下采样到7 * 7 * 512最后输入全连接,最后进行边框精修和分类。
损失函数:
RPN:
ODN:
第一个使用softmax交叉熵,第二个使用smoothL1损失。
5.Mask RCNN
看完Mask RCNN的复现,感觉大神们太牛逼了,现简单总结一下。
1.简介:
Mask RCNN可以看做是一个通用实例分割架构。Mask RCNN以Faster RCNN原型,增加了一个分支用于分割任务,对于Faster RCNN的每个Proposal Box都要使用FCN进行语义分割,分割任务与定位、分类任务是同时进行的。引入了RoI Align代替Faster RCNN中的RoI Pooling。因为RoI Pooling并不是按照像素一一对齐的(pixel-to-pixel alignment),也许这对bbox的影响不是很大,但对于mask的精度却有很大影响。引入语义分割分支,实现了mask和class预测的关系的解耦,mask分支只做语义分割,类型预测的任务交给另一个分支。这与原本的FCN网络是不同的,原始的FCN在预测mask时还用同时预测mask所属的种类。
2.基本结构和训练过程
①Mask R-CNN基本结构:使用Resnet101、FPN特征金字塔网络作为特征提取网络,RPN和MRCNN共享特征,与Faster RCNN采用了相同的two-state步骤:首先是找出RPN,然后对RPN找到的每个RoI进行分类、定位、并找到binary mask。这与当时其他先找到mask然后在进行分类的网络是不同的。
②RPN层:先生成anchor,RPN产生rpn_class_logits,rpn_class和rpn_bbox,经过Proposal层产生RoI区域。
③RoIAlign层:根据标签,经过DetectionTarget选择positive的RoI作为target roi,输出target rois,target_class_ids,target_bbox,target_mask。
④分类和回归层:根据FPN的特征图和target rois输出mrcnn_class_logits,mrcnn_class,mrcnn_bbox。
⑤mask层:根据FPN的特征图和target rois输出mrcnn_mask。
⑥loss层:
rpn_class_loss:input_rpn_match, rpn_class_logits,二分类交叉熵损失,目标背景损失。
rpn_bbox_loss:input_rpn_bbox, input_rpn_match, rpn_bbox,smoothL1损失
class_loss:target_class_ids, mrcnn_class_logits, active_class_ids,softmax交叉熵损失,多分类损失。
bbox_loss:target_bbox, target_class_ids, mrcnn_bbox,smoothL1损失
mask_loss:target_mask, target_class_ids, mrcnn_mask,二分类交叉熵。mask是目标还是背景,若是目标,class_loss已经分类。
3.细节:
RoIAlign:RoIPool的目的是为了从RPN网络确定的ROI中导出较小的特征图(a small feature map,eg 7x7),ROI的大小各不相同,但是RoIPool后都变成了7x7大小。RPN网络会提出若干RoI的坐标以[x,y,w,h]表示,然后输入RoI Pooling,输出7x7大小的特征图供分类和定位使用。问题就出在RoI Pooling的输出大小是7x7上,如果RON网络输出的RoI大小是8*8的,那么无法保证输入像素和输出像素是一一对应,首先他们包含的信息量不同(有的是1对1,有的是1对2),其次他们的坐标无法和输入对应起来(1对2的那个RoI输出像素该对应哪个输入像素的坐标?)。这对分类没什么影响,但是对分割却影响很大。RoIAlign的输出坐标使用插值(双线性插值)算法得到,不再量化;每个grid中的值也不再使用max,同样使用插值算法。
这篇文章总结的很好,可以看一下这个。