RCNN系列:RCNN,SPPNet,Fast RCNN,Faster RCNN,R-FCN。这一系列是个递进关系,也是目标检测使用two-stage方法的一个发展过程。想要更好的理解Faster RCNN和R-FCN,只能把这些算法都梳理清楚了,才能明白算法的整个优化过程。


本篇讲解的是Faster RCNN。2016年,发表在CVPR。


理解了SPPNet之后,我们知道了RCNN已经进化到了SPPNet阶段,那么,Fast RCNN又更进一步提高了速度。那么耗时最多的几乎都来自selective search了。


为了解决这个问题,Faster RCNN终于来了。


多说几句,起初我看论文的时候是从Faster RCNN开始看的,但是怎么都看不太明白,为什么要这样?为什么要那样?都不太清楚,将RCNN的一系列梳理了一遍之后,


才有些恍然大悟的一点感觉。


但是,基础还是不够扎实,有些理解还是会出现问题,之后随着理解的加深,慢慢再更新。


希望看到博客的读者,也能这样从头开始学RCNN,并不会浪费时间,反而会理解的更加深刻。



再看Fast RCNN过程:



  1. 使用selective search算法为每一张待检测的图片提取出2000左右的候选框,这一点和RCNN相同;
  2. 特征提取阶段,同样是提取出整张图片的feature map,然后将原图上的候选框映射到feature map上。然后对各个候选框对应的feature map上的块做ROI pooling,提取出固定长度的特征向量;
  3. 对于上一步的每一个ROI,网络输出每个类的概率和每个bounding box;
  4. 最后,使用NMS算法。

经过两次迭代优化,原始RCNN算法训练过程的三步走,现在只有两步,但是最终还是要使用selective search来做region proposal(候选框的生成)。


那么能不能使用CNN来做候选框的生成呐?


答案是可以!


由此,RPN(Region Proposal Network)被设计出来了。中文名就是区域生成网络。


Faster RCNN 可以看作是RPN 和 Fast RCNN的结合。


意味着我们把RPN理解透彻就能够很好的理解Faster RCNN了。



题外话:



这一段算是我的个人总结吧,在起初学习RPN的时候,很不明白,为什么RPN就能提取物体的候选框了,为什么要使用Anchor?


这些问题即使看了别人讲解RPN的博客也是一头雾水,根本不明白。


要理解这些问题,我们要学会用CNN做两件事情。



第一件:分类,这个问题是只要接触了CNN,我们就能基本知道怎么做,LeNet就是一个10分类,到了后来的AlexNet,VGG是1000分类。


如果这块还是不明白的话,只能好好推推CNN了。



第二件:回归,使用CNN做回归,我是开始没有搞明白。也就是怎么才能用CNN提取出来物体的bounding box呐?


bounding box 不就是学到目标的(x,y,h,w)四个参数吗?其中(x,y)是目标的在图片上面的中心坐标或者是左上角的坐标,h和w是目标框的长宽。


由于这四个参数都是连续的,所以是个回归问题。


为了弄明白这个道理,我们从最简单的开始,比如一张图中只有一个目标,且这一个目标只有三个种类比如是猫,狗,鼠。


四个坐标参数类别即可。


那么我们利用CNN需要得到什么信息呐?


首先需要一个参数p来确定这张图片是否含有目标,p=1代表有目标,p=0代表不含有目标。


如果图中存在目标,那么我们还要指定这个目标是三类中哪一个?


这时用SoftMax的方法一般是给出三个种类的概率即用c,d,m分别代表猫狗鼠在图中出现的概率。


(x,y,h,w)。


那么我们需要CNN最后输出的结果即是:(p,c,d,m,x,y,h,w )维的向量即可。


更准确点就是让CNN的全连接层的最后输出是8维的向量,其中每一个输出单元代表了以上含义。


以上过程可以看作是CNN的前向传播过程,从输入一张图片,到输出这8维向量。


后向传播最主要的就是设计合理的loss函数,一般常用的loss函数可以按照以下:



loss=SoftMax(p,c,d,m)+s*L2( (x,y,h,w)-GT)



以上,SoftMax就不用讲了,L2范数其实就是欧氏距离(两点距离),其中s是两者的权重。


这样有了loss函数,我们就可以使用后向传播来反复迭代了,直到收敛。


这样单目标的提取目标检测框的过程就完成了。



理解了CNN做这两件事的过程,我们再来理解RPN网络,就会变得轻松一些了。



在正式开始RPN之前,还是先熟悉一下RPN的基础网络VGG16:




faster cnn结构 faster rcnn介绍_Faster RCNN


上图中D网络就是VGG16,如果你不太理解上图的含义,请移步:


我们可以看到,VGG16拥有13个conv,3个FC层。RPN用到的是conv3最后一层输出的feature map。



RPN网络:




faster cnn结构 faster rcnn介绍_RPN_02


有了以上基础后,我们再看Faster论文中的上图就很清晰了。


从下到上来看,


conv feature map是VGG16最后一层conv3的输出。


然后RPN在这个feature map上使用3*3的卷积核来进行卷积。


在这里我们先不考虑 anchor的存在 。假设feature map的大小的是40*60,那么使用3*3,pading=1,stride=1进行卷积后,输出依然是40*60。


那么针对这40*60个点,每一个点都输出一个6维的向量,如我们刚才理解的用CNN做回归的过程一样。那么最后输出的特征图应该是


40*60*6的feature map。


再换个思路理解就是,RPN将输入图片分成了40*60格子(要理解的是,这些格子的感受野在原图上是重叠的),每个格子都会输出一个用来分类和做回归的6维向量。


这样我们每个格子就会提出一个bounding box,一张图就可以提出2400个bounding box。这就代替了selective search 来做候选框的生成了。


那还为什么会有anchor呐?


其实这是由于一些问题出现了。


先考虑一种情况,


如果一个格子中出现了不止一个物体,而我们的RPN在格子中却只提出了一个bounding box,


那么带来的结果必定是漏检了,这个格子里面的目标只能找到一个或者都找不到。


再考虑另外一种情况,




faster cnn结构 faster rcnn介绍_目标检测_03



比如上面这张图中,我们假设一个格子中既有人也有马,人是竖长的格子,马是横向比较长的格子,我们的框又该怎么找呐?


针对这些情况,作者提出了Anchor 的概念,就是在一个格子中,我们不仅仅提取一个box,我们提取出9个尺度,横纵比不同的box,


这样会在一个格子中存在9种不同的box,然后我们利用CNN来回归这些box。


怎么做回归呐?



RPN的前向传播过程:



在一个格子中,RPN会提取出来一个9*(2+4)的向量,其中2代表是否存在目标,4即是bounding box的四个坐标。


在前向过程中,RPN在一个格子中提取了9个框,以及每个框的置信度。


Anchor在这里起的作用,按照我的理解就是初始化上面提取的9个框。


这样每个格子的9个框就会有了初始的大小。


起初在这里我也有疑问,为什么要用Anchor初始化啊,不加上Anchor也是可以提取出来9个框的啊?


但是,CNN的训练过程我们是不可控的,虽然在一个格子中是可以提取到9个框,但是我们不能确定这9个框可能是回归到了同一个呐?


那就还是会出现马和人在一个格子中,我们可能只能找到一个目标。当然也可能可以找到两个。这些是不确定的。


但是,我们要增大我们能同时找到所有目标的概率。


这就是Anchor了。



其中按照一定的规则来抛弃一些box。规则可以参考以下:



faster cnn结构 faster rcnn介绍_Anchor_04


再啰嗦一句,起初RPN提取的9个框和置信度的偏差肯定很大,所以需要后向传播的迭代优化。



RPN的后向传播过程:



CNN的后向传播最关键的就是要找到合适的loss,在有了合适的loss函数后,CNN就能迭代优化了。


RPN的loss函数:



faster cnn结构 faster rcnn介绍_faster cnn结构_05


其中具体字母代表的含义可以参考论文,只要明白了是分类和回归坐标的结合就可以了。


这样在每一张图片中就可以得到了40*60*9个bounding box,经过以上的分析,这些框是可以基本覆盖所有的ground truth。



以上,所有的分析基本回答了Anchor 是什么以及为什么使用Anchor。



再看RPN,这次就是横向对比了,去掉Anchor的RPN其实就是Fast RCNN的变形,


Fast RCNN:



faster cnn结构 faster rcnn介绍_faster cnn结构_06


RPN:




faster cnn结构 faster rcnn介绍_Faster RCNN_07



唯一不同的就是使用的loss函数不同,网络结构基本可以看作是一样的。


有了以上对比,Faster RCNN使用的共享权值那就是水到渠成了。



faster cnn结构 faster rcnn介绍_Anchor_08


训练方法参考下图:




faster cnn结构 faster rcnn介绍_Anchor_09



实验结果并不是我太关注的事情,肯定是当时最好。



个人见解:大家都知道Faster RCNN很厉害,速度相当快了,RPN是Faster的核心,而Anchor又是RPN的核心。那么Anchor的思想是来源哪里呐?


还是作者独到见解?


我的猜测,这个思想来源是另一篇2014年的CVPR:


Scalable Object Detection using Deep Neural Networks


论文名字并不出名,但是提出的loss函数可是被Fast RCNN,Faster RCNN,yolo,SSD所使用。结构名字也叫DeepMultibox。


如果你没关注到这篇论文,可以看一下:


这篇文章是这系列的目标检测的思想来源(我认为的)。很多内容被扩展后就成为了很牛的算法。



参考:


Faster R-CNN: Towards Real-Time Object Detection


with Region Proposal Networks


Faster RCNN详解:


deepmultibox:

Faster RCNN详解: http://www.360doc.com/content/17/0303/14/10408243_633634497.shtml