目标检测 = 目标识别+定位
目标识别(classification):
输入:图片
输出:物体的类别
评估方法:准确率
定位(localization):
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union ( IOU )
IoU
bounding box的定位精度。因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示:
就是矩形框A、B的重叠面积占A、B并集的面积比例。
传统目标检测流程:
传统目标检测的主要问题:
候选区域建议:利用图像中的纹理、边缘、颜色等信息,预先找出图中目标可能出现的位置。
原文地址
对于目标识别任务,比如判断一张图片中有没有车、是什么车,一般需要解决两个问题:目标检测、目标识别。而目标检测任务中通常需要先通过某种方法做图像分割,事先得到候选框;直观的做法是:给定窗口,对整张图片滑动扫描,结束后改变窗口大小重复上面步骤,缺点很明显:重复劳动耗费资源、精度和质量不高等等。
针对上面的问题,一种解决方案是借鉴启发式搜索的方法,充分利用人类的先验知识。J.R.R. Uijlings在《Selective Search for Object Recoginition》提出一种方法:基于数据驱动,与具体类别无关的多种策略融合的启发式生成方法。图片包含各种丰富信息,例如:大小、形状、颜色、纹理、物体重叠关系等,如果只使用一种信息往往不能解决大部分问题,例如:
左边的两只猫可以通过颜色区别而不是通过纹理,右面的变色龙却只能通过纹理区别而不是颜色。
基于以上准则设计Selective Search算法:
采用层次分组算法解决尺度问题。
引入图像分割中的自下而上分组思想,由于整个过程是层次的,在将整个图合并成一个大的区域的过程中会输出不同尺度的多个子区域。整个过程如下:
利用《Efficient Graph-Based Image Segmentation》(基本思想:将图像中每个像素表示为图上的一个节点,用于连接不同节点的无向边都有一个权重,这个权重表示两个节点之间的不相似度,通过贪心算法利用最小生成树做图像分割)生成初始候选区域;
采用贪心算法合并区域,计算任意两个领域的相似度,把达到阈值的合并,再计算新区域和其所有领域的相似度,循环迭代,直到整个图变成了一个区域,算法如下:
多样化策略
三个方面:使用多种颜色空间、使用多种相似度计算方法、搜索起始区域不固定。
◆ 颜色相似度
以RGB为例,使用L1-norm归一化每个图像通道的色彩直方图(bins=25),每个区域被表示为25×3维向量: Ci={c1i,...,cni} C i = { c i 1 , . . . , c i n } ;
颜色相似度定义为:
◆ 纹理相似度
使用快速生成的类SIFT特征,对每个颜色通道在8个方向上应用方差为1的高斯滤波器,对每个颜色通道的每个方向提取 bins=10 b i n s = 10 的直方图,所以整个纹理向量维度为: 3×8×10=240 3 × 8 × 10 = 240 ,表示为: Ti={t1i,...,tni} T i = { t i 1 , . . . , t i n } ;
纹理相似度定义为:
该策略希望小的区域能尽早合并,让合并操作比较平滑,防止出现某个大区域逐步吞并其他小区域的情况。相似度定义为:
◆ 区域规则度相似度
能够框住合并后的两个区域的矩形大小越小说明两个区域的合并越规则,如:
区域规则度相似度定义为:
最终相似度为所有策略加权和,文中采用等权方式:
训练过程包含:提取候选框、提取特征、生成正负样本、训练模型,图示如下:
早期图像特征提取往往是各种HOG特征或BoW特征,现在CNN特征几乎一统天下。
检测定位效果评价采用Average Best Overlap(ABO)和Mean Average Best Overlap(MABO):
pre-train:拿一个在ImageNet上pre-train的CNN模型(如AlexNet/VGG)作为初始模型(前五个卷积层提取特征的能力已较成熟)
fine-tune:由于物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的方法是,利用pre-train的CNN的参数进行参数初始化后,再在该CNN上用 selective search 搜索出来的候选框 (自己的数据集) 对CNN的所有层(卷积层+FC层)进行再训练,使得CNN能适应待检测的新数据集。
**用FC7的特征训练线性SVM分类器:**fine-tune之后,这个模型就适应了这套检测的数据集,之后把SS的正负样本再经过fine-tune好的CNN,取FC7的特征(4096)分类,一共N个SVM,每个SVM都会输出概率值,概率值最高的对应的标签是猫,则该SS对应的class=cat
4. 用Conv5的特征训练Bounding box回归模型:将SS区域的位置 (x,y,w,h) ( x , y , w , h ) 精度进行提升,映射为更精确的 (x′,y′,w′,h′) ( x ′ , y ′ , w ′ , h ′ )
1. 一个输入特征是:Selective Search输入到AlexNet前向运算的第五层卷积层Conv5的输出特征;
2. 另一个输入特征是:Bounding box对 ,(P,G) , ( P , G ) , P P 是SS提出的候选框的位置信息,只有跟Ground-truth( G G )重合的 IoU>0.6 I o U > 0.6 的 P P 才考虑;
ϕ5(Pi) ϕ 5 ( P i ) 是Conv5的特征, w^T∗ w ^ ∗ T 是要学习的参数一共有4个 wx,wy,ww,wh w x , w y , w w , w h , ti∗ t ∗ i 的 ∗ ∗ 对应 tx,ty,tw,th t x , t y , t w , t h 共4个 t t , tx,ty t x , t y 是直角坐标系下的比例关系, tw,th t w , t h 是极坐标系下的比例关系,因此 w^T∗ϕ5(Pi) w ^ ∗ T ϕ 5 ( P i ) 最终要算出的是一个offset值,是一个校准量而不是绝对坐标值
测试阶段
Conv5的特征和学习好的4个 w w 参数相乘: w^T∗ϕ5(Pi) w ^ ∗ T ϕ 5 ( P i ) 得到 x,y,w,h x , y , w , h 各自对应的offset: d∗(P) d ∗ ( P )
之后各自经过坐标系变换得到Ground-truth的输出 G^∗ G ^ ∗
G^x=Pwdx(P)+Px G ^ x = P w d x ( P ) + P x
G^y=Phdy(P)+Py G ^ y = P h d y ( P ) + P y
G^w=Pwexp(dw(P)) G ^ w = P w e x p ( d w ( P ) )
G^h=Phexp(dh(P)) G ^ h = P h e x p ( d h ( P ) )
输入测试图像
利用selective search算法在图像中从下到上提取2000个左右的Region Proposal
先将每个Region Proposal作16个像素的膨胀以保证所有物体的信息都能进来,之后缩放成CNN可接受的尺寸(如AlexNet的输入尺寸为224x224)的大小并输入到CNN(AlexNet/VGG16)
缩放的方式
1) 各向异性缩放
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小224*224,如下图(D)所示;
2) 各向同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。有两种办法:
A. 先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如上图(B)所示;
B. 先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图(C)所示;对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
使用fine-tune过的AlexNet计算2种特征
[email protected] (mean Average Precision)
每一类分别计算AP,然后做mean平均
准确率(precision): TP/(TP+FP) T P / ( T P + F P )
召回率(recall): TP/(TP+FN) T P / ( T P + F N )
True Positive区域:与Ground truth区域的 IoU≥0.5 I o U ≥ 0.5
Source: 边框回归(Bounding Box Regression)详解
1. 为什么要bbox回归?
对于上图,绿色的框表示Ground Truth, 红色的框为Selective Search提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5), 那么这张图相当于没有正确的检测出飞机。 如果我们能对红色的框进行微调, 使得经过微调后的窗口跟Ground Truth 更接近, 这样岂不是定位会更准确。 确实,Bounding-box regression 就是用来微调这个窗口的。
Bounding box regression流程?
我们的目标是寻找一种关系使得输入原始的窗口 P P 经过映射得到一个跟真实窗口 G G 更接近的回归窗口 G^ G ^ 。
即给定 (Px,Py,Pw,Ph) ( P x , P y , P w , P h ) ,寻找一种映射 f f ,使得 f(Px,Py,Pw,Ph)=(G^x,G^y,G^w,G^h) f ( P x , P y , P w , P h ) = ( G ^ x , G ^ y , G ^ w , G ^ h ) 并且 (G^x,G^y,G^w,G^h)≈(Gx,Gy,Gw,Gh) ( G ^ x , G ^ y , G ^ w , G ^ h ) ≈ ( G x , G y , G w , G h )
那么经过何种变换才能将窗口 P P 变为窗口 G^ G ^ 呢? 比较简单的思路就是: 平移+尺度放缩:
先做平移 (Δx,Δy) ( Δ x , Δ y ) , Δx=Pwdx(P),Δy=Phdy(P) Δ x = P w d x ( P ) , Δ y = P h d y ( P ) ,这是R-CNN论文的:
G^x=Pwdx(P)+Px,(1) G ^ x = P w d x ( P ) + P x , ( 1 )
G^y=Phdy(P)+Py,(2) G ^ y = P h d y ( P ) + P y , ( 2 )
然后再做尺度缩放 (Sw,Sh),Sw=exp(dw(P)),Sh=exp(dh(P)) ( S w , S h ) , S w = e x p ( d w ( P ) ) , S h = e x p ( d h ( P ) ) , 对应论文中:
G^w=Pwexp(dw(P)),(3) G ^ w = P w e x p ( d w ( P ) ) , ( 3 )
G^h=Phexp(dh(P)),(4) G ^ h = P h e x p ( d h ( P ) ) , ( 4 )
观察(1)-(4)我们发现, 边框回归学习的就是 dx(P),dy(P),dw(P),dh(P) d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) 这四个变换。下一步就是设计算法得到这四个映射。
线性回归就是给定输入的特征向量 X X , 学习一组参数 W W , 使得经过线性回归后的值跟真实值 Y Y (Ground Truth)非常接近. 即 Y≈WX Y ≈ W X 。
Bounding-box 的输入以及输出?
输入:
RegionProposal→P=(Px,Py,Pw,Ph) R e g i o n P r o p o s a l → P = ( P x , P y , P w , P h ) ,这个是什么? 输入就是这四个数值吗?其实真正的输入是这个窗口对应的 CNN 特征,也就是 R-CNN 中的 Pool5 feature(特征向量)。 (注:训练阶段输入还包括 Ground Truth, 也就是下边提到的 t∗=(tx,ty,tw,th)) t ∗ = ( t x , t y , t w , t h ) )
输出:
需要进行的平移变换和尺度缩放 dx(P),dy(P),dw(P),dh(P) d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) , 或者说是 Δx,Δy,Sw,Sh Δ x , Δ y , S w , S h 。 我们的最终输出不应该是 Ground Truth 吗? 是的, 但是有了这四个变换我们就可以直接得到 Ground Truth, 这里还有个问题, 根据(1)~(4)我们可以知道, P P 经过 dx(P),dy(P),dw(P),dh(P) d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) 得到的并不是真实值 G G ,而是预测值 G^ G ^ 。的确, 这四个值应该是经过 Ground Truth 和 Proposal 计算得到的真正需要的平移量 (tx,ty) ( t x , t y ) 和尺度缩放 (tw,th) ( t w , t h ) 。
这也就是 R-CNN 中的 (6)∼(9) ( 6 ) ∼ ( 9 ) :
tx=(Gx−Px)/Pw,(6) t x = ( G x − P x ) / P w , ( 6 )
ty=(Gy−Py)/Ph,(7) t y = ( G y − P y ) / P h , ( 7 )
tw=log(Gw/Pw),(8) t w = log ( G w / P w ) , ( 8 )
th=log(Gh/Ph),(9) t h = log ( G h / P h ) , ( 9 )
那么目标函数可以表示为 d∗(P)=wT∗Φ5(P) d ∗ ( P ) = w ∗ T Φ 5 ( P ) , Φ5(P) Φ 5 ( P ) 是输入 Proposal 的特征向量(conv5之后的pooling层的feature map), w∗ w ∗ 是要学习的参数( ∗ ∗ 表示 x,y,w,h x , y , w , h , 也就是每一个变换对应一个目标函数) , d∗(P) d ∗ ( P ) 是得到的预测值。 我们要让预测值跟真实值 t∗=(tx,ty,tw,th) t ∗ = ( t x , t y , t w , t h ) 差距最小。
即:以proposal为基准,从proposal到ground truth的平移缩放值为 t∗ t ∗ ,从proposal到预测框的平移缩放值为 d∗(P) d ∗ ( P ) ,两者的差距越小,说明预测框和ground truth越接近。
得到损失函数为:
Loss=∑Ni(ti∗−w^T∗ϕ5(Pi))2 L o s s = ∑ i N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2
函数优化目标为:
W∗=argminw∗∑Ni(ti∗−w^T∗ϕ5(Pi))2+λ||w^∗||2 W ∗ = a r g m i n w ∗ ∑ i N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2 + λ | | w ^ ∗ | | 2
利用梯度下降法或者最小二乘法就可以得到 w∗ w ∗ 。
为什么宽高尺度要采用log形式?
我们想要得到一个放缩的尺度,也就是说这里限制尺度必须大于0。我们学习的 tw,th t w , t h 怎么保证满足大于0呢?直观的想法就是 exp e x p 函数,如公式(3), (4)所示,那么反过来推导就是 log l o g 函数的来源了。
当输入的 Proposal 与 Ground Truth 相差较小时(RCNN 设置的是 IoU>0.6), 可以认为这种变换是一种线性变换, 那么我们就可以用线性回归来建模对窗口进行微调, 否则会导致训练的回归模型不 work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这里我来解释:
Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?大家还记得这个公式不?参看高数1:
limx=0log(1+x)=x l i m x = 0 l o g ( 1 + x ) = x
现在回过来看公式(8):
tw=log(Gw/Pw)=log(Gw+Pw−PwPw)=log(1+Gw−PwPw) t w = log ( G w / P w ) = l o g ( G w + P w − P w P w ) = l o g ( 1 + G w − P w P w )
当且仅当 Gw−Pw=0 G w − P w = 0 的时候,才会是线性函数。也就是说Groud Truth和Proposal的宽度w和高度h必须近似相等。
(1) 训练分为多个阶段,步骤繁琐: fine-tune+训练SVM+训练边框回归器
(2) 训练耗时,占用磁盘空间大:5000张图像产生几百G的特征文件
(3) 速度慢: 使用GPU, VGG16模型处理一张图像需要47s。
(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算
(5) SVM和回归是事后操作:在SVM和回归过程中CNN特征没有被学习更新
R-CNN速度慢的一个重要原因是卷积特征重复计算量太大,每张图片的2000个候选区域都需要前向计算CNN特征,而这些候选区域是有大量重叠的。
SPP-Net的两大改进: