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,\theta,\psi,\sigma,\gamma) = \exp\left(-\frac{x'^2+\gamma^2y'^2}{2\sigma^2}\right)\exp\left(i\left(2\pi\frac{x'}{\lambda}+\psi\right)\right)

Real

g(x,y;\lambda,\theta,\psi,\sigma,\gamma) = \exp\left(-\frac{x'^2+\gamma^2y'^2}{2\sigma^2}\right)\cos\left(2\pi\frac{x'}{\lambda}+\psi\right)

Imaginary

g(x,y;\lambda,\theta,\psi,\sigma,\gamma) = \exp\left(-\frac{x'^2+\gamma^2y'^2}{2\sigma^2}\right)\sin\left(2\pi\frac{x'}{\lambda}+\psi\right)

where

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

and

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

简单的说就是使用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张)。


  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
下面是使用OpenCV和Python实现人脸表情识别的代码示例: ```python import cv2 # 加载分类器和表情标签 cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') emotions = ['Angry', 'Disgusted', 'Fearful', 'Happy', 'Neutral', 'Sad', 'Surprised'] # 加载模型 model = cv2.dnn.readNetFromTensorflow('emotion_detection_model.pb') # 读取摄像头视频流 cap = cv2.VideoCapture(0) while True: # 逐帧读取视频 ret, frame = cap.read() # 灰度化处理 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 探测人脸 faces = cascade_classifier.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 对每张脸进行表情检测 for (x, y, w, h) in faces: face = gray[y:y+h, x:x+w] # 从灰度图像中提取人脸区域 face = cv2.resize(face, (48, 48)) # 将人脸区域缩放为48x48像素 face = face.reshape((1, 48, 48, 1)) face = face.astype('float32') / 255.0 # 使用模型进行表情预测 predictions = model.predict(face) emotion_label = emotions[predictions.argmax()] # 在人脸上标注表情标签 cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2) cv2.putText(frame, emotion_label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) # 显示视频帧 cv2.imshow('Facial Expression Recognition', frame) # 按下"q"键退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 清理资源 cap.release() cv2.destroyAllWindows() ``` 这段代码实现了通过摄像头进行实时人脸表情识别。其中,使用了OpenCV的级联分类器(haarcascade_frontalface_default.xml)探测人脸,并使用了一个基于TensorFlow的模型进行表情识别。模型结构可以从OpenCV的GitHub仓中下载(emotion_detection_model.pb)。在检测到人脸后,将其提取并缩放到48x48像素的大小,然后将其输入到模型中进行表情预测。最后,在人脸上标注预测出的表情标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kimmking

赠人玫瑰手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值