Fast R-CNN论文笔记

论文原文:https://arxiv.org/abs/1504.08083
Fast RCNN算法详解:https://blog.csdn.net/shenxiaolu1984/article/details/51036677
RoI pooling layer解读:https://blog.csdn.net/xunan003/article/details/86583563

摘要

本文提出了一种快速的基于区域的卷积网络方法(fast R-CNN)用于目标检测。Fast R-CNN建立在以前使用的深卷积网络有效地分类目标的成果上。相比于之前的成果,Fast R-CNN采用了多项创新提高训练和测试速度来提高检测精度

Introduction

复杂性的产生是因为检测需要目标的精确定位,这就导致两个主要的难点。首先,必须处理大量候选目标位置(通常称为“建议”)。 第二,这些候选框仅提供粗略定位,其必须被精细化以实现精确定位。 这些问题的解决方案经常会影响速度,准确性或简单性。
简化了最先进的基于卷积网络的目标检测器的训练过程。我们提出一个单阶段训练算法,共同学习分类候选框和改进他们的空间位置。

1.1 R-CNN and SPPnet

基于区域的卷积网络方法(RCNN)通过使用深度卷积网络来分类目标候选框,获得了很高的目标检测精度。然而,R-CNN具有显着的缺点:

  • 训练的模型是多阶段管道(pipeline)。R-CNN首先使用目标候选框对卷积神经网络进行微调。然后,它将卷积神经网络得到的特征送入SVM。 这些SVM作为目标检测器,替代通过微调学习的softmax分类器。 在第三个训练阶段,学习bbox(边界)回归。
  • 训练在时间和空间上是很大代价的。对于SVM和bbox回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,这个过程需要2.5 GPU-天在VOC07训练集上的5k图像。这些特征需要数百GB的存储空间。
  • 目标检测速度很慢。在测试时,从每个测试图像中的每个目标候选框提取特征。用VGG16网络检测目标需要47s /图像(在GPU上)。

R-CNN很慢是因为它为每个目标候选框进行卷积神经网络正向传递,而不共享计算。SPP网络通过共享计算加速R-CNN。SPP网络计算整个输入图像的卷积特征映射,然后使用从共享特征映射提取的特征向量来对每个候选框(object proposals)进行分类。通过将候选框内的特征图的一部分最大化为固定大小的输出(例如,6X6)来提取针对候选框的特征。多个输出被池化,然后连接成空间金字塔池
SPP网络也有显著的缺点。像R-CNN一样训练网络是一个多阶段的涉及提取特征的网络,和对网络进行微调有损失,训练SVM分类器,最后拟合边界回归(bbox)。特征也写入磁盘。但与R-CNN不同,微调算法不能更新在空间金字塔池之前的卷积层。

1.2 Contributions

Fast RCNN方法有几个优点:

  • 比R-CNN和SPP网络具有更高精度(mAP)的目标检测;
  • 训练是使用多任务损失(loss)的单阶段训练;
  • 训练可以更新所有网络层参数;
  • 特征缓存不需要磁盘空间

2.fast R-CNN 结构和训练

Fast R-CNN论文笔记_第1张图片Fast R-CNN论文笔记_第2张图片
图像归一化为224×224直接送入网络。
前五阶段是基础的conv+relu+pooling形式,在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4,序号用于训练)
Fast R-CNN论文笔记_第3张图片
Fast R-CNN网络将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池层来处理整个图像,以产生特征图。然后,对于每个候选框,感兴趣区域(RoI)池化层从特征图中提取固定长度的特征向量。每个特征向量被送到完全连接(fc)层的中。

2.1 ROI pooling layer

不同于前面的SPP,在Fast RCNN网络中,RoI来完成SPP层的作用。RoI指的是在一张图片上完成Selective Search后得到的“候选框”在特征图上的一个映射,RoI层的作用主要有两点:

  • RoI池化层使用最大池化将任何有效的感兴趣区域内的特征转换成具有H × W(例如,7×7)的固定空间范围的小特征图。考虑到感兴趣区域(RoI)尺寸不一,但是输入图中后面FC层的大小是一个统一的固定值,ROI池化层的作用类似于SPP-net中的SPP层,即将不同尺寸的RoI feature map池化成一个固定大小的feature map。具体操作:假设经过RoI池化后的固定大小为 H W \frac{H}{W} WH是一个超参数,假设输入的RoI feature map大小为 h w \frac{h}{w} wh,池化窗口的尺寸为: h H × w W \frac{h}{H}\times \frac{w}{W} Hh×Ww,即用这个计算出的窗口对RoI feature map做max pooling,Pooling对每一个feature map通道都是独立的。
  • RoI是一个矩形窗口,成为一个特征映射。 每个RoI由指定其左上角(r; c)及其高度和宽度(h; w)的四元组(r; c; h; w)定义

2.2 Initializing from pre-trained networks

实验了三个预训练的ImageNet网络,每个网络有五个最大池化层和五到十三个卷积层,当预训练网络初始化fast R-CNN网络时,其经历三个变换。

  • 用RoI pooling layer取代网络的最后一个池化层,其通过将H和W设置为与网络的第一完全连接层兼容来配置(例如,对于VGG16,H = W = 7)

  • 网络的最后全连接层和softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(完全连接的层和softmax在K + 1类别和类别特定的边界回归)

  • 输入两组数据到网络:一组图片和每一个图片的一组RoIs

2.3. Fine-tuning for detection

  1. 用反向传播训练所有网络权重是fast R-CNN的重要能力
    SPPnet无法更新低于空间金字塔池化层的权重。 根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的 ,低效的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传递必须处理整个感受野,训练输入是大的(通常是整个图像)

  2. 作者利用特征分享的优势,提出一个更加有效的训练方法:SGD mini_batch分层采样方法。
    首先随机取样N张图片,然后每张图片取样R/N个RoIs 。除此之外,网络在一次微调中将softmax分类器和bbox回归一起优化,区别于R-CNN的softmax回归,SVM,bbox回归的三步分开优化。

  3. 多任务损失(multi-task loss)
    Fast R-CNN论文笔记_第4张图片
    Fast R-CNN网络具有两个同级输出层,一个是softmax用于对每个RoI区域做分类,假如有K类待分(加上背景总共K+1类),输出结果为 p = ( p 0 , … , p K ) p=(p_{0}, \dots, p_{K}) p=(p0,,pK),另一个是bbox,用于更精确的定位RoI的区域,输出结果 t k = ( t x k , t y k , t w k , t h k ) t^{k}=(t^{k}_{x}, t^{k}_{y}, t^{k}_{w}, t^{k}_{h}) tk=(txk,tyk,twk,thk)
    多任务损失函数定义为:
    在这里插入图片描述

    上式中, L c l s ( p , u ) = − l o g p u L_{cls}(p,u)=-logp_{u} Lcls(p,u)=logpu是真实类 u u u的log损失函数, L l o c 中 v = v x , v y , v w , v h L_{loc}中v={v_{x}, v_{y}, v_{w}, v_{h}} Llocv=vx,vy,vw,vh是类为u的真实框的位置而 t u = ( t x u , t y u , t w u , t h u ) t^{u}=(t^{u}_{x}, t^{u}_{y}, t^{u}_{w}, t^{u}_{h}) tu=(txu,tyu,twu,thu)是类为u的预测框位置。 当 当 u>1 , [ u > 1 ] ,[u>1] [u>1]为1,反之为0。文中实验时 λ = 1 \lambda=1 λ=1
    背景类标记为u = 0,对于背景RoI,没有ground truth边界框的概念,因此Lloc被忽略
    对于边界框回归,我们使用损失$L_{loc}:
    在这里插入图片描述

    其中:
    在这里插入图片描述
    smooth是鲁棒的L1损失,对于异常值比在R-CNN和SPPnet中使用的L2损失更不敏感,当回归目标无界时,具有L2损失的训练可能需要仔细调整学习速率,以防止爆炸梯度。
    超参数λ控制两个任务损失之间的平衡。将groundtruth回归目标 v i v_i vi归一化为具有零均值和单位方差。所有实验都使用λ = 1。

  4. 小批量取样(mini-batch sampling)
    不再类似于R-CNN那样使用均匀的随机采样128个训练样本,而是分层采样,先随机采样N张图片,然后从每张图片中采样R/N个RoIs,实际选择N=2, R=128,
    训练数据构成:N张完整图片以50%概率水平翻转。没有使用数据扩增 。
    R个候选框的构成方式如下:
    在这里插入图片描述

  5. 通过RoI池层的反向传播

    反向传播的函数为:
    在这里插入图片描述
    x i ∈ R xi∈ R xiR是到RoI池化层的第i个激活输入
    y r j y_{rj} yrj是来自第 r r r个RoI的层的第 j j j个输出节点
    RoI池化层计算 y r j = x i ∗ ( r ; j ) y_{rj} = x_i*(r; j) yrj=xir;j,其中 i ∗ ( r ; j ) = a r g m a x i ’ ∈ R ( r ; j ) x i ’ i*(r; j)= argmax _{i’∈R(r; j)}x_i’ ir;j=argmaxiRr;jxi,表示i节点是否被候选区域r的第j个节点选为最大值输出
    R ( r ; j ) R(r; j) Rr;j是输出单元 y r j y_{rj} yrj 最大池化的子窗口中的输入的索引集合
    单个 x i x_{i} xi 可以被分配给几个不同的输出 y r j y_{rj} yrj
    对于每个小批量(mini-batch)RoI r r r和对于每个池化输出单元 y r j y_{rj} yrj,如果 i i i y r j y_{rj} yrj 通过最大池化选择的argmax(一个函数),则将这个偏导数 α L / α y r j αL/αy_{rj} αL/αyrj积累下来。在反向传播中,偏导数 α L / α y r j αL/αy_{rj} αL/αyrj已经由RoI池层顶部的层的向后函数(backwards function)计算。

  6. SGD超参数
    用于分类的全连接层以均值为0、标准差为0.01的高斯分布初始化;
    用于回归的全连接层以均值为0、标准差为0.001的高斯分布初始化,偏置都初始化为0

3 Fast R-CNN detection

一旦fast R-CNN网络被微调完毕,检测相当于运行前向传递(假设候选框是预先计算的)。网络将图像(或图像金字塔,编码为图像列表)和待计算概率的R个候选框的列表作为输入,当使用图像金字塔的时候,每个RoI被指定尺度使得接近224*224。
对于每个测试的RoI r,正向传递输出类别后验概率分布p和相对于r的预测的边界框偏移集合(K个类别中的每一个获得其自己的精细边界框预测)。我们使用估计的概率 P r ( c l a s s = k ∣ r ) = p k P_r(class= k|r)= p_k Prclass=kr=pk为每个对象类别k分配r的检测置信度。然后,我们使用R-CNN算法的设置和对每个类别独立执行非最大抑制。

全连接层提速
Fast R-CNN论文笔记_第5张图片

你可能感兴趣的:(机器学习与深度学习)