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

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

前言

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

概要

  论文的CNN实验架构从 AlexNet  VGG16 A l e x N e t   到   V G G 16 。该论文的架构的训练速度、测试速度、精确度比 RCNN SPPnet R C N N   和 S P P n e t 都要好。

引言

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

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

  本文可以在一个非常深的网络中训练( VGG16 V G G 16 ),训练速度是 RCNN R C N N 9 9 倍,SPPnet 3 3 倍,同时mAP RCNN R C N N 62% 62 % 提升到了 66% 66 %

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

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

SPPnet的缺点

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



   Fast F a s t - RCNN R C N N 综合了两个网络的特点,并得到如此结果:

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

Fast RCNN F a s t   R − C N N 架构及其训练

  Fast RCNN的训练过程如下:

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

这里写图片描述

这里写图片描述

RoI池化层

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

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

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

   右、下角:
x^=xS1 x ^ = ⌈ x S ⌉ − 1

检测中的微调
为什么 SPPnet S P P n e t 的金字塔池化层之前的参数不能更新?

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

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

多任务损失

这里写图片描述
多任务损失函数图

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

Lcls(p,u)=logpu
  bound-box回归的目标是对每一个类别有变换尺度 tk=(tkx,tky,tkh,tkw) t k = ( t x k , t y k , t h k , t w k ) ,使用的损失函数为平滑 L1 L 1 函数,作者表示这种形式可以增强模型对异常数据的鲁棒性,展示如下:

smoothL1(x)={0.5x2|x|0.5|x|1otherwise s m o o t h L 1 ( x ) = { 0.5 x 2 | x | ≤ 1 | x | − 0.5 o t h e r w i s e
  因此,对于回归目标 v v ,其回归损失函数为Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)
  因此,多任务学习的损失函数如下:
L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v) L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v )
  其中 λ λ 是控制两个损失函数平衡的参数,该论文的设置为1,理由是作者将变换目标变成方差为1,均值为0的目标【大大的不明白为什么输出要这样变换,输出不是我们要预测的吗?】;如果类别是正的(即是对象,不是背景), [u1]=1 [ u ≥ 1 ] = 1 ,否则, [u1]=0.0 [ u ≥ 1 ] = 0. ( 默 认 背 景 类 别 为 0 )

Minibatch M i n i − b a t c h 采样

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

RoI R o I 反向传播

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

Fast RCNN F a s t   R C N N 检测

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

  同时,作者使用截断的SVD代替全连接层的参数 W W <script type="math/tex" id="MathJax-Element-157">W</script>,以减少检验(测试)的时间。这是因为参数大量减少,导致计算量减少,因此速度加快,这是一种压缩(compression)的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值