原始论文链接:http://arxiv.org/abs/1506.01497
Faster R-CNN 为R-CNN终极之作,提出了region proposal network 将region proposal放入整个深度网络中,通过卷积共享使得region proposal几乎不耗费任何时间。而且将region proposal的个数从2k降低到300个,大幅度提升了目标检测的速度,检测速度能够达到5fps。让我们看到了实时目标检测的希望,而且整个网络是端到端训练的,堪称完美。
github地址:https://github.com/ShaoqingRen/faster_rcnn
我们将在后续文章介绍faster_rcnn的环境搭建。
需要注意的是,尽管我们的RPN具有bounding box回归,但是RPN的主要作用是做region proposal,进一步优化bounding box还是通过fast Rcnn进行的
摘要及引言
Fast RCNN大幅度提高了目标检测的速度几乎可以达到实时的水平(除region proposal)。现在整个网络的速度瓶颈在region proposal,因为除了这部分,其他部分都是通过GPU进行运算的。能不能通过将region proposal 使用GPU进行实现从而提高速度呢?答案是显而易见的,文章通过RPN网络,将region proposal 加入到了整个检测网络中,并通过和检测网共享卷积层实现速度的提升,而且提高了检测精度。
相关工作
object proposal
常用的proposal方法主要有基于超像素合并的,如selective search、CPMC、MCG。还有基于滑动窗口的,如EdgeBoxes。通常这些模型适合检测网络进行分开的,如我们之前讲到的RCNN的各种变形。目标检测的深度模型
R-CNN仅使用卷积特征对region proposal 进行分类和预测,使用额外的bounding box回归进行区域修正。Fast R-CNN将bounding box回归加入检测网络中。但是这些方法在很大程度上依赖于region proposal的正确性。一些paper提出使用深度网络进行预测目标的bounding box。如Overfeat、MultiBox。但是这些网络并不和检测网络共享权重,因此收敛速度和效果不是很好。
Faster R-CNN
Faster R-CNN由两部分组成:RPN、Fast RCNN。类似于采用注意力机制,RPN告诉RCNN where to look。
RPN
RPN网络接受输入为一幅图片,输出为很多的region proposal和目标分数(分数越高越可能为目标)。由于需要和检测网络进行权值共享,因此使用和检测网络一样的CNN模型,如VGG-16。为了得到众多的region proposals,我们在最后一层feature map上滑动一个小的n*n(如3*3,虽然n很小但是对应的感受野通常很大,如228pixels)网络,然后生成一个低维的特征向量(如512d)。将特征向量输入bounding box回归层(输出4个坐标)以及box 分类层(输出是目标还是背景,2分类)。Anchors
在feature map上我们滑动我们的3*3小窗口的时候,Faster RCNN使用了一个reference box称为Anchors。一个Anchor与一个尺度和比例相关联,通过Achors实现多尺度窗口采样。
文中使用3个尺度和3个比例的Anchor,在每个3*3的滑动窗口中,都提取这9个尺寸的feature,然后生成一个低维的特征向量传递给后面的分类和回归网络。对于一个W*H(通常约为2400)大小的feature map,共产生W*H*K个anchors。多尺度预测
对于多尺度问题通常有两种解决方案,本文提出一种新颖的解决方案,提高了多尺度问题的计算速度。- image/feature pyramids
这种方法是通过将图像或者是feature map resized到不同的尺度,然后对每个scale单独处理,形成金字塔。这种方法很常用但是也很耗时。 - sliding windows of multiple scales on the feature maps.
在feature map上滑窗能够有效减少计算量,通常与第一种方法一起使用。可称为“pyramid of filters” - pyramid of anchors
这是本文的做法,通过anchors进行采样,这样我们仅仅针对一个scale的图像输入,使用多个scale的anchors产生多个尺度的anchors输出。
- image/feature pyramids
Loss Function
在训练RPN的时候,我们将anchors分为两类(object or not),将与任何一个目标的IoU>0.7的标为object,IoU<0.3的标位负样本。目标函数使用与Fast R-CNN类似的多任务目标函数:
训练RPNS
RPN是一个端到端的网络,因此可以使用bp通过SGD进行优化。为了使得训练结果不偏向负样本(数量较多),我们在每一个mini-batch(256 anchors)中尽量使得正负样本数量一致。训练时所有的新层使用0均值高斯分布初始化,其他层用预训练的imageNet初始化。Fast R-CNN的训练
与Fast R-CNN中文章中一致,与RPN分开训练。参见:http://blog.csdn.net/u011587569/article/details/52151871RPN与Fast R-CNN的特征共享
文章使用4-step交替训练方法进行特征共享
1.通过ImageNet预训练RPN网络,并使用region proposal 任务fine-tune。
2.通过ImageNet预训练Fast RCNN网络,并使用步骤一的region proposal进行fine-tune。
3.使用第二步的Fast RCNN共享卷积层去fine-tune RPN的特有几层。
4.使用第三步产生的region proposals 固定Fast RCNN的卷积层,fine-tune Fast RCNN的特有层。
实验部分
rbg大神的实验通常都很充分很精彩,过段时间细看。
使用自己的图片做了个测试,可以看看效果:
实现过程参见这篇博文:
http://blog.csdn.net/u011587569/article/details/52180205
结论和总结
Faster R-CNN 提出RPN,将region proposal的计算也放入GPU中,通过和检测网络的共享卷积大幅度提升了检测速度,基本上可以达到实时的水平。而且region proposal的精度以及检测的精度也有提升,可谓是完美!