目标检测1 - RCNN

1 目标检测任务

目标检测 = 目标识别+定位

目标识别(classification):
输入:图片
输出:物体的类别
评估方法:准确率

定位(localization):
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union ( IOU )

IoU
bounding box的定位精度。因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示:

就是矩形框A、B的重叠面积占A、B并集的面积比例。

1.1 传统目标检测方法

传统目标检测流程:

  • 区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)
  • 特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)
  • 分类器(主要有SVM、Adaboost等)

传统目标检测的主要问题:

  • 基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余
  • 手工设计的特征对于多样性的变化没有很好的鲁棒性

1.2 R-CNN系列方法

1.2.1 R-CNN

1) R——Region Proposal

候选区域建议:利用图像中的纹理、边缘、颜色等信息,预先找出图中目标可能出现的位置。

原文地址

对于目标识别任务,比如判断一张图片中有没有车、是什么车,一般需要解决两个问题:目标检测、目标识别。而目标检测任务中通常需要先通过某种方法做图像分割,事先得到候选框;直观的做法是:给定窗口,对整张图片滑动扫描,结束后改变窗口大小重复上面步骤,缺点很明显:重复劳动耗费资源、精度和质量不高等等。
针对上面的问题,一种解决方案是借鉴启发式搜索的方法,充分利用人类的先验知识。J.R.R. Uijlings在《Selective Search for Object Recoginition》提出一种方法:基于数据驱动,与具体类别无关的多种策略融合的启发式生成方法。图片包含各种丰富信息,例如:大小、形状、颜色、纹理、物体重叠关系等,如果只使用一种信息往往不能解决大部分问题,例如:

左边的两只猫可以通过颜色区别而不是通过纹理,右面的变色龙却只能通过纹理区别而不是颜色。

基于以上准则设计Selective Search算法:

  • 采用层次分组算法解决尺度问题。
    引入图像分割中的自下而上分组思想,由于整个过程是层次的,在将整个图合并成一个大的区域的过程中会输出不同尺度的多个子区域。整个过程如下:

    1. 利用《Efficient Graph-Based Image Segmentation》(基本思想:将图像中每个像素表示为图上的一个节点,用于连接不同节点的无向边都有一个权重,这个权重表示两个节点之间的不相似度,通过贪心算法利用最小生成树做图像分割)生成初始候选区域;

    2. 采用贪心算法合并区域,计算任意两个领域的相似度,把达到阈值的合并,再计算新区域和其所有领域的相似度,循环迭代,直到整个图变成了一个区域,算法如下:

  • 多样化策略

    三个方面:使用多种颜色空间、使用多种相似度计算方法、搜索起始区域不固定。

    1. 颜色空间有很多种:RGB、HSV、Lab等等,不是论文重点;
    2. 相似度衡量算法,结合了4重策略:

    ◆ 颜色相似度

    以RGB为例,使用L1-norm归一化每个图像通道的色彩直方图(bins=25),每个区域被表示为25×3维向量: Ci={c1i,...,cni} C i = { c i 1 , . . . , c i n }

    颜色相似度定义为:

    Scolor(ri,rj)=k=1nmin(cki,ckj) S c o l o r ( r i , r j ) = ∑ k = 1 n m i n ( c i k , c j k )

    区域合并后对新的区域计算其色彩直方图:
    Ct=size(ri)×Ci+size(rj)×Cjsize(ri)+size(rj) C t = s i z e ( r i ) × C i + s i z e ( r j ) × C j s i z e ( r i ) + s i z e ( r j )

    新区域的大小为: size(rt)=size(ri)+size(rj) s i z e ( r t ) = s i z e ( r i ) + s i z e ( r j )

    ◆ 纹理相似度

    使用快速生成的类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 } ;
    纹理相似度定义为:

    Stexture(ri,rj)=k=1nmin(tki,tkj) S t e x t u r e ( r i , r j ) = ∑ k = 1 n m i n ( t i k , t j k )

    ◆ 大小相似度

    该策略希望小的区域能尽早合并,让合并操作比较平滑,防止出现某个大区域逐步吞并其他小区域的情况。相似度定义为:

    Ssize=1size(ri)+size(rj)size(im) S s i z e = 1 − s i z e ( r i ) + s i z e ( r j ) s i z e ( i m )

    其中 size(im) s i z e ( i m ) 为图像包含像素点数目。

    ◆ 区域规则度相似度

    能够框住合并后的两个区域的矩形大小越小说明两个区域的合并越规则,如:

    区域规则度相似度定义为:

    Sfill=1size(BBi,j)size(ri)size(rj)size(im) S f i l l = 1 − s i z e ( B B i , j ) − s i z e ( r i ) − s i z e ( r j ) s i z e ( i m )

最终相似度为所有策略加权和,文中采用等权方式:

Sri,rj=α1Scolor(ri,rj)+α2Stexture(ri,rj)+α3Ssize(ri,rj)+α4Sfill(ri,rj) S r i , r j = α 1 ⋅ S c o l o r ( r i , r j ) + α 2 ⋅ S t e x t u r e ( r i , r j ) + α 3 ⋅ S s i z e ( r i , r j ) + α 4 ⋅ S f i l l ( r i , r j )

使用Selective Search做目标识别

训练过程包含:提取候选框、提取特征、生成正负样本、训练模型,图示如下:

早期图像特征提取往往是各种HOG特征或BoW特征,现在CNN特征几乎一统天下。
检测定位效果评价采用Average Best Overlap(ABO)和Mean Average Best Overlap(MABO):

ABO=1|Gc|gciGcmaxIjLOverlap(gci,lj) A B O = 1 | G c | ∑ g i c ∈ G c m a x I j ∈ L O v e r l a p ( g i c , l j )

其中: c c 为类别标注、 gci g i c 为类别 c c 下的ground truth, L L 为通过Selective Search生成的候选框。
MABO=1|C|i=1nABO(Ci) M A B O = 1 | C | ∑ i = 1 n A B O ( C i )

2)R-CNN

目标检测1 - RCNN_第1张图片

目标检测1 - RCNN_第2张图片

R-CNN训练步骤
  1. pre-train:拿一个在ImageNet上pre-train的CNN模型(如AlexNet/VGG)作为初始模型(前五个卷积层提取特征的能力已较成熟)

  2. fine-tune:由于物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的方法是,利用pre-train的CNN的参数进行参数初始化后,再在该CNN上用 selective search 搜索出来的候选框 (自己的数据集) 对CNN的所有层(卷积层+FC层)进行再训练,使得CNN能适应待检测的新数据集。

    • fine-tune的Loss仍采用AlexNet网络的softmax的loss
    • 将最后一个全连接层的输出(分类数)从1000改为N+1(你自己的数据集的类别总数N+1个背景类),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变(SGD,学习率0.001)
    • 正负样本的定义:
      • 正样本(N个类别):区域建议的框和标签标的真正的矩形框(Ground-truth)重合IoU≥0.5
      • 负样本(背景类):IoU<0.5

  3. **用FC7的特征训练线性SVM分类器:**fine-tune之后,这个模型就适应了这套检测的数据集,之后把SS的正负样本再经过fine-tune好的CNN,取FC7的特征(4096)分类,一共N个SVM,每个SVM都会输出概率值,概率值最高的对应的标签是猫,则该SS对应的class=cat

    • Loss采用的是SVM的Hinge loss,不再是softmax的loss
    • 每个类别对应一个SVM分类器,属于该类别就1,否则0(共需训练N个SVM)
    • 正负样本定义:
      • 正样本:所有Ground-truth区域对应的FC7层的特征(注意和fine-tune时不同)
      • 负样本:跟Ground-truth重合IoU<0.3的SS区域的FC7

目标检测1 - RCNN_第3张图片
4. 用Conv5的特征训练Bounding box回归模型:将SS区域的位置 (x,y,w,h) ( x , y , w , h ) 精度进行提升,映射为更精确的 (x,y,w,h) ( x ′ , y ′ , w ′ , h ′ )

  • Loss是回归模型采用的square loss

目标检测1 - RCNN_第4张图片
1. 一个输入特征是:Selective Search输入到AlexNet前向运算的第五层卷积层Conv5的输出特征;
2. 另一个输入特征是:Bounding box对 (PG) , ( P , G ) P P 是SS提出的候选框的位置信息,只有跟Ground-truth( G G )重合的 IoU>0.6 I o U > 0.6 P P 才考虑;

目标检测1 - RCNN_第5张图片
ϕ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 ) )

R-CNN测试步骤

  1. 输入测试图像

  2. 利用selective search算法在图像中从下到上提取2000个左右的Region Proposal

  3. 先将每个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的精度最高。

  4. 使用fine-tune过的AlexNet计算2种特征

    • FC7的特征送入N个SVM分类器进行分类,每个SS区域都会得到N个类别分值,哪个类别的分值最高就认为该Bounding box是哪个类别;
    • 对每个类别下的所有区域进行非极大值抑制:如SS提出的2k个区域中可能有100个区域在cat这个类别的SVM分类器的输出值是最大的,那我们需要对这100个cat的候选区域用非极大值抑制进行筛选过滤,把多余或重合的区域剔除,最终可能剩下3个重合度不高的区域(可能是3只不同的猫)
      1. 把该类别下所有候选区域(如100个属于cat的区域)按SVM的输出的概率分值进行从大到小排序;
      2. 剔除冗余区域:第2-100个区域依次和排第1的区域进行IoU比较,如果 IoU0.5 I o U ≥ 0.5 ,说明重合度很高,那么该区域就扔掉;
      3. 经过一轮剔除后,此时如果还剩下50个区域,第1个区域是上一轮分值最大的那个区域,保存下来不再参与后续剔除,剩下的49个区域作为新的集合再次回到第1步,排序并比较IoU,一直循环;
      4. 最后100个区域里可能剩下3个保存下来的SS区域
    • Conv5特征:取这3个的Conv5的特征送到回归模型获取Bound box的offset去修正原来的SS算法
R-CNN性能评价

[email protected] (mean Average Precision)

  • 每一类分别计算AP,然后做mean平均

    • AP是Precision-Recall Curve下面的面积:准确率(precision)和召回率(recall)不能兼得,所以随着准确率地提升,召回率不能下降太快,即AP的面积越大越好

    • 准确率(precision): TP/(TP+FP) T P / ( T P + F P )

    • 召回率(recall): TP/(TP+FN) T P / ( T P + F N )

    • True Positive区域:与Ground truth区域的 IoU0.5 I o U ≥ 0.5

    • False Positive区域: IoU0.5 I o U ≤ 0.5
    • False Negative区域:遗漏的Ground truth区域(一共100只cat,只检测出90只cat,剩下的10只没检测出来的就是FN)
Bounding box回归详解

Source: 边框回归(Bounding Box Regression)详解
1. 为什么要bbox回归?

目标检测1 - RCNN_第6张图片

对于上图,绿色的框表示Ground Truth, 红色的框为Selective Search提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5), 那么这张图相当于没有正确的检测出飞机。 如果我们能对红色的框进行微调, 使得经过微调后的窗口跟Ground Truth 更接近, 这样岂不是定位会更准确。 确实,Bounding-box regression 就是用来微调这个窗口的。

  1. 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)非常接近. 即 YWX Y ≈ W X

  2. Bounding-box 的输入以及输出?

    • 输入:

      RegionProposalP=(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=(GxPx)/Pw,(6) t x = ( G x − P x ) / P w , ( 6 )

      ty=(GyPy)/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(tiw^Tϕ5(Pi))2 L o s s = ∑ i N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2

      函数优化目标为:

      W=argminwNi(tiw^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 ∗

  3. 为什么宽高尺度要采用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+PwPwPw)=log(1+GwPwPw) 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 )

    当且仅当 GwPw=0 G w − P w = 0 的时候,才会是线性函数。也就是说Groud Truth和Proposal的宽度w和高度h必须近似相等。

R-CNN缺点

(1) 训练分为多个阶段,步骤繁琐: fine-tune+训练SVM+训练边框回归器
(2) 训练耗时,占用磁盘空间大:5000张图像产生几百G的特征文件
(3) 速度慢: 使用GPU, VGG16模型处理一张图像需要47s。
(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算
(5) SVM和回归是事后操作:在SVM和回归过程中CNN特征没有被学习更新

R-CNN速度慢的一个重要原因是卷积特征重复计算量太大,每张图片的2000个候选区域都需要前向计算CNN特征,而这些候选区域是有大量重叠的。

SPP-Net的两大改进:

  • 直接输入整图,所有区域共享卷积计算(只需要计算一遍卷积),Conv5直接输出整图的特征,再在Conv5的特征图上做区域建议
  • 然后由于Conv5层后面要接FC层,所以要把每个SS的conv5输出的特征映射为固定的尺寸,因此引入空间金字塔池化(Spatial Pyramid Pooling)

你可能感兴趣的:(Deep,Learning)