目标检测3 - Fast RCNN

Fast R-CNN的改进

  • 实现了end-to-end的单阶段训练,采用多任务损失函数将分类和回归任务作为一个整体进行训练:把最后一层的Softmax换成两个,一个是对区域的分类Softmax(包括背景),另一个是对bounding box的微调。
  • RCNN提取特征给SVM训练时候需要中间要大量的磁盘空间存放特征,Fast R-CNN去掉了SVM这一步,所有的特征都暂存在显存中,就不需要额外的磁盘空间了。
  • 并且,由于去掉了单独的SVM训练,所有层都可以fine-tune。
  • 网络有两个输入,一个是整张图片,另一个是候选proposals算法产生的可能proposals的坐标。

在SPP-Net的基础上引入2个新技术:

  • RoI pooling层
  • 多任务损失函数(Multi-task loss)

注意这里为了多任务损失函数的融合,用的是Softmax分类器,不再是SVM,分类和回归的损失函数汇总后,梯度回传到第一个卷积层。

RoI pooling

是SPP pooling的简化版单层特例:

  • 将RoI区域的卷积特征拆分成HxW的网格(如VGG是7x7)
  • 每个网格内的所有特征进行max pooling

论文通过实验得到的结论是多尺度学习能提高一点点mAP,不过计算量成倍的增加,故单尺度训练的效果更好。

另一方面:简化的目的是为了便于梯度回传??

Q:为什么SPP-Net无法fine-tune SPP pooling层之前的卷积层?

解释1: 作者说明了为什么SPP-Net无法更新空间金字塔池化层之前的层的权重:当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播非常低效。低效源于每个RoI可能具有非常大的感受野(接收区),通常包括整个输入图像。由于正向传播必须处理整个感受野,训练输入是非常大(通常是整个图像)。反向传播需要计算每一个RoI感受野的卷积层梯度,通常RoI会覆盖图像的大部分区域,如果一个一个用RoI-centric sampling的方式计算感受野的梯度的话会变得又慢又耗内存。

解释2: SPP-Net在fine-tuning阶段之所以无法使用反向传播微调SPP-Net前面的Covs层,是因为特征提取CNN的训练和SVMs分类器的训练在时间上是先后顺序,两者的训练方式独立,卷积特征是线下计算的,从而无法再微调阶段反向传播误差。因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,因此即使采用更深的CNN网络进行特征提取,也无法保证SVMs分类器的准确率一定能够提升。

Fast R-CNN训练流程

  1. 采用预训练网络初始化

    作者实验了三个pre-trained的ImageNet 网络:CaffeNet,VGG_CNN_M_1024,VGG-16,每个网络有5个max pooling层和5~13个卷积层。当用pre-trained的网络初始化Fast R-CNN网络时,要进行3步转化后再fine-tune:

    1. 最后一个max pooling层由 RoI pooling层代替,该层将 H 和W 设置为与第一个全连接层兼容;
    2. 网络最后那层全连接层和softmax(被训练用于包含1000类的ImageNet分类)被替换为前面描述的两个同级层:softmax的对K+1个类别的分类层,和bounding box 回归层
    3. 网络有两个输入数据:一组原始图片和每张图片的一组RoIs
  2. 特定样本下(自己的数据集)fine-tune for detection

    Fast R-CNN可以用反向传播训练所有层的网络权重。作者提出了一种更有效的训练方法:利用训练期间的特征共享。在Fast RCNN训练中,随机梯度下降(SGD)小批量计算被分级采样,首先随机取样 N 张图片,然后每张图片取样 R/N 个RoIs 。

    关键在于来自相同图像的RoI在向前和向后传播中共享计算和内存,这大大减少了一个mini-batch的计算。例如,当 N=2,R=128时,这种方法比从128个不同的图像中提取一个RoI的方法要快64倍。

    采用这种sample的方式是为了配合SPP的改进:同一张图片只用做一次卷积得到conv5 feature map,再把原图通过SS得到的proposal映射到feature map。而只有配合这种sample方式才可以发挥这个改进的优势。

    这种策略的一个缺点在于其可能会减慢训练的收敛因为来自同一张图片的RoIs是相关的。但是在实践中这种担忧并没有出现,当 N=2,R=128 时,比RCNN使用更少的SGD迭代得到了更好的结果。

    除了分层采样,Fast R-CNN使用一个精简的训练过程,一次fine-tune中联合优化softmax分类器和bbox回归器,而不是在三个独立的阶段训练softmax分类器,SVMs和Regressions。这一步包含了:

    • 多任务损失(multi-task loss)
    • 小批量取样(mini-batch sampling)
    • RoI pooling层的反向传播(backpropagation through RoI pooling layers)
    • SGD超参数(SGD hyperparameters)

Fast R-CNN多任务损失函数

Fast R-CNN网络分类损失和回归损失如下图所示【仅针对一个RoI即一类物体说明】,黄色框表示训练数据,绿色框表示输入目标:

两个输出层:

  • cls_score层用于分类,输出每个RoI输出在 K+1 个类别上的离散概率分布:p=(p0,,pK)
  • bbox_predict层用于调整候选区域位置,输出bounding box回归的offsets:tu=(txk,tyk,twk,thk)k 表示某个类别k,前两个参数是指相对于object proposal 尺度不变的平移 ,后两个参数是指log空间中相对于object proposal的高与宽。共4K维数组,也就是说对于每个类别都会训练一个单独的回归器

u 是每个用于训练的RoI标记的真实物体类别,v 是边界框回归目标的ground-truth,则:

  • loss_cls层评估分类代价,由真实类别 u 对应的log loss决定:Lcls(p,u)=logpu

  • loss_bbox评估回归损失代价,比较真实类别 u 对应的预测平移缩放参数 tu=(txu,tyu,twu,thu) 和真实平移缩放参数 v=(vx,vy,vw,vh) 的差距:

    Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)smoothL1(x)={0.5x2, |x|<1 |x|0.5,otherwise

smoothL1 损失函数曲线如下图所示,相比于 L2 损失函数,其对离群点、异常值不敏感,可控制梯度的量级使其训练时不容易跑飞(prevent exploding gradients):

把两个损失函数写在一起:

L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)[u1]={1,u>1 0,otherwise

  • 约定 u=0 为背景类,那么 [u1] 函数用于限制背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作;
  • λ 控制分类损失和回归损失的平衡,文中所有实验 λ=1

Mini-batch sampling

每个mini-batch来自于 N=2 张图片,mini-batch size取 R=128,也就是从每张图片中取64个RoIs。25%的RoIs来自候选区域中和标注边界框(Ground-truth)有至少0.5(IoU)重叠,这些RoIs包含标记有前景对象类的示例,也就是 u1的那些具体物体,剩下75%的RoIs取自最大IoU在 [0.1,0.5) 之间的候选区域,代表 u=0 的背景样例。训练时,图片以0.5的概率采用水平翻转,不采用其他的数据增强技术。

类别 比例 方式
前景 25% 与ground-truth bbox边界框重叠区间在 [0.5,1]
背景 75% 与ground-truth bbox边界框重叠区间在 [0.1,0.5)

在Fast R-CNN中是通过image-centric sampling提高了卷积层特征抽取的速度,从而保证了梯度可以通过SPP层(即RoI pooling层)反向传播:

  • R-CNN和SPPnet中采用RoI-centric sampling:从所有图片的所有候选区域中均匀取样,这样每个SGD的mini-batch中包含了不同图像的样本,不同图像之间不能共享卷积计算和内存,运算开销大;
  • Fast R-CNN中采用image-centric sampling: 每个mini-batch采用层次采样,即先对 N 张图像采样 ,再在采样到的图像中对候选区域采样(每个图像中采样 R/N 个,一个mini-batch共计 R 个候选区域样本),同一张图像的候选区域卷积共享计算和内存,降低了运算开销; image-centric sampling方式采样的候选区域来自于同一图像,相互之间存在相关性,可能会减慢训练收敛的速度,但是作者在实际实验中并没有出现这样的现象,反而使用 N=2R=128 的RoI-centric sampling方式比R-CNN收敛更快。

RoI Pooling层反向传播

首先看普通max pooling层如何求导,设 xi 为输入层节点,yi 为输出层节点,那么损失函数 L 对输入层节点 xi 的梯度为:

Lxi={0,δ(i,j)=false Lyj,δ(i,j)=true

其中判定函数 δ(i,j) 表示输入 i 节点是否被输出 j 节点选为最大值输出。不被选中,即:δ(i,j)=false ,有两种可能: xi 不在 yi 范围内,或者 xi 不是最大值。若选中: δ(i,j)=true ,则由链式规则可知损失函数 L 相对 xi 的梯度等于损失函数 L 相对 yi 的梯度 ×yixi 的梯度恒等于 1 ),故可得上述所示公式;

对于RoI max pooling层,不一样的是 xi可能是多个感兴趣区域的重合部分。设 xi 为输入层的节点,yrj 为第 r 个候选区域的第 j 个输出节点,一个输入节点可能和多个输出节点相关连,如下图所示,输入节点 7 和两个候选区域(蓝色RoI和黄色RoI)输出节点相关连;

该输入节点 7 的反向传播如下图所示。对于不同候选区域,节点 7 都存在梯度,所以反向传播中损失函数 L 对输入层节点 xi 的梯度为损失函数 L 对各个有可能的候选区域 rxi 被候选区域 r 的第 j 个输出节点选为最大值)输出 yrj 梯度的累加,具体如下公式所示:

Lxi=rj[i=i(r,j)]Lyrj

[i=i(r,j)]={1,i=i(r,j)1 0,otherwise

判决函数 [i=i(r,j)] 表示 i 节点是否被候选区域 r 的第 j 个输出节点选为最大值输出(如上图的蓝色RoI,j 代表0+0+1+0,r 代表蓝色RoI+黄色RoI),若是,则由链式规则可知损失函数 L 相对 xi 的梯度等于损失函数 L 相对 yrj 的梯度 ×yrjxi 的梯度 恒等于1),上图已然解释该输入节点可能会和不同的 yrj 有关系,故损失函数 L 相对 xi 的梯度为求和形式。

SGD超参数

除了修改增加的层,原有的层参数已经通过预训练方式初始化;

  • 用于分类的全连接层以均值为0、标准差为0.01的高斯分布初始化,用于回归的全连接层以均值为0、标准差为0.001的高斯分布初始化,偏置都初始化为0;
  • 针对PASCAL VOC 2007和2012训练集,前30k次迭代全局 learning rate为0.001,每层权重学习率为1倍,偏置学习率为2倍,后10k次迭代全局学习率更新为0.0001;
  • 动量momentum设置为0.9,权重衰减weight_decay设置为0.0005。

Fast R-CNN测试流程

img

  1. 任意size图片输入CNN网络,经过若干卷积层与池化层,得到特征图;
  2. 在任意size图片上采用selective search算法提取约2k个建议框;
  3. 根据原图中建议框到特征图映射关系,在特征图中找到每个建议框对应的特征框(深度和特征图一致),并在RoI池化层中将每个特征框池化到H×W(VGG-16网络是7×7)的size;
  4. 固定H×W大小的特征框经过全连接层得到固定大小的特征向量;
  5. 第4步所得特征向量经由各自的全连接层(由SVD分解实现),分别得到两个输出向量:一个是softmax的分类得分,一个是Bounding-box窗口回归;
  6. 利用窗口得分分别对每一类物体进行非极大值抑制剔除重叠建议框,最终得到每个类别中回归调整后得分最高的窗口。

【论文】一旦Fast R-CNN网络被微调,detection过程相当于运行正向传播(假设对象建议框object proposal是预先计算的)。网络将图像(或图像金字塔,编码为图像列表)和一组待给得分的 R 个对象建议框(object proposal)作为输入(R一般为2000)。当使用图像金字塔的时候,每个RoI被尺度归一化为接近 224×224 (意思可能是用RoI pooling操作模拟resize(224,224)?maybe 7x7在原图上的感受野是224x224)。对于每个测试RoI r ,网络输出关于 r 的一个后验概率分布 p 和一系列预测bbox偏移(每个类 [共K个类] 获得自己的精确bbox预测)。然后使用估计概率 Pr(class=k|r)pkr 赋予关于 k 个对象类的检测置信度。最后给每个类都实施一个非极大值抑制。

Truncated SVD for faster detection

图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多(约2k),几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次(每个建议框都要计算),因此在Fast R-CNN中可以采用SVD分解加速全连接层计算。

具体实现:

  1. 物体分类和窗口回归都是通过全连接层实现的,假设全连接层输入数据为 x ,输出数据为 y ,全连接层参数为 W ,尺寸为 u×v,那么该层全连接计算为 y=Wx ,计算复杂度为 u×v

  2. 若将 W 进行SVD分解,并用前 t 个特征值近似代替,即:

    W=UVTU(u,1:t)(1:t,1:t)V(v,1:t)T

    那么原来的前向传播分解成两步:

    y=Wx=U(VT)x=Uz

    结合下图,先 (VT)x 得到 z ,再 Uz 得到 y ,计算复杂度为 u×t+v×t(两步分解),若 t<min(u,v) ,则这种分解会大大减少计算量;

    在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。

思考

Q1: 为什么用Softmax取代SVM?

为什么R-CNN中采用SVM分类而不直接用CNN网络输出端进行分类已经在R-CNN博客中说明,针对Fast R-CNN,文中分别进行实验并对比了采用SVM和采用softmax的mAP结果,不管AlexNet(S for small)、VGG_CNN_M_1024(M for medium)、VGG-16(L for large)中任意网络,采用softmax的mAP都比采用SVM的mAP高0.1%~0.8%,这是由于softmax在分类过程中引入了类间竞争,分类效果更好;

并且由于Fast R-CNN去掉了SVM这一步,所有的特征都暂存在显存中,就不需要额外的磁盘空间。

Q2: Multi-task真的有效吗?

首先不看多任务训练效果,至少比起R-CNN其训练方便、简洁。多任务训练考虑各任务间共享卷积层的相互影响,是有潜在可能提高检测效果的;
文中通过实验发现AlexNet(S for small)、VGG_CNN_M_1024(M for medium)、VGG-16(L for large)三种网络采用多任务训练比不采用mAP提高了0.8%~1.1%(测试时不采用Bounding-box regression)

Q3:如何处理尺度不变性(scale invariance)?

即如何使24×24和1080×720的车辆同时在一个训练好的网络中都能正确识别?

作者提出了使用两种方式对规模不变的对象进行检测:brute-force(单一尺度)和image pyramids(多尺度,图像金字塔):

  • 单一尺度直接在训练和测试阶段将image预先固定好像素大小,直接输入网络训练就好,然后期望在训练过程中网络自己能够学习到尺度不变性scale-invariance;
  • 多尺度在训练阶段随机从图像金字塔(缩放图片的scale得到,得到多尺度图片,相当于扩充数据集)中采样训练,通过一个图像金字塔向网络提供一个近似的尺度不变,在测试阶段图像金字塔用来对每个object proposal近似尺度归一化,训练阶段每次采样一个图像就随机采样一个金字塔尺度。

作者在5.2节对单一尺度和多尺度分别进行了实验,不管哪种方式下都定义图像短边像素为s,单一尺度下s=600(维持长宽比进行缩放),长边限制为1000像素;多尺度s={480,576,688,864,1200}(维持长宽比进行缩放),长边限制为2000像素,生成图像金字塔进行训练测试;实验结果表明AlexNet(S for small)、VGG_CNN_M_1024(M for medium)下单一尺度比多尺度mAP差1.2%~1.5%,但测试时间上却快不少,VGG-16(L for large)下仅单一尺度就达到了66.9%的mAP(由于GPU显存限制多尺度无法实现),该实验证明了深度神经网络善于直接学习尺度不变形,对目标的scale不敏感。

第2种方法的表现确实比1好,但是好的不算太多,大概是1个mAP左右,但是时间要慢不少,所以作者实际采用的是第一个策略,也就是single scale。

Q4:selective search的候选区域越多越好吗?

文中仅采用selective search算法提取约2k个候选区域,那候选区域越多越好吗?
文中利用selective search算法提取1k~10k中10种数目(1k,2k…)的候选区域进行训练测试,发现随着候选区域个数的增加,mAP成先增加后缓慢下滑的趋势,这表明更多的候选区域会有损精度;与此同时,作者也做了召回率(所谓召回率即候选区域为真的窗口与Ground Truth的比值【IoU大于阈值即为真】)分析实验,发现随着候选区域个数的增加,召回率并没有和mAP成很好的相关性,而是一直不断增加,也就是说更高的召回率并不意味着更高的mAP;

文中也以selective search算法提取的2k个候选区域为基础,每次增加1000 × {2, 4, 6, 8, 10, 32, 45}个密集box(滑动窗口方法)进行训练测试,发现mAP比只有selective search方法的2k候选区域下降幅度更大,最终达到53%。

Q5:训练数据越多效果越好吗?

实验 训练集 测试集 mAP
实验1 VOC 2007训练集 VOC 2007测试集 66.9%
实验1 VOC 2007+VOC 2012训练集 VOC 2007测试集 70.0%
实验2 VOC 2012训练集 VOC 2010测试集 66.1%
实验2 VOC 2007+VOC 2012训练集+VOC2007测试集 VOC 2010测试集 68.8%
实验3 VOC 2012训练集 VOC 2012测试集 65.7%
实验3 VOC 2007+VOC 2012训练集+VOC2007测试集 VOC 2012测试集 68.4%

文中分别在VOC 2007、VOC 2010、VOC 2012测试集上测试,发现训练数据越多,效果确实更好。这里fine-tune时采用100k次迭代,每40k次迭代学习率都缩小10倍。

Q6:哪些layer的参数需要fine-tune?

SPPnet论文中采用ZFnet(AlexNet的改进版)这样的小网络,其在微调阶段仅对全连接层进行微调,就足以保证较高的精度,作者文中采用VGG-16网络,若仅仅只对全连接层进行微调,mAP会从66.9%降低到61.4%, 所以文中也需要对RoI池化层之前的卷积层进行微调;

那么问题来了?向前微调多少层呢?所有的卷积层都需要微调吗?
作者经过实验发现仅需要对conv3_1及以后卷积层(即9-13号卷积层)进行微调,才使得mAP、训练速度、训练时GPU占用显存三个量得以权衡;
作者说明所有AlexNet、VGG_CNN_M_1024的实验结果都是从conv2往后微调,所有VGG-16的实验结果都是从conv3_1往后微调。

Fast R-CNN缺点

Fast R-CNN中采用selective search算法提取候选区域,而目标检测大多数时间都消耗在这里(selective search算法候选区域提取需要2~3s,而提特征分类只需要0.32s),这无法满足实时应用需求,而且Fast R-CNN并没有实现真正意义上的端到端训练模式(候选区域是使用selective search算法先提取出来的);

参考Fast R-CNN论文详解

展开阅读全文

没有更多推荐了,返回首页