【论文阅读笔记】Fast R-CNN

论文地址http://arxiv.org/abs/1504.08083
作者:Ross Girshick
发布时间:2015年4月发布,2015年9月最后修改

前言

  RCNN是单一尺度的模型,输入需要强扭曲成指定大小;且需要单独训练三个目标softmaxSVMboundingboxregression;因其训练复杂,提取的候选区域有大量的重复计算;检测时间长;训练分类器和回归器又是在提取特征之后离线进行的。
  所以FastRCNN试图解决这几个问题,通过如下方式:使用多尺度模型(使用RoI池化层);将softmax分类器和boundingbox回归器放在网络模型之中,使用多任务学习模型;将一个minibatch设置为一(几)张图片,从其特征图中提取候选区域以满足minibatch大小,同时共享了计算卷积层的操作;检测时使用截断式SVD代替全连接层的权重,以加快检测速度。
  可以看出,虽然FastRCNN模型基本满足端到端的要求,但从特征图中提取候选区域的操作仍是线下进行的,这将耗费大量时间(提取大概需要2~3秒,而前向传播一次模型不足1秒),因此仍达不到实时的要求

概要

  论文的CNN实验架构从 AlexNet  VGG16。该论文的架构的训练速度、测试速度、精确度比 RCNN SPPnet 都要好。

引言

  目标检测的困难点在于检测目标定位的准确性上,这导致两个问题:⑴ 需要处理大量候选区域;⑵ 这些候选区域需要调整以达到精确定位。目标检测的解决方案需要在速度、准确性、复杂程度上折中。

  本文综合了两大当时最先进的目标检测方法(R-CNNSPPnet),提炼了一套较为精简的训练过程,同时把目标候选的分类以及回归一起结合起来了(使用多任务学习)。

  本文可以在一个非常深的网络中训练(VGG16),训练速度是RCNN9倍,SPPnet3倍,同时mAPRCNN62%提升到了66%

RCNN的缺点

  1. 训练时分多个阶段:先预训练CNN网络,再微调CNN网络,再训练SVM分类器替代softmax分类器;同时,候选区域还需要经过变换以精确定位
  2. 训练花费大量时间和“空间”:对于SVM分类和候选区域回归阶段,需要从每张图片中提取每个候选区域并写入磁盘中。
  3. 训练完的模型在检测目标时很慢:在测试时,需要从每张图片提取多个候选区域以定位
  4. 候选区域截取的图片需要经过扭曲的resize

  RCNN慢的原因是每个候选区域都要进行一次CNN网络的前向传播操作,其中包含大量的重复计算。SPPnet可以通过共享计算来加快RCNNSPPnet的输入是整张图片(而不是一个个候选区域),候选区域的分类通过在共享的特征上提取区域特征上完成(比如在金字塔池化层前有66的特征图,其中22是我们想要的候选区域的“映射”,而后将其变成固定长度的特征向量如22)。SPPnet可以在测试时加快 RCNN  10  100 倍,在训练时可以加速 3 倍(提取特征更快)。

SPPnet的缺点

  1. 训练分多阶段进行:和RCNN一样,只是提取候选区域特征快一些
  2. 训练耗费空间:特征需要写入到硬盘上(分类以及bounding-box回归分别需要用到特征,都是离线训练的)
  3. 微调CNN网络时,卷积层不能微调:金字塔池化层之前的卷积层都不能更新参数,这种固定参数限制了网络的精确度



  Fast-RCNN综合了两个网络的特点,并得到如此结果:

  1. 提高了检测质量(mAP);
  2. 训练成为了单阶段的,使用多任务损失;
  3. 不像SPPnet,该网络可以更新所有参数;
  4. 特征不需要存储到磁盘中;【直接在网络模型上训练,在线训练分类层和回归层,不需要存储特征】

Fast RCNN架构及其训练

  Fast RCNN的训练过程如下:

  1. 网络输入整张图片以经历前向传播,输入候选区域等待后续选择特征;
  2. 整张图片经历前向传播得到特征图,利用候选区域与原图的映射选择目标特征向量;
  3. 目标特征向量经过RoI池化层,化成固定大小的特征向量【VGG16网络是77】;
  4. 目标特征向量经过全连接层得到最终的特征向量表示【R-CNN实验表明,全连接层的特征向量实现的性能更好】;
  5. 最终的特征向量传向两个目标:softmax层和bounding-box回归层【这是个多任务学习网络】;
  6. 利用softmax层得到的窗口分数,对每一个类别的窗口执行一次非最大值抑制。

【论文阅读笔记】Fast R-CNN

【论文阅读笔记】Fast R-CNN

RoI池化层

  RoIRegionofInterest,RoI池化层就是提取感兴趣的区域的池化操作。
  RoI层的计算过程和SPPnet的spp层(spatial pyramid pooling)一样,不同的地方在于 RoI层只用了一个尺度的区域选择。RoI层将从特征图计算出来的感兴趣区域经过pooling操作得到固定大小的H  W的感兴趣区域特征(H,W是超参数,如7,7)。截取出来的感兴趣的区域用(r,c,h,w)表示,其中(r,c)表示区域左上角的位置,(h,w)表示区域的长宽,因此RoI池化层的池化大小为(hHwW)

  池化感兴趣区域的计算就和spp网络一样(每个区域块就和max pooling一样,选一个最大值);
  感兴趣区域与原图上的候选区域的对应如下:

(xy)=(Sx^Sy^)
  其中,(x,y)是原图的候选区域坐标,(x^,y^)是特征图上的感兴趣区域坐标,SRoI层之前所有的步长stride的乘积(包括池化层和卷积层的stride,如S=2222=16)。因此我们能得到如下计算得到候选区域对应的坐标:
x^=xS+1
  因此,我们根据原图得到的四个角点,可以得到特征区域:
  左、上角:
x^=xS+1

  右、下角:
x^=xS1

检测中的微调

为什么SPPnet的金字塔池化层之前的参数不能更新?

  作者认为根本原因在于反向传播在通过SPP层之后太低效了,这种低效在于每个训练样本都来源于不同图片(这也是R-CNN所做的,大概就是选择一个候选区域,然后遍历所有图片的做法);这种低效也源于金字塔层的感受野太大了(对于SPP来说,有不同尺度的,其中甚至有input_sizeinput_size的池化层,也就是处理整张图片的大小)。
  作者提出一种加速的做法:对于minibatch=NSGD来说,先随机选择数量为R的图片,再对这R张图片选择NRRoI。这种做法的优势在于:对于每张图片而言,前向传播的计算和内存是共享的,只是在RoI池化层前的操作不同。其劣势在于:同一个图片的不同样本(不同RoI)是相关联的,这样做之后,模型可能很难收敛,但实验表明这并不是实际需要担心的问题。【作者没提到的另一个操作是,不像SPP pooling一样使用多尺度的最大池,该论文只使用一个尺度的最大池。相对于上面的感受野尺寸太大,这个也是一个改善,不知道是不是可以更新的另一个原因。但是每个ROI的池化层池化的子区域大小也不一样。】

  另外,作者精简了模型过程,使得之前需要独立训练的三个目标:softmax,SVM分类层,bounding-box回归层,变成了多任务学习的softmax分类层 & class-special的bounding-box回归层。这样做的优势在于特征是在线使用的,而不需要离线存入磁盘中。

多任务损失

【论文阅读笔记】Fast R-CNN
多任务损失函数图

  我们的分类目标是分出K+1个类,使用的损失函数为对数损失函数,对于分类目标类别u的损失函数如下:

Lcls(p,u)=logpu
  bound-box回归的目标是对每一个类别有变换尺度tk=(txk,tyk,thk,twk),使用的损失函数为平滑L1函数,作者表示这种形式可以增强模型对异常数据的鲁棒性,展示如下:
smoothL1(x)={0.5x2|x|1|x|0.5otherwise
  因此,对于回归目标v,其回归损失函数为Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)
  因此,多任务学习的损失函数如下:
L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)
  其中λ是控制两个损失函数平衡的参数,该论文的设置为1,理由是作者将变换目标变成方差为1,均值为0的目标【大大的不明白为什么输出要这样变换,输出不是我们要预测的吗?】;如果类别是正的(即是对象,不是背景),[u1]=1,否则,[u1]=0.0

Minibatch采样

  前面提过,每个SGD的Mini-batch都是从N=2张图片中随机取得,每个RoI的类别样本标记如下:选择[IoU0.5]的区域作为正样本(前景),即u1;选择[0.1IoU0.5]的区域作为负样本(背景),即u=0。这里选择负样本的下限为0.1是因为负样本很多,我们采用较为“有用”的负样本,即硬负样本。

RoI反向传播

  其实RoI pooling的反向传播和max pooling的反向传播的计算是一样的,就是对应区域的最大值才有传递,否则导数为0。该反向传播稍微不同的地方在于前向传播的时候是N张图片,经过RoI Pooling层的时候,是RN,所以整个反向传播的公式在RoI Pooling层是稍微有些不同,为Lxi=rNiRN[i=i(r,j)]Lyrj  其中,[i=i(r,j)]为判断是否是传递的那个最大值,是为1,不是为0。

Fast RCNN检测

  经过微调的 Fast RCNN网络,检测的前向传播比训练要快。网络输入一张图片以及一个关于R个候选区域的列表。在测试阶段,作者一般把R设定为2000。
  对于每一个测试的候选区域 r,前向传播的输出为一个类别的后验概率 p,以及关于 r的预测边框偏移量(每个类别都单独有一个)。同时,边框执行度标记为后验概率p,对其执行非最大值抑制操作。

  同时,作者使用截断的SVD代替全连接层的参数W,以减少检验(测试)的时间。这是因为参数大量减少,导致计算量减少,因此速度加快,这是一种压缩(compression)的思想。