为什么提出Fast-R-CNN:
1、R-CNN网络训练、测试繁琐,包括提取候选区、提取CNN特征、SVM分类和Bounding-box 回归等步骤,网络训练、测试速度都很慢。
2、R-CNN网络训练需要大量存储空间:20类即20个SVM分类器和20类即20个Bounding-box 回归器在训练过程中需要大量特征作为训练样本,这部分从CNN提取的特征会占用大量存储空间;
Fast R-CNN的运行流程:
1、使用CNN网络来抽取图像的特征,形成特征图像
与R-CNN不同,这里是先利用卷积网络提取图像的特征,之后再使用候选区域找到对应的特征区域投影。
2、使用SS算法提取候选区域
用Selective Search的方法在每个图像上生成很多的候选区域(大约2000个类别独立的候选区域)
3、POI池化层
RoI池池层使用最大池将任何有效感兴趣区域内的特征转换为固定空间范围为H×W的小特征映射。实现方法:首先假设候选区对应特征图中的特征区域大小为h×w,将其划分H×W个子窗口,每个子窗口大小为h/H×w/W,然后对每个子窗口采用max pooling下采样操作,每个子窗口只取一个最大值,则特征框最终池化为H×W的size【特征框各深度同理】,这将各个大小不一的特征框转化为大小统一的数据输入下一层。
4、通过全连接层分支输出
所得特征向量经由各自的全连接层【由SVD分解实现】,这里使用SVD分解的目的是为了提高全连接层网络的计算速度。分别得到两个输出向量:一个是softmax的分类得分,一个是Bounding-box回归.
5、非极大抑制的方法
利用得分,分别对每一类物体进行非极大值抑制删除重叠窗口,最终得到每个类别中回归修正后的得分最高的窗口。
训练的过程:
1、使用CNN网络预训练
首先使用仅含类别标签的数据集,对三种网络模型采用进行预训练,本章中仅用了VCG-16来进行后面的说明。
2、特定样本下的微调,微调前,有3步转化:
(1)RoI池化层取代有监督预训练后的VGG-16网络最后一层池化层;
(2)两个并行层取代网络的最后一层全连接层和softmax层,并行层分别是新全连接层1+原softmax层1000个分类输出修改为21个分类输出【20种类+背景】和新全连接层2+候选区域窗口回归层;
(3)上述网络由原来单输入:一系列图像修改为双输入:一系列图像和这些图像中的一系列候选区域;
我在阅读是遇到的问题:
文章中有两个部分的理解比较晦涩,分别是和Fast R-CNN的损失函数。
1、RoI池化层的反向求导训练,看完文章的解释大概是基本普通max pooling层,但是RoI池化层的反向传播中可能出现多个候选区输出梯度的累加。对于这些反向求导的叠加有没有可能导致训练出现震荡,无法收敛。我认为在fast R-CNN中没有出现震荡现象的原因是,后面的训练是微调,步长较小。不知道我这样的理解对不对。
2、fast R-CNN的多任务训练,多任务训练中考虑了各任务间共享卷积层的相互影响。文章中提到这样影响可以潜在的提高检测时效果,在5.1节中,作者也提高在多任务训练下,改善范围从+0.8 到+1.1 mAP 点,从多任务学习显示出一致的积极效果。我是这样理解的,这里的多任务是图像的分类和图像候选区域的回归,而这两个任务都是倾向于对图中某一物体的精确定位,在逻辑层面的特征选择相似,可以互相弥补彼此对图像特征的选取损失,从而增加性能。
我觉得本文的贡献
1、规避R-CNN中冗余的特征提取操作,只对整张图像全区域进行一次特征提取;
2、使用RoI pooling层取代最后一层max pooling层,从而可以输入不同尺寸图像,仅在最后的RoI pooling规定特征的尺度。
3、Fast R-CNN网络末尾采用并行的不同的全连接层,可同时输出分类结果和窗口回归结果,节省了特征存储空间。
4、采用SVD对Fast R-CNN网络末尾并行的全连接层进行分解,减少计算复杂度,加快检测速度。