Fast R-CNN是基于R-CNN的一个更快更强的版本
论文地址:
1. Introduction
论文首先阐述了过去的R-CNN的缺点,主要有以下三个方面:
- 训练分为多个阶段。R-CNN需要经过候选框的选取和裁剪图像,接着进行CNN特征提取,最后是SVM进行框回归和类别判定
- 训练需要耗费大量的空间和时间。对于类别判别器和框回归器的训练,需要从每幅图像中的每个候选框中提取特征并写入磁盘
- 物体检测速度较慢。测试时,要从每张测试图像中的每个候选框中提取特征
论文接着肯定了SPPnet的优点。SPPnet是一种优于R-CNN算法,其创新点在于只在整张图像上抽取一次特征。然后在每个特征图的候选窗口上应用空间金字塔池化,形成这个窗口的一个固定长度表示。
因为R-CNN的最后几层全连接层是固定的,因此导致网络的输入也是固定的227*227,而且是从图像中裁剪出2000个候选区域输入网络中。而SPPnet通过改变全连接层前池化层的设置,ROI Pooling使用自适应(根据输入feature的大小自调整)池化区域,不再固定池化区域大小,而固定池化区域个数,这样就确保了输入什么大小的feature,输出的feature大小完全相等。
因此,SPPnet不再固定网络的输入尺寸大小,网络不需要对每张输入图像进行裁剪,而是整张图像作为输入,经过CNN特征提取之后,得到特征图,接着根据预先确定好的候选框大小,从特征图中寻找原始图片中候选框的位置(根据特征图的大小和原图大小进行逆转换),并选用这个区域作为池化层的输入。SPPnet网络后面的部分和R-CNN相似。
论文接着阐述了SPPnet也有缺点,与R-CNN一样,训练也是分为多个阶段,并且无法更新空间金字塔池化之前的卷积层(这点本人无法理解,认真看了论文的解释也是一知半解,最后求助知乎得到了可以解释的解答),简单来说就是SPPnet对于图像的训练模式是打乱每个batch的所有ROI,所以很难更新卷积层的参数(虽然我也不知道为什么它要这样训练)
2. Fast R-CNN architecture and training
论文提出一种新的算法结构Fast R-CNN,首先,将图片输入DeepCNN网络中得到特征图,根据映射关系可以找到原图上每个候选区域在特征图上的特征矩阵,然后将特征矩阵通过RoI Pooling层统一缩放到指定尺寸(论文中采用7x7),然后经过两个全连接层得到特征向量,在这之后并联两个全连接层层,左边的全连接层用于目标类别预测(分类器),右边全连接层用于边界框回归参数的预测(回归器)。
分类器:输出N+1个类别的概率,N为检测目标种类数,1为背景
回归器:输出N+1个类别的边界框回归参数,每组 4 个值代表框的位置
RoI池化层只是SPPnets中使用的空间金字塔池化层的特例,其中只有一个金字塔层。论文中是将所有不同尺寸的特征图统一池化成7*7的特征向量。
论文使用三个预先训练好的ImageNet网络进行实验,每个网络都有五个最大池化层和五到十三个 conv 层。当一个预训练网络初始化Fast R-CNN网络时,它将经历三次转换。首先,最后一个最大池化层被 RoI 池化层取代, 其次,将网络的最后一个全连接层替换为前面所述的(一个全连接层和 K + 1 个类别的softmax以及特定类别的边界框回归层)。 第三,对网络进行修改,以接受两个数据输入: 图像和这些图像中的 RoIs。
这部分比较难理解,网上也没有标准的解释,本人认为论文的意思是Fast R-CNN的训练方式与SPPnet对比,采用分层采样思想,先采样出N张图像,在这N张图像中再平均采样出R个RoI,即每张图片采样出R/N个RoI,同一图像的RoI共享计算和内存。论文中举了一个例子说到:设N = 2, R = 128,也就是说只用计算和存储2张图像卷积正向传播过程中的数据,那么需要存储的数据量相比R-CNN和SPPnet小了64倍(因为SPPnet采用的是打乱RoI训练,那么针对一张图像来说,两个模型达到相同效果的情况下SPPnet需要存储的数据量更大)
损失函数采用类别损失与边框回归损失的加权和(),其中 是真实类别 u 的对数损失。当 u ≥ 1 时,[u ≥ 1] 的值为 1,否则为背景,则[u ≥ 1]=0
边框回归损失是一种稳健的 L1 损失,与 R-CNN 和 SPPnet 中使用的 L2 损失相比,它对异常值不那么敏感。当回归目标不受限制时,使用 L2 损失进行训练可能需要仔细调整学习率,以防止梯度爆炸。
在正负样本的选择上,论文选择IoU大于0.5的候选框里面的25%作为正样本;IoU低于0.5的则作为负样本;论文中提到使用了水平翻转作为数据增强。
论文详细解释了RoI池化层反向传播原理。假设图片经过候选框裁剪之后得到许多尺寸不一的特征图,并且经过一个池化(最大池化)得到3*3的输出,其中指的是第r个区域特征图的第i个输入, 指的是第r个特征图的第j个输出。在前向传播中,使用的是最大池化,所以是在第r特征图中的第j个池化区域的最大值
反向传播时,计算对 的偏导时,由于不同的区域特征图对应的可能是同一个,因为需要对每一个特征图相加;同样的,也有许多池化区域的最大池化可能都是 ,因此也需要对每一个j输出相加 ,其中,控制的是使得只有当 时该值=1,否则=0
论文中还对SGD的超参数进行了设置
论文探索了两种实现物体尺度不变检测的方法:(1) 通过 "蛮力"学习;(2) 利用图像金字塔。在 "蛮力 "方法中,在训练和测试过程中,每幅图像都按照预先确定的像素尺寸进行处理。网络必须从训练数据中直接学习比例不变的物体检测。 多尺度方法则通过图像金字塔为网络提供近似的尺度不变性。测试时,图像金字塔用于对每个候选框进行近似比例归一化。
3. Fast R-CNN detection
在测试阶段,由于每张图像的候选区域比较多,网络在全连接阶段耗费时间比较多,因此网络提出了一个“截断 SVD”用于加快检测速度。
学过矩阵分解的应该都知道实际上SVD就是一个矩阵分解,将原本全连接层的W压缩成较小参数量的T(奇异值非0),参数量越少,计算速度越快