读DL论文心得之Fast RCNN

这篇论文是Ross Girshick等准备发表在ICCV 2015上面的Fast R-CNN。本篇论文也开源了(代码在此)。它是在R-CNN和SPPnet这一个系列的进阶版,相比起R-CNN,FRCN的训练阶段要快9倍,测试阶段要快213倍,相比起SPPnet,FRCN的训练阶段要快3倍,测试阶段要快10倍,并且准确率也有一定提高。首先看看R-CNN和SPPnet的不足之处。

drawbacks

R-CNN:
1. 训练时要经过多个阶段,首先要提取特征微调ConvNet,再用线性SVM处理proposal,计算得到的ConvNet特征,然后进行用bounding box回归。
2. 训练时间和空间开销大。要从每一张图像上提取大量proposal,还要从每个proposal中提取特征,并存到磁盘中。
3. 测试时间开销大。同样是要从每个测试图像上提取大量proposal,再从每个proposal中提取特征来进行检测过程,可想而知是很慢的。
SPPnet:
SPP已有一定的速度提升,它在ConvNet的最后一个卷积层才提取proposal,但是依然有不足之处。和R-CNN一样,它的训练要经过多个阶段,特征也要存在磁盘中,另外,SPP中的微调只更新spp层后面的全连接层,对很深的网络这样肯定是不行的。

overview

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

读DL论文心得之Fast RCNN_第1张图片

大概过程就是,用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)。预训练的网络初始化Fast RCNN要经过三次变形:
1. 最后一个max pooling层替换为RoI pooling层,设置H’和W’与第一个全连接层兼容。
2. 最后一个全连接层和softmax(原本是1000个类)替换为softmax的对K+1个类别的分类层,和bounding box 回归层
3. 输入修改为两种数据:一组N个图形,R个RoI,batch size和ROI数、图像分辨率都是可变的。

fine-tuning

前面说过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的关系:
读DL论文心得之Fast RCNN_第2张图片

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

你可能感兴趣的:(cnn,深度学习,RCNN,frcn)