基于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代码:
最后附上程序的最终运行结果:
原谅我是爱因斯坦的脑残粉~
在学习人脸模型上除了利用神经网络外,还可以利用svm来学习,svm的基本公式是:w*x+b=0。只要学习出w,b为参数的超平面就可以判断是否是人脸了。具体的svm以后深入学习后再写博客了。
谨以此博文记录即将逝去的暑假~~~
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以后深入学习后再写博客了。
谨以此博文记录即将逝去的暑假~~~
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例