RBG的RCNN使用region proposal(具体用的是Selective Search Koen van de Sande: Segmentation as Selective Search for Object Recognition)来得到有可能得到是object的若干(大概10^3量级)图像局部区域,然后把这些区域分别输入到CNN中,得到区域的feature,再在feature上加上分类器,判断feature对应的区域是属于具体某类object还是背景。当然,RBG还用了区域对应的feature做了针对boundingbox的回归,用来修正预测的boundingbox的位置。RCNN在VOC2007上的mAP是58%左右。
RCNN存在的问题:1、一张图像上有大量的重叠框,所以这些候选框送入神经网络时候,提取特征会有冗余! 2、训练的空间需求大。因为RCNN中,独立的分类器和回归器需要很多的特征作为训练。RCNN中提取候选框,提取特征和分类回归是分开的,可独立。
FAST-RCNN步骤
1、使用SS算法,在图像上生成2k个候选区域
2、将整张图片传入CNN,提取整张图片的特征
3、利用ROIPooling,在整张图片特征上扣取候选区域的特征(不同大小的候选区特征大小相同)
4、利用扣取的特征,对每个候选区域进行分类和候选框的回归精修
SPP的作用:不管输入的尺寸大小,输出都是固定的。
我们从上面网络结构图可以看出:最右边的不管输入是什么尺寸,每个特征图只输出一个值;中间的是不管输入什么尺寸,将特征图分为2*2个矩阵,每个矩阵取出一个值,一共有4个值;同理,最左边输出有16个值。所以不管输入特征图的大小,每一个特征图经过SPP以后都会产生21维的特征向量。
ROI pooling layer具体操作
- 根据输入image,将ROI映射到feature map对应位置
- 将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同)
- 对每个sections进行max pooling操作
这样我们就可以从不同大小的方框得到固定大小的feature maps
摘要
本文为目标检测提出了一种基于快速区域的卷积网络方法(FAST R-CNN)。FAST R-CNN建立在以前工作的基础上,利用深度卷积网络对目标进行有效分类。与以往的工作相比,FAST R-CNN在提高训练和测试速度的同时,也提高了检测精度。Fast R-CNN训练非常深的VGG16网络比R-CNN快9倍,测试时快213倍,并在Pascal voc 2012上取得了更好的效果。与sppnet相比,Fast R-CNN训练速度为VGG16 的3倍快,测试速度为10倍快,且精度更高。FAST R-CNN是在python和c++(使用caffe)中实现的,并且可以在开放源代码的MIT许可下获得:https: //github.com/rbgirshick/fast-rcnn.
一、引言
最近,深度卷积网络[14,16]大大提高了图像分类[14]和目标检测[9,19]的准确性。与图像分类相比,目标检测是一项更具有挑战性的任务,需要更复杂的方法来解决。由于这一复杂性,目前的方法(例如,[9,11,19,25]在多级流程中训练模型速度缓慢,且效果不佳。
复杂性的提高是因为检测需要精确地定位对象,这就产生了两个主要的挑战。首先,必须处理许多候选对象位置(通常称为“建议框”)。第二,这些候选框只提供粗略的位置,必须加以改进才能实现精确的定位。这些问题的解决方案往往会影响速度、准确性或简单性。
在本文中,我们简化了基于ConvNet的目标检测器的训练过程[9,11].我们提出了一种单级训练算法,它联合学习对目标方案进行分类并细化它们的空间位置。
此方法可以训练出一个非常深的检测网络,比VGG16快9倍,比SPPnet[11]快3倍。在运行时,检测网络在0.3s内处理图像(不包括对象提议时间),同时在Pascal voc 2012[7]上达到最高精度,为66%(R-CNN为62%)。
1.1 RCNN和SPP-Net
基于区域的卷积网络方法(RCNN)[9]利用深度ConvNet对目标建议框进行分类,获得了很好的目标检测精度。然而,R-CNN有明显的缺点:
1.训练是一个多阶段的过程。 R-CNN第一次使用对数损失函数完成了关于目标建议框的ConvNet。然后,它使用svms拟合ConvNet特性。这些svms充当对象检测器,取代通过微调学习的Softmax分类器。在第三个训练阶段,边框才被学习到。
2.训练在空间和时间上都是昂贵的。 对于svm和bounding-box回归的训练,从每个图像中的每个对象建议框中提取特征并写入磁盘。对于非常深的网络(如VGG16),这个过程需要GPU用2.5天的时间来处理VOC07的trainval集的5k图像。这些特性需要数百GB的存储空间。
3.目标检测速度慢。 在测试时,从每个测试图像中的每个对象建议框中提取特征.使用VGG16进行检测每张图片需要47s(在GPU上)。
R-CNN速度慢,因为它对每个对象建议框执行一个ConvNet前向传递,而不需要共享计算。空间金字塔池化网络(Sppnet)[11]被提出通过共享计算来加速R-CNN。sppnet方法计算整个输入图像的卷积特征映射,然后使用从共享特征映射中提取的特征向量对每个对象建议框进行分类。通过最大限度地将建议框内的特征映射部分合并成固定大小的输出(例如,6×6),为建议框提取特征。多个输出大小被池化,然后像在空间金字塔池[15]中那样连接。在测试时间,sppnet将R-CNN加速10至100倍。由于建议框特征提取速度更快,训练时间也减少了3倍。
sppnet也有明显的缺点。像R-CNN一样,训练是一个多阶段的过程,包括提取特征,用log损失函数对网络进行微调,训练svm,并最终拟合bounding-box回归器。特性也被写入磁盘。但与R-CNN不同,微调算法不能更新空间金字塔池之前的卷积层。毫不奇怪,这种限制(固定的卷积层)限制了非常深的网络的精度。
1.2. Contributions
我们提出了一种新的训练算法,在提高训练速度和精度的同时,弥补了R-CNN和sppnet的缺点。我们称这种方法为“Fast R-CNN”,因为它的训练和测试相对较快。Fast R-CNN方法有几个优点:
1.检测质量(MAP)高于R-CNN,sppnet
2.训练是单一阶段,使用多任务损失
3.训练可以更新所有网络层
4。功能缓存不需要磁盘存储。
FAST r-cnn是用python和c++(caffe[13])编写的,在开放源码的MIT许可下可以在 https://github.com/rbgirshick/ fast-rcnn.
二、Fast-RCNN的架构和训练
图1.快速r-CNN架构。一个输入图像和多个感兴趣区域(ROIS)被输入到全卷积网络中。每个ROI集合成一个固定大小的特征映射,然后通过完全连接层(FCS)映射到一个特征向量。该网络每个ROI有两个输出向量:Softmax概率和每类bounding-box回归偏移量。该体系结构是经过训练的端到端的多任务损失。
Fig.1说明了Fast R-CNN的体系结构。一个快速的R-CNN网络接受一个完整的图像和一组对象建议框作为输入。该网络首先用多个卷积(Conv)和最大池化层处理整个图像,生成一个Conv特征映射。然后,对于每个对象建议框,感兴趣区域(ROI)池化层从特征映射中提取固定长度的特征向量。每个特征向量被输入到一个完全连接(FC)层的序列中,这些层最终被划分为两个兄弟级输出层:一个在k个对象类上生成Softmax概率估计,另一个层为每个k个对象类输出四个实值数字。每组4个值编码一个k类的bounding-box位置。
2.1 ROI池化层
ROI池层使用最大池化将感兴趣的任何有效区域内的特征转换为具有固定空间范围 h×w(例如,7×7)的小特征映射,其中h和w是与任何特定ROI无关的层超参数。在本文中,ROI是进入Conv特征映射的矩形窗口。每个ROI由一个四元组(r,c,h,w)定义,该元组指定其左上角(r,c)及其高度和宽度(h,w)。
ROI最大池化层的工作原理是将h×w 的ROI窗口划分为近似大小为h/H×w/W的子窗口的H×W的网格,然后将每个子窗口pooling输出的值合并到相应的输出网格单元中。池化独立地应用于每个特征映射通道,如标准的最大池化。ROI层只是sppnet[11]中使用的空间金字塔池层的特例,其中只有一个金字塔级别。我们使用[11]中给出的池子窗口计算。
2.2、从预先训练的网络初始化
我们用三个预先训练过的ImageNet[4]网络进行实验,每个网络都有5个最大池化层和5-13个Conv层(详见4.1节)。当预先训练的网络初始化一个快速的R-CNN网络时,它会经历三个转换.。
首先,将最后一个最大池化层替换为ROI池化层,通过设置H和W与网络的第一个全连接层兼容(例如,H=W=7表示VGG16)
其次,网络的最后一个全连接层和Softmax(为1000路ImageNet分类训练)被替换为前面描述的两个兄弟层(一个全连接层后接k+1类别的Softmax和一个全连接层后接特定类别的bounding-box回归器)。
2.3、检测微调
利用反向传播训练所有网络权值是快速R-CNN的一项重要能力。首先,让我们阐明为什么SPPnet无法更新空间金字塔池层以下的权重。
其根本原因是当每个训练样本(即ROI)来自不同的图像时,通过SPP层的反向传播效率很低,这正是R-CNN和SPPnet网络被训练的方式。低效率源于这样一个事实:每个ROI可能有一个非常大的感受域,通常跨越整个输入图像。由于前向传播必须处理整个感受域,训练输入量很大(通常是整个图像)。
我们提出了一种在训练过程中利用特征共享的高效训练方法。在FAST R-CNN训练中,随机梯度下降(SGD)分层采样mini-batch,首先对N个图像进行采样,然后从每幅图像中采样R/N个ROI。关键的是,来自同一图像的ROIS在向前和向后传播中共享计算和内存。减小N可以减少了mini-batch计算量。例如,当使用N=2和R=128时,所提出的训练方案比从128幅不同图像(即R-CNN和sppnet策略)中采样一次ROI快约64倍。
这种策略的一个关注点是,它可能会导致训练收敛速度缓慢,因为来自同一图像的ROI是相关的。这似乎不是一个实际的问题,我们取得了较好的结果,N=2和R=128比R-CNN使用更少的SGD迭代。
除了分层抽样之外,FAST R-CNN还使用了一个简化的训练过程,通过一个微调阶段联合优化Softmax分类器和bounding-box回归器,而不是将Softmax分类器、svms和回归器训练在三个不同的阶段[9,11]。此过程的组成部分(loss、mini-batch抽样策略、通过ROI池化层的反向传播和SGD超参数)如下所述。
多任务损失:一个Fast R-CNN网络有两个兄弟输出层。第一个输出k+1个类别的离散概率分布(每ROI),p=(p0,...,pK)p=(p_0,...,p_K)p=(p0,...,pK)。和往常一样,p是由全连接层的k+1个输出接Softmax计算的。第二个兄弟层输出bounding-box回归偏移量,tk=(txk,tyk,twk,thk)t^k=(t^k_x,t^k_y,t^k_w,t^k_h)tk=(txk,tyk,twk,thk)。对于每个K对象类,按k索引。我们使用了[9]中给出的tkt^ktk参数化,其中指定了相对于对象方案的尺度不变平移和对数空间高度/宽度移动。
每个训练ROI都被标记为一个ground-truth类u和一个ground-truth bounding-box回归目标v。我们使用多任务损失函数L对每个标记的roi进行分类和bounding-box回归的联合训练:
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)L(p,u,t^u,v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v)L(p,u,tu,v)=Lcls(p,u)