目标检测 Fast R-CNN 论文笔记
摘要
- 此篇文章是 Ross Girshick 大牛在微软研究所单撸出来的一篇文章。基于14年 R-CNN 的大获成功,作者提出了其改进算法 Fast R-CNN 。Fast R-CNN 在VGG16 network下训练速度比R-CNN快了9倍,测试时间更是缩短了213倍,不仅如此,mAP也达到了最高水平。作者也在github上传了源码,可以点此下载。
简介
- 对R-CNN尚不了解的同学可以看看这里。简而言之,R-CNN实现的分成这么四步:
- 利用 selective research 在一张图像中选出2000个候选框(即可能存在目标的区域);
- 将每个候选框 warp 成固定大小的图像(例如227*227),送入CNN提取4096维的 feature map;
- 对于这2000个 feature map ,利用SVM分类器进行分类,判断它是属于某个特定类还是背景;
- 使用回归器进一步调整边界框的位置。
- 作者认为目标检测的高复杂度源于两个问题:一是无数的候选框都要被运行一次,以判定其类别;二是这些候选框只提供了一个大致位置,后期还需要细调。
- 传统的R-CNN已经做得很好了,但还是存在几个问题:
- 训练是一个多阶段过程。R-CNN的训练分成三步(和实现不一样!),先训练CNN网络,再训练SVM,再训练边界框回归。这样实在有点复杂;
- 训练耗时又耗空间。 在诸如VGG16的深度网络下,程序可能要花几天来训练,生成的特征图也多达几百G;
- 目标检测速度慢。如果使用VGG16,在GPU下一张图需要47秒来检测。
- 之后有人提出 SPPnet 来改进R-CNN的速度。一张图片通过CNN**只生成一个公用的feature map**,而不是每个候选框都生成一个。然而,SPPnet的缺点还是很明显。
- 基于R-CNN和SPPnet的缺点,作者再次提出了Fast R-CNN,它具有如下优点:
- 更高的mAP;
- 训练只有一个阶段,且使用multi-task loss;
- 训练可以更新所有的网络层;
- 不需要硬盘来缓存特征图。
网络结构和训练策略
- 论文中给出的网络结构图如下图。首先,网络的输入有两个:原始图像和候选区域(region of interest, ROI)。首先,卷积网络对整张图像提取出提取出feature map;接着,每个ROI都通过生成的这feature map提取出一段特征向量,且通过ROI pllling层框定尺寸;最后,每个特征向量通过全连接层(FC)输出两个内容:softmax分类和边界框。
ROI pooling
- ROI pooling是本文章中的一个重点,它实现的功能是将任意大小的矩形区域通过池化转变为统一的尺寸。在此借用 shenxiaolu1984大神博客 的示意图。可以看见,假如输出固定尺寸是H * W,则上一层的任何一个矩形框ROI都被平均分割为H * W个小块,每个小块进行一次max pooling操作,选出小块中的最大值。
多任务损失
- 由网络结构可知,输出有softmax分类和边界框两个。作者设定了一个multi-task损失来衡量两个输出和真实值的差异。损失函数如下表式:
L(p,u,tu,v)=