您的位置:首页 > 其它

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

2015-08-23 20:18 573 查看
记得上一次写博客还是两年前搞ACM时候写的了,,,哎时光荏苒啊啊啊啊啊,废话不多说,直接上干货~

HOG特征是2005年法国一位NB博士提出来的(原论文),弱菜表示佩服的五体投地,无限ORZ-=-(请接好俺的膝盖)。

还是来简单说一下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以后深入学习后再写博客了。

谨以此博文记录即将逝去的暑假~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hog 算法