关于人脸检测中的Haar特征提取

影响AdaBoost人脸检测训练算法速度很重要的两方面是特征选取和特征计算。选取的特征为矩特征为Haar特征,计算的方法为积分图。
(1)Haar特征:
    Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。在确定了特征形式后 Harr- like特征的数量就取决于训练样本图像矩阵的大小,特征模板在子窗口内任意放置,一种形态称为一种特征,找出所有子窗口的特征是进行弱分类训练的基础。
(2)积分图:
    积分图(Integral Image)主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算。“积分图"能够在多种尺度下,使用相同的时间来计算不同的特征,因此大大提高了检测速度。
 

原文地址:Haar-like矩形特征的特征值的快速计算方法 作者:charming
1、Haar-like特征:

    Haar-like特征最早是由Papageorgiou等应用于人脸表示。Papageorgiou在针对正面人脸和人体检测问题的研究中使用Haar小波基函数,他们发现标准正交Haar小波基在应用上受到一定的限制,为了取得更好的空间分辨率,他们使用了3种类型的3种形式的特征。Viola等在此基础上作了扩展,使用2种类型4种形式的特征。3种类型分别为:2-矩形特征、3-矩形特征、4-矩形特征。

    [转载]Haar-like矩形特征的特征值的快速计算方法

    对于图中的A,  B和D这类特征,特征数值计算公式为:

                                 v=Sum白-Sum黑

    而对于C来说,计算公式如下:

                  

               v=Sum白-2*Sum黑

    之所以将黑色区域像素和乘以2 ,是为了使两种矩形区域中像素数目一致。

    通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。为了描述的方便,本文将上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展 (平移伸缩)得到的特征称为“矩形特征”;矩形特征的称为 “特征值”o

     假设训练或检测窗口大小为Wx H个像素,w , h 分别为特征原型的长、 宽,所示四种特征原型对应的w 1 h 分别为:2/1,1/2,3/1,2/2。

    关于人脸检测中的Haar特征提取_第1张图片

    一个haar-like特征在24*24像素图的子检测窗口中的矩形特征数量总计为134736个。

    2、积分图:

    由于训练样本通常有近万个,并且矩形特征的数量非常庞大,如果每次计算特征值都要统计矩形内所以像素之和,将会大大降低训练和检测的速度。因此引入了一种新的图像表示方法——积分图像,矩形特征的特征值计算,只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。

    积分图的定义为:

    [转载]Haar-like矩形特征的特征值的快速计算方法
    其中I(x',y')为图像在点(x',y')处的像素值。

    为了节约时间,减少重复计算,则图像I的积分图可按如下递推公式计算:

    [转载]Haar-like矩形特征的特征值的快速计算方法
    这样就可以进行2种运算:

    (1)任意矩形区域内像素积分。由图像的积分图可方便快速地计算图像中任意矩形内所有像素灰度积分。如下图2.3所示,点1的积分图像ii1的值为(其中Sum为求和) :

    ii1=Sum(A)

    关于人脸检测中的Haar特征提取_第2张图片

    同理,点2、点3、点4的积分图像分别为:

    ii2=Sum(A)+Sum(B);      ii3=Sum(A)+Sum(C);    ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D);

    矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:

                     Sum(D)=ii1+ii4-(ii2+ii3)            (1)
    (2) 特征值计算
    矩形特征的特征值是两个不同的矩形区域像素和之差,由(1)式可以计算任意矩形特征的特征值,下面以图2.1中特征原型A为例说明特征值的计算。

    关于人脸检测中的Haar特征提取_第3张图片
    如图2.4 所示,该特征原型的特征值定义为:

    Sum(A)-Sum(B)

    根据(1)式则有:Sum(A)=ii4+ii1-(ii2+ii3);    Sum(B)=ii6+ii3-(ii4+ii5);

    所以此类特征原型的特征值为:

                 (ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)

    另示:运用积分图可以快速计算给定的矩形之所有象素值之和Sum(r)。假设r=(x,y,w,h),那么此矩形内部所有元素之和等价于下面积分图中下面这个式子:

                 Sum(r) = ii(x+w,y+h)+ii(x-1,y-1)-ii(x+w,y-1)-ii(x-1,y+h)

    由此可见,矩形特征特征值计算只与此特征端点的积分图有关,而与图像坐标值无关。对于同一类型的矩形特征,不管特征的尺度和位置如何,特征值的计算所耗费的时间都是常量,而且都只是简单的加减运算。其它类型的特征值计算方法类似。

 

[matlab code]

 

%---------------------------------------------------------------------------------------------
%2 遍历得到各点的积分
function ii = bianli(I)
[row,col] = size(I);
ii=zeros(row,col);
for i=1:row
      for j=1:col
              s=sum(I(1:i,j));
              if(j-1<=0)
                      ii(i,j) = s;
              else
                      ii(i,j)=s+ii(i,j-1);
              end
              s=0;
      end
end
%---------------------------------------------------------------------------------------------
%3 在矩阵上面补0和左面补0
%rn 补rn行0
%cn 补cn列0
function ii = buzero(iio,rn,cn)
[row,col]=size(iio);
ii=[zeros(rn,col+cn);[zeros(row,cn),iio]];
%---------------------------------------------------------------------------------------------
%对于图中B的矩阵特征
function F = tezhen1(ii)
minw = 1; %最小宽
minh = 2; %最小高
aw=1; %伸缩倍率,w方向
ah=1; %伸缩倍率,h方向
F=[];
F1=[];
w=minw;
h=minh;
[row,col]=size(ii);
while(minh*ah<=row)       
      while(minw*aw<=col)
              for i=1:row-h
                      for j=1:col-w
                              white = ii(i,j)+ii(i+h/2,j+w)-ii(i+h/2,j)-ii(i,j+w);
                              black = ii(i+h/2,j)+ii(i+h,j+w)-ii(i+h,j)-ii(i+h/2,j+w);
                              F1((i-1)*(col-w)+j)=white-black;
                      end
              end
              F=[F,F1];
              F1=[];
              aw=aw+1;
              w=minw*aw;
      end
      ah=ah+1;
      h=minh*ah;
      w=minw; %复位
      aw=1;    %复位
end
%---------------------------------------------------------------------------------------------
%测试
%I=[1,2,3,4,5,6;7,8,9,10,11,12;13,14,15,16,17,18;19,20,21,22,23,24;25,26,27,28,29,30;31,32,33,34,35,36]; %应为189个
%I=rgb2gray(imread('1.bmp')); %20*20像素图,因为21000
ii=bianli(I);
ii=buzero(ii,1,1);
F=tezhen1(ii); %为矩形特征值数组

       目标检测方法最初由Paul Viola [Viola01]提出,并由Rainer Lienhart [Lienhart02]对这一方法进行了改善. 首先,利用样本(大约几百幅样本图片)的 harr 特征进行分类器训练,得到一个级联的boosted分类器。训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如人脸或汽车等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小(例如,20x20)。

分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。

    分类器中的“级联”是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。目前支持这种分类器的boosting技术有四种: Discrete Adaboost, Real Adaboost, Gentle Adaboost and Logitboost。"boosted" 即指级联分类器的每一层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。基础分类器是至少有两个叶结点的决策树分类器。 Haar特征是基础分类器的输入,主要描述如下。目前的算法主要利用下面的Harr特征。

  •  边界特征,包含四种
  •  线性特征,包含8种
  •  中心围绕特征,包含两种


在扫描待检测图片的时候,以边界特征中的(a)为例,正如前面提到的那样,计算机中的图片是一个数字组成的矩阵,程序先计算整个窗口中的灰度值x,然后计算矩形框中的黑色灰度值y,然后计算(x-2y)的值,得到的数值与x做比较,如果这个比值在某一个范围内,则表示待检测图片的当前扫描区域符合边界特征(a),然后继续扫描。

关于这个算法的更详细描述已经超出了本文的范围,可以在参考资源中获得更多的信息。

 

非固定大小目标检测

因为是基于视频流的目标检测,我们事先不太可能知道要检测的目标的大小,这就要求我们的级联表中的分类器具有按比例增大(或者缩小)的能力,这样,当小的窗口移动完整个待检测图片没有发现目标时,我们可以调整分类器的大小,然后继续检测,直到检测到目标或者窗口与待检测图片的大小相当为止。

 

    每个特定分类器所使用的特征用形状、感兴趣区域中的位置以及比例系数(这里的比例系数跟检测时候采用的比例系数是不一样的,尽管最后会取两个系数的乘积值)来定义。例如在第三行特征(2c)的情况下,响应计算为复盖全部特征整个矩形框(包括两个白色矩形框和一个黑色矩形框)象素的和减去黑色矩形框内象素和的三倍。每个矩形框内的象素和都可以通过积分图象很快的计算出来。(察看下面和对cvIntegral的描述). 通过HaarFaceDetect 的演示版可以察看目标检测的工作情况。

 

你可能感兴趣的:(关于人脸检测中的Haar特征提取)