原理:使用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

Gabor见: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人脸库)的更多相关文章

  1. java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对

    java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...

  2. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  3. 使用python3.7和opencv4.1来实现人脸识别和人脸特征比对以及模型训练

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_126 OpenCV4.1已经发布将近一年了,其人脸识别速度和性能有了一定的提高,这里我们使用opencv来做一个实时活体面部识别的 ...

  4. 人脸识别-关于face_recognition库的安装

    首先十分感谢博客https://blog.csdn.net/scc_722/article/details/80613933,经历过很多尝试(快要醉了),终于看了这篇博客后安装成功. face_rec ...

  5. 干货 | AI人脸识别之人脸搜索

    本文档将利用京东云AI SDK来实践人脸识别中的人脸搜索功能,主要涉及到分组创建/删除.分组列表获取.人脸创建/删除.人脸搜索,本次实操的最终效果是:创建一个人脸库,拿一张图片在人脸库中搜索出相似度最 ...

  6. 百度云人脸识别API人脸对比

    from urllib import request import base64 import requests import re import json import urllib import ...

  7. 百度云人脸识别API人脸库管理

      from urllib import request import base64 import requests import re import json import urllib impor ...

  8. face-api.js 前端人脸识别,人脸检测,登录认证

    1.参考face-api.js https://github.com/justadudewhohacks/face-api.js#face-api.js-for-the-browser

  9. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

随机推荐

  1. Web服务器处理动态程序三种方式及Apache配置

    模块.CGI.FastCGI三种方式介绍 以PHP脚本为例: 模块方式是指Web服务器通过libphp5.so模块调用PHP服务,模块将相关函数嵌入Web服务请求处理流程,不需要额外解释器进程.注意, ...

  2. RSA加密登录

    1.首先下载前端JS加密框架:jsencrypt 2.后台添加解密帮助类:RSACrypto(参考文章最后) 3.在登录页面先引入jquery.min.js,在引入jsencrypt.min.js 4 ...

  3. java之正则表达式、日期操作

    正则表达式和日期操作 正则表达式简介 正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求. 作用:比如注册邮箱,邮箱有用户名和密码,一 ...

  4. jersey中的 404 Not Found 错误。

    把资源定义到com.diandaxia.rest包里 就可以了: 当然也可以使用注册的方式,注册到jersey框架里.当一个类 必须再com.diandaxia.rest 包之外的话,又不想 扩大 自 ...

  5. spring自定义注解的使用

    前几天写了一个消息中间件(kafka)的封装,业务方发现消费者需要配置的东西太多(每增加一个topic和实现类都需要在配置文件中加,会显得很繁琐).于是我为了尽量减少这个XML配置,采用注解的方式来获 ...

  6. 利用Fidder工具抓取App数据包

    第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler打开Fiddler,     ...

  7. 使用Python快速查询所有指定匹配KEY的办法

    import redis redis_ip = '10.10.14.224' redis_port = 18890 # 配置redis的连接办法 # http://blog.csdn.net/u010 ...

  8. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  9. 十三oracle --控制结构(分支,循环,控制)

    .使用各种if语句2.使用循环语句3.使用控制语句——goto和null(goto语句不推荐使用): 二.条件分支语句pl/sql中提供了三种条件分支语句if—then,if–then–else,if ...

  10. SASS详解之混合(mixins)

    SASS详解之混合(mixins)可以出现在SASS的任何地方.有很多类名具有相同或者相似的样式,就可以用SASS中的混合(mixins)来进行编写,然后针对不同类名的不同样式逐一编写. 定义一个混合 ...