一.简介
R-CNN来源于论文“Rich feature hierarchies for accurate object detection and semantic segmentation”,论文原文地址为http://arxiv.org/abs/1311.2524
其基本思想是“将检测任务转换为分类任务”
二.算法原理
2.1模块设计
(1)产生区域建议模块
本文中使用Selective Search的方法产生2000个Region Propopals。
(2)特征提取模块
对于每一个Region Proposal,首先对这些区域进行膨胀处理,在其 box 周围附加了
个像素,也就是人为添加了边框,在本文中
通过Selective Search产生的Region Proposals大小不一,为了适应AlexNet的输入图像的尺寸要求,作者无视Region Proposals的大小和形状,将膨胀后的每一个Region Proposal都暴力地resize到
的尺寸大小
之后使用AlexNet对于每一个Region Proposal都抽取出一个4096维的特征向量
2.2模型训练
在R-CNN的训练阶段,主要可分为以下几个步骤:
(1)有监督的预训练
在paper中,作者借助Caffe这一深度学习框架的CNN相关库,在ILSVRC2012的数据集上训练了一个CNN(此CNN为AlexNet),其实此时训练出来的CNN只具备图像分类的能力。关于ILSVRC2012数据集的介绍可以参考这篇博客:ILSVRC2012数据集介绍
(2)针对特定领域的Fine-tuning
为了使得上一步中我们预训练的CNN能够适应新的任务(目标检测)和新领域(变形的候选窗口中的图像),作者使用resize的候选窗口中的图像进行SGD(随机梯度下降)训练(即Fine-tuning)
上一步中训练得到的CNN的最后一层的分类层(softmax层)为1000个节点,根据Fine-tuning使用的数据集不同,将分类层改成
个节点,其中
为此步骤中使用的数据集的类别数目,需要加的
是背景。对于VOC数据集,
;对于ILSVRC2013数据集,
同时,这一步中使用的AlexNet除了需要改造最后一层softmax层的节点个数以外,为了模型精简,作者还去掉了倒数第二层的FC7
选取IoU>=0.5的bounding box;在SGD训练中,设置学习率为0.001;在每一轮的SGD迭代中,在一张图像的所有类别中采样32个正窗口和96个背景窗口组成一个128大小的mini-batch
(3)物体类别分类器
此时需要训练一个二分类器,输出结果为positive和negative
首先需要明确定义好什么样子的example属于positive和negative,定义好之后就可以为每一个方框打上label。以识别汽车为例,对于一个方框包含了一辆汽车,定义为positive;若一个方框完全没有包含汽车,那它就是一个背景,定义为negative;如果一个方框一部分与汽车重叠,使用IoU的阈值(threshold),R-CNN中threshold取0.3,如果一个区域与ground truth的IoU值低于设定的阈值,那么可以讲它看成是 negative,否则为positive。很自然地,将判断属于positive的example定义为ground truth
此时到目前为止,已经实现了特征提取和打上label,就可以使用此数据及标签来最训练并优化一个SVM
由于数量过大内存装不下,这里作者采用的方法为hard negative mining
2.3模型测试
在测试阶段,R-CNN在每张图片上提取大约2000 个Region Proposals
然后对于每个Region Proposal使用“特征提取模块”进行先膨胀再resize,送进AlexNet以读取特征,然后用 SVM 进行类别的识别,并产生分数
Region Proposals有 2000 个,所以会有很多重叠,针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域