Fast R-CNN

∥☆過路亽.° 提交于 2020-02-01 17:19:13

  Fast R-CNN是对R-CNN、SPPnet的一个改进,主要是提高了训练和测试的速度,也提高了测试的精度。下面讲一讲这篇文章怎么实现速度和精度的提升的。

1.介绍

1.1 R-CNN网络的缺点

  1. 多阶段的训练。R-CNN的训练有三大步:用log损失微调CNN得到特征提取器;使用候选框的特征图训练SVMs分类器,这里抛弃的softmax分类器;训练bounding-box regressor精修候选框。
  2. 训练消耗大量的时间和空间。在训练SVMs和bounding-box regressor时候,需要保存每个候选框的特征图,这个特征图要几百G的空间。
  3. 目标检测很慢。测试的时候,是先提取候选框,再分别进行特征提取,这个过程有大量的冗余计算。

1.2 Fast R-CNN的工作

  1. 更高的mAP。
  2. 一次性训练参数(single-stage training),用multi-task loss实现一次性训练。
  3. 训练中可以更新所有的网络参数。
  4. 不需要额外保存特征图。

2. Fast R-CNN的结构、训练

  Fast-RCNN的输入是:完整的图片、候选框集合;输出是K+1类别的概率分布、K个类别的refined参数。过程如下:


  1)把原始图片送入CNN进行特征提取,得到特征图。
  2)对于每个候选框对应的特征子图,RoI Pooling从中提取出固定长度的特征向量。
  3)每个特征向量先经过一系列全连接层,然后送入两个输出层:第一个是softmax概率估计,这个概率分布是K+1个类别上的,添加了一个背景类;第二个是对候选框做精修,每个类别(不包含background类)输出四个值,表示中心点的如何移动,长宽如何缩放。

2.1 Region of Interest Pooling

  先解释一下Rol pooling如何把不同大小的特征子图,映射到固定的特征向量。RoI pooling使用的是最大池化。假设池化输出特征图大小为$Htimes W$,W和H这两个值和后面全连接层要求的输入向量的长度有关,当然也和特征图的个数有关。文章中提到,每个池化核有四个参数(r,c,h,w),其中(r,c)表示这个核在特征图中开始的位置,(h,w)表示池化的区域。(实际上,这四个参数就确定了候选框在特征图上的一个位置)。

  RoI max pooling把$htimes w$大小的特征子图划分为$Htimes W$的矩形网格,每个格子$frac{h}{H} times frac{w}{W} $大小,每个格子输出一个值。和标准的最大池化一样,RoI pooling独立的在每个通道中进行。RoI pooling是空间金字塔池化(SSPnets)的特例。

2.2 Initializing from pre-trained networks

  需要修改一下拿过来的网络:

  1. 最后一个池化改成RoI pooling,池化的输出大小要和后面全连接要求的输入大小匹配。
  2. 一般网络后面是FC+Softmax,这里要改成两个输出头。
  3. Fsat R-CNN需要两个输入:原始特征图,RoIs参数(标定了一系列特征子图,位置、大小)。

2.3 Fine-tuning for detection

2.3.1 如何标记候选框、mini-batch中样本的选择

  Fast R-CNN的训练每个mini-batch采用分层的采样方式。每次使用N张图,每张图提取$frac{R}{N}$个RoI。一张图的RoIs共享前向、反向传播过程,所以一个mini-batch只有过N个传播过程。而R-CNN一次迭代有R个传播过程。比较一下R-CNN和Fast R-CNN:

模型 每个mini-batch使用原图数量 大专栏  Fast R-CNNxt-align:center">每张图提取RoI数量 RoI总量 传播过程
R-CNN R 1 R R
Fast R-CNN N (N<R) $frac{R}{N}$ R N

  Fast R-CNN在实际训练的时候,取N=2,R=128,也就是每张图片使用64个候选框。这64个RoI中,保证至少有25%的IoU>0.5,这些RoI被标记为相应类别(u>=1)(和R-CNN的方法一样);剩下75%的样本,由那些最大IoU只在[0.1, 0.5)之间的RoI构成,这些被标记为background(u=0)。

  • 文章中说与所有ground-truth的最大IoU在0.1以下的RoI用来做困难样本挖掘,但是困难的样本不应该是IoU接近0.5的background吗?这些是容易被误分类是某个foreground的。IoU在0.1之下的候选框,应该是很容易正确分类为background的啊???

  训练中只用了一种数据增强:图片以0.5的概率水平翻转。

2.3.2 Multi-task loss

  和R-CNN模型不同的是:

  1. 一次性训练特征提取器件、分类器、回归器,就是用multi-task loss,这里一般取$lambda=1$。
    $$
    L(p,u,t^u,v) = L_{cls}(p,u) + lambda [u>=1] L_{loc}(t^u,v)
    $$
    解释一下变量的含义:

    $p = (p_0,p_1,…,p_K)$,分类器输出,对于每个RoI,在K+1个类别上的概率分布。

    u:对于每个RoI,他的ground-truth class,就是label。

    $t^u:t^k = (t^k_x,t^k_y,t^k_w,t^k_h)$表示某个RoI在第k类别上的偏移。

    v:ground-truth bounding-box regression target,这里的$t^k$和$v$和R-CNN是一样的。

  1. 回归中,使用的损失函数不是平方损失+L2正则,而是$smooth_{L_1}$损失。首先$u>=1$表示回归中不考虑背景类(u=0)的损失(背景类没有ground-truth,也就没有回归的目标v这个量)。对于一个候选框,回归器在K个类别中分别输出四个参数$t^1,t^2,…,t^K$,如果候选框不是背景类,只考虑$t^u$与回归目标$v$的损失。这个损失的具体表达式如下:
    $$
    L_{loc}(t^u,v) = sum_{iin { {x,y,w,h}} } smooth_{L_1}(t^u_i - v_i)
    $$
    $$
    smooth_{L_1}(x) = begin{cases}
    0.5x^2 & if|x|<1 \
    |x|-0.5 & otherwise \
    end{cases}
    $$

2.3.3 RoI pooling层的反向传播

  记$x_i in R$是RoI层的输入特征图的i-th激活值,$y_{rj}$是r-th的RoI池化的j-th输出,则$y_{rj}$为其有效区域$R(r,j)$的最大值,一个输入$x_i$可能是不同$R(r,j)$的最大值:

$$
y_{rj}=x_{i^(r,j)} \
i^
(r,j) = argmax_{i’ in R(r,j)}x_i’
$$

  反向传播的时候,输入$x_i$的导数为:

$$
frac{partial L}{partial x_i} = sum_r sum_j [i = i*(r,j)]frac{partial L}{partial y_{rj}}
$$

就是说,对于RoI的某个输出值$y_{rj}$,BP会把此处的梯度传给有效区域$R(r,j)$内最大的$x_i$(局部导数为1),其他的$x_i$(不在有效区域内,或者在有效区域内但不是最大值)为0(布局导数为0)。把所有的输出在这一层BP完,在累加就行。

2.4 尺度不变性

  作者提出了两种方法进行尺度不变的目标检测:brute-force(单一尺度)和image pyramids(多尺度,图像金字塔)。作者采用了第一种方法。第二种效果要好,但是也没好多少,检测速度却降低很多。

3. Fast R-CNN detection

  检测一张图片的时间主要是:提取候选框+前向传播+额外的一点时间。对于一个RoI r,模型输出后验概率分布p,表示$p_k = Pr(class = k | RoI)$,边框修正值r(K个类别都有);测试时,一张图片会有大约R=2000个候选框输入,和对应的R=2000组后验概率、边框修正值。;对每个类别进行非极大值抑制,再去除低于设定阈值的候选框;修正留下的候选框,最终得到检测的结果。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!