作者:Ross Girshick,Jeff Donahue,Trevor Darrell,Jitendra Malik
阅读原因:了解RCNN、Fast RCNN、Faster RCNN在object detection中的应用
Fast RCNN学习笔记
主要参考:①R-CNN读书笔记 ②关于Faster R-CNN的一切——笔记1:R-CNN ③【目标检测】RCNN算法详解
Region CNN(R-CNN)可以说是利用深度学习进行目标检测的开山之作。作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖。这篇文章思路简洁,在DPM方法多年平台期后,效果提高显著。
RCNN是一种可伸缩的(scalable)检测算法,在PASCAL VOC2012数据集上将mean average precision(mAP)提高了30%,达到53.3%。下面是mAP的计算过程,其中AP为average precision,即平均精确度。
\qquad 计算mAP时,一般先计算每个预测框的loU值(预测框与真实框的交集面积与并集面积之比),通过与loU阈值比较得到“正确预测”或“错误预测”。计算第i个图像的第C类的精度:
P r e c i s i o n i , C = C 类 别 的 正 确 预 测 次 数 C 类 别 的 总 数 量 Precision_{i,C}=\frac{C类别的正确预测次数}{C类别的总数量} Precisioni,C=C类别的总数量C类别的正确预测次数
再计算平均精度AP:
A P C = ∑ i P r e c i s i o n i , C 图 像 总 数 AP_C=\frac{\sum_iPrecision_{i,C}}{图像总数} APC=图像总数∑iPrecisioni,C
进而再对AP取平均,就得到mAP值。
m A P = 1 ∣ Q R ∣ ∑ q ∈ Q R A P q mAP=\frac{1}{|Q_R|}\sum_{q\in Q_R}AP_q mAP=∣QR∣1q∈QR∑APq
RCNN有两个优点:
(1)可以将high-capacity CNN应用于候选区域(region proposals),从而实现目标的局部化和分割(Regions with CNN,R-CNN)。
(2)当有标签的training data缺乏时,先在辅助任务进行有监督预训练,再在自己的数据集上做微调,这样可以提高模型性能。
RCNN的不足:
(1)测试时速度慢:对于提取的Region Proposal,多数都是互相重叠的,重叠部分会被多次重复提取特征,都要分别进行CNN前向传播一次(相当于进行了2000次提特征和SVM分类的过程),操作冗余,计算量较大。
(2)训练时速度慢:原因同上。
(3)多阶段训练过程:每一步需要训练三个模型:CNN、SVM、bounding box回归,且RCNN中独立的分类器和回归器都需要大量特征作为训练样本。
Q:在什么情况下,CNN在ImageNet分类的结果可以推广到PASCAL VOC目标检测问题?
A:本文通过建立图像分类和目标检测的关系,来回答这一问题。相较于简单的HOG,CNN可以得到好得多的目标检测结果。为得到这一结果,需要解决两个问题:
(1)利用深度网络将目标局部化
(2)只利用较少的带注释的检测数据来训练一个high-capacity模型
使用区域识别方法来解决CNN局部化问题,此方法在目标检测和语义分割(semantic segmentation)中的应用都很成功。同时,bounding-box回归(边框回归)方法可以很好的降低mislocalizations——此模型主要的error mode】。
本文的第二个贡献:展现了上述预训练+微调的方法是在labeled data缺乏的情况下,训练大容量CNN的有效方法。
[图像处理之特征提取(一)之HOG特征简单梳理][]
本文模型是高效的,唯一的计算是矩阵-向量乘积和贪婪非极大值抑制(greedy non-maximum suppression)。这些计算都与在所有类别中出现的特征有关,而且这些类别的维度比之前使用的区域特征小两个数量级。
↓ \downarrow ↓
↓ \downarrow ↓
↓ \downarrow ↓
候选区域 \ 得分 \ 类别 | 1 | … | N=20 |
---|---|---|---|
2k个proposals | scores | scores | scores |
文中使用selective search方法,算法如下:
\qquad selective search算法是先通过简单的区域划分算法,将图片划分成很多小区域,再通过相似度和区域大小(小的区域先聚合,这样是防止大的区域不断的聚合小区域,导致层次关系不完全)不断的聚合相邻小区域,类似于聚类的思路。这样就能解决object层次问题。例如汽车是object,轮胎也是object,汽车包含轮胎,两个目标的层次是不同的。
\qquad 为了保证能够划分的完全,对于相似度,作者提出了可以多样化的思路,不但使用多样的颜色空间(RGB,Lab,HSV等等),还有很多不同的相似度计算方法。并类过程中的proposals都是算法的输出,选择评分高的作为selective search的结果,得到约2k个region proposals。参考选择性搜索(selective search)和Selective Search原理及实现(均附代码)
\qquad bounding-box回归可以改善局部化效果。在DPM中,是用inferred DPM part location计算出的几何特征进行回归,而RCNN是用CNN计算出的特征进行回归。
\qquad 对于N个training pairs { ( P i , G i ) } i = 1 N \{(P^i,G^i)\}_{i=1}^N {(Pi,Gi)}i=1N,其中proposal P i = ( P x i , P y i , P w i , P h i ) P^i=(P_x^i,P_y^i,P_w^i,P_h^i) Pi=(Pxi,Pyi,Pwi,Phi)、ground-truth bounding box G i = ( G x i , G y i , G w i , G h i ) G^i=(G_x^i,G_y^i,G_w^i,G_h^i) Gi=(Gxi,Gyi,Gwi,Ghi)都是四元组:前两项指明了bounding box的中心点的坐标,后两项是bbox的width和height。我们的目的是学习一个变换,将proposed box P P P 映射到ground-truth box G G G。
\qquad 我们用四个函数来(参数化)表示这个变换: d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)。前两个表示 P P P的bounding box的中心的一个scale-invariant的平移,后两个表示 P P P的bounding box的宽和高的一个log-space平移(尺度放缩)。则这个变换可以拆分为:平移+尺度放缩
\qquad 每一个函数 d ∗ ( P ) d_*(P) d∗(P)都可以modeled as是proposal P P P的pool5 feature的线性函数,记作 ϕ 5 ( P ) \phi_5(P) ϕ5(P)【实际操作中,并不是输入P的四元组,而是P的pool5 feature】,则有 d ∗ ( P ) = w ∗ T ϕ 5 ( P ) d_*(P)=w_*^T\phi_5(P) d∗(P)=w∗Tϕ5(P), w ∗ w_* w∗是需要学习的参数。而此时,回归的真实目标也从G变为了: t ∗ = ( t x , t y , t w , t h ) t_*=(t_x,t_y,t_w,t_h) t∗=(tx,ty,tw,th),其中
因此,损失函数为
L = ∑ i N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2 L=\sum_i^N(t_*^i-\hat{w}_*^T\phi_5(P^i))^2 L=i∑N(t∗i−w^∗Tϕ5(Pi))2
从而问题转化为正则化的最小二乘问题(Ridge回归):
\qquad 进行bounding box回归时需要注意:(1)Ridge回归中正则化参数 λ \lambda λ很重要,本文取 λ = 1000 \lambda=1000 λ=1000。(2)只针对至少和一个ground-truth box“很近”的proposal P进行训练,这里“很近”指的是:与P重叠的ground-truth boxes中,IoU最大的ground-truth box G,且IoU大于等于0.6,则这样的{P,G}需要进行训练。其他不满足的P舍弃。
RCNN具有两个性质:
(1)所有类别的CNN参数共享
(2)CNN得到的特征向量比其他方法得到的维数要低,例如spatial pyramids with bag-of-visual-word。
这种共享使得计算时间被分摊在所有类别上。每一类的计算只有:特征与SVM权重之间的点乘,和NMS。而一个图像的所有点乘计算可以写成矩阵-矩阵乘积。特征矩阵是2k × \times × 4096,SVM权重矩阵是4097 × \times ×N,其中N是类别数。这意味着,RCNN的性质使得它可以处理几千个目标种类而不需要借助近似技巧。
从RCNN的结构看,需要训练CNN和SVMs。
为什么要用不同的定义?
\qquad fine-tuning:对于每一个region proposal,找出与图片中ground-truth box的IoU值最大的那个box(如果存在这样的box),若IoU值大于等于0.5,则将这个region proposal标记为该box对应类别的正样本。其余proposals标记为background(即,所有类别中都是负样本)。
\qquad SVM:只将ground-truth box定义为对应类别的正样本,将与某一类中所有ground-truth boxes的IoU值都小于0.3的proposal标记为该类别的负样本。其余灰色区域的proposal舍弃。
这样分别定义的原因
1、若训练SVM时延用fine-tuning的正负样本定义,结果明显劣于现在的定义。
2、fine-tuning的定义方式增加了很多jittered样本,扩充了正样本的数量。在对整个网络进行微调时,这种扩充是必要的,防止过拟合。而在精确的局部化过程中,这些jittered样本会导致结果不是最优的。
为什么fine-tuning之后还要训练SVM?
\qquad 若直接用fine-tuning后的CNN的最后一层【21-way softmax 回归分类器】进行目标检测,会导致mAP下降(VOC2007)。这可能是因为fine-tuning中正样本的定义不能突出精确局部化的目的,而且训练softmax 分类器是在随机抽取的负样本上,而不是训练SVM时的hard negatives。
\qquad 本文推测:若在fine-tuning过程中增加一些变动,不训练SVM也是可以的。那么,这可以使RCNN更简洁,速度更快,且效果不变。