基于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以后深入学习后再写博客了。

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

1. Viola-Jones算法: 优点: - 算法速度非常快,能够在实时系统中使用 - 算法对于不同的目标具有较好的泛化性能,可以应用于人脸识别、人体检测等多个领域 缺点: - 对于遮挡、光照变化、角度变化等因素敏感,准确率有限 - 对于非正面的人脸检测效果较差 - 对于目标的大小、旋转角度等要求较高,需要对输入图像进行预处理 2. HOG算法: 优点: - 算法对于光照变化、遮挡等因素具有一定的鲁棒性,能够在一定程度上保持检测的准确性 - 算法能够在不同的尺度下进行目标检测,对于不同大小的目标具有较好的适应性 缺点: - 算法对于目标的姿态、旋转角度等变化较为敏感,需要进行预处理 - 算法对于背景噪声较大的情况下,会对检测结果产生影响 3. YOLO算法: 优点: - 算法速度较快,能够在实时系统中使用 - 算法能够在单个网络中完成目标检测和分类,具有较高的精度和召回率 - 算法对于目标的姿态、旋转角度等变化较为鲁棒 缺点: - 算法对于小目标的检测准确率较低 - 算法对于密集目标的检测准确率较低 - 算法对于目标的长宽比例较大的情况下,检测效果不佳 4. CNN算法: 优点: - 算法能够自动学习特征,无需手工提取,具有较高的鲁棒性和准确性 - 算法对于目标的姿态、旋转角度等变化较为鲁棒 - 算法在图像分类、目标检测等多个领域具有广泛的应用 缺点: - 算法需要大量的计算资源和数据集支持,训练时间较长 - 算法对于数据集的质量要求较高,需要进行预处理 - 算法的可解释性较差,难以理解和解释其决策过程 5. MTCNN算法: 优点: - 算法能够同时完成人脸检测、关键点检测和人脸对齐等任务,具有较高的精度和鲁棒性 - 算法对于不同尺度、姿态、光照等因素具有较好的适应性和泛化性能 缺点: - 算法运行速度较慢,对于实时系统应用有一定限制 - 算法对于遮挡、模糊等情况下的检测效果较差 - 算法对于不同种族、年龄等差异较大的人脸检测效果有限
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值