openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
2014-05-18 14:56
567 查看
原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检测人脸区域,ASM Library特征检测,然后使用YCrCb颜色空间做肤色检测,再用LBP+Gabor小波提取特征,最小邻近距离做分类识别。
GT人脸库包含50个人,每人15张不同角度、不同表情的正面照片。
图片为JPG格式,640*480,大小在159~192KB之间。Zip压缩下总大小130M。
特点是数据量比较多,每个人的图像信息丰富多变,相对也比较其他库难以识别。
以下几个图片在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
识别以后,提取人脸区域。
按照肤色判断公式检查区域内的肤色像素,按照阈值为0.2判断是否为人脸区域,
再进一步规范化并获取人脸特征。
s05_07提取的人脸特征灰度图
s01_01提取的人脸特征灰度图
Gabor见:http://en.wikipedia.org/wiki/Gabor_filter
Complex
Real
Imaginary
where
and
简单的说就是使用Gabor变换在0~4五个尺度,0~8八个邻域方向对前面提取的人脸灰度图做卷积运算。然后提取灰度直方图作为特征。
2、识别率:一组测试采用5个人每人5个图片作为样本,测试每个人另外5张照片。
例如s01-s05,使用每人前5张照片(共25张)训练,中间或最后5张照片(共25张)作为待识别图片,识别率均为92%(23张)。
1、GT人脸库
Georgia Tech face database,网址:http://www.anefian.com/research/face_reco.htmGT人脸库包含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=aladdinGabor见:http://en.wikipedia.org/wiki/Gabor_filter
Complex
Real
Imaginary
where
and
简单的说就是使用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张)。
相关文章推荐
- openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
- Linux系统下利用OpenCV实现人脸检测和基于LBPH算法的人脸识别
- 人脸识别特征提取(LBP)及其opencv实现
- 基于OpenCV的EigenFace FisherFace LBPHFace人脸识别的实现
- OpenCV人脸识别facerec源码分析2――LBPH概述
- 使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别
- 人脸识别经典算法实现(三)——LBP算法
- 【图像识别】 Python+Opencv调用摄像头实现人脸识别并保存视频
- OpenCV人脸识别LBPH算法源码分析
- OpenCV中人脸识别代码实现
- 人脸识别(七)--LBP特征原理及实现
- OpenCV+JavaCV实现人脸识别
- gabor变换人脸识别的python实现,att_faces数据集平均识别率99%
- 【计算机视觉】OpenCV人脸识别facerec源码分析2——LBPH概述
- 【Android】Android使用OpenCV实现人脸识别(OpenCV+JavaCV)
- OpenCV实现人脸识别——EigenFace特征脸法
- LBP及其实现的人脸识别
- LBP(局部二值模式)实现人脸识别
- 调用OpenCV实现人脸识别功能
- 基于 OpenCV 的 LBP + SVM 人脸识别