Fast R-CNN

Girshick R,Microsoft Research. Fast R-CNN:Fast Region-based Convolutional Networks for object detection[J]. IEEE International Conference on Computer Vision, 2015:1440-1448.

提出感兴趣区域池化(RoI pooling),可以完成特征提取,分类,包围盒回归的端到端联合训练。Fast R-CNN 相比SPP-net 的优势在于 : SPP-net 中 SPP 层前的卷积层不能进行网络参数更新 [24] , 而 Fast R-CNN 可以 ;SPP-net 为进行包围盒回归 , 需要使用额外的回归模型 ( 如线性 SVM 等 ), 包围盒回归不能融入整个网络训练 .

问题:Fast R-CNN 在除了候选区域提取以外的环节接近于实时 , 候选区域提取是计算中的瓶颈问题 .


摘要:本文提出了一个用于目标检测的方法Fast R-CNN。Fast R-CNN建立在R-CNN的基础上使用深度卷及网络可以更有效的进行目标分类,与之前的工作相比,Fast R-CNN几种创新来提升测试速度以及检测准确率。Fast R-CNN在VGG16 network上训练速度是R-CNN的9倍和SPPnet的3倍,测试速度是R-CNN的213倍以及SPPnet的10倍,并且PASCAL VOC2012数据集上获得了更高的mAP。Fast R-CNN执行在caffe环境下的python和C++,执行代码获取地址:https://github.com/rbgirshick/fast-rcnn.

1.Introduction

  目标检测复杂性的出现是由于检测需要有目标的准确定位,由此产生了两个主要的挑战。首先,必须对众多的候选位置进行处理。其次,这些候选项只提供粗略的位置,必须将其细化到实现精确定位。解决这些问题的方法通常是速度、准确率、简单性的折中。

本文中,我们简化最新型的基于卷积目标检测训练方法,提出了一个单层次的训练算法,该算法可以共同的学习目标分类建议框并能完善它们的空间位置。

Drawbacks

R-CNN: 
1. 训练时要经过多个阶段:首先要使用log损失函数对目标建议框的ConvNet进行微调,然后使得SVM适合ConvNet feature。这些SVM替代通过微调得到的softmax分类器作为目标检测器。在训练的第三阶段,学习得到bounding box的回归。(再用线性SVM处理proposal,计算得到的ConvNet特征,然后进行用bounding box回归)

2. 训练时间和空间开销大:对于SVM和b-box 回归的训练,要从每一张图中的每一个proposal中提取特征并写入磁盘中。要从每一张图像上提取大量proposal,还要从每个proposal中提取特征,并存到磁盘中)

3. 目标检测速度慢:在测试时,从每一张图片的每一个proposal中提取feature,VGG16检测需要47s/image。要从每个测试图像上提取大量proposal,再从每个proposal中提取特征来进行检测过程) 

R-CNN速度慢是因为它对每一个目标proposal都进行前向传播,而没有使用计算结果共享,SPPnet通过使用计算结果共享对R-CNN进行了加速。SPPnet方法是对整张图片计算其feature map 然后使用一个从共享的feature map中提取的特征向量对每一个object proposal进行分类。通过maxpooling proposal内特征图的部分来提取特征从而得到一个object proposal,被提取出来的特征形成一个固定大小的输出。

SPP已有一定的速度提升,它在ConvNet的最后一个卷积层才提取proposal,但是依然有不足之处。和R-CNN一样,它的训练要经过多个阶段,特征也要存在磁盘中,另外,SPP中的微调只更新spp层后面的全连接层,对很深的网络这样肯定是不行的。

Contribution

针对R-CNN和SPPnet的缺点,FRCN做到了下面的改进: 
1. 比R-CNN更高的检测质量(mAP); 
2. 把多个任务的损失函数写到一起,实现单级的训练过程; 
3. 在训练时可更新所有的层; 
4. 不需要在磁盘中存储特征。 

Fast R-CNN architecture

Fast R-CNN网络需要输入一张完整的图片和一个object proposal集合,该网路首先使用多个卷基层和max池化层处理整张图片,从而得到一个feature map。然后对于每一个感兴趣区域通过池化层从feature map中提取一个固定长度的特征向量。每个特征向量被输入到全连接序列,最后被分成两个输出层:其中一个在k目标类别上增加背景类并产生一个softmax 概率估计,另一个输出对于每一个k个对象类的实值数字。每一个四个实值数字集合精细化k类别的b-box的位置。


整个结构如下图所示:

这里写图片描述

大概过程就是,用selective search在一张图片中生成约2000个object proposal,即RoI。把它们整体输入到全卷积的网络中,在最后一个卷积层上对每个ROI求映射关系,并用一个RoI pooling layer来统一到相同的大小。继续经过两个全连接层(FC)得到特征向量。特征向量经由各自的FC层,得到两个输出向量:第一个是分类,使用softmax,第二个是每一类的bounding box回归。

RoI pooling layer

这是SPP pooling层的一个简化版,只有一级“金字塔”,输入N个特征映射和一组R个RoI,R>>NN个特征映射来自于最后一个卷积层,每个特征映射都是H x W x C的大小。每个RoI是一个元组(n, r, c, h, w)n是特征映射的索引,n∈{0, ... ,N-1}(r, c)是RoI左上角的坐标,(h, w)是高与宽。输出是max-pool过的特征映射,H' x W' x C的大小,H'≤HW'≤W。对于RoI,bin-size ~ h/H' x w/W',这样就有H'W'个输出bin,bin的大小是自适应的,取决于RoI的大小。

Pre-trained networks

用了3个预训练的ImageNet网络(CaffeNet/VGG_CNN_M_1024/VGG16),每一个网络都具有5个max pooling和5-13个Convnet。预训练的网络初始化Fast RCNN要经过三次变形: 
1. 最后一个max pooling层替换为RoI pooling层,设置H’和W’与第一个全连接层兼容。 
2. 最后一个全连接层和softmax(原本是1000个类)替换为softmax的对K+1个类别的分类层,和bounding box 回归层。 
3. 输入修改为两种数据:图片的列表和这些图片中ROI的列表,

R个RoI,batch size和ROI数、图像分辨率都是可变的。

Fine-tuning

本文提出了一个更有效的训练方法:在训练期间充分利用特征共享,在训练FRCNN时分层采样得到SGD mini-batches,首先对一张图片取样取出N个子采样图片,然后对每一个子图片进行采样,每个子图片取出R/N个RoI,同一个子图片的RoI在前向和反向传播中共享计算结果和存储空间。N值越小mini-batch 计算结果越小。

该方法可能会由于同一个图片的RoI相关联而减慢训练的收敛。(实际中没有发生)

前面说过SPPnet有一个缺点是只能微调spp层后面的全连接层,所以SPPnet就可以采用随机梯度下降(SGD)来训练。 
RoI-centric sampling:从所有图片的所有RoI中均匀取样,这样每个SGD的mini-batch中包含了不同图像中的样本。(SPPnet采用) 
FRCN想要解决微调的限制,就要反向传播到spp层之前的层,反向传播需要计算每一个RoI感受野的卷积层,通常会覆盖整个图像,如果一个一个用RoI-centric sampling的话就又慢又耗内存。 
image-centric sampling: mini-batch采用层次取样,先对图像取样,再对RoI取样,同一图像的RoI共享计算和内存。 
另外,FRCN在一次微调中联合优化softmax分类器和bbox回归,看似一步,实际包含了多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、RoI pooling层的反向传播(backpropagation through RoI pooling layers)、SGD超参数(SGD hyperparameters)。

multi-task loss

两个输出层,一个对每个RoI输出离散概率分布:这里写图片描述 
一个输出bounding box回归的位移:这里写图片描述 
k表示类别的索引,前两个参数是指相对于object proposal尺度不变的平移,后两个参数是指对数空间中相对于object proposal的高与宽。把这两个输出的损失写到一起:

这里写图片描述

k*是真实类别,式中第一项是分类损失,第二项是定位损失,L由R个输出取均值而来,不再具体展开。

mini-batch sampling

在微调时,每个SGD的mini-batch是随机找两个图片,R为128,因此每个图上取样64个RoI。从object proposal中选25%的RoI,就是和ground-truth交叠至少为0.5的。剩下的作为背景。

backpropagation through RoI pooling layers

RoI pooling层计算损失函数对每个输入变量x的偏导数,如下:

这里写图片描述

y是pooling后的输出单元,x是pooling前的输入单元,如果y由x pooling而来,则将损失L对y的偏导计入累加值,最后累加完R个RoI中的所有输出单元。下面是我理解的x、y、r的关系: 
这里写图片描述

SGD hyperparameters

是一些参数的设置。

Scale invariance

SPPnet用了两种实现尺度不变的方法: 
1. brute force (single scale),直接将image设置为某种scale,直接输入网络训练,期望网络自己适应这个scale。 
2. image pyramids (multi scale),生成一个图像金字塔,在multi-scale训练时,对于要用的RoI,在金字塔上找到一个最接近227x227的尺寸,然后用这个尺寸训练网络。 
虽然看起来2比较好,但是非常耗时,而且性能提高也不对,大约只有%1,所以这篇论文在实现中还是用了1。

Truncated SVD for faster detection

在分类中,计算全连接层比卷积层快,而在检测中由于一个图中要提取2000个RoI,所以大部分时间都用在计算全连接层了。文中采用奇异值分解的方法来减少计算fc层的时间,学过矩阵论的都懂,不展开了。

results

for VOC2007

method mAP S M L train time(h) S M L test rate (s/im) S M L
SPPnet BB — — 63.1 — — 25 — — 2.3
R-CNN BB 58.5 60.2 66.0 22 28 84 9.8 12.1 47.0
FRCN 57.1 59.2 66.9 1.2 2.0 9.5 0.10 0.15 0.32


Conclusion

当然,可能存在未发现的技术,这种技术可以使得密集型boxes表现的像稀疏型那样。这种方法可以进一步加速对象检测。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值