r-cnn学习(一)
http://closure11.com/rcnn-fast-rcnn-faster-rcnn%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BA%8B/
首先看fast r-cnn这篇论文,中间加入了有些博友的想法。
问题
目标检测主要面临两个问题:过多的候选位置(proposals);必须由这些粗略的候选位置中选出准确的位置。
这篇论文将学习目标proposals分类和精确定位结合起来。
1、 R-CNN和SPPnet存在的问题
(1)R-CNN的问题
训练需要多阶段:先用ConvNet进行微调,再用SVM进行分类,最后通过regression对 bounding box进行微调。在R-CNN中,
20类即20个SVM分类器训练,20个bounding box回归器训练(测试同),非常繁琐;
训练代价大:在SVM和regression过程中,一张图需要2k个proposals(有大量重叠),提取每个proposals的特征
(重叠)并写入磁盘,耗时耗空间;
R-CNN需要先对proposals进行形变操作(227*227),再输入CNN提取特征,而AlexNet CNN在特征提取过程中并不
固定图像的大小,只是在全连接时才需要固定尺寸,然后使用SVM分类。
(2)SPPnet
R-CNN慢是因为其需要对每个proposals进行前向计算而没有共享,SPPnets通过共享来加速r-cnn,SPPnet先计算
整张图像的卷积特征图,然后通过提取特征图中特征向量对proposals进行分类。使用max pooling将特征映射为固定大
小。不同于R-CNN,微调算法不能更新spatial pyramid pooling前面的卷积层,只能更新后面的全连接层,这限制了其精度。
2、论文工作
(1)通过使用多任务损失,使训练成为单阶段的。
(2)训练可在所有层中更新
(3)不需要在磁盘中存储特征
3、如何做到呢
(1)fast r-cnn架构和训练
输入为整张图像和一系列的object proposals(大小不同)。网络首先用几层卷积和max pooling处理
整张图像,生成特征图;对于每个object proposal,使用RoI pooling从特征图中提取固定大小的特
征向量;将特征向量送入全连接层(fc layer),进而分出两支:一支输出K类物体的softmax 概率+背景,
另一支输出K个类别的四个值(每个类别框的位置和大小)。那么什么是RoI pooling?
(2)RoI Pooling
RoI pooling层使用 max pooling将不同大小的特征转为固定大小的小特征(W*H)。那么它是如何做到的呢?
对于一个h*w的区域,将其划分为H * W大小的格子,每个格子中有h/H * w/W个格子,对这些格子做 max pooling
就行了。
(3)预训练前网络的初始化
当用fast r-cnn初始化预训练网络时,它需要经历三种变换:
首先用RoI pooling层替代最后一个max pooling层,在送入全连接层前将其变为H*W;
其次,将最后一个全连接层和softmax替换为两个分支层(参考前文);
这个模型需要两个输入,一个为一系列图像,另一个为这些图像的一系列RoI(region of intrest)。
(4) 检测时的微调
首先阐述为啥SPPnet不能在spatial pyramid pooling layer下更新权重:这是因为在训练网络时,每个训练样本(RoI)来自
于不同的图像,而bp算法通过SPP layer是远远不够的(?)。这种不够是因为,每个RoI可能拥有非常大的感受野,经常跨越
整副输入图像。因为前向传输时必须处理整个感受野,训练输入时会很大(通常为整副图像)。
本文在训练时通过特征共享来提高效率。在训练时,SGD分层次采样,首先采样N张图像,然后在每张图像上采样R/N个RoI。
来自于同一张图像的RoIs共享计算和内存,这就将计算量降低了N倍。比如当N=2,R=128时,这种方法大约比在128张图像上提
取一个RoI(R-CNN和SPPnet的方法)快64倍。
除了分层采样,本文还采用流水线训练过程:使用一个微调阶段,将softmax分类器和bounding-box regressors联合优化,而不是
将训练softmax,SVM和regressors分成三个阶段。那个这个过程中的各个组成(包括loss,mini-batch采样策略,通过RoI pooling层的bp算法和
SGD参数)是怎么样的呢?
Multi-task loss
该模型包括两个分支输出层,第一个输出每个RoI离散的概率值(由softmax得出),有K+1类;
第二个分支输出bounding box的offsets,,其中tk表示尺度不变的转换相对object proposal的log-space的高度/宽度转换。
每个RoI的标签为类别u,每个bounding box的regression target记为v,本文对每个RoI使用一个multi-task loss来联合训练分类器
和bounding box regression:
其中,第二个损失函数(回归操作只针对前景)被定义为对于类别u的bounding box 的regression元组(?)。
其中v=,预测元组。对于bounding box loss:
Mini-batch sampling
在微调阶段,每个SGD mini-batch从N=2张图像中构造,均匀随机选择(常见的做法是遍历数据集的排列)。我们使用的
mini-batch的大小为R=128,每张图中采样64个RoI。我们从object proposals中取25%RoIs(正样本比例为25%),
这些object proposals与bounding box至少有0.5的交集。这些RoI包含前景,剩余的RoI也从object proposals中采样(负样本75%),
它们的IoU在0.1至0.5之间,这样是背景。
Back-propagation through RoI pooling layers
经过RoI pooling层的BP算法如何求导呢?
设xi表示RoI pooling层的第i个激活输入,yrj表示该层的第r个RoI的第j个输出,则该层的反向求导为
即反向传播中,L对输入层节点x的梯度为损失函数L对各个有可能的候选区域r输出梯度的累加。
SGD hyper-parameters
全连接层使用softmax分类和bounding box regression,初始化用的是0均值的高斯分布,标准偏差为
0.01和0.001,bias为0。
进行SGD训练时,R-CNN和SPPnet采用RoI-centric sampling,即从所有图片的所有候选区域中均匀取样,这样
每个SGD的mini-batch中包含了不同图像的样本不同图像之间不能共享卷积计算和内存,运算开销大;Fast R-CNN中
采用image-centric sampling:mini-batch采用层次采样,即先对图像采样(N个),再在采样到的图像中对候选区域采样
【每个图像中采样R/N个,一个mini-batch共计R个候选区域样本】,同一图像的候选区域卷积共享计算和内存,降低了运算开销。
Scale invariance
本文采用两种方式来达到尺度不变的目标检测:单一尺度和图像金字塔。
在单一尺度中,不管是训练还是测试,每张图像用固定大小的尺度来处理图像,希望网络从训练数据中直
接学习到尺度不变的特征表达;相比之下,多尺度方法通过图像金字塔提供了一个近似尺度不变给网络。在测试
阶段,图像金字塔为每个object proposal提供近似尺度归一化。在多尺度训练中,当一副图像被采样时,
我们随机采样金字塔尺度。最后的实验表明,多尺度的效果一般。
Fast R-CNN detection
网络输入一张图像和R个object proposals,在测试阶段,R=2000。对于每个测试的RoI r,前向传递输出
一个类别的后验概率分布p,以及一系列的预测bounding box offsets(相对r)。使用估计概率为每个类别k,对
于r,赋于一个检测置信值,并以每个类别使用非极大值抑制。
Truncated SVD for faster detection
对于整个图像分类来说,花在全连接层的时间要比卷积层的时间要少。相反,检测时RoI的数量很大,花费在全连接
层上的时间几乎是前向传播的一半。通过truncated SVD可以很容易加速大的全连接层。
对于u*v个权重的矩阵W,它可以近似分解为:
其中U为u*t,中间为t*t的对角阵,V为v*t的矩阵。SVD将参数由u*v减少为(u+v)*t,为了压缩网络,这个全连接
层变为两个全连接层。
SVM VS softmax
实验表明,采用softmax的效果比SVM的mAP要高。这是因为在softmax在引入了类间竞争,分类效果更好;同时
所有的特征只需存于显存中,不需要额外的磁盘空间。
仍存在的问题
Fast R-CNN中采用selective search算法提取候选区域,而目标检测大多数时间都消耗在这里,而且Fast R-CNN并没有
实现真正意义上的端到端训练模式。
那有没有可能使用CNN直接产生候选区域并对其分类呢?Faster R-CNN框架就是符合这样需求的目标检测框架,请看Faster R-CNN博客。
参考:http://blog.csdn.net/WoPawn/article/details/52463853