introduction
Fast-RCNN (Fast Region based Convolutional Network)在之前的工作任务上建立了更有效的分类proposal,使用VGG16进行训练,比起RCNN快9倍,测试时间快213倍,比起SPPnet训练快3倍,测试快10倍。
深度卷积网络用于目标检测带来两个主要挑战:
- 大量候选目标位置(proposal)需要处理
- 这些候选仅仅提供了粗略的定位必须调整取得更精确的定位。
对比RCNN与SPPNet:
Region-based Convolutional Network method 有明显的缺点:
3. 训练是多阶段的,R-CNN首先在proposals上边训练一个ConvNet,提取图像特征,然后训练一个SVM对正负样本特征分类,这些SVM作为目标检测检测器取代了微调的softmax分类器。最后,学习bunding box 回归,预测目标位置。
4. 训练耗时耗力。
5. 检测速度慢
SPPNet虽然对R-CNN进行了加速,但是也是基于多阶段训练,包括提取特征、微调网络、训练SVM、最后bounding box回归训练。特征需要写入硬盘。但是与R-CNN不一样,SPPNet提出的微调网络不能更新在空间金字塔池化层之前的卷积层参数,也就是不能共享训练参数,毫无疑问,这种局限性(即固定卷积层)限制了深度网络的精确度。
针对这些任务,作者提出了一个single-stage算法,该算法可以联合学习对object proposals进行分类并优化其空间位置。
Fast R-CNN architecture
detail
Fast R-CNN 结构图如上所示,提取建议框的方法与R-CNN一样,使用Selective search。图像提取特征使用VGG16的卷积部分,将整幅图像输入其中进行特征提取得到最后的feature map,然后将所有建议框送入RoI layer,在特征图上找到对应的映射区域并固定尺寸,随后是通过两个全连接层,得到固定尺寸的RoI特征向量。到这一步,每个RoI都提取了一个固定维度的特征,将其作为目标分类和边界框回归两个任务的输入,即可得到目标检测结果。
上图中,按照底色分为两个部分,左半边白色,右半边灰色。白色部分只会进行一次计算,其中红色框是建议框计算,白色框是特征计算,灰色部分是每个RoI都要进行计算,如果一张图像中有2k个RoI,则要计算2k次。此外,Fast R-CNN将分类和BB回归一起进行计算,简化了计算流程。
- Fast R-CNN 由一个 CNN(通常在 ImageNet 分类任务上预先训练)组成,其最后pooling层被"ROI 池化"层取代,其最终 FC 层被两个分支替换 :一个 (K + 1) 个类别 softmax 分类器产生softmax概率,用来估计k个objec加一个背景类别共K+1个类别的概率和一个特定于类别的边界框回归器,针对每个类别输出4个实数(r,c,h,w)【表示左上角坐标和高度、宽度】,每组4个值对k个object其中一个类的精确边界框位置进行编码,背景是被忽略的。
- 将整个图像送到backbone CNN中,并获得来自最后一个卷积层的特征。根据所使用的backbone CNN,输出特征图比原始图像小得多。这取决于backbone CNN 的步幅,在 VGG 主干的情况下,它通常为 16。
- 通过Selective Search等方法获取object proposal window
- 属于该object proposal window的backbone feature map映射到RoI pooling layer
- ROI 池化层是空间金字塔池 (SPP) 层的一种特殊情况,只有一层金字塔。该层基本上将selective proposal window(来自区域建议算法)中的划分为大小为 h/H *w/W的子窗口,并在其中每个子窗口中执行池化操作。这会产生固定大小的输出特征(H x W),而与输入大小无关。选择 H 和 W 时,输出与网络的第一个全连接层兼容。在Fast R-CNN论文中选择的H和W值为7。与常规池化一样,ROI 池化在每个channel中单独执行。
- 然后,来自 ROI 池化层(N x 7 x 7 x 512,其中 N 是建议数)的输出特征被送到连续的 FC 层以及 softmax 和 Bounding box 回归分支中。softmax 分类分支生成属于 K 个类别的每个 ROI 的概率和一个背景类别。BB 回归分支输出用于使区域建议算法中的边界框更精确。
ROI pooling(Region of Interesting )
Fast R-CNN使用的RoI是SPPNet金字塔池化的简化版本,只有一个level的金字塔池化,同样使用最大池化,将RoI区域的特征转换为固定大小的HxW的特征图。RoI表示建议框字特征图上的映射区域。
RoI和建议框都表示目标的region proposals,但是大小和意义不同,建议框表示原图像中找到的obeject region proposal,RoI表示从卷积网络最顶层得到的object region proposal。
Each RoI is defined by a four-tuple (r; c; h;w) that specifies its top-left corner (r; c) and its height and width (h;w).
why SPPnet is unable to update weights below the spatial pyramid pooling layer
根本原因是,当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播效率非常低,这正是R-CNN和SPPnet网络的训练方式.这种无效传播来源于:每个RoI可能有一个非常大的感受野,通常覆盖整个输入图像。由于前向传播必须处理整个感受野,训练输入是非常大的(通常是整张图像)。
本文提出了一种更有效的训练方法,在训练期间利用特征共享。在Fast R-CNN训练期间,SGD mini-bathes 是层次抽样的,首先抽样N张图像,然后从每张图像抽样R/N RoIs.
重要的是,来源于同一张图像的RoIs 在前向传播和反向传播时共享计算和存储。让N变小可以减少mini-batch 计算量。举例来说,使用N=2,R=128的训练大约比从128张图像抽样一个RoI要快64倍。
奇异值分解(singular value decomposition)SVD fc layer加速计算
对于整个图像分类,与conv层相比,计算全连接层所花费的时间很小。相反,对于检测,要处理的ROI数量很大,近一半的前向传递时间用于计算全连接层(见图2)。
通过使用截断的SVD压缩大型全连接层,可以很容易地加快它们的速度。
设全连接层前一级的数据为x,后一级的数据为y,全连接得参数为W,尺寸为uxv,前向传播的过程为
y
=
W
∗
x
y=W*x
y=W∗x
对W进行奇异值分解,得到
W
=
U
Σ
t
V
T
W = U\Sigma_{t}V^{T}
W=UΣtVTU是uxt的矩阵,由W的前t个左奇异值向量组成。
Σ
t
\Sigma_{t}
Σt是txt的对角矩阵,由W的前t个奇异值组成,V是vxt的矩阵,由W的前t右奇异值向量组成。这样,计算复杂度由uv变为t(u+v),在t远小于u和v的情况下非常有用,而且在RoI数量非常大的情况,具有很好的加速效果。相当于把一个全连接层拆分为两个,中间一个低维数据相连,结果可以看上图,在精度下降0.3%的情况下,fc6和fc7计算时间下降了101ms。
training
- First, the last max pooling layer is replaced by a RoI pooling layer that is configured by setting H and W to be compatible with the net’s first fully connected layer (e.g.,H = W = 7 for VGG16).
- Second, the network’s last fully connected layer and softmax (which were trained for 1000-way ImageNet classification) are replaced with the two sibling layers described earlier (a fully connected layer and softmax over K+1 categories and category-specific bounding-box regressors).
- Third, the network is modified to take two data inputs: a list of images and a list of RoIs in those images
- 在训练期间,每个mini-batch都是 N=2 个图像构造。mini-batch由每个图像的 64 个 ROI 组成,即一共128个proposal。
- 训练时每个mini-batch添加N幅图像,然后添加从N幅图像选取的R个建议框。本文N=2,R=128,其中proposal的正负样本比列为1:3,正样本为与某类真实边界框的IoU不小于0.5的proposal,负样本定义为与全部20个类别(VOC数据集种有20个类别)的ground truth bounding box的IoU小于0.5的proposal。
- 在 ROI 池化层之前,整个图像都要经过 CNN。这样,来自同一图像的所有ROI在通过CNN前向和后向传播中共享计算和内存(在ROI池层之前)。
- 采样策略(从非常少的图像中批量抽取所有 ROI)允许整个模块(特征生成、分类和回归)一起训练,这与 SPP Net 不同。在SPP网络中,大多数输入ROI来自不同的图像,因此检测的训练过程仅在特征生成后微调全连接的层,因为在SPP层之前更新权重是不可行的(某些ROI可能在原始图像上具有非常大的感受野)。实际特征仍然来自经过分类训练的预训练网络,这限制了 SPP 网络的准确性。
- 请注意,在 ROI 池化层(batch size = 2)之前,CNN 的网络批大小非常小,但对于以下 softmax 和回归层,网络的批大小要大得多(batch size = 128)。
loss
详见论文,Fast R-CNN 是一个包含目标分类和边界框回归两个任务的多任务模型,因此称为多任务损失,由类别损失和定位location损失两部分构成。
分类
在R-CNN中使用SVM分类,在Fast-R-CNN中使用softmax分类,这是由于结构不同导致的。R-CNN中softmax是Alexnet最后的结构,使用迁移学习的方式进行微调将类别数由1000改为2,训练的样本是随机的,总体效果不如SVM。Fast R-CNN中,softamx是独立的,VGG后边的结构已经被替换掉了(替换为分类和边界框回归两个任务),训练时使用样本与SVM一样,因此效果比SVM更好。
贴两张图对比R-CNN 与Fast R-CNN
reference
https://towardsdatascience.com/fast-r-cnn-for-object-detection-a-technical-summary-a0ff94faa022