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

时间:2021-07-04 12:35:13

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

1、Haar-like特征:

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

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

    对于图中的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特征提取

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

   2、积分图:

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

    积分图的定义为:

    关于人脸检测中的Haar特征提取
    其中I(x',y')为图像在点(x',y')处的像素值。

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

    关于人脸检测中的Haar特征提取
    这样就可以进行2种运算:

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

    ii1=Sum(A)

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

    同理,点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特征提取
    如图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);