目标检测系列(二):Fast R-CNN

在前面R-CNN中我们讲到Ross Girshick使用CNN取代传统的方法来提取图像特征,将卷积神经网络引入了神经网络中,使得目标检测的性能得到了很大的提升。

虽然R-CNN相较于传统方法有了显著的提升,但是R-CNN还有几个明显的弊端:

  • 1、 训练是多段式的,需要训练几个不同的模型——提取特征的CNN模型,分类用的SVM模型以及精修候选框的回归模型;
  • 2、训练时间和空间开销很大。在时间上,训练一个非常深的网络花费时间非常多,如VGG16,这个过程在单GPU上需要2.5天(VOC07上的5k个图像)。在空间上,由于不论是候选框还是CNN提取的候选框特征都是需要储存在磁盘上的,这些储存需要数百GB的空间;
  • 3、目标检测速度很慢。在测试时,需要先从每个候选框提取特征。使用VGG16检测单个图像需要47s(单GPU)。

R-CNN慢是因为他为每个图像的候选框都进行的单独的运算(前向传播)。而SPPnet正是考虑到同一张图像的前向传播计算是可以共享,其将整张原始图像作为输入,计算整个图像的卷积特征图,然后使用从共享特征图提取的特征向量来对每个候选框进行分类(这里有个操作是将候选框的坐标映射到feature map坐标上)。SPPnet通过最大池化将候选框内的特征图转化为固定大小的输出(例如,6x6)来提取针对候选框的特征。其多个feature map被池化,然后连接成空间金字塔。SPPnet在测试时将R-CNN加速10到100倍。而由于更快的候选框特征提取训练时间也减少3倍。

但SPP网络也有很多与R-CNN相同的明显缺点——系统为多级流水线,特征写入磁盘占用空间大。而且,与R-CNN不同,在SPPnet中的fine-tune无法对ROI 池化之前的卷积层进行有效的反向传播更新。可以预见,这种限制会对系统的性能产生影响。

Fast R-CNN提出了一种新的训练方法,同时克服了R-CNN和SPPnet的缺点,同时提高了速度和准确性。Fast R-CNN有以下几个有点:

  • 1、相较于R-CNN和SPPnet更高的目标检测精度(mAP);
  • 2、训练是使用多任务损失的单阶段训练;
  • 3、训练可以更新所有网络参数;
  • 4、不需要磁盘空间缓存特征。

Fast R-CNN网络将整个图像和一组候选框作为输入,网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生特征图。然后对于每个候选框,ROI池化层从特征图中提取固定长度的特征向量。每个特征向量被送入一系列全连接(fc)层中,其最终分支有两个输出:一个输出K各类别加上一个背景类别的softmax概率估计,另一个为K各类别的每一个类别输出的四个数值。魅族4个值表示K个类别的一个类别的候选框的修正。

下面将从网络结构和训练及预测过程来对Fast R-CNN进行介绍。

ROI池化层

SPPnet的Roi池化是多尺度的池化,而Fast R-CNN的Roi池化是单一尺度池化。它将任意输入的feature map转换成特定大小HxW的输出(这里HxW是独立于Roi的超参数,他只跟模型有关,更准确的说是模型最后几层全连接层的大小)。每个RoI由指定其左上角(r,c)及其高度和宽度(h,w)的四元组(r,c,h,w)定义。

由于Roi大小不是固定的而(每个网络)输出HxW是固定的(VGG16的7x7),因此对于不同的Roi大小所需要的pooling的kernel size也是不同的。若Roi的大小为(x, y), 输出为HxW,则pooling的核大小为x/H*y/W(默认是非重叠pooling,即stride等于kernel size)。例如对于一个Roi大小为12x12,要求输出大小HxW为4x4,则其pooling核大小为12/4*12/4,即3x3。而当Roi大小为16x16时,其pooling核的大小则要相应的变成4x4了。

使用预训练模型进行初始化

与R-CNN一样,Fast R-CNN也是用预训练模型进行初始化,不同的是这里使用的是不同深度/宽度的3个模型。而R-CNN最后一个层的单个softmax分类器也被替换成了两个分支,一个与原来的相同也是softmax分类器,另一个则是bounding box回归器。这样就将R-CNN的多阶段训练(CNN+SVM+候选框回归)合成了一步。而网络输入也改成了两个:图像列表和这些图像中的Roi的列表。

fine-tune

在这里Fast R-CNN克服了SPPnet方向传播更新网络的低效。至于为什么是低效的,我也没有太看懂,姑且先贴上知乎上的一个回答为什么SPP-Net无法fine-tune卷积层?:
SPP-Net中fine-tuning的样本是来自所有图像的所有RoI打散后均匀采样的,即RoI-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储这些图像的Feature Map,过程变得expensive. Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。

Multi-task loss

Fast R-CNN使用了多任务学习,网络具有两个输出层,即图像分类和候选框坐标回归。其loss为:

总loss

其中Lcls是分类softmax损失,而后面的Lloc则是候选框回归loss,这里的回归loss是一个更加平滑的L1回归:
目标检测系列(二):Fast R-CNN_第1张图片

作者表示这种形式可以增强模型对异常数据的鲁棒性,整个函数在matplotlib中画出来是这样的:
目标检测系列(二):Fast R-CNN_第2张图片
图片来自https://zhuanlan.zhihu.com/p/24780395

mini-batch采样

作者这里的采样是每一次先随机选取两张图像。使用的batch大小为128,即从每个图像选择64个Roi。

通过Roi池化层的反向传播和SGD超参数

反向传播具体参见论文,这里不进行讨论。SGD参数学习率为0.001,训练30k步后降为0.0001,在训练10k次迭代。使用0.9的动量和0.0005的参数衰减(权重和偏置)。

尺度不变性

作者在文章中尝试了两种实现尺度不变对象检测方法:(1)通过“brute force”学习(单一尺度)和(2)通过使用图像金字塔(多尺度)。

在‘brute force’方法中,训练和测试都是使用预先设置好的特定图像大小(只有一个大小),网络必须直接从训练数据中学习尺度不变性目标检测。

而图像金字塔则是将图像缩放到不同的大小放入网络进行训练,相当于进行了数据增强。

使用阶段的SVD来进行更快的检测。

作者将大的全连接层用奇异值分解(SVD)进行了转换使得计算速度更快,而准确率只有很小的下降。

实验结果

在VOC07和VOC12上进行了测试,结果大概就是我们在当前的目标检测方法中我们的表现是最棒的。具体可以看论文。

微调哪些层

在SPPnet中使用的是不太深的网络,仅fine-tune全连接层也达到了不错的结果。作者假设这个结果不适用于非常深的网络,因此采用了VGG16来做实验,而实验结果也表明:通过Roi池化层的训练对于非常深的网络是非常重要的

作者通过更新不同层数的卷积网络来评估微调带来的影响。结果如下图:
目标检测系列(二):Fast R-CNN_第3张图片

既然fine-tune卷积层对于深度网络非常重要,那么是否意味着所有卷积层都应该进行fine-tune呢?Absolutely Not。在较小的网络(S和M)中,我们发现conv1(第一个卷积层)是通用的和任务独立的。允许conv1学习或不学习,对mAP没有很有意义的影响。对于VGG16,我们发现只需要更新conv3_1及以上(13个卷积层中的9个)的层。这种观察是实用的:(1)从conv2_1更新使训练变慢1.3倍(12.5小时对比9.5小时)和(2)从conv1_1更新GPU内存不够用。当从conv2_1学习时mAP仅为增加0.3个点(表5,最后一列)

设计评估

作者通过实践来将Fast R-CNN与SPPnet、R-CNN进行比较,以期了解和评估Fast R-CNN中这些设计的效果如何。

多任务训练有用吗?

相较于多阶段训练,一步到位的多任务训练自然是更为方便的,但是结果如何呢?作者对这个问题进行了测试。

首先,仅使用分类loss来进行训练(下表中每组第一列)作为基线。然后每组第二列采用了多任务学习,两个loss,但是在测试时候不使用bounding box回归。

每组第三列是多阶段训练的结果。每组第四列是使用多任务训练同时加上了bounding box回归。结果如下:
目标检测系列(二):Fast R-CNN_第4张图片
多任务学习结果

从上面可以看出,多级训练结果是明显不如多任务训练的。

多尺度学习:to brute force or finesse

这里以两种策略实现了测度不变性检测并比较其准确性:暴力学习(单尺度)和图像金字塔(多尺度)。结果如下图:
目标检测系列(二):Fast R-CNN_第5张图片

上表显示了当使用一个或五个尺度进行训练和测试时的模型S和M的结果。令人惊讶的是多尺度训练竟然只比单一尺度略好。而最深的L模型的单一尺度训练结果是要远远优于中小模型的。这些结果表明:深度卷积网络擅长直接学习尺度不变性。多尺度方法消耗大量的计算时间仅带来了很小的mAP增加。而且深度模型的66.9%的mAP,略高于R-CNN的66.0%,而R-CNN中的结果是相当于使用的多尺度的。

需要更多数据吗?

当提供更多的训练数据时,好的目标检测器应该会得到改善。在增加数据集之后Fast R-CNN的mAP还是有比较明显的提升的,从66.9%到70.0%。

SVM分类是否优于softmax

Fast R-CNN在微调期间使用softmax分类器学习,而不是如在R-CNN和SPPnet中训练线性SVM。为了理解这种选择的影响,作者进行了实验,结果如下:
目标检测系列(二):Fast R-CNN_第6张图片

对于所有三个网络,Softmax略优于SVM,mAP分别提高了0.1到0.8个点。这种效应很小,但是它表明与先前的多级训练方法相比,“一次性”微调是足够的。我们注意到,Softmax,不像SVM那样,在分类RoI时引入类之间的竞争。

更多的候选区域更好吗?

答案是否定的,结果如下图所示,蓝色实线是使用selective search的结果,蓝色虚线是在selective research中加入了Dense 结果的:
目标检测系列(二):Fast R-CNN_第7张图片

结论

比R-CNN、SPPnet更快更好!

参考:
Fast R-CNN. Ross Girshick
Fast R-CNN 论文翻译

你可能感兴趣的:(目标检测系列(二):Fast R-CNN)