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

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

前言

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

概要

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

引言

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

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

  本文可以在一个非常深的网络中训练( V G G 16 ),训练速度是 R C N N 9 倍, S P P n e t 3 倍,同时 m A P R C N N 62 % 提升到了 66 %

R C N N 的缺点

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

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

S P P n e t 的缺点

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



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

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

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

  Fast RCNN的训练过程如下:

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

这里写图片描述

这里写图片描述

扫描二维码关注公众号,回复: 2512832 查看本文章

RoI池化层

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

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

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

   右、下角:
x ^ = x S 1

检测中的微调

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

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

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

多任务损失

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

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

L c l s ( p , u ) = log p u
  bound-box回归的目标是对每一个类别有变换尺度 t k = ( t x k , t y k , t h k , t w k ) ,使用的损失函数为平滑 L 1 函数,作者表示这种形式可以增强模型对异常数据的鲁棒性,展示如下:
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 ,其回归损失函数为 L l o c ( t u , v ) = i { x , y , w , h } s m o o t h L 1 ( t i u v i )
  因此,多任务学习的损失函数如下:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u 1 ] L l o c ( t u , v )
  其中 λ 是控制两个损失函数平衡的参数,该论文的设置为1,理由是作者将变换目标变成方差为1,均值为0的目标【大大的不明白为什么输出要这样变换,输出不是我们要预测的吗?】;如果类别是正的(即是对象,不是背景), [ u 1 ] = 1 ,否则, [ u 1 ] = 0. 0

M i n i b a t c h 采样

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

R o I 反向传播

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

F a s t   R C N N 检测

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

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

猜你喜欢

转载自blog.csdn.net/qq_19784349/article/details/81042289