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
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人脸库)的更多相关文章
- java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对
java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...
- 基于node.js人脸识别之人脸对比
基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...
- 使用python3.7和opencv4.1来实现人脸识别和人脸特征比对以及模型训练
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_126 OpenCV4.1已经发布将近一年了,其人脸识别速度和性能有了一定的提高,这里我们使用opencv来做一个实时活体面部识别的 ...
- 人脸识别-关于face_recognition库的安装
首先十分感谢博客https://blog.csdn.net/scc_722/article/details/80613933,经历过很多尝试(快要醉了),终于看了这篇博客后安装成功. face_rec ...
- 干货 | AI人脸识别之人脸搜索
本文档将利用京东云AI SDK来实践人脸识别中的人脸搜索功能,主要涉及到分组创建/删除.分组列表获取.人脸创建/删除.人脸搜索,本次实操的最终效果是:创建一个人脸库,拿一张图片在人脸库中搜索出相似度最 ...
- 百度云人脸识别API人脸对比
from urllib import request import base64 import requests import re import json import urllib import ...
- 百度云人脸识别API人脸库管理
from urllib import request import base64 import requests import re import json import urllib impor ...
- face-api.js 前端人脸识别,人脸检测,登录认证
1.参考face-api.js https://github.com/justadudewhohacks/face-api.js#face-api.js-for-the-browser
- Opencv摄像头实时人脸识别
Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...
随机推荐
- 关于select联动的两种做法
第一种方法: function dong(){ var getSheng = document.getElementById("sheng"); var get ...
- python 之ConfigParser模块学习
1.1 读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该secti ...
- 简约而不简单的Django
本文面向:有python基础,刚接触web框架的初学者. 环境:windows7 python3.5.1 pycharm专业版 Django 1.10版 pip3 一.Django简介 百度百 ...
- Prime
#include<iostream>#include<cstdio>#include<cstring>using namespace std; const int ...
- Merge k Sorted Lists——分治与堆排序(需要好好看)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 1 ...
- 禁用Flash P2P上传
Mac OS: sudo bash -c 'echo RTMFPP2PDisable=1 >> /Library/Application\ Support/Macromedia/mms.c ...
- pip/conda国内镜像--安装包提速
对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...
- JS 数据类型转换以其他
JavaScript 是一种弱类型的语言,也就是没有类型限制,变量可以随时被赋予任意值. 同时,在程序运行过程中,类型会被自动确认的.因此,这就是涉及到数据的类型转换.在 JS 的世界中,数据类型转换 ...
- Deepin 2015 安装后找不到win10 启动选项的解决办法
#sudo vi /boot/grub/grub.cfg 在export linux_gfx_mode后面加 menuentry "Windows 10 (loader)" --c ...
- vue 阻止事件冒泡
<mt-button type="danger" size="small" @click="cancelOrderInfo(this.even ...