重点参考《读DL论文心得之Fast RCNN》
fast r-cnn【1】是Ross Girshick在2015年对上一年的SPP-Net算法做的改进。作者在VGG16网络的测试表明:fast r-cnn在训练阶段比r-cnn快了9倍,比spp-net快了3倍;在测试阶段比r-cnn快了213倍,比spp-net快了10倍;同时精度也有一定提升
1)r-cnn 和 spp-net 的训练都需要经过多个阶段:fine-tuning得到网络卷积层的特征输出、SVM对每组特征向量的学习、位置bounding box的回归
2)对r-cnn,训练和测试的时间空间开销大。每个图像提取的大量roi特征需要存储和通过cnn
3)对spp-net,虽然roi特征在最后一个卷积层才提取,省去了多次前向cnn。但由于SVM,roi特征仍需存储。此外,spp-net中的tunning无法更新spp层之前的所有权重,因此对于比较深得网络无能为力
如图1所示,算法首先通过 selective search方法生成约2K个ROI,连同图像一起输入到CNN网络;在最后一个卷积层后求取ROI位置的映射关系,使用1层的spp池化层将每个ROI统一到相同大小;最后通过两个全连接层,一个FC层后接softmax实现分类,一个FC层后接bounding box回归得到类别修正后的位置。
是仅含1层的SPP pooling层,《论文笔记 《Fast R-CNN》》里猜测,这里之所以不使用多层是为了避免重新训练
ROI池化层的输入是N个特征映射(我的理解是N张图像)和R个ROI,每个特征映射的维度为H x W x C,每个ROI为(n, r, c, h, w),n是特征映射的索引,(r, c)是ROI左上角坐标,(h, w)是ROI高宽
ROI池化层的输出是大小一致的(max-pool)特征映射(H’ x W’ x C)
CNN网络需要经过3个调整才能应用fast r-cnn算法:
1)最后一个max pooling层替换为 ROI pooling层,输出尺寸H’ 和W’与后面的全连接层输入一致
2)最后一个全连接层+softmax层替换为两组:全连接层+softmax对K+1个类别(包括1个背景)的分类;全连接层+回归层对bounding box的调整
3)网络输入除了图像数据,还要增加ROI数据
spp-net之所以不能tuning spp 层之前的网络,是因为每次SGD中包含了不同图像的样本,反向传播需要计算每个ROI感受野的卷积层(通常会覆盖整个图像),这样会导致梯度涣散
针对这个问题,fast r-cnn提出层次取样的方法:首先取样N个图像,对每张图像取 R/N 个ROI(R为全部ROI数),同一图像的ROI共享计算和内存
此外fast r-cnn在一次tuning中同时优化了softmax分类器和bbox回归
假定 p=(p0,...,pk) 是k+1个类别的softmax输出
假定 tk=(txk,tyk,twk,thk) 是bbox回归输出的第k类box的偏移(相对于ROI)
那么两者的损失为:
文章比较了两种方法:
1)brute force:直接将图像统一为某种尺寸,期望网络学会自适应sacle
2)image pyramids:生成一个图像金字塔,对于ROI,在金字塔上找到最接近标准尺寸(227x227)的一个来训练
经过比较,方法2比方法1在精度上仅提高了1个mAP,但耗时大大增加,因此最终使用方法1(spp-net使用方法2,这是fast r-cnn比他快的一个原因)
文章认为全连接层非常耗时,提出将权重做SVD分解,通过数据降维的方式减小计算量
文章《【目标检测】Fast RCNN算法详解》对此有较为详细的分析
此外,文章通过实验证明:
1)对于较深的网络(如VGG),卷积层和全连接层一起tuning会有较大精度的提升
2)浅层卷积层没必要tuning,因为对mAP基本没影响
3)训练数据越多越好
4)候选区域proposals并不是越多越好
Girshick在github上开源了该算法的python代码
系列文章《r-cnn系列代码编译及解读(1)》会对代码做详细分析
【1】Girshick R. Fast R-CNN[J]. Computer Science, 2015.