近段时间,笔者开始系统的看了看目标检测方面的文章,以后可能会在这个方向上发展。所以这里准备写个目标检测系列,先是RCNN系列(从RCNN一直到Mask RCNN,以及YOLO和SSD)。之后可能还会写语义分割,目标追踪,3D检测方向blog。
区域卷积神经网络(R-CNN)
2014年 CVPR RBG大神-Ross Girshick开创性的提出区域卷积神经网络(Regions with CNN features,简称 R-CNN),借助CNN良好的特征提取性能,使用RegionProposal的方式将目标检测问题转化为一个分类问题和一个回归问题。
下面就来简单的概述下RCNN是如何工作的。
具体来说主要分为以下四步:
- 对每张输入图像使用选择性搜索selective search来选取多个高质量的提议区域 。这个算法先对图像基于像素信息做快速分割来得到多个区域,然后将当下最相似的两区域合并成一个区域,重复进行合并直到整张图像变成一个区域。最后根据合并的信息生成多个有层次结构的提议区域,并为每个提议区域生成物体类别和真实边界框。
- 选取一个预先训练好的卷积神经网络,去掉最后的输出层来作为特征抽取模块。对每个提议区域,将其变形成卷积神经网络需要的输入尺寸后进行前向计算抽取特征。
- 将每个提议区域的特征连同其标注做成一个样本,训练多个支持向量机(SVM)来进行物体类别分类。
- 使用bounding box regression来对目标框做修正。
在第一步中,使用的selective search是2012年提出的一个方法,其核心也是借助SVM将相似的区域不断合并,结构如下。
第二步中用到的卷积神经网络是在ImageNet上预训练的AlexNet。
第三步中分类时一共分了N+1类(N个目标类别 + background)
下面再详细介绍下第四步
Bounding-box regression
首先算法的输入是N个pair对
其中
是第i个框的坐标值,前两个为该框中心点的坐标,后两个分别为宽和高。
然后
我们的目标就是要学习一个转换,将proposed box P 映射到 ground-truth box G.
我们将这个映射定义为四个转换函数dx(P),dy(P),dw(P),dh(P)
于是我们就可以通过下面的方法得到预测框
其中的每一个d都是一个线性函数,所以又可以表示成
w是一个可学习的vector
现在我们就可以得到优化目标
其中的t就是我们的回归目标,定义如下
简单的来说就是我们通过上面所述的这些方法,对每一个P得到一个修正值t,P和t做运算过后就得到了最后的预测框。
小结
R-CNN 对之前物体识别算法的主要改进是使用了预先训练好的卷积神经网络来抽取特征,有效的提升了识别精度。
但R-CNN存在如下几个缺点
- 多个候选区域对应的图像需要预先提取,占用较大的磁盘空间
- 每一个RegionProposal都要通过CNN做前向运算,非常消耗资源,从而导致速度过慢。
当然在训练的时候我们可以事先算好每个区域的特征并保存,因为训练中不更新卷积网络的权重。但在做预测时,我们仍然需要计算上千次的前向计算,其带来的巨大计算量使得 RCNN 很难在实际应用中被使用。