目标检测算法之 Faster R-CNN算法详解

 


Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015.

本文是继RCNN[1],fast RCNN[2]之后,目标检测界的领军人物Ross Girshick团队在2015年的又一力作。简单网络目标检测速度达到17fps,在PASCAL VOC上准确率为59.9%;复杂网络达到5fps,准确率78.8%。

作者在github上给出了基于matlab和python的源码。

上一节我们介绍到Fast R-CNN网络,Fast R-CNN看似很完美了,但是Fast R-CNN中还存在着一个优点尴尬的问题,它需要先使用Selective Search提取框,这个方法比较慢,有时,检测一张图片,大部分时间不是花费在计算神经网络分类上,而是花在Selective Search提取框上!在Fast R-CNN升级版Faster R-CNN中,使用RPN(Region Proposal Network)网络取代了Selective Search,不仅速度得到了大大提高,而且还获得了更加精确的结果。

回到顶部

一 Faster R-CNN思路

从R-CNN到Fast R-CNN,再到本文的Faster R-CNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。 
这里写图片描述

Faster R-CNN可以简单地看做“区域生成网络(RPN)+Fast RCNN“的系统,用区域生成网络代替Fast R-CNN中的Selective Search方法,网络结构如下图。本篇论文着重解决了这个系统中的三个问题: 

  • 如何设计区域生成网络 
  • 如何训练区域生成网络 
  • 如何让区域生成网络和Fast R-CNN网络共享特征提取网络

目标检测算法之 Faster R-CNN算法详解_第1张图片

步骤如下:

  • 首先向CNN网络【ZF或VGG-16】输入任意大小图片M×NM×N
  • 经过CNN网络前向传播至最后共享的卷积层,一方面得到供RPN网络输入的特征图,另一方面继续前向传播至特有卷积层,产生更高维特征图;

  • 供RPN网络输入的特征图经过RPN网络得到区域建议和区域得分,并对区域得分采用非极大值抑制【阈值为0.7】,输出其Top-N【文中为300】得分的区域建议给RoI池化层;
  • 第2步得到的高维特征图和第3步输出的区域建议同时输入RoI池化层,提取对应区域建议的特征;
  • 第4步得到的区域建议特征通过全连接层后,输出该区域的分类得分以及回归后的bounding-box。
  • 回到顶部

    二 RPN详解

    基本设想是:在提取好的特征图上,对所有可能的候选框进行判别。由于后续还有位置精修步骤,所以候选框实际比较稀疏。 

    目标检测算法之 Faster R-CNN算法详解_第2张图片

    1、特征提取

    RPN还是需要使用一个CNN网络对原始图片提取特征。为了方便读者理解,不妨设这个前置的CNN提取的特征为51×39×25651×39×256,并对得分区域进行非极大值抑制后输出得分Top-N(文中为300)区域,告诉检测网络应该注意哪些区域,本质上实现了Selective Search、EdgeBoxes等方法的功能。

    目标检测算法之 Faster R-CNN算法详解_第3张图片

    3、框回归

    如图绿色表示的是飞机的实际框标签(ground truth),红色的表示的其中一个候选区域(foreground anchor),即被分类器识别为飞机的区域,但是由于红色区域定位不准确,这张图相当于没有正确检测出飞机,所以我们希望采用一种方法对红色的框进行微调,使得候选区域和实际框更加接近:

    目标检测算法之 Faster R-CNN算法详解_第4张图片

    对于目标框一般使用四维向量来表示(x,y,w,h)(x,y,w,h)

    目标检测算法之 Faster R-CNN算法详解_第5张图片

    那么如何去计算FF

    • 平移:

    Gx=Ax+Awdx(A)Gx′=Ax+Aw⋅dx(A)

    • 缩放:

    Gw=Awexp(dw(A))Gw′=Aw⋅exp(dw(A))
    之后,我们就可以计算出精确的anchor,然后按照物体的区域得分从大到小对得到的anchor排序,然后提出一些宽或者高很小的anchor(获取其它过滤条件),再经过非极大值抑制抑制,取前Top-N的anchors,然后作为proposals(候选框)输出,送入到RoI Pooling层。

    回到顶部

     三 RoI Pooling层

     RoI Pooling层负责收集所有的候选框,并计算每一个候选框的特征图,然后送入后续网络,从Faster RCNN的结构图我们可以看到RoI Pooling层有两个输入:

    • 原始的特征图;
    • RPN网络输出的候选框;

    1、为何使用RoI Pooling

    先来看一个问题:对于传统的CNN(如AlexNet,VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定的大小。如果输入图像大小不定,这个问题就变得比较麻烦。有2种解决办法:

    • 从图像中crop一部分传入网络;
    • 将图像warp成需要的大小后传入网络;

     目标检测算法之 Faster R-CNN算法详解_第6张图片

    两种办法的示意图如上图,可以看到无论采取那种办法都不好,要么crop后破坏了图像的完整结构,要么warp破坏了图像原始形状信息。
    回忆RPN网络生成的proposals的方法:对foreground anchors进行bounding box regression,那么这样获得的proposals也是大小形状各不相同,即也存在上述问题。所以Faster R-CNN中提出了RoI Pooling解决这个问题。不过RoI Pooling是从Spatial Pyramid Pooling发展而来,有兴趣的读者可以自行查阅相关论文。

    2、RoI Pooling原理

    我们把每一个候选框的特征图水平和垂直分为pooled_w(文章中为7)和pooled_h(7)份,对每一份进行最大池化处理,这样处理后,即使大小不一样的候选区,输出大小都一样,实现了固定长度的输出:

    目标检测算法之 Faster R-CNN算法详解_第7张图片

    然后我们把Top-N个固定输出(7×7=497×7=49,所以这就说明了RoI Pooling的重要性。

    回到顶部

     五 训练

    Faster R-CNN使用RPN生成候选框后,剩下的网络结构和Fast R-CNN中的结构一模一样。在训练过程中,需要训练两个网络,一个是RPN网络,一个是在得到框之后使用的分类网络。通常的做法是交替训练,即在一个batch内,先训练RPN网络一次,再训练分类网络一次。关于训练的详细流程可以参考一文读懂Faster RCNN。

     参考文章:

    [1]Faster R-CNN论文详解

    [2]Faster RCNN解析

    [3]【目标检测】Faster RCNN算法详解 

    [4]Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

    [5]基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(强烈推荐)

    [6]目标检测(5)-Faster RCNN

    [7]RCNN,Fast RCNN,Faster RCNN 总结

    [8]Faster RCNN代码理解(Python)

    [9]一文读懂Faster RCNN(这位大佬讲的很细、相信这看了这篇文章,对Faster RCNN的实现细节你会有了更深的了解)

    [10]Object Detection and Classification using R-CNNs

你可能感兴趣的:(目标检测)