物体检测论文-RCNN

mark

物体检测

再说物体检测之前,我们先说一下图片分类问题,在前面的blog中我们讲解了AlexNet,VGGNet等深度卷积网络。要说为什么会有这么多效果极佳的分类模型,究其原因是因为有着ImageNet这样高质量的数据集。

在图像分类问题上深度神经网络表现出极好的效果,而在ImageNet的另一项比赛-物体检测,成绩一直不是很好,没有什么大的起伏。要说原因的话,物体检测任务本身的比较复杂,难度系数比分类高了几个级别,不是很好整。 很自然的就想到在物体检测上应用深度神经网络,而R-CNN就是第一个达到state-of-the-art的基于深度神经网络的模型。

简单的介绍了一下物体检测,下面我们细致的看一下图片分类和物体检测和联系区别,再了解几个在物体检测任务中常用到的概念。

图片分类和物体检测

显著的区别

物体检测可能会存在多个检测目标:
mark

一张图片上有各种动物,这不仅需要我们判别出各个动物的类别,而且还要准确定位出动物的位置.这比分类的难度大得多。

换算到输入输出和指标

mark

下表是分类任务和物体检测任务之间的对比:

任务 description 输入 输出 评价标准
分类(Classification) 在固定的类别下对一张图片进行分类 图片(image ) 类别标签(categories) 准确率(top1,top5)
Detection
and
Localization
(检测和定位)
在输入图片中找出存在的物体类别和位置.(可能存在多种物体) 图片(image ) 类别标签(categories)和
位置(bbox(x,y,w,h))
IoU (Intersection over Union)
mAP (Mean Average Precision)

物体检测中基本概念

在物体检测任务中,我们常提到的bboxIoU非极大值抑制这几个名词,这是传统图像处理中常用的,这里我们拎出来讲一下,学过的就当复习一下,没学过的认真看一遍。

Bounding Box(bbox)

bbox是包含物体的最小矩形,该物体应在最小矩形内部.

下图的包围小猫的红色矩形框

mark

这里注意到物体检测中关于物体位置的信息输出是一组$(x,y,w,h)$数据,其中$x,y$代表着bbox的左上角(或者其他固定点,可自定义),对应的$w,h$表示bbox的宽和高.一组$(x,y,w,h)$可以唯一的确定一个定位框。

Intersection over Union(IoU)

已知两个区域$R$和$R’$,则两个区域的重叠程度overlap计算如下:
$$ O(R,R’) = \frac{|R∩R’|} {|R∪R’|} $$

mark

在训练网络的时候, 我们常依据侯选区域和标定区域的IoU值来确定正负样本。

非极大值抑制 (Non-Maximum Suppression)

非极大值抑制(NMS)可以看做是局部最大值的搜索问题,NMS是许多计算机视觉算法的部分。如何设计高效的NMS算法对许多应用是十分关键的,例如视频跟踪、数据挖掘、3D重建、物体识别以及纹理分析等。

这里我们主要针对非极大值抑制在物体检测上的应用,非极大值抑制就是把不是极大值的抑制掉,在物体检测上,就是对一个目标有多个标定框,使用极大值抑制算法滤掉多余的标定框。

下图一个小猫有多个红框标定框在使用非极大抑制后:

mark

算法的实现可以看Matlab下的非极大值抑制实现

这里只是简单的介绍了物体检测任务需要注意的问题和一些概念。

下面进入本次主题:R-CNN,


R-CNN

R-CNN经典论文《Rich feature hierarchies for Accurate Object Detection and Segmentation

RGB大神的(Ross Girshick)这篇paper,可以说是 改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型 ,R-CNN在当时以优异的性能令世人瞩目。以R-CNN为基点,后续的SPPNetFast R-CNNFaster R-CNN模型都是照着这个物体检测思路,一步步推进物体检测的state-of-the-art。下面就来细致学习R-CNN模型。

Introduction

在R-CNN模型出现之前,物体检测的state-of-the-art模型是基于一堆传统的图像处理模型的变形(例如: SIFT和HOG),这些变形模型大多数是换汤不换药,在VOC数据集上表现都不是很好。

R-CNN开创性的使用了深度神经网络来做物体检测。 并明确的把物体检测任务分为多个pipelines ,在此基础上提供了一套在较少标注集下的训练方法。

R-CNN在物体检测上的解决方案

mark

mark

R-CNN模型的处理流程为:

  • 找出图片中可能存在目标的侯选区域
  • 通过CNN对候选区域提取特征向量
  • 在候选区域的特征向量上训练分类器,分类器用于判别物体并得到bbox
  • 修正bbox,对bbox做回归微调

找出图片中可能存在目标的 侯选区域

要想知道一张图片上是否存在的物体?存在的物体的大小/位置?常用的方法是 先找出一组图像区域,这些图像称为侯选区域(region proposals) ,然后使用一堆算法处理候选区域得到具体的物体和位置。

侯选区域中可能存在目标,使用侯选区域方案可减少在一张图片上寻找物体的复杂度,且很大可能的保存了图片上所有存在物体的区域,那么问题来了,怎么找到侯选区域?

直观的方式是用滑窗(sliding window)的方法去遍历整张图片,找出一些可能存在物体的侯选区域。滑窗寻找方法工作量非常大,且效果不好。除了使用滑窗,图像处理算法中给出了一些常用的产生侯选区域的方法,见下表:

mark

R-CNN最终选择的产生候选区域产生的方法是selective search,这里我们简单的介绍一下论文中使用selective search

详情参考论文Selective Search for Object Recognition

下图是selective search在图片上提取侯选区域的示意图:

mark

Selective Search在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而在下一层我们需要使用CNN提取候选区域的特征向量,需要接受固定长度的输入,故我们需要对候选区域做一些尺寸上的修改。

论文对图片做了两种方法的比较:

  • 各向异性缩放,即直接缩放到指定大小,这可能会造成不必要的图像失真
  • 各向同性缩放,在原图上出裁剪侯选区域,在边界用固定的背景颜色(采用侯选区域的像素颜色均值)填充到指定大小

mark

经过一系列的实验,作者发现采用各向异性缩放的实验精度最高,故采用这个方法。

通过深度神经网络(CNN)为候选区域提取特征向量

我们在讲CNN时,提到了CNN的特征提取能力。例如AlexNet的 前5个卷积层可以宽泛的认为是对原图的特征提取,提取的特征是原图像的高级表示,并且在提取特征的过程是有平移不变性。 依照这个思路, 我们把CNN的卷积层当做特征提取的模板,用这个模板来提取候选区域的特征,只需要把需要候选区域塞给它,就可以获取到我们想要的特征向量。当然,这需要我们训练好CNN的卷积层

现在我们明白了深度神经网络(CNN)在物体检测任务中的作用: 即在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器的输入数据,分类器依据高级特征回归出物品的位置和种类。

对于一张图片,使用训练好的CNN基础上,将所有的图片的所有侯选区域塞到CNN里面,把得到的pool5 feature存到硬盘里面(这里一存,后面训练一取,非常耗费时间)

mark

整个提取侯选区域的过程如上图所示.

下面我们回过头来说CNN,既然要用CNN,那必须得训练一个好的CNN模型。

CNN网络的训练

CNN的训练分为两个步骤:预训练微调阶段

有监督的预训练(pre-training)

一般的CNN模型层数多,模型的容量大,在标定数据少的情况下,数据量是不够从新训练一个CNN模型的。故我们采用已训练好的AlexNet/VGG16模型的卷积层参数,使用这样已训练好的网络参数,可以较好的提取图片的特征。这样的操作有一个专业的名词-迁移学习(这里不做讨论)

mark


微调阶段(fine-tuning)

AlexNet是针对ImageNet训练出来的模型, AlexNet的卷积部分可以作为一个好的特征提取器,后面的全连接层可以理解为一个好的分类器。这里把AlexNet的softmax层替换为一个N+1神经元的输出层(N为存在物体的种类,即正样本;1为背景,即负样本)。然后做微调训练。

mark

原本ImageNet的输出类别有1000个,这里把1000个替换为21个(N=20,1为背景).

fine-tuning训练方式使用的SGD,每个mini-batch取128.其中样本的选择规则如下表:

样本 数量 描述
正样本 32 候选区域与ground-truth(图片物体标注区域)的IoU>0.5
负样本 96 候选区域与ground-truth(图片物体标注区域)的IoU<0.5

这里取 IoU的阈值为0.5是因为CNN模型容量大,需要的数据多,故放宽限制,获取到更多的数据,防止模型过拟合。

需要注意的是,我们在训练CNN的时候会在网络的后面加上一个分类层,在训练完毕后,我们会移除最后的分类层,直接提取到前面的FC层,AlexNet的FC层为4096维。

使用特征向量训练物体类别分类器SVM

前面通过CNN把侯选区域的特征向量提取出来了,例如一张图片的2000个侯选区域,那么提取出来的就是$2000*4096$这样的特征向量(AlexNet的第一个FC层维度为4096,故pool5的输出为4096),这些特征向量需要存储到disk中,方便后面训练调用。这里我们怎么使用这些候选区域的高级特征呢?

因为是物体类别分类器,例如判定一个候选区域内是不是车,答案有两种:是(正样本),不是(负样本)。对于这样的二分类问题,在机器学习中,有很多适用的模型,这里选用SVM。因为 整个模型输出为N+1个种类,故我们同时训练N个二分类的SVM

因为一张图片候选区域的特征向量维度为 $20004096$,故$N=20$个SVM的权重矩阵为$4096N$(N为分类种类)。然后训练SVM即可.

为什么不用CNN接直接softmax直接分类?非要搞出来一咕噜SVM?

这是因为我们在 训练CNN的时候选的数据比较宽泛(选择样本不够准确),直接使用softmax输出的效果不是很好。(为什么训练的数据不好,是因为怕模型过拟合啊!)。

我们 把CNN当如一个特征提取模型,在提取出来的特征向量基础上,再筛选训练样本。更为细致的训练一组SVM,那样分类效果会比较棒。

这里我们注意一下训练SVM的时候,使用的样本的变换规则:

样本 描述
正样本 候选区域与ground-truth(图片物体标注区域)的IoU>0.7
负样本 候选区域与ground-truth(图片物体标注区域)的IoU<0.3

这个0.7的阈值是做实验得出来的经验值,比训练CNN模型时使用的0.5要苛刻许多~

mark

在经过SVM分类后,会输出一堆的候选框得分(是一个2000x20的得分矩阵),这时候我们需要用非极大值抑制去除多余框,得到想要的候选框了.大概步骤如下:

  • 对矩阵按列从大到小排序
  • 每列的最大值向下做非极大值抑制,遍历完所有列
  • 依据阈值,得到候选区域的类型

到这里,我们得到的是一组预测好类别的候选区域了。

建立bbox regressor,修正回归系数

上一步我们使用分类器大概确定了那些候选区域里面有物体了,但是这个物体的位置可能与ground-truth有偏差,那该怎么办?

这里论文给出了一个bounding-box回归, 这个bbox回归用于修正筛选后的候选区域,使之回归于ground-truth,从而进一步提高物体定位的精确度。 需要注意的是,这里做了一个近似,认为这两个框之间是线性关系。因为在最后筛选出来的候选区域和ground-truth很接近了。

mark

Bounding-box regression(回归实现详解)

mark

从筛选后的候选框$P$到预测框$\hat{G}$进过两个步骤:

  1. 平移$(\Delta x,\Delta y)$

$$\Delta x=P_wd_x(P) , \Delta y=P_hd_y(P) $$

即R-CNN论文里面的:

$$ \hat{G_x}=P_wd_x(P)+P_x , \hat{G_y}=P_hd_y(P)+P_y $$

  1. 作尺度放缩$(S_w,S_h)$
    $$S_w=P_wd_w(P) , S_h=P_hd_h(P) $$

$$\hat{G_w}=P_we^{d_w(P)} , \hat{G_h}=P_he^{d_h(P)} $$

我们要学习的是$d_x(P),d_y(P),d_w(P),d_h(P)$这四个变换.

输入:
样本值:输入不是侯选区域的$P=(P_x,P_y,P_w,P_h)$,而是候选区域的特征向量,

Ground Truth: $ t_a=(t_x,t_y,t_w,t_h)$

输出:
需要进行平移变换和尺度缩放的$d_x(P),d_y(P),d_w(P),d_h(P)$,或者说是$\Delta x,\Delta y ,S_w,S_h$。

这里我们可以通过计算得到预测值$\hat{G}$,在R-CNN里面:

$$t_x=\frac{G_x-P_x} {P_w} , t_y=\frac{G_y-P_y} {P_h} , t_w=\log\frac{G_w} {P_w} , t_h=\log\frac{G_h} {P_h}$$

目标函数 :

$$ d_*(P) =\hat{w}^T \Theta_5(P) $$

$\Theta_5(P) $是输入Proposal在Pool5的特征向量, $ \hat{w} $是要学习的参数.即$(w_x,w_y,w_w,w_h)$

损失函数为:(带正则化)

$$Loss = \underset{\hat{w}} {argmin} \sum_{i=0}^N(t_a^i-\hat{w}^T\Theta_5(P^i))^2 +\lambda{||\hat{w}||}^2 $$


总结

看完了上面的剖析,现在对比一下下面两个图:

mark

mark

R-CNN的贡献在于将深度神经网络引入物体检测任务中,并提出了一系列的训练方法和训练细节,尤其是使用CNN模型提取特征向量,在细致的训练分类器和回归模型,这一整套的物体检测思路奠定了后续R-CNN模型的基础,可谓说是意义非凡。


参考资料

cs231n课件
多个blog

Thanks for your support!