zoukankan      html  css  js  c++  java
  • openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)

    原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特征,最小邻近距离做分类识别。

    1、GT人脸库

    Georgia Tech face database,网址:http://www.anefian.com/research/face_reco.htm

    GT人脸库包括50个人,每人15张不同角度、不同表情的正面照片。

    图片为JPG格式,640*480,大小在159~192KB之间。Zip压缩下总大小130M。

    特点是数据量比較多,每一个人的图像信息丰富多变,相对也比較其它库难以识别。

    2、openCV人脸区域检測

    	pFaces = cvHaarDetectObjects(
    		pic8, g_FDcascade, g_FDstorage,
    		1.1,
    		3,
    		0 |
    		//CV_HAAR_DO_CANNY_PRUNING	|
    		//CV_HAAR_FIND_BIGGEST_OBJECT	|
    		CV_HAAR_DO_ROUGH_SEARCH		|
    		CV_HAAR_SCALE_IMAGE | 
    		0,
    		cvSize(20, 20));

    下面几个图片在CV_HAAR_DO_CANNY_PRUNING | CV_HAAR_FIND_BIGGEST_OBJECT(识别最大的人脸区域)下识别不出来:

    s05_07.jpg // 能够在CV_HAAR_DO_ROUGH_SEARCH | CV_HAAR_SCALE_IMAGE(识别全部的人脸区域)下识别,见下图
    s24_03.jpg // 无法识别
    s32_06.jpg // 无法识别
    s32_14.jpg // 识别错误
    s43_14.jpg // 识别错误

    可见openCV的检測率还是非常高的(745/750 = 99.33%)。

    s05_07.jpg 

    s01_01.jpg

    3、ASMLibrary特征检測

    ASM Library是国人的作品,https://code.google.com/p/asmlibrary/

    	#define FDFN	"haarcascade_frontalface_alt2.xml"
    	#define ASMFN	"AsmModel.amf"
    
    	g_AsmFit.Read(ASMFN));
    	g_FDcascade = (CvHaarClassifierCascade*)cvLoad(FDFN, 0, 0, 0);
    

    	g_detshape[0].x = float(g_faceRc.x);
    	g_detshape[0].y = float(g_faceRc.y);
    	g_detshape[1].x = float(g_faceRc.x+g_faceRc.width);
    	g_detshape[1].y = float(g_faceRc.y+g_faceRc.height);
    	InitShapeFromDetBox(g_shape, g_detshape,
    		g_AsmFit.GetMappingDetShape(), g_AsmFit.GetMeanFaceWidth());
    	g_AsmFit.Fitting(g_shape, picCopy); // fit ASM model

    识别以后,提取人脸区域。

    4、YCrCb颜色空间做肤色检測

    		for (int w=0; w<src->width; w++)
    		 {
    			 if (pycrcb[Cr]>=133&&pycrcb[Cr]<=173&&pycrcb[Cb]>=77&&pycrcb[Cb]<=127)
    			 {
    				 SkinCount++;
    			 }
    			 pycrcb+=3;
    			 psrc+=3;
    		 }

    依照肤色推断公式检查区域内的肤色像素,依照阈值为0.2推断是否为人脸区域,

    再进一步规范化并获取人脸特征。

     s05_07提取的人脸特征灰度图    s01_01提取的人脸特征灰度图

    5、LBP+Gabor小波

    LBP见:http://baike.baidu.com/view/1099358.htm?fr=aladdin



    图1,LBP示意图

    Gabor见:http://en.wikipedia.org/wiki/Gabor_filter

    Complex

    g(x,y;lambda,	heta,psi,sigma,gamma) = expleft(-frac{x'^2+gamma^2y'^2}{2sigma^2}
ight)expleft(ileft(2pifrac{x'}{lambda}+psi
ight)
ight)

    Real

    g(x,y;lambda,	heta,psi,sigma,gamma) = expleft(-frac{x'^2+gamma^2y'^2}{2sigma^2}
ight)cosleft(2pifrac{x'}{lambda}+psi
ight)

    Imaginary

    g(x,y;lambda,	heta,psi,sigma,gamma) = expleft(-frac{x'^2+gamma^2y'^2}{2sigma^2}
ight)sinleft(2pifrac{x'}{lambda}+psi
ight)

    where

    x' = x cos	heta + y sin	heta\,

    and

    y' = -x sin	heta + y cos	heta\,

    简单的说就是使用Gabor变换在0~4五个尺度,0~8八个邻域方向对前面提取的人脸灰度图做卷积运算。然后提取灰度直方图作为特征。

    					tmpV0 = tmpV * exp(-tmpV * (x*x + y*y) / 2.0);
    					tmpV1 = k*cos(phi)*x + k*sin(phi)*y;
    					cvmSet( re, y+kernelRadius, x+kernelRadius, tmpV0 * cos(tmpV1) );
    					cvmSet( im, y+kernelRadius, x+kernelRadius, tmpV0 * sin(tmpV1) );
    					
    
    					/* G{scale_idx,angle_idx} = k^2/sigma^2 * exp(-k^2*(X.^2+Y.^2)/2/sigma^2)...
    						.*(exp(1i*(k*cos(phi)*X+k*sin(phi)*Y) - DC)); */

    6、最小邻近距离

    最后使用最小邻近距离,推断 待检測图片与样本的距离,最小的即为匹配的样本。



    7、几点总结

    1、速度:训练大概是0.16s一幅,识别大概是0.35s一幅。速度有点慢。

    2、识别率:一组測试採用5个人每人5个图片作为样本,測试每一个人另外5张照片。

    比如s01-s05,使用每人前5张照片(共25张)训练,中间或最后5张照片(共25张)作为待识别图片,识别率均为92%(23张)。


  • 相关阅读:
    VC:文件串行化(CFileDialog类、CFile类、CArchive类、Edit控件)
    实例说明optimize table在优化mysql时很重要
    文件备份,同步工具rsync服务器端的安装及配置
    log4cxx does not compile on kernel 2.6.29.6
    CentOS桌面安装
    编译 apachelog4cxx0.10.0inputstreamreader.cpp:66: error: ‘memmove’ was not declared in this sco
    解决/usr/bin/ld: cannot find lmysqlclient错误
    mysql 复制表数据,表结构的3种方法
    php 动态添加OPENSSL模块
    mysql开启慢查询方法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3763348.html
Copyright © 2011-2022 走看看