faster-rcnn自己的理解总结(包括它的前世今身R-CNN和fast R-CNN)
1、grandfather: R-CNN网络
结构如下:
工作流程:
Input(an image) Proposals(~2K个,在使用CNN提取特征之前还要先resize)
feature maps
每类得分,再经过NMS筛选,再使用手工设计的回归器进行box regression;
缺点:
(1)速度慢,2K多个proposals都要经过CNN提取特征;
(2)先分类在再回归,没有实现end to end;
2、father: fast R-CNN网络
结构如下:
工作流程:
Input(an Image,同时已经用SS提取了proposals,知道了它们的位置) 整图的feature map(同时将proposals映射到了feature map上)
(经过Rol Pooling的resize操作)
再使用softmax分类以及box regssion
改进:
(1)不用再对每一个proposal单独提取特征,大大提高了速度;
(2)引入了ROI Pooling层;
(3)将分类和回归加入了网络,且共享卷积层,不用再像R-CNN中那样单独训练SVM和回归器了;
缺点:
(1)依然在使用SS(selective search)提取候选框,很耗时;
为了摒弃SS,我们取而代之使用RPN网络,即用CNN实现提取特征框的功能,这样一来所有的操作都可以通过CNN实现了,真正实现了end to end,然后我们的猪脚登场了:
3、son : faster-rcnn的网络结构如下:
如上图所示,(im_info = [M , N , scale_factor]),说一下它的前向传播流程:
(1)一般对于输入的图像,P*Q的原图先统一缩放为M*N,并且在前面的特征提取层(也可称“共享卷积层”)中,由于stride = 1 , pad = 1 , kernel size = 3 * 3,所以卷积前后图像大小不变,只有四个Pool层起到了作用,因此原始图像经过提取层后的feature map大小为(M / 16)* (N /16),这样做也是为了使原始图像到feature map的缩放系数为整数从而使得feature map上的每个特征点和M*N的原始图像的区域坐标更方便地实现一一映射关系,这对后面生成proposal会有帮助;
(2)RPN结构中第一个层是一个3*3的卷积层,它作用在经过特征提取层后的feature map上,我觉得这个3*3的卷积作用是为了增加目标附近区域的语义理解;然后再经过两条支路,每条都首先经过一个1*1的卷积。先看上面一条,这条的作用是对“foreground”和"background"进行二分类,所以经过1*1之后的深度为18(9*2,对应每个点生成9个anchors和每个anchor两个类别),再看下面一条,也是经过一个1*1的卷积,深度为36(9*4)进行矩形框回归,然后这两条支路汇合,首先去除掉background类别,然后对于剩下的forground类别,利用im_info先将anchors放大到M*N的原始图像上,这些放大后在原始图像上的区域就是一开始的proposals,数量很多所以我们还要进行两次筛选:第一次,判断这些proposals是否大范围超出图像边界,剔除严重超出边界的;第二次,对剩下的proposals进行nms,然后对nms后的proposals根据cls scores进行排序,选取top-N个作为最终的proposals(一般在600个左右),其实到这里检测任务差不多就完成了,但作者后面还加另一步,相当于一个refine;
(3)之后就涉及到ROI Pooling层了,由于RPN输出的proposals对应的M*N的输入图像,所以我们先通过im_info中的scale_factor将其映射到特征提取层的feature map上,但由于后面需要经过全连接层,而这里每个proposals映射到feature map上的大小均不同,所以我们使用了ROI Pooling层将这些proposals映射后的大小固定(7*7或者6*6,好像论文和实现里稍微有点不同,看代码就知道了),
(4)针对roi_pooling之后的cls_head和bbox_head,以mask-rcnn中的设定为例:经过rpn获得的proposals为1000个,经过roi_pooling之后获得的特征图为(1000, 256, 7, 7),然后flatten为(1000, 12544),再经过两层fc[(12544, 1024),(1024,1024)]之后获得输出(1000, 1024),再经过两个head,分别输出类别信息(1000, 81)和坐标信息(1000, 320),(coco2017有80类,还有额外的背景类),然后再经过nms获得最终60个输出框。
关于如何训练,参考这个:https://www.cnblogs.com/zf-blog/p/7142463.html
补充:
(1)bounding box regression: