Fast R-CNN基于之前的RCNN,用于高效地目标检测,运用了一些新的技巧,是训练速度、测试速度、准确率都提升。Fast R-CNN训练了一个VGG 16网络,但训练速度比RCNN快9被,测试速度快213倍,同时在PASCAL VOC上有更高的准确率,相比SPPnet,它的训练速度快3倍,测试速度快10倍。
之前的模型为了实现目标检测,有两个主要的问题:候选区域过多,同时区域不够精确,必须修正来达到准确定位,解决他们的同时牺牲了速度、准确率。Fast R-CNN提出了一个单段式的训练算法,可以同时进行分类和修正位置的学习。
训练是多段的:RCNN首先对卷积网络进行微调,然后通过得到的特征训练所有的SVM,第三步训练bounding-box回归。
训练占用大量时间与空间:训练SVM和bounding-box时,输入是每张图片中CNN提取的特征,它们存储在磁盘中。如果要训练像VGG16这样的大型网络,5k图片需要划分2.5 GPU-days来训练。同时需要几百G的存储空间。
目标检测速度缓慢:RCNN在VGG16上检测一张图片需要47s
检测缓慢的原因:一张图片的提取出的区域建议的计算参数不共享(一个区域做一次卷积)。因此SPPnet被提出(空间金字塔池化网络)通过共享计算来提速。SPPnet将整个图片作为输入进行卷积,将SS算法得到的区域映射到特征图上,得到对应的窗口,将窗口均匀划分为44, 22, 11的块,对每个块采取不同尺度最大池化,不同尺度的区域就得到了相同大小的特征向量(44+2*2+1)*N(对整张图片卷积,卷积池化后得到的特征图与原图片的特征位置是对应的,可以直接在特征图上截取候选框,然后做不同尺寸的最大池化将得到的特征向量拼接得到最终的特征向量)不同大小的输出被池化然后合并为空间金字塔池化层。
SPPnet相比RCNN测试速度提升了100倍,训练速度提升3倍。缺点:训练仍是多段的,包括提取特征,微调,训练SVM,训练bounding-box,特征也在磁盘中,微调算法不能更新在池化金字塔之前的卷积层,准确率受限。
Fast R-CNN输入一整张图片和SS算法提取的一组候选框,网络首先对一整张图片进行卷积、池化,得到一个特征图,然后对每个候选区域,RoI(region of interest)池化层会从特征图中提取一个定长特征向量。每个特征向量都进入全连接层,最终分别输入到两个输出层:第一个使用solftmax估计每个目标类与背景的概率,另一个对每个类输出它的bounding-box回归(每个类4个值)。
CNN的模型使用的是VGG16,将最后一个池化层用RoI层代替,最后一个全连接层和softmax被替换为一个K+1维的全连接层和softmax以及一个bounding-box回归分类器。
RoI(region of Interest与region proposal基本等价,是在特征图上的映射)
RoI池化是SPP池化层的简化版,SPP使用尺度不同的池化,而RoI池化只用一个尺度(7*7)。RoI池化层在全连接层之前,将不同大小的RoI在特征图上的映射块,池化为相同大小的特征向量,输入到全连接层。
1)怎么理解基于原图的区域建议映射在特征图上
上半部分是将区域作为输入进行卷积,下半部分是将原图输入进行卷积,可以看到全连接层的每个位置与原图的位置是有对应关系的,因为这种位置关系存在,使我们可以从原图找到区域,然后映射到特征图上。
2)怎么理解RoI池化层将不同大小的特征输入转换为相同大小的输出
FRCN的有两个输出层,一个是输出每个类的概率,使用了softmax,优于SVM;另一个是每个类的bounding-box回归,为了在向前向后传播时将二者结合,将损失函数修改为:
是每个类u的概率损失, 是边界框损失, 是超参数,用于调节概率和边界框损失的比例,当u=0时表示背景,背景没有ground-truth, 为0,其他情况为1。
smooth函数提高了鲁棒性
smooth L1
对里中心点较远的点不敏感(增加鲁棒性),同时折点位置可求导
对网络中所有权重使用反向传播时Fast R-CNN的重要能力。
为什么RCNN和SPPnet的空间池化金字塔下的权重不能通过反向传播更新呢:根本原因是当训练样本(RoI)来自不同图像时,反向传播效率极低(之前说过RCNN训练的mini-batch是从所有类的区域采样128个,由此是来自不同图像,FRCN的mini-batch是从N=2个图像分别采样R/N=64个区域。按作者的说法,来自不同图像会使反向传播效率极低)。低效的原因:RoI可能有一个非常大的感受野,通常几乎跨越整个输入图片,因为正向传播必须处理整个感受野,那么训练输入时很大的。
作者提出了在训练时特征共享。进行随机梯度下降时的mini-batch采用分级采样,首先采样得到N个图片,然后从每张图片中采样得到R/N个RoI,一共是R个RoI。来自同一个图片的RoI在向前向后传播中共享计算和内存。(假设N=2,R=128,那么采用共享计算的FRCN比从128张不同图像取RoI组成mini-batch的RCNN快64倍)
(微调中的抽样:在微调时,每个SGD(随机梯度下降)的mini-batch大小R=128,N=2,从每张图片采样64个RoI。从RoI中选取与ground-truth的IoU大于0.5的其中25%,他们作为foreground,u≥1,剩下的RoI从IoU值在[0.1, 0.5)的RoI中采样得到,作为背景u=0。)
暴力地将输入图像调整为一个固定的大小。
多尺度方法: 通过图像金字塔,是SPP的特例,使用一个特定大小的金字塔对图片进行采样、池化,得到定长的特征向量。
FRCN检测
完成微调后就可以进行检测。网络输入一张图片和图片的区域建议(大约2000个),图片卷积得到特征图,RoI提供映射,然后将不同大小的RoI输入RoI池化层,使它们尺度一致。对每个测试的RoI,输出每个类的概率和边界框回归偏移量,然后对每个类使用非最大抑制。
使用了三个用ImageNet预训练的模型,第一个是AlexNet,第二个是VGG_CNN_M_1024,第三个是VGG16,分别用S,M,L代替。
引入技巧:SVD
在检测时,计算全连接层在正向传播几乎占用了一半的时间,作者使用了截断奇异值分解,大的全连接层容易被其压缩,从而减少时间。(具体不明白)
实验证明微调要包含部分卷积层效果最好,但不能包含最前面的卷积层(基本特征不用微调,对实验没有提升)