开篇需要跟大家道歉,一切忙没时间的理由都是借口,实际上就是偷懒了,这么久才更新,非常抱歉!
本篇争取以最简明的叙述,帮助大家理解下基于Region Proposal的目标检测的一系列工作,包括RCNN,Fast-RCNN,Faster-RCNN,这部分内容网上有很多博文,本文中会有很多图与其他博文相似或者雷同,如有侵权行为,请联系鄙人。讲得不好请大家海涵,若有疑点,大家可以阅读原论文。
目标检测是计算机视觉当中很重要的一个任务,它的目标不仅要识别出图像中包含物体的类别,还要对各个物体进行较精确的定位,定位的方式为给出一个包含该物体的框。见开篇图,取自论文RCNN。
那么怎样进行检测和识别呢,接来下就开始说RCNN。
RCNN:Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation,2014-CVPR
从本篇标题说起,整个RCNN系列是基于Region Proposal(可译为候选区域)做的。简单来说,这种做法就是先在图上提取很多个候选区域,然后判断这个区域是否包含物体以及包含什么物体,最后对包含物体的候选区域位置进行精修。
RCNN整个过程是分段的,可以分为以下几步:
1.提取候选区域
文中选取了Selective Search的方式对每张图提取了约2000个大小不一候选区域,为了使不同尺寸的候选区域可以喂给固定输入尺寸的网络提取特征,对这些候选区域都缩放到227,为避免缩放操作对识别检测精度的影响,作者对缩放过程做了优化,比如对候选区域边界扩展、warp等,并选取最好的缩放方式。
2.训练一个用于提特征的深度网络
在这一部分,首先基于ILVCR-2012中ImageNet所有数据训练一个1000分类的模型,作者尝试了VGG-16和AlexNet,单从精度方面VGG-16优于AlexNet,但由于VGG-16速度方面大幅落后于AlexNet,因此作者最终选用了AlexNet,我们简称为模型1。
其次,在上述模型1的基础上,基于在图像上提出的候选区域,筛选出符合条件的,对网络进行微调,即Fine-tune,稍后会说如何对候选框进行筛选。在微调的过程中,将上述模型1的最后一层输出类别个数改为要检测的目标类别个数加1,以VOC为例,最后微调的模型输出类别为20+1=21类,即物体类别数加上背景。
在微调模型的过程中,最关键的点在于候选区域的筛选和标签的获得,这里需要引入一个概念:IoU(intersection-over- union),IoU描述了两个框之间的重叠度,计算方法为两个框的交集除以两个框的并集,见下面示意图:
根据候选框和真实标定框(Ground Truth)之间的IoU值确定该候选框的标签,选取候选框与真实标定框IoU最大的标定框,若IoU大于0.5,标签即取为该真实框内物体的类别标签。如果候选框与任何一个真实标定框之间IoU均小于0.5,该候选框的标签即为背景。基于筛选出的包含各个类别和背景的候选区域对网络进行微调,即可得到最终用于提特征的深度网络。
3.提取候选区域特征,训练SVM分类器
最终对候选框类别的分类,作者单独训练了SVM,需要注意的是对于每个类别,均训练了一个二分类的SVM,比如对于狗,训练一个SVM来判断一个候选区域是或者不是狗。还是以VOC为例,则训练了20个SVM分类器。
在SVM的训练过程中,对候选区域的选择较为严格,正例为真实标定框,负例为与真实标定框IoU值小于0.3的候选框,将这些框过一遍上一步中微调好的模型,提取最后一层FC-4096维的特征向量,喂给这些框对应类别SVM进行训练。由于负例很多,作者采用了hard negative mining的方式。
4.利用回归的方式对框位置进行精修
在经过上述所有步骤得到最终框之后,为了使得框的位置更加精确,作者对框进行了线性回归。选取判定为该类别的框与标定框的IoU大于0.6的候选框,提取深度特征进行回归。
以上即为整个流程的训练过程。
整个test过程如下,在整幅图中利用Selective Search选取约2000个候选框,提取2000个框的深度特征,分别喂给各个类别的SVM分类器,判断是否包含该物体。由于一个物体可能有多个候选框,所以对同一类别的多个框做NMS(非极大值抑制),选取最优的框,将剩下的框分别进行框回归,得到最终结果。
RCNN存在的问题以及大部分人的疑问:
很多人对为什么单独训练SVM而不拿微调的模型直接得到分类结果存在疑问,作者也在论文附上了他们的解释,主要还是精度的问题,在微调模型的时候,对候选区域的选择较为宽松,防止过拟合,而且在SVM训练过程中作者采用了hard negative mining的方式,因此SVM的分类精度比微调后的深度模型softmax分类精度高的多。
当无法否认的是,RCNN存在很多缺点,比如速度慢,占用太多磁盘资源等,但也正是这些痛点,才催化出后来更优秀的算法。
由于篇幅有限,Fast RCNN以及Faster RCNN后续再说了,上述不好的地方或者没说明白的地方,欢迎留言批评指正。