之前李菲菲的公开课cs231n上曾讲解rcnn、fast-rcnn等一系列的文章,所以这周对这篇文章进行学习。
这篇文章是2014年CVPR上的经典paper,是物体检测领域曾经获得state-of-art精度的经典文献。这篇paper的思想,改变了物体检测的总思路,现在好多文献关于深度学习的物体检测的算法,基本上都是继承了这个思想,可以说是利用深度学习进行目标检测的开山之作。下面具体对这篇文章进行讲述。
在这篇文章出来之前,视觉detection的任务多采取SIFT和HOG,所以发展缓慢,而深度学习的兴起给作者以启发,能否将Alexnet等在分类上表现很好的方法迁移到检测任务上,所以就产生了本文,将CNN用于物体检测。检测和分类的区别就是分类只区分物体类别,而检测同时要确定物体位置,这就把分类问题转化成立回归问题,找到一个BBox圈出物体。下图是本文的模型框架,接下来会具体讲解各部分内容。
简单来说就是,首先输入一张图片,先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用svm算法对各个候选框中的物体进行分类识别。也就是按照如下程序:
a、找出候选框;
b、利用CNN提取特征;
c、利用SVM进行特征分类。
a、找出候选框;
作者采用选择性搜索的方式搜索出2000个候选框,文章采用的是过分割的手段,将图片分割成很多小区域,所以作者先将候选框进行合并,按照颜色。纹理等特征进行合并。从上面的模型框架中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,比如Alexnet网络要求输入图片大小为227*227。因此对于每个输入的候选框都需要缩放到固定的大小。文章对于图片缩放做了两种类型的实验。
(1)各向异性缩放,这种方法很简单,就是不管图片的长宽比例,不管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;
(2)各向同性缩放,因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用b box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的-+
背景颜色(b box的像素颜色均值)填充成正方形图片,如下图(C)所示;
文章还对图片做了padding处理,上面的示意图中第1、3行结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验对比,作者发现采用各向异性缩放、padding=16的精度最高。
此时我们已经选出了2000个候选框,2000个矩形框也不一定会出现一个与人工标注完全匹配的候选框。因此我们需要用IOU为2000个bounding box打标签,以便下一步CNN训练使用。IOU定义了两个b box的重叠度,如下图所示:IOU=(A∩B)/(A∪B)
在CNN阶段,如果挑选出来的候选框与物体的人工标注矩形框的重叠区域IOU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。
b、利用CNN提取特征;
作者尝试采用了Alexnet和Vggnet两种模型,Vgg的结果虽然略好于Alexnet,但消耗的计算量却远高于Alexnet,所以文章采用了Alexnet的模型进行特征提取,我们知道Alex最后的F6和F7层是4096个神经元的全连接,所以最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
有监督预训练,又称为迁移学习。迁移学习就是就是把已学训练好的模型参数迁移到新的模型来帮助新模型训练数据集。在本文里就是将已经经过ILSVRC2012训练过的分类图片的Alexnet网络拿来做物体检测任务,解决了检测领域标记样本少的问题,直接将参数初始化后的Alexnet网络来进行检测,再进行后续的fine-tuning训练。
fine-tuning训练,我们将2000个候选框处理后对上面预训练的cnn模型进行fine-tuning训练。假设要检测的物体类别有N类,那么就需要把上面预训练阶段的CNN模型的F7层给替换掉,替换成N+1个输出的神经元(一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,batch size大小选择128,其中32个正样本、96个负样本(因为正样本量少)。
作者针对要不要进行fintune进行了实验,结果如下表所示:
上表显示如果不进行fintune,FC6层直接检测结果要优于FC7,而进行fintune之后结果会大幅度提升。据此我们了解到,如果不针对特定任务进行finetune,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。比如说,对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征。
C、SVM训练,测试阶段
此阶段将CNN特征提取之后的2000个框输入到SVM里进行二分类,此时同一个目标会被多个建议框包围,这时需要非极大值抑制操作去除得分较低的候选框以减少重叠框。
非极大值抑制的流程是:就像下面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
1)从最大概率矩形框F开始,分别判断A~E与F的IOU是否大于某个设定的阈值;
2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
而在二分类时定义正负阈值,IOU大于0.5的为正样本,小于0.3的为负样本;而在CNN训练阶段,负样本选择为0.5,从网上找资料说是因为“微调阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IOU限制宽松:IoU>0.5的建议框为正样本,否则为负样本;SVM这种机制是由于其适用于小样本训练,故对样本IOU限制严格:IOU<0.3的建议框为负样本。”
下图是作者在VOC 2010和VOC2007的检测结果,mAP值提升明显。
文章还展示了RCNN在图像语义分割上的应用,不过效果并不理想,在此也不赘述,文章附录里讲述了很多具体的实验细节,还和overfeat模型结构进行对比,因为我对检测领域不是很了解,所以也没有认真研究这一部分。
本文所提出的RCNN网络虽然效果达到了state-of-the-art,但仍旧有问题存在,比如说,整个测试过程很复杂,要先提取建议框,之后提取每个建议框CNN特征,再用SVM分类,做非极大值抑制,最后做b-box回归才能得到图片中物体的种类以及位置信息;同样训练过程也很复杂,这些不连续过程必然涉及到特征存储、浪费磁盘空间等问题。也就是因为上面这些问题的存在,才引出了Fast-RCNN、Faster-RCNN的产生,接下来我也会继续把这几篇文章了解清楚。