RCNN精读
原论文地址:https://arxiv.org/abs/1311.2524
首先介绍几个物体检测算法常用到概念
Bounding Box(bbox)
bbox是包含物体的最小矩形,该物体应在最小矩形内部,如图各种颜色的框。
物体检测中关于物体位置的信息输出是一组(x,y,w,h)数据,其中x,y代表着bbox的左上角(或者其他固定点,可自定义),对应的w,h表示bbox的宽和高.一组(x,y,w,h)可以唯一的确定一个定位框。
Intersection over Union(IoU)
中文叫交并比,对于两个区域R和R′,则两个区域的重叠程度overlap计算如下:
O(R,R′)=|R∩R′|/|R∪R′|
在训练网络的时候,我们常依据侯选区域和标定区域的IoU值来确定正负样本
非极大值抑制(Non-Maximum Suppression又称NMS)
非极大值抑制(NMS)可以看做是局部最大值的搜索问题,NMS是许多计算机视觉算法的部分,非极大值抑制就是把不是极大值的抑制掉,在物体检测上,就是对一个目标有多个标定框,使用极大值抑制算法滤掉多余的标定框。
那么怎么能够简单的又通透的理解呢?
比如下图左图的赫本人脸有好多框,其中每个框都有得分也就是置信度,那非极大值抑制是做什么呢,就是找到置信度最高的该类别的所有框,如果只检测一张人脸那就不用NMS,但如果一个图中有多个人脸呢,即如果同一个类别出现好多呢,你怎么知道哪个最高的置信度是属于那个人脸的呢?,所以看算法流程:
- 比如网络输出一个2000×20的矩阵,20代表的是20个类别,2000是代表一个类别有2000个候选框,每个框都有得分(置信度),其中同一个类别(同一列里有可能出现好几个目标,比如某一列检测狗的位置,但是途中出现多个狗就是这个道理)
- 从每一列(每一个类别)的最大置信度的候选框开始,该最大置信度的候选框和后面的每个候选框做IoU,如果该IoU>设定的阈值,则把得分较小的这个候选框去掉,否则,则认为这个得分较小的框是和最大置信度的框分属同一类别的多个目标。意义呢?其实如果IoU较高说明这两个框重叠的比较大,而现实是同一个类别的不同目标的几乎不会有很大的重叠,所以就去掉了IoU较大的那个框,这样就解释通了。
- 遍历每一列重复上面的算法核心步骤这就是所有类别的非极大值抑制。
现在正式细读RCNN
先了解下网络结构
其中SS算法得到ROI区域亦即region proposal,SS算法是selective search(选择性搜索)以后再介绍
整个算法过程主要分4步:
1.获取输入图像
2.提取约2000个候选区域(通过SS算法得到)
3.将候选区域分别输入CNN网络(这里需要将候选图片进行缩放,即为图中所示的规整Warped过程)
4.将CNN的输出分别输入SVM中进行类别的判定和回归原图上的bbox
提取约2000个候选区域
这部分有很多传统的方法可以选择,本文为了和之前的物体检测算法进行对比,选择了selective search方法
规整Warped过程
因为CNN对输入图像的大小有限制,所以在将候选区域输入CNN网络之前,要将候选区域进行固定尺寸的缩放。
缩放分为两大类(该部分在原文附录A):
a.各向同性缩放,长宽放缩相同的倍数
- tightest square with context:
把region proposal的边界进行扩展延伸成正方形,灰色部分用原始图片中的相应像素填补,如下图(B)所示 - tightest square without context:
把region proposal的边界进行扩展延伸成正方形,灰色部分不填补,如下图(C)所示
b.各向异性缩放, 长宽放缩的倍数不同
不管图片是否扭曲,长宽缩放的比例可能不一样,直接将长宽缩放到227*227,如下图(D)所示
在放缩之前,作者考虑,在region proposal周围补额外的原始图片像素(pad p)。上图中,第一层p=0,第二层p=16。
最后试验发现,采用各向异性缩放并且p=16的时候效果最好。
将候选区域分别输入CNN网络
在训练的时候是利用预训练的AlexNet
CNN的输出分别输入SVM中进行类别的判定和回归原图上的bbox
a.分类处理CNN输出特征
对CNN输出的特征用SVM进行打分(每类都有一个SVM,21类就有21个SVM分类器),对打好分的区域使用NMS即非极大抑制(每类都单独使用)。
分类就完成了,但是得到的位置只是候选区在图像中的位置,而候选区的位置并不一定就是ground truth(检测目标的真实位置)。
问题:最终目标分类是通过SVM进行分类的,而不是通过网络框架中的softmax分类的,为什么不直接用softmax输出的结果而是再训练SVM来进行分类的(下面回答)
b.回归处理
将CNN对候选区域提取出的特征输入训练好的线形回归器中,得到更为精确的位置定位,但要明确的是,这些回归器是按照类来训练的,即每类分类完后进行回归。
训练过程
1.预训练
训练的时候,文章用了个trick,他先用ILSVRC2012数据库多类别训练Alexnet,训练的时候目标时图片分类,因为ILSVRC2012数据库没有分类的标定数据。这步称为预训练。
这种方法也是当数据量不够的时候,常用的一种训练方式,即先用别的数据库训练网络,然后再用自己的数据库微调训练(fine-tuning)。微调期间,定义与ground truth的IoU大于0.5的候选区域为正样本,其余的为负样本。
这里训练时,网络输出要有所改变,因为分类问题,网络输出为N+1,其中N为正样本的类别数,1为背景。
对于VOC,N=20,对于ILSVRC2013, N=200。
a.SVM正负样本的定义,为什么fine-tuning与SVM正负样本定义不一样?
在训练SVM时,正样本为groundtruth,负样本定义为与ground truth的IoU小于0.3的候选区域为负样本,介于0.3与0.7之间的样本忽略。
fine-tuning时担心过拟合的原因,要扩大正样本的样本量,所以定义比较宽松,但是SVM是最终用于分类的分类器,而且SVM原理就是最小的距离最大化,越难分的数据越有利于SVM的训练,所以对样本的定义比较严格。
b.为什么不直接用softmax的输出结果?
因为在训练softmax的时候数据本来就不是很准确,而SVM的训练使用的是hard negative也就是样本比较严格,所以SVM效果会更好。
bbox回归认为候选区域和ground-truth之间是线性关系(因为在最后从SVM内确定出来的区域比较接近ground-truth,这里近似认为可以线性关系)
训练回归器的输入为N对值,$\left\{\left(P^{i}, G^{i}\right)\right\}_{i=1,2, \ldots, N}$,分别为候选区域的框坐标和真实的框坐标,下面在不必要时省略i。这里选用的Proposal必须和Ground Truth的IoU>0.6才算是正样本.
从候选框P到预测框$\hat{G}$的基本思路如下:
因为我们在分类之后得到候选框$_{P}\left(P_{x}, P_{y}, P_{w}, P_{h}\right)$,其中$P_{x}$和$P_{y}$为候选框的中心点,$P_{w}$和$P_{h}$为候选框的宽高,下面介绍中所有框的定位都用这种定义,即x和y表示中心点坐标,w和h表示框的宽高。知道候选框的表示,那么只要估计出出候选框与真实框的平移量和尺度缩放比例,就可以得到我们的估计框了
1)先求平移量(Δx,Δy)
$\Delta x=P_{w} d_{x}(P),\Delta y=P_{h} d_{y}(P)$
即R-CNN论文里面的:
$\hat{G}_{x}=P_{w} d_{x}(P)+P_{x} , \hat{G}_{y}=P_{w} d_{y}(P)+P_{y}$
2)算尺度放缩量$\left(S_{w}, S_{h}\right)$
$S_{w}=P_{w} d_{w}(P), S_{h}=P_{h} d_{h}(P)$
$\hat{G}_{w}=P_{w} \exp \left(d_{w}(P)\right), \hat{G}_{h}=P_{h} \exp \left(d_{h}(P)\right)$
我们要学习的是$d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P)$这四个变换,就可以得到估计框了。
这四个变换可以用下列公式表示:
$d_{*}(P)=w_{*}^{T} \Phi_{5}(P)$
上式中$\Phi_{5}(P)$为Alexnet pool5输出的特征,所以要求$d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P)$这四个变换,只需求出$w_{*}^{T}$即可。
该回归器的损失函数为:
$w_{*}=\underset{\hat{w}_{*}}{\arg \min } \sum_{i}^{n}\left(t_{*}^{i}-\hat{w}_{*}^{T} \Phi_{5}\left(P^{i}\right)\right)^{2}+\lambda\left\|\hat{w}_{*}\right\|^{2}$
上式中的$t_{\dot{*}}^{i}$可以通过如下公式求出:
$\begin{aligned} t_{x} &=\left(G_{x}-P_{x}\right) / P_{w} \\ t_{y} &=\left(G_{y}-P_{y}\right) / P_{h} \\ t_{w} &=\log \left(G_{w} / P_{w}\right) \\ t_{h} &=\log \left(G_{h} / P_{h}\right) \end{aligned}$
所以通过输入的特征值训练,从而求出$\hat{w}_{*}$,就可以得到回归器