基于HOG特征和Neural network的人脸检测

记得上一次写博客还是两年前搞ACM时候写的了,,,哎时光荏苒啊啊啊啊啊,废话不多说,直接上干货~

HOG特征是2005年法国一位NB博士提出来的(原论文),弱菜表示佩服的五体投地,无限ORZ-=-(请接好俺的膝盖)。
还是来简单说一下HOG特征提取的几个关键步骤吧,其实也就是HOG算法,如下图:
HOG特征的流程图
解释一下:
1.对于目标图片,通过Slide window来提取,对于行人检测64*128比较好,检测的step一般可以大一点比如10,16个像素。
2.对图片伽马滤波,主要目的是减少光线亮度的干扰.
3.计算梯度,这一步是HOG特征的核心一步,HOG特征的核心就是局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述。其实也很好理解,可以这样想象,一幅图的形状绝对是一个局部的开始当然也是另一个局部的结束,好比中国象棋中的楚河汉界,正好把两个部分分割开,然而在图像中就正好表示为像素点的变化,所以通过计算像素的梯度变化就能很好的计算图像的形状信息。
梯度计算的公式为:

4.将图像划分成小cells,一个cell就表示一个局部特征也就是一个局部形状的描述,一般可以分为4*4,2*2等等。
5.将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。
6.最后把这些blocks组合起来就成了整副图的特征值了。
以上就是整个HOG特征算法。

有了HOG特征的提取怎样才能知道那个特征就是属于人脸的特征呢?
首先,我们的通过训练学习得到一个识别人脸的模型,这里我是通过BP神经网络来学习人脸特征的。BP神经网络这个不用讲了,机器学习的入门算法。其中数据主要来自于标准的数据库ORl人脸检测数据,里面包含400张人脸。其他的负样本就可以随意从网上找了。这里我是使用1000张图片作为训练样本的,其中400张正样本即人脸,600张负样本。经过几个小时的训练结果出乎意料其中,准确率达到了99.8%,平均的召回率到达99.9%。毫无疑问BP神经网络在处理简单的特征学习还是不在话下的。通过训练和学习数据,可以得到一个模型。然后就可以通过使用side wind ow来检测人脸了,提取出一个概率最大的就可以了。这里附上HOG特征学习的MATLAB代码:

 function g=HogEx(path)
     if isa(path,'char') == 1
        img= imread(path);
        mysize=size(img);
        if numel(mysize)>2
            img= rgb2gray(img);
        end
        %由于原人脸的数据是114*90的,所以这里就不变了
        img=imresize(img,[114 ,90]);
        img=double(img);
    else 
        img=imresize(path,[114 ,90]);
        img=double(img); 
    end
    [m, n]=size(img);
    img=sqrt(img);     
    fy=[-1; 0 ;1];        
    fx=fy';             
    Iy=imfilter(img,fy,'replicate');   
    Ix=imfilter(img,fx,'replicate');    
    Ied=sqrt(Ix.^2+Iy.^2);            
    Gradent=Iy./Ix;                

    step=6;             
    orient=9;             
    degree=360/orient;      
    Cell=cell(1,1);                       
    jj=1;
    for i=1:step:m         
        ii=1;
        for j=1:step:n    
            tmpx=Ix(i:i+step-1,j:j+step-1);
            tmped=Ied(i:i+step-1,j:j+step-1);
            s=sum(sum(tmped));
            if s~=0
               tmped=tmped/s;        
            end
            tmpphase=Gradent(i:i+step-1,j:j+step-1);
            Hist=zeros(1,orient);           
            for p=1:step
                for q=1:step
                    if isnan(tmpphase(p,q))==1  
                        tmpphase(p,q)=0;
                    end
                    if isinf(tmpphase(p,q))==1  
                        tmpphase(p,q)=0;
                    end
                    ang=atan(tmpphase(p,q));
                    ang=mod(ang*180/pi,360);   
                    if tmpx(p,q)<0            
                        if ang<90            
                            ang=ang+180;      
                        end
                        if ang>270           
                            ang=ang-180;     
                        end
                    end
                    ang=ang+0.0000001;       
                    t=ceil(ang/degree);
                    if t>=10.00
                        t=9;
                    end
                    Hist(t)=Hist(t)+tmped(p,q);   
                end
            end
            s1=sum(Hist);
            if s1~=0
                   Hist=Hist/sum(Hist);    
            end
            Cell{ii,jj}=Hist;      
            ii=ii+1;         
        end
        jj=jj+1;                 
    end
    [m, n]=size(Cell);
    feature=cell(1,(m-1)*(n-1));
    for i=1:m-1
       for j=1:n-1           

            f=[Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
            feature{(i-1)*(n-1)+j}=f;
       end
    end
    l=length(feature);
    f=[];
    for i=1:l
        f=[f feature{i}(:)'];  
    end 
    g=f ;
    end

最后附上程序的最终运行结果:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述
原谅我是爱因斯坦的脑残粉~

在学习人脸模型上除了利用神经网络外,还可以利用svm来学习,svm的基本公式是:w*x+b=0。只要学习出w,b为参数的超平面就可以判断是否是人脸了。具体的svm以后深入学习后再写博客了。

谨以此博文记录即将逝去的暑假~~~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值