根据最近自己看的有关RCNN的论文、博客结合自己的理解对RCNN这一系列包括RCNN 、FAST、FASTER等做一个学习总结。
主要按照数据在CNN中的不同阶段进行总结:预选框获取、预选框处理、CNN训练、类别判别及边框回归
1、预选框获取
- RCNN:在RCNN中,选取预选框 region proposal是通过matlab编译的selective search模块完成的,单张图选取2000左右的预选框,大概是通过简单的滑窗扫描结合图斑的合并形成的预选框,数量很庞大;fast-RCNN本质上使用的和RCNN相同的方式获取proposal
- faster-RCNN:提供RPN(region proposal network)生成预选框。经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如RCNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster RCNN的巨大优势,能极大提升检测框的生成速度。
RPN在卷积输出的featuremap上使用n*n滑窗进行扫描,将滑窗中心反向映射在原图形成对应的Iou区域即anchor,使用固定设置的scale和aspect ratios形成固定比例尺寸的Iou,常见scale[1:1,1:2,2:1],aspect ratios[128*128,256*256,512*512],如下图:
RPN将形成的anchors输出到两个全连通层,cls layer和bbox regression layer分别判别anchor所属类和对应的边框偏移量。
cls layer:通过softmax分类anchors获得foreground和background(检测目标是foreground)
bbox regression layer:计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。将剩余的proposals输送到fast-RCNN中进行参数训练。 - 补充
Proposal Layer负责综合所有[dx(A),dy(A),dw(A),dh(A)]变换量和foreground anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
- Proposal Layer有3个输入:fg/bg anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的[dx(A),dy(A),dw(A),dh(A)]变换量rpn_bbox_pred,以及im_info(对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息,数值都是为了将proposal映射回原图而设置的)
Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理: - 再次生成anchors,并对所有的anchors做bbox reg位置回归(注意这里的anchors生成顺序和之前是即完全一致的)
- 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors。即提取修正位置后的foreground anchors
- 利用feat_stride和im_info将anchors映射回原图,判断fg anchors是否大范围超过边界,剔除严重超出边界fg anchors。
进行nms(nonmaximum suppression,非极大值抑制) - 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出
- Proposal Layer有3个输入:fg/bg anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的[dx(A),dy(A),dw(A),dh(A)]变换量rpn_bbox_pred,以及im_info(对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息,数值都是为了将proposal映射回原图而设置的)
2、