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

前面咱们学习了
算法

【目标检测算法系列】1、R-CNN算法网络

【目标检测算法系列】2、SPP-Net算法.架构

【目标检测算法系列】3、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成为一个真正意义上的端到端的网络模型。下面咱们来具体看看post

1、Faster R-CNN总体架构

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

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

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

1.RPN网络概况

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

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

(注:上面说过,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池化层。

3、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)。

4、最终的分类和回归

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

5、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计算机视觉工坊,本公众号不按期推送机器学习,深度学习,计算机视觉等相关文章,欢迎你们和我一块儿学习,交流。

                                

相关文章
相关标签/搜索