Notes for Faster R-CNN and YOLO

最近NIPS 2015的投稿截止了,各种投到NIPS的文章也外泄了,看到了两篇关于Detection的文章,说实话,看到这些论文的时候一点兴奋都没有。

两篇paper都是出自rbg大神的: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks以及You Only Look Once: Unified, Real-Time Object Detection。然后两篇都是讲提速的,共同点都是把Selective Search(一些额外的proposal方法)去掉,用网络本身产生,做成一个end-to-end的框架。

Faster R-CNN

说白了是一个能够联合优化的Cascade结构。

核心思想是引入了一个Region Proposal Networks(RPNs),这个网络产生的proposals作为Fast R-CNN的输入。在特征提取上RPNs跟Fast R-CNN共享前面的所有卷积层,流程可简化如下:

其中RPNs的结构如下:

实际上操作的时候,会用RPNs在最后一层的特征图(Feature Map)上做划窗(Sliding window),窗口的大小是$n \textrm{x} n$,然后每个窗口经过RPNs后会产生$k$个proposals,为什么不是一个而是使用$k$个?看文章的意思是为了得到平移/尺度不变形,不过在我看来是没必要的,这样给人感觉太过hand-crafted了,直接回归一个bbox也就可以了。作者好像没有对$k$做对比实验。

然后具体是怎么联合优化的?实际上,一开始就直接把整个网络进行联合优化是不合理的,因为proposal都不准,训练Fast R-CNN的分类网络意义何在….所以作者就提出了自己的训练方法,一开始,RPNs跟Fast R-CNN的卷积层是不共享的:

  1. 用ImageNet-pre-trained(AlexNet或VGG)来初始化RPN,然后对RPN进行fine-tune。
  2. 用ImageNet-pre-trained(AlexNet或VGG)来初始化Fast R-CNN,然后对Fast R-CNN进行fine-tune,其中这时候Fast R-CNN的proposals输入是由训练好的RPN产生的。
  3. 用Fast R-CNN来初始化RPN,固定卷积层,fine-tune全连接层。
  4. 固定卷积层,同时fine-tune RPN跟Fast R-CNN。

方法不太优美,但是又好像只能这么做。

YOLO

这个很暴力…

只是大概讲一下思路,首先看一下YOLO的模型:

我想你应该没想错,就是这么暴力,对于一张图片,不管多大,都是先resize成448x448,然后扔进网络里面,网络就输出7x7=49个bbox,同时会为每个bbox输出它属于某种物体的概率。

那么具体这个7x7跟原图有什么关系以及groundtruth应该怎么设?作者是把原图划分成7x7=49个格子,然后如果原图上的某个物体的中点落在某个格子$b_{xy}$上,那么这个格子就负责预测这个物体出来,比如狗的bbox的中点落在(1, 5)这个格子,那么这个格子对应的groundtruth就是狗的bbox,以及狗的概率为1。

这有一个很严重的缺陷是,它没办法处理物体挨在一起且中点都落在同一个格子上的情况。

坚持原创技术分享,您的支持将鼓励我继续创作!