【目标检测算法系列】四、Faster R-CNN算法

1,800 阅读9分钟

前面我们学习了

【目标检测算法系列】一、R-CNN算法

【目标检测算法系列】二、SPP-Net算法.

【目标检测算法系列】三、Fast R-CNN算法

这次,我们紧接着,继续看下 Faster R-CNN。

上次我们讲到Fast R-CNN时,说过Fast R-CNN虽然已经对之前的R-CNN系列算法做了很多改进,不管是速度还是精度,都得到了一个很大的提升,但是还有一个可以优化的地方就是最开始时候的,候选框的提取算法。不管是R-CNN, SPP-Net, Fast R-CNN,都是依靠区域选择算法来进行推测目标位置,但是这种方案很耗时。而Faster R-CNN的提出,终于解决了这个瓶颈问题,Faster R-CNN使用了一种新的区域提出网络(RPN),该网络将与检测网络共享整个图像的卷积特征,从而大大减少了候选框提取的时间成本,同时使Faster R-CNN成为一个真正意义上的端到端的网络模型。下面我们来具体看看

一、Faster R-CNN整体架构

Faster R-CNN整体架构如上图所示,它由两个模块组成,负责进行候选框提取的RPN网络模块,以及使用提取出来的候选框进行检测的Fast R-CNN检测模块。具体来讲这两个模块的关系,就是RPN告诉Fast R-CNN要看哪里。两个模块共享卷积特征,整个Faster R-CNN系统,就是一个统一的目标检测网络模型。

二、区域提案网络(RPN)详解

Faster R-CNN模型,最主要的就是RPN网络的提出,下来我们具体看下。

1.RPN网络概况

RPN是一个全卷积网络,它将通过基础网络(VGG等)的对应共享卷积模块提取出来的feature map 作为输入,最终输出提案框(候选框)的集合,每个提案框中有对应类别信息(背景或者前景)以及对应框的坐标信息。

在RPN网络中,在输入的feature map上,滑动一个n*n(一般使用3*3)的小网络窗口,每一个滑动窗口将会映射到一个低维向量上(对于ZF是256-d,对于VGG来说就是521-d),将这个向量输出给两个同级的全连接层,即检测框回归层(reg)和检测框分类层(cls)。如图所示:

(注:上面说过,RPN网络是一个全卷积网络,为何这块又会出现全连接层呢?其实这个是针对单个滑动窗口来说,结合到一块,整体针对整个输入的feature map,就是先进行3*3的卷积,然后再跟上两个同级的1*1的卷积filter进行分类和回归,如下图所示:)


2.anchor boxs

为了解决各个待检测对象大小不定的问题,RPN中引入了anchor boxs。

为了检测不同大小的对象,在上述每一个滑动窗口的位置,以滑动窗口的中心为中心点,我们同时预测k个anchor ,anchor 一般采用三种面积尺寸(128^2,256^2,512^2)以及每个尺寸下的三种长宽比(1:1,1:2,2:1),所以针对每个滑动窗口,需要使用k=9个anchor.如下图:

因为在RPN网络中,最终输入与输出的长宽尺寸是不变的,改变的只是channel通道数,所以,针对于的feature map,总共需要个anchor,最终RPN网络的分类层输出为:,回归层输出为:

(因为RPN只进行前景和背景的粗分类,所有对于feaure map中的每个位置,输出为2k个值,每个anchor需要通过4个值来定位,所以每个位置对应的回归层输出个数为4k)

3.anchor的具体提取

虽然anchors是基于共享卷积层后feature map来定义的,但是最终的anchors是建立在原始图片上的。

所以,我们是基于原图来生成anchors的,之前在说Fast R-CNN中的ROIpooling层我们说过,因为提取feature map的卷积模块,只有卷积层和pooling层,所以feature map的尺寸与原图的尺寸是成比例映射关系的,如果图片尺寸 w*h,特征图的尺寸则是w/r * h/r 如果在卷积特征图空间位置定义 anchor,则最终的图片会是由 r 像素划分的 anchors 集. (VGG 中, r=16)。另外,对于那些跨越图像边界的anchor,我们直接忽略掉。

4.RPN网络具体训练过程

首先,RPN网络的输入即为共享卷积模块提取出来的feature map。在训练时,需要将所有的anchor分为正样本(前景)和负样本(背景)。

其中正样本包含以下两类anchor:

  1. 与ground-truth(真实检测框)IOU最高的anchor

  2. 与任意ground-truth(真实检测框)的IOU大于0.7的anchor

可以看到,一个ground-truth可能对应多个anchor。

而对于与所有的ground-truth的IOU都小于0.3的anchor,我们分配到负样本。对于剩余的那些非正非负的anchor,我们将其丢弃,不进行训练。

对于一张图片的所有正负样本的anchor,并不会都用来训练,而是随机在一张图片中采样256个anchor作为一个mini-batch,计算mini-batch的损失函数,其中采样的正负anchor的比例最多是1:1。如果一个图像中的正样本数小于128,我们就用负样本填补这个mini-batch。(如果采用所有的anchor的话,预测结果会偏向于负样本,因为负样本是占大多数的)。

RPN网络中的损失函数,与Fast R-CNN中的基本保持一致,如下所示:

相关参数代表含义如下:

其中为第i个anchor预测为前景的概率,当第i个anchor为正样本时,,当第i个anchor为负样本时,,由此可见,只有在正样本时,才会去关系后面的回归检测。即为一个mini-batch

为第i个anchor(正样本)到预测区域的对应4个平移缩放参数,为第i个anchor(正样本)到ground-truth(真实检测框)的对应4个平移缩放参数。

即为一个mini-batch。

下面具体看下

对于分类损失函数,因为RPN中的分类是一个二值分类器,所以

回归损失函数为(两种变换之差最小化):

其中,

最后,参数用来权衡分类和回归损失,默认值为=10

至此,通过RPN网络得到了对应提案框以及每个提案框的得分,并对得分使用NMS(非极大值抑制),阈值为0.7,得到得分靠前的TOP-N(论文中为300个)个提案框提供给后续的ROI池化层。

三、ROI池化层

Faster R-CNN中的ROI池化层和Fast R-CNN中的是一样的。对于前面的共享卷积层所提取出来的feature map,既会提供给RPN网络进行提案框的提取,也会提供给ROI池化层。

对于ROI池化层来说,对于输入的feature map,会根据RPN网络最终所提供出来的提案框,来找到对应提案框在feature map上的映射,也就是对应ROI(候选框所对应的feature map)。正如之前所有,RPN告诉Fast R-CNN要看哪里。然后后续,就和Fast R-CNN完全一样,将输入的不同ROI(候选框所对应的feature map)划分为H*W个块,然后在每个块中使用最大池化层提取出一个特征,对应池化操作独立于每个feature map通道,最终输出H*W*c(c为通道数)的特征。将输入的特征转换为特征向量喂给后面的全连接层。(对于使用的VGG16为基础模型来说,这块H*W为7*7)。

四、最终的分类和回归

讲过ROI池化层,提取出固定长度的特征向量,进行后续的全连接层、分类,回归,和Fast R-CNN中完全一样,这块不再赘述。

五、Faster R-CNN完整训练流程

通过上面的说明,我们知道了,Faster R-CNN是将经过共享卷积模块提取出来的feature map通过RPN网络来进行候选框的提取,同时进行粗分类和粗回归,然后再经过ROI池化层来提取出固定的特征向量,送入全连接层中,进行最终的精确分类与回归。

完整训练流程如下:

1. 先使用ImageNet数据集训练一个CNN网络(这块采用VGG)

2. 进行数据预处理,将输入图像的尺寸经过缩放固定到600*600,

3. 使用预训练网络的卷积模块(具体到block5_conv3)提取feature map,送入RPN网络中,端到端的fine-tune(微调)RPN网络。

4. 先固定RPN的权值,利用第3步中RPN生成的提案框,训练一个单独 的Fast R-CNN检测网络。这个检测网络同样是由ImageNet预训练 的模型初始化的,这时候两个网络还没有共享卷积层

5. 用第四步训练的检测网络来初始化RPN训练,但是训练时,我们固 定共享的用来提取feature map的卷积层,只微调RPN独有的层。

6. 继续保持固定共享的卷积层,微调Fast R-CNN的FC层。

这样进行下来,两个网络共享相同的卷积层,构成一个统一的网络。上述的最后的交替训练可以迭代多次,但是论文中提出对结果并没有多大改进。

上述就是Faster R-CNN的相关内容,一个真正意义上的端到端的网络模型,相对于之前的RCNN系列,检测速度有个很大的提升,几乎可以做到实时检测,并且,精度上也有较大提升。

后面,我们将通过keras来实现Faster RCNN。

欢迎关注我的个人公众号 AI计算机视觉工坊,本公众号不定期推送机器学习,深度学习,计算机视觉等相关文章,欢迎大家和我一起学习,交流。