Fast R-CNN(RoI)简介

  Fast R-CNN是一个基于区域的目标检测算法。Fast R-CNN建立在先前的工作之上,并有效地使用卷积网络分类目标建议框。与先前的工作相比,使用几点创新改善了训练和测试时间并增加了检测准确率。

2. Fast R-CNN结构和训练

  图1展示了Fast R-CNN的结构。该网络输入一个完整的图像和一组目标建议框。首先用卷积和池化来产生一个特征图。然后,对每一个目标建议框使用RoI(Region of Interest)池化层从特征图提取一个固定长度的向量。每个特征向量送人两个兄弟般的全连接层,一个来输出类的概率,一个输出四个值。每组的四个值是边界框相关编码。

2.1 RoI池化层

  RoI池化层用最大值池化将RoI内的特征转化成固定空间大小$H×W$(例如,7×7)的特征图。RoI是一个矩形框,用(r,c,h,w)表示,(r,c)表示左上角,(h,w)表示高度和宽度。

RoI最大池化将$h×w$的RoI分割成$H×W$的格点,每个格点的尺寸大约为$h/H×w/W$,将每个格点最大池化格点的输出。池化独立应用到每个特征图通道,好像标准最大池化一样。RoI层SPPnets中使用的空间金字塔池化中的简单的特殊情况。

2.2 从预训练网络初始化

  尝试了3个预训练的ImageNet网络,每个都有5个最大池化层和5-13卷积层(4.1节有更多细节)。使用一个预训练的网路,有三个转换。

①最后一个最大池化层被RoI池化层取代,并且设置$H$和$W$与网络的第一个全连接层兼容。

②用两个兄弟般的层取代网络的最后全连接层和softmax。

③修改网络的输入:一组图像和这些图像的RoI

2.3 用于检测的微调

Multi-task loss. Fast R-CNN有两个输出层。第一个输出每个RoI在$K+1$个类上的离散概率分布。第二个输出是边框偏移。

  每个训练RoI用真值类别$u$和真值边框回归目标$v$标签。在每一个标签的RoI上用多任务损失$L$联合训练分类和边框回归:  

$L(p,u,t^u,v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v)$,  (1)

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

  这里$L_{cls}(p,u)=-rm{log}p_{u}$是真实类别$u$的log损失。

  第二个损失$L_{loc}$定义在真实边框回归目标的$(v_{x},v_{y},v_{w},v_{h})$和预测结果$t^u=(t^{u}_{x},t^{u}_{y},t^{u}_{w},t^{u}_{h})$上。当$u≥1$函数$[u≥1]$表示1,否则为0。按照惯例,将背景类标记为$u=0$。没有真值边框的背景RoI不参与损失计算。针对边框回归,使用下面损失:

$L_{loc}(t^{u},v)=\sum{i\in{\{x,y,w,h\}}}\rm{smooth}_{L_{1}}(t^{u}_{i}-v_{i})$,  (2)

  其中:

$\rm{smooth_{L_{1}}}(x) = \left\{
             \begin{array}{lcl}
             {0.5x^{2}} & if|x|<1 \\
             { |x|-0.5} & otherwise
             \end{array}  
        \right.$  (3)

  $L_{1}$损失比R-CNN和SPPnet中的$L_{2}$更鲁棒。当回归目标没有没有边界时,$L_{2}$损失训练需要仔细调整学习率来防止梯度爆炸。公式(3)消除了这种敏感。

  公式(1)中的超参数λ控制了两个任务损失的平衡。将真值回归目标$v_{i}$归一化到0均值和单位方差。左右的实验使用λ=1。

Mini-batch sampling. 在微调过程中,SGD的批量数是$N=2$张图像,每张图像64RoI,共$R=128$个RoI。意思是每次训练只输入两张图像,64个RoI之间共享卷积特征。从与真值框重叠超过0.5的目标建议框中挑出25%的RoI,这些RoI只包含前景目标。其余RoI从目标建议与真值IoU在区间[0.1,0.5)的最大值中采样。除了数据镜像外,没有采用其它数据增强。

Back-propagation through RoI pooling layers. 为清楚起见,假设每个批量中只有一张图像($N=1$),这不影响结果。

设$x_{i}\in \mathbb{R}$是RoI池化层的第$i$激活输入,$y_{rj}$是第$r$个RoI层的第$j$个输出。RoI池化层计算$y_{rj}=x_{i*(r,j)}$,其中$i*(r,j)=argmax_{i'\in{R(r,j)}}x_{i'}$。$R(i,j)$是在输出单元$y_{rj}$最大池化的子窗口上的输入索引组。一个$x_{i}$可以被分配几个不同的输出$y_{rj}$。

RoI池化层的反向传播函数计算每个输入变量$x_{i}$损失函数的偏导数,如下所示:

$\frac{\partial L}{\partial x_{i}}=\sum_{r}\sum_{j}[i=i*(r,j)]\frac{\partial L}{\partial y_{rj}}$.  (4)

猜你喜欢

转载自www.cnblogs.com/majiale/p/9417011.html
今日推荐