前言
R-CNN系列算法是经典的two-stage的目标检测算法,相较于one-stage精度更高,但是速度略有下降。从R-CNN到Fast R-CNN和Faster R-CNN,整个思路是:候选框选取 —— 特征提取 —— 对候选框进行分类(判定类别)和回归(修正候选框位置)
R-CNN
背景
R-CNN是使用深度学习进行目标检测的开山之作。传统的目标检测方法大多以图像识别为基础。 一般可以在图片上使用穷举法选出所有物体可能出现的区域框,对这些区域框提取特征并使用图像识别方法分类, 得到所有分类成功的区域后,通过非极大值抑制(Non-maximum Suppression)输出结果。
R-CNN则将特征提取这一步替换成了使用CNN进行特征提取,同时在各个步骤上加上了一些Tricks使得整体的性能得到了提升。
贡献
(1)提出了一个基于大规模CNN的基于区域候选框的目标检测网络(用传统的机器学习方法,无法同时处理像CNN这么多的网络参数),即用深度学习进行目标检测的开山之作。
(2)提出了一个当标签好的数据集稀少时的解决方法:先在辅助的大规模数据集上进行预训练pre-training,之后再在和任务相关的数据集上进行微调fine-tune。 比如本文是先在ImageNet上用分类问题的标签进行预训练,再到PASCAL VOC数据集上用检测问题的标签进行微调。
方法介绍
以下是R-CNN的结构图
分为三个模块:候选框选取;特征提取;线性的SVM分类器(二分类,yes or no)
候选框选取: 使用选择性搜索的方法为整张图片生成约2000个候选框。
选择性搜索假设物体存在的区域之间具有相似性和连续性。首先使用分割手段,将图像分割成小区域,然后计算每两个相邻区域的相似度,并合并可能性最高的两个区域。其中,颜色直方图相近的、梯度直方图相近的(即纹理)、合并后总面积小的,以及在其边界框所占比例大的区域优先合并。因此,在合并过程中,操作的尺度较为均匀,这会避免大区域陆续合并其他小区域,并且保证合并后的形状规则。如此重复,直到将整张图像合并成一个区域位置,最终所有曾经存在过的区域都是候选区域。
特征提取: 使用CNN为每个输入的候选框进行一次特征提取。在输入CNN之前需要将每个候选框的image部分warp成227*227RGB(固定大小,因为后面的全连接层要求输入的大小固定)。网络包括五个卷积层和两个全连接层。
以上是经过warp后的图像示例。
分类和NMS: 为每个类训练一个线性分类器。每个候选区域提取特征后的vector进入每个线性分类器并给出一个score,选择得分最高的class作为预测class。所有候选框分类完以后,再利用NMS逐个剔除多余的候选框。
pre-train和fine-tune:
首先在ILSVRC数据集上预训练CNN(没有bounding-box的label,只有类别的label,训练一下网络和分类器)输出类别分数。
之后在PASCAL VOC上对检测任务进行fine-tune训练。
最后的输出是候选框+类别+置信分数
缺点
虽然惊为天人地创造了基于深度学习的目标检测算法,但是它还是存在许多缺陷。
(1)选择性搜索来生成候选框,速度太慢。
(2)需要对每个候选框区域的图像部分提取一次特征,有较多的重复操作(有些区域存在很大的重叠)以及耗时太长(每个区域都要经过一次网络计算)。
(3)在输入网络前要warp成固定大小,这样对图像的resize会导致结果有一定影响(毕竟和原图不一样),而且多一步操作也会降速。(0.1秒也是时间。。)
(4)训练分多步。 首先对卷积网络进行训练,接softmax,使用log loss;然后再替换softmax,对线性分类器进行训练。
Fast R-CNN
基于R-CNN的一些缺点,提出了Fast R-CNN。
贡献
(1)单阶段的训练,训练时更新整个网络层,使用mult-task loss。
(2)特征只提取一次。
(3)使用池化操作代替wrap操作,这样可以处理任意尺寸的图片。
(4)同时训练softmax分类器和边界框回归器bbox regerssor。
方法介绍
未完待续