R-CNN,Fast R-CNN,Faster R-CNN学习笔记

引言

   近年来,目标检测最流行的方法可谓是Faster R-CNN了,下面我会简要概括这些方法的步骤,同时详细叙述一些key points。先供上来自Coursera-DeepLearning中Andrew Ng对R-CNN发展中各个方法的精简概括:
R-CNN


R-CNN

  R-CNN,就是Region + RCNN的结合。整个过程分为以下几个部分:

  1. Region Proposal System:通过这个proposal系统(Selective Search,Edge Boxes等方法)提取图片中感兴趣的区域(约2000个),并把它们抠出来保存。
  2. CNN:将这些区域resize到统一大小,送入CNN中,得到它们的特征向量。
  3. SVM:将特征向量送入k个SVM分类器中进行分类(对每一个类别分别训练一个SVM)。
  4. Bounding Box Regression:将上述感兴趣区域与真实的bounding box进行对比,得到一个回归模型,专门用来矫正提取的区域与真实区域的误差。
R-CNN

  总之,当时这个模型把每一步都拆解得很开,在当时的准确率是相当高了~但是这个方法有缺点:速度慢,步骤冗长。


SPP Net(补充知识)

  前面的R-CNN是将原图上所有proposal region依次送入至CNN中,提取各个region的feature map,这个速度无疑会很慢。那有没有一种更好的方法,能将原图直接输入至CNN,得到整个图像的feature map,然后在这个feature map上抠出proposal region呢?
   SPP Net提出了Spatial Pyramid Pooling layer的思想来解决这一问题。
Spatial Pyramid Pooling layer

  如上图,假设我们将图像输入至CNN提取了256个feature map(这时我们知道feature map上的一个像素的感受野对应的是原图上的一个框框,那么每一个proposal region对应到feature map中的框框我们都可以找到),那么我们可以依据原图上的proposal region来扣出的feature map上相应的区域,但是这些区域大小不一,所以无法送入全连接层,怎么办?这里就要用到Spatial Pyramid Pooling layer了。
  对于每一个feature map上的区域,我们将44,22,11大小的这三张网格放到相应区域上,然后对这21个网格做最大池化(此时一个wh的网格只对应一个网格中的最大数字),那么对于一个区域,我们就能得到21维的特征向量。而我们得到了256个 feature map,所以一个区域我们就有256*21大小的特征向量。这么做的话,每个区域对应的特征向量维数就一样了~
  再放一张图展示下R-CNN和SPP Net的区别:
R-CNN和SPP Net

  总之,SPP Net在提取特征这一步骤降低了时间复杂度,同时它用可变尺寸图片训练,增加标度不变形并降低模型过拟合性。


Fast R-CNN

  Fast R-CNN 借鉴了SPP Net 的思想,用滑动窗口的卷积实现方式,实现了同一张图片只用送入CNN一次,便可在feature map上得到所有proposal region的特征向量。相比之前的R-CNN,它有以下优点:

  • 更高的检测识别率
  • 更快的速度(对于一张图片,一次CNN提取特征即可)
  • 更简洁的训练方式(一个网络,既能提取特征,还能做BBox回归,还能分类)

  先谈谈这个RoI pooling layer,这个一层和SPP Net里面的Spatial Pyramid Pooling layer功能很相似,都是为了使不同大小的区域在经过pooling后得到同一维度的特征向量。本质上而言,RoI pooling layer就是简化版本的Pyramid Pooling layer。
  为什么要简化? 它加快了计算速度。同时,在SPP net中,每个训练样本来自不同图像,而每个RoI在原图上对应着一个巨大的感受野,所以整个网络在反向传播到SPP layer之后,效率就很低了 ,所以说,SPP layer只能用来tune全连接层,而不能tune到它之前的卷积层。(这一点有待思考)
  要怎么简化呢? SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只是用一个size的金字塔,将这个feature map下采样到一个7x7的feature map上,实现了不同大小的区域到全连接层维数的对应。
在这里插入图片描述

  再谈谈RoI后面分支出来的Multi-loss,这个loss函数来源于softmax对标签的loss以及对bbox框框回归的loss,具体定义如下:
multi-loss

  第一项, L c l s ( p , u ) = l o g ( p u ) L_{cls} (p, u) = − log(p_u) ,这个loss值为对class为u的预测概率取log。
  第二项, λ \lambda 是为了权衡一二项的比重; [ u 1 ] [u\geq1] 表示只有框内object不为背景(非零)的时候第二项loss才有效; L l o c ( t u , v ) = i x , y , w , h s m o o t h L 1 ( t i u v i ) L_{loc}(t^u,v)=\sum_{i\in{x, y, w, h}} smooth_{L_1}(t^u_i - v_i) ,这里我们计算的是真实框框 ( v x , v y , v w , v h ) (v_x, v_y, v_w, v_h) 和预测框框$ t_u = (t^u_x , t^u_y , t^u_w, t^u_h ) 之间的差异,最后这个 smooth 函数只是一个作为系数的惩罚函数, x$离0越远惩罚力度越大。(很神奇这个能网络同时做到BBox regression,有待思考)
s m o o t h L 1 ( x ) = { 0.5 x 2 i f x < 1 x 0.5 o t h e r w i s e smooth_{L_1}(x)= \begin{cases} 0.5x^2 & if |x| < 1 \\ |x|-0.5 & otherwise \end{cases}
  小结一下,它避免了RCNN中对一个图像的重复计算,同时它集成了更一体化的训练方式,使检测和分类准确度再次提高~不过,它还是没有解决挖掘proposal region的耗时问题。


Faster R-CNN

  Faster R-CNN最重要的贡献是它提出了Region Proposal Network,这个网络代替了传统的Selective Search等方法,加快了region proposal的速度。话不多说,先看看Faster R-CNN的大致示意图:
Faster R-CNN

  整个网络可以看作是三部分:
  1. 通过CNN提取整个特征图像。
  2. 把整个特征图像送入RPN,提取有物体的,框框较大的感兴趣区域。
  3. 将感兴趣区域从特征图像中扣出送入RoI池化层,再进行分类与BBox回归。

   首先,RPN是怎么选出候选区域的见上面示意图。在VGG网络提取整个特征图像后,我们使用一个33的滑窗在这个图像上滑动,对于每一个位置,我们同时预测k个不同region proposals,所以左上角的分类层含有2k个输出(表明是否为物体的概率),右上角的边框回归层有4k个输出(表示region的坐标到groundtruth的坐标的四个矫正量)。其中,这k个proposals分别对应原图中k个框框里面object的大致位置。
   其次,为什么一个卷积出来的256-d向量能对应k个anchors个人理解,anchor boxes的size是我们人为固定好了的(anchor boxes的大小对应的是原图像的,它中心点是原图像上anchor boxes的中心点,对应到示意图里就是那个蓝点点),但是实际上神经网络中并没有把这k个anchor boxed坐标当做某某参数来搞。而是,神经网络在训练的过程中,每个anchor会根据它对应的k个boxes学出4
k个坐标矫正量(根据“人工定义的anchor boxes的坐标+人工标注groundtruth的坐标”得到的loss来学习)。(如果理解有误,还望在评论中批评指出,谢谢!)
RPN

  最后来看看RPN的loss函数,见下图。
  第一项,表示是否为object的log loss。第二项, p i p^*_i 表示框内只有是个object的时候才为1,这时 L r e g L_{reg} 和之前说的回归loss相同,这里不再多说~
  而后面的分类器classification loss和精细调整框框BBox regression这两个东西和之前的Fast R-CNN一样,这里也不多说了。
RPN loss function

  总之,Faster R-CNN用RPN替代了之前的区域选择的方法,得到了更快的速度和更精确的准确率~不过,Andrew Ng提到,尽管它可以当做同一网络进行端到端训练,它从提出候选区域到分类,边框回归的这一系列步骤还是比较麻烦的。所以,期待有更简洁更高效的目标检测方法~


参考文献

https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/object_localization_and_detection.html
http://blog.csdn.net/xjz18298268521/article/details/52681966
http://blog.csdn.net/myarrow/article/details/51878004
http://blog.csdn.net/qq_34784753/article/details/78707613
https://www.zhihu.com/question/42205480

发布了40 篇原创文章 · 获赞 44 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Site1997/article/details/79312730