R-CNN是现代目标检测识别的开山之作,其意义不言而喻,但是面对枯燥的论文,我想很多同学都不能理解到位。这里我想通过自己的阅读与理解帮助大家更加深刻的了解R-CNN。
结构框架与训练过程
在讲框架结构之前,先跟大家提一提R-CNN的创新点。
1.采用CNN网络提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力;
2.采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题。
它的训练过程如下:
*1.有监督预训练*
ILSVRC样本集上仅有图像类别标签,没有图像物体位置标注;
采用AlexNet CNN网络进行有监督预训练,学习率=0.01;
该网络输入为227×227的ILSVRC训练集图像,输出最后一层为4096维特征->1000类的映射,训练的是网络参数。
在这里我们需要理解几个问题。
什么叫有监督预训练?为什么我们第一步要进行有监督预训练呢?
有监督预训练也称之为迁移学习,举例说明:若有大量标注信息的人脸年龄分类的正负样本图片,利用样本训练了CNN网络用于人脸年龄识别;现在要通过人脸进行性别识别,那么就可以去掉已经训练好的人脸年龄识别网络CNN的最后一层或几层,换成所需要的分类层,前面层的网络参数直接使用为初始化参数,修改层的网络参数随机初始化,再利用人脸性别分类的正负样本图片进行训练,得到人脸性别识别网络,这种方法就叫做有监督预训练。这种方式可以很好地解决小样本数据无法训练深层CNN网络的问题,我们都知道小样本数据训练很容易造成网络过拟合,但是在大样本训练后利用其参数初始化网络可以很好地训练小样本,这解决了小样本训练的难题。
这篇文章最大的亮点就是采用了这种思想,ILSVRC样本集上用于图片分类的含标注类别的训练集有1millon之多,总共含有1000类;而PASCAL VOC 2007样本集上用于物体检测的含标注类别和位置信息的训练集只有10k,总共含有20类,直接用这部分数据训练容易造成过拟合,因此文中利用ILSVRC2012的训练集先进行有监督预训练。
*2.特定样本下的微调*
PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签;
采用训练好的AlexNet CNN网络进行PASCAL VOC 2007样本集下的微调,学习率=0.001【0.01/10为了在学习新东西时不至于忘记之前的记忆】;
mini-batch为32个正样本和96个负样本【由于正样本太少】;
*3.SVM训练*
由于SVM是二分类器,需要为每个类别训练单独的SVM;
SVM训练时输入正负样本在AlexNet CNN网络计算下的4096维特征,输出为该类的得分,训练的是SVM权重向量;
由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。
在这里我们需要理解几个问题。
为什么在微调CNN和训练目标检测支持向量机时,正面和负面的例子定义不同?
简要回顾一下定义,将每个推荐目标映射到ground-truth实例,它与ground-truth实例具有最大的IoU重叠(如果有的话),如果IoU至少为0.5,则将其标记为匹配的ground-truth类的正样本。所有其他的推荐都标为背景(所有类的负样本)。而训练SVM时,只把对应各自类别的gt boxes作为正样本并且将与一个类别中所有实例重叠IOU小于0.3的目标标为负样本。之所以得出这些定义,是因为我们首先对ImageNet预训练CNN计算出来的特性进行SVMs训练,所以微调在那个时候没有考虑。在该设置中,发现用于培训支持向量机的特定标签定义在评估的一组选项中是最优的(包括现在用于微调的设置)。当开始微调时,最初使用与SVM相同的正负样本,但是,效果没有现在定义的正负样本的结果好。
为什么微调后还需要训练SVM呢?
我们把微调后的网络最后一层(a 21-way softmax regression classifier)作为目标检测器。发现在VOC 2007上的性能下降了3.3%。造成下降的原因可能包括用微调时正样本的定义没有强调精确坐标以及softmax分类器是用随机抽取负样本训练而不是跟SVM一样用hard negatives。
*4.Bounding-box regression训练*
在这里我们需要理解几个问题。
为什么要采用回归器?回归器是什么有什么用?如何进行操作?
首先要明确目标检测不仅是要对目标进行识别,还要完成定位任务,所以最终获得的bounding-box也决定了目标检测的精度。
这里先解释一下什么叫定位精度:定位精度可以用算法得出的物体检测框与实际标注的物体边界框的IoU值来近似表示。
那么问题来了,回归器如何设计呢?
Test过程讲解
在明确如何进行Test之前,我们需要理解R-CNN是如何利用selective search确定它的region proposal的。
在深入介绍Selective Search之前,先说说其需要考虑的几个问题:
1. 适应不同尺度(Capture All Scales):穷举搜索(Exhaustive Selective)通过改变窗口大小来适应物体的不同尺度,选择搜索(Selective Search)同样无法避免这个问题。算法采用了图像分割(Image Segmentation)以及使用一种层次算法(Hierarchical Algorithm)有效地解决了这个问题。
2. 多样化(Diversification):单一的策略无法应对多种类别的图像。使用颜色(color)、纹理(texture)、大小(size)等多种策略对(对图像分割好的)区域(region)进行合并。
3. 速度快(Fast to Compute):算法,就像功夫一样,唯快不破!
这里是基于区域的合并,区域包含的信息比像素丰富,更能够有效地代表物体的特征。
1. 使用 Efficient Graph-Based Image Segmentation【1】的方法获取原始分割区域R={r1,r2,…,rn}
2. 初始化相似度集合S=∅
3. 计算两两相邻区域之间的相似度(见第三部分),将其添加到相似度集合S中
4. 从相似度集合S中找出,相似度最大的两个区域 ri 和rj,将其合并成为一个区域 rt,从相似度集合中除去原先与ri和rj相邻区域之间计算的相似度,计算rt与其相邻区域(原先与ri或rj相邻的区域)的相似度,将其结果添加的到相似度集合S中。同时将新区域 rt 添加到 区域集合R中。
5. 获取每个区域的Bounding Boxes,这个结果就是物体位置的可能结果L
由此,测试过程如下:
1.输入一张多目标图像,我们采用selective search提取约2000个建议框(region proposal)。(但是这2000个建议框的像素维度并不满足CNN的输入要求维度,我们需要变形使得每个建议框的维度变成227×227。)
2.先在每个建议框周围加上16个像素值为建议框像素平均值的边框,再直接变形为227×227的大小;
用在R-CNN中的卷积神经网络需要输入的维度是227×227,对于检测,我们认为推荐目标是图像中任意矩形内的像素。这里有两种方式可以将推荐目标变形为有效的CNN输入。
第一种方法(“tightest square with context”),将每个推荐目标容纳在最紧贴的方形里并且放大到可以作为CNN输入的大小。第二种方法(“warp”)是非均匀地放大每个推荐目标到能够作为CNN的输入。
3.先将所有建议框像素减去该建议框像素平均值后【预处理操作】,再依次将每个227×227的建议框输入AlexNet CNN网络获取4096维的特征【比以前的人工经验特征低两个数量级】,2000个建议框的CNN特征组合成2000×4096维矩阵;
4.将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵表示每个建议框是某个物体类别的得分;
5.分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框;
为什么要进行非极大值抑制?非极大值抑制又如何操作?具体实现步骤请看我的博文。
在测试过程完成到第4步之后,获得2000×20维矩阵表示每个建议框是某个物体类别的得分情况,此时会遇到下图所示情况,同一个车辆目标会被多个建议框包围,这时需要非极大值抑制操作去除得分较低的候选框以减少重叠框。
具体怎么做呢?
① 对2000×20维矩阵中每列按从大到小进行排序;
② 从每列最大的得分建议框开始,分别与该列后面的得分建议框进行IoU计算,若IoU>阈值,则剔除得分较小的建议框,否则认为图像中存在多个同一类物体;
③ 从每列次大的得分建议框开始,重复步骤②;
④ 重复步骤③直到遍历完该列所有建议框;
⑤ 遍历完2000×20维矩阵所有列,即所有物体种类都做一遍非极大值抑制;
⑥ 最后剔除各个类别中剩余建议框得分少于该类别阈值的建议框。【文中没有讲,博主觉得有必要做】
6.分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。