首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenCV人脸识别的原理 .

OpenCV人脸识别的原理 .

作者头像
全栈程序员站长
发布于 2022-08-25 01:55:07
发布于 2022-08-25 01:55:07
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

在之前讲到的人脸测试后,提取出人脸来,并且保存下来,以供训练或识别是用,提取人脸的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void GetImageRect(IplImage* orgImage, CvRect rectInImage, IplImage* imgRect,double scale)
{
	//从图像orgImage中提取一块(rectInImage)子图像imgRect
	IplImage *result=imgRect;
	CvRect size;
	size.x=rectInImage.x*scale;
	size.y=rectInImage.y*scale;
	size.width=rectInImage.width*scale;
	size.height=rectInImage.height*scale;
	
	//result=cvCreateImage( size, orgImage->depth, orgImage->nChannels );
	//从图像中提取子图像
	cvSetImageROI(orgImage,size);
	cvCopy(orgImage,result);
	cvResetImageROI(orgImage);
}

人脸预处理

现在你已经得到一张人脸,你可以使用那张人脸图片进行人脸识别。然而,假如你尝试这样简单地从一张普通图片直接进行人脸识别的话,你将会至少损失10%的准确率!

在一个人脸识别系统中,应用多种预处理技术对将要识别的图片进行标准化处理是极其重要的。多数人脸识别算法对光照条件十分敏感,所以假如在暗室训练,在明亮的房间就可能不会被识别出来等等。这个问题可归于“lumination dependent”,并且还有其它很多例子,比如脸部也应当在图片的一个十分固定的位置(比如眼睛位置为相同的像素坐标),固定的大小,旋转角度,头发和装饰,表情(笑,怒等),光照方向(向左或向上等),这就是在进行人脸识别前,使用好的图片预处理过滤器十分重要的原因。你还应该做一些其它事情,比如去除脸部周围的多余像素(如用椭圆遮罩,只显示其内部的人脸区域而不是头发或图片背景,因为他们的变化多于脸部区域)。

为简单起见,我展示给你的人脸识别系统是使用灰度图像的特征脸方法。所以我将向你说明怎样简单地把彩色图像转化为灰度图像,并且之后简单地使用直方图均衡化(Histogram Equalization)作为一种自动的标准化脸部图像亮度和对比度的方法。为了得到更好的结果,你可以使用彩色人脸识别(color face recognition,ideally with color histogram fitting in HSV or another color space instead of RGB),或者使用更多的预处理,比如边缘增强(edge enhancement),轮廓检测(contour detection),手势检测(motion detection),等等。 你可以看到一个预处理阶段的例子

这是把一幅RGB格式的图像或灰度图像转变为灰度图像的基本代码。它还把图像调整成了固定的维度,然后应用直方图均衡化来实现固定的亮度和对比度。

PCA原理

现在你已经有了一张经过预处理后的脸部图片,你可以使用特征脸(PCA)进行人脸识别。OpenCV自带了执行PCA操作的”cvEigenDecomposite()”函数,然而你需要一个图片数据库(训练集)告诉机器怎样识别当中的人。

所以你应该收集每个人的一组预处理后的脸部图片用于识别。比如,假如你想要从10人的班级当中识别某个人,你可以为每个人存储20张图片,总共就有200张大小相同(如100×100像素)的经预处理的脸部图片。

特征脸的理论在Servo Magazine的两篇文章(Face Recognition with Eigenface)中解释了,但我仍会在这里尝试着向你解释。

我们使用“主元分析”把你的200张训练图片转换成一个代表这些训练图片主要区别的“特征脸”集。首先它将会通过获取每个像素的平均值,生成这些图片的“平均人脸图片”。然后特征脸将会与“平均人脸”比较。第一个特征脸是最主要的脸部区别,第二个特征脸是第二重要的脸部区别,等……直到你有了大约50张代表大多数训练集图片的区别的特征脸。

在上面这些示例图片中你可以看到平均人脸和第一个以及最后一个特征脸。注意到,平均人脸显示的是一个普通人的平滑脸部结构,排在最前的一些特征脸显示了一些主要的脸部特征,而最后的特征脸(比如Eigenface 119)主要是图像噪声。你可以在下面看到前32张特征脸。

简单地说,特征脸方法(Principal Component Analysis)计算出了训练集中图片的主要区别,并且用这些“区别”的组合来代表每幅训练图片。 比如,一张训练图片可能是如下的组成:

(averageFace) + (13.5% of eigenface0) – (34.3% of eigenface1) + (4.7% of eigenface2) + … + (0.0% of eigenface199). 一旦计算出来,就可以认为这张训练图片是这200个比率(ratio):

{13.5, -34.3, 4.7, …, 0.0}.

用特征脸图片分别乘以这些比率,并加上平均人脸图片 (average face),从这200个比率还原这张训练图片是完全可以做到的。但是既然很多排在后面的特征脸是图像噪声或者不会对图片有太大作用,这个比率表可以被降低到只剩下最主要的,比如前30个,不会对图像质量有很大影响。所以现在可以用30个特征脸,平均人脸图片,和一个含有30个比率的表,来代表全部的200张训练图片。

在另一幅图片中识别一个人,可以应用相同的PCA计算,使用相同的200个特征脸来寻找200个代表输入图片的比率。并且仍然可以只保留前30个比率而忽略其余的比率,因为它们是次要的。然后通过搜索这些比率的表,寻找在数据库中已知的20个人,来看谁的前30个比率与输入图片的前30个比率最接近。这就是寻找与输入图片最相似的训练图片的基本方法,总共提供了200张训练图片。

训练图片

创建一个人脸识别数据库,就是训练一个列出图片文件和每个文件代表的人的文本文件,形成一个facedata.xml“文件。 比如,你可以把这些输入一个名为”trainingphoto.txt”的文本文件: joke1.jpg joke2.jpg joke3.jpg joke4.jpg lily1.jpg lily2.jpg lily3.jpg lily4.jpg 它告诉这个程序,第一个人的名字叫“joke,而joke有四张预处理后的脸部图像,第二个人的名字叫”lily”,有她的四张图片。这个程序可以使用”loadFaceImgArray()”函数把这些图片加载到一个图片数组中。

为了从这些加载好的图片中创建一个数据库,你可以使用OpenCV的”cvCalcEigenObjects()”和”cvEigenDecomposite()”函数。

获得特征空间的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData,CvTermCriteria* calcLimit, IplImage* avg, float* eigVals )

nObjects:目标的数目,即输入训练图片的数目。 input:输入训练的图片。 output:输出特征脸,总共有nEigens ioFlags、ioBufSize:默认为0 userData:指向回调函数(callback function)必须数据结构体的指针。 calcLimit:终止迭代计算目标特征的条件。根据calcLimit的参数,计算会在前nEigens主要特征目标被提取后结束(这句话有点绕,应该就是提取了前nEigens个特征值,),另一种结束的情况是:目前特征值同最s大特征值的比值降至calcLimit的epsilon值之下。 赋值如下calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1); 它的类型定义如下: typedef struct CvTermCriteria {   int type;  int max_iter;    //最大迭代次数   double epsilon;    //结果精确性 } avg:训练样本的平均图像 eigVals:以降序排列的特征值的行向量指针。可以为0。

最后将所得数据形成一个facedata.xml“文件保存下来,它可以随时被重新载入来识别经训练过的人。

图像在特征空间的投影:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput,int ioFlags, void* userData, IplImage* avg, float* coeffs );

obj:输入图像,训练或识别图像 nEigObjs:特征空间的eigen数量 eigInput:特征空间中的特征脸 ioFlags、userData:默认为0 avg:特征空间中的平均图像 coeffs:这是唯一一个输出,即人脸在子空间的投影,特征值

识别的过程

1. 读取用于测试的图片。

2. 平均人脸,特征脸和特征值(比率)使用函数“loadTrainingData()” 从人脸识别数据库文件(the face recognition database fil)“facedata.xml”载入。

3. 使用OpenCV的函数“cvEigenDecomposite()”,每张输入的图片都被投影到PCA子空间,来观察哪些特征脸的比率最适合于代表这张图片。

4. 现在有了特征值(特征脸图片的比率)代表这张输入图片,程序需要查找原始的训练图片,找出拥有最相似比率的图片。这些用数学的方法在“findNearestNeighbor()”函数中执行,采用的是“欧几里得距离(Euclidean Distance)”,但是它只是基本地检查输入图片与每张训练图片的相似性,找到最相似的一张:一张在欧几里得空间上与输入图片距离最近的图片。就像在 Servo Magazine的文章上提到的那样,如果使用马氏距离( the Mahalanobis space,需要在代码里定义 USE_MAHALANOBIS_DISTANCE),你可以得到更准确的结果。

5. 在输入图片与最相似图片之间的距离用于确定可信度(confidence),作为是否识别出某人的指导。1.0的可信度意味着完全相同,0.0或者负的可信度意味着非常不相似。但是需要注意,我在代码中用到的可信度公式只是一个非常基本的可信度测量,不是很可靠,但是我觉得多数人会想要看到一个粗略的可信度值。你可能发现它对你的图片给出错误的值,所以你可以禁用它(比如:把可信度设为恒定的1.0)。

一旦指导哪张训练图片和输入图片最相似,并假定可信度值不是太低(应该至少是0.6或更高),那么它就指出了那个人是谁,换句话说,它识别出了那个人!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142088.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于 opencv 的人脸识别系统
随着智能设备的不断发展,人脸检测技术应用于越来越多的领域,极大的丰富和方便了人们的生活,具有很大的商业价值和研究意义。人 脸 识 别 主 要 为 两 个 步 骤:人 脸 检 测(FaceDetection)和人脸识别(Face Recogniton)。人脸检测就是判断待检测图像中是否存在人脸以及人脸在图片中的位置,人脸识别则是将检测到的人脸与已知的人脸库中的人脸进行比对,得出相似度信息。本项目基于天嵌的 TQ2440(采用 S3C2440 处理器)硬件开发平台,扩展 USB 摄像头模块,搭建配置嵌入式开发环境,给出并实现了一个嵌入式人脸识别实现方案。本系统使用人脸类 harr 特征、Adaboost 算法进行人脸检测,采用 PCA(Principal Component Analysis)降维算法得到特征脸子空间,将在 PC 平台训练的人脸识别分类器预存到嵌入式目标平台,最后结合最近邻匹配算法实现在线人脸识别,实际采集的图片测试结果表明该系统效果良好。
跋扈洋
2022/03/29
2.4K0
基于opencv人脸识别
5.开始、读训练数据、计算平均脸、计算协方差矩阵、计算特征值、特征矩阵、 PAC降维、子空间模型、检测
全栈程序员站长
2022/09/05
6280
基于opencv人脸识别
【模式识别】解锁降维奥秘:深度剖析PCA人脸识别技术
这些技术通常不是孤立存在的,而是相互交叉和融合的,以解决更复杂的问题。在实际应用中,根据具体的问题和数据特点选择合适的模式识别技术是至关重要的。
SarPro
2024/02/20
3930
【模式识别】解锁降维奥秘:深度剖析PCA人脸识别技术
高铁新建人脸识别系统,如何做到整容也可以识别逃犯?
如今人脸识别系统已经广泛应用于我们的生活中,如数码相机、门禁系统、机场的安全设施 、桌面软件、互联网应用(如Facebook)等等[1]。然而今日的一则关于“高铁人脸识别抓逃犯”的新闻一出[2],在评论中又引发了一阵阵怀疑。怀疑的中心问题在于,人脸识别系统真的能准确无误地在数以亿计的面孔中找出匹配的嫌疑人吗? 降维:减少冗余信息 完整的人脸识别系统一般由多个模块组成,在进行人脸识别之前首先要进行人脸检测(即在一张完整的图片中探测到人脸区域),以及图片的预处理、归一化等步骤(例如自动把倾斜的照片摆正)。本文就
用户1737318
2018/06/05
3.3K0
动态人脸识别技术的研究
摘要:本文主要从静态人脸识别局限性的提出,对动态人脸识别技术进行了探讨,介绍其研究背景,工作原理,结果分析,给出了在生活领域中的应用情况,并分析了存在的难题,发展趋势以及在人工智能化潮中的重要作用。
用户9831583
2022/06/16
2.3K0
动态人脸识别技术的研究
人脸识别系列一 | 特征脸法
从这里开始,我会不定期的更新一些人脸识别的有趣算法和小demo算法,源码也会开放出来,自己在学习的过程中希望也能帮助到公众号中对这方面感兴趣的小伙伴,无论是从源码角度,还是从原理角度,我说清楚了,对在看的你有帮助就是我最大的幸福。
BBuf
2019/12/09
1.7K0
使用计算机视觉实战项目精通 OpenCV:6~8
非刚性人脸跟踪是视频流每一帧中一组准密集的人脸特征的估计,这是一个难题,现代方法从许多相关领域借鉴了思想,包括计算机视觉,计算几何 ,机器学习和图像处理。 这里的非刚性指的是以下事实:人脸特征之间的相对距离在面部表情和整个人群之间变化,并且不同于人脸检测和跟踪,后者仅旨在在每个帧中查找面部的位置,而不是配置人脸特征。 非刚性人脸跟踪是一个流行的研究主题,已经有二十多年的历史了,但是直到最近,各种方法才变得足够鲁棒,处理器也足够快,这使得构建商业应用成为可能。
ApacheCN_飞龙
2023/04/27
1.5K0
使用计算机视觉实战项目精通 OpenCV:6~8
Python | Opencv的人脸检测和人类识别
开始人类检测之前,我们要先获取一个特征数据。在opencv安装目录中,cv2/data文件夹,进入该文件夹后,里面全是特征文件,我们一般选用haarcascade_frontalface_default.xml。
用户9925864
2022/07/27
1.5K0
Python | Opencv的人脸检测和人类识别
OpenCv识别小罗伯特唐尼
在实现人脸识别之前,我们先简单了解一下OpenCv的一些基本操作。在此之前,我们需要先安装OpenCv,我们使用pip安装:
ZackSock
2020/02/14
7420
人脸识别经典算法:特征脸方法(Eigenface)
特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的。特征脸用到的理论基础PCA在之前的文章中已经讲过了。直接上特征脸方法的步骤: 步骤一:获取包含M张人脸图像的集合S。在我们的例子里有25张人脸图像(虽然是25个不同人的人脸的图像,但是看着怎么不像呢,难道我有脸盲症么),如下图所示哦。每张图像可以转换成一个N维的向量(是的,没错,一个像素一个像素的排成一行就好了,至于是横着还是竖着获取原图像的像素,随你自己,只要前后统一就可以),然后把这M个向量放到一个集合S里,如下式所示。
智能算法
2018/04/03
5.5K0
人脸识别经典算法:特征脸方法(Eigenface)
关于OpenCV for Python入门-自带人脸识别工具测试
前文提到了OpenCV自带的人脸分类器,虽然准确度一般,但是含着泪也要把工作做完,巧了,OpenCV还提供了三种人脸识别算法(Eigenfaces、Fisherfaces、LBPH),这几种算法各有各的特点,识别率也一般。
python与大数据分析
2022/04/02
6250
关于OpenCV for Python入门-自带人脸识别工具测试
基于OpenCV3实现人脸识别(实践篇)[通俗易懂]
由于篇幅原因,后面一篇写各个算法背后的原理,原理背后的相关知识的了解,人脸识别项目总遇到的问题
全栈程序员站长
2022/06/26
1.6K0
基于OpenCV3实现人脸识别(实践篇)[通俗易懂]
MATLAB实现人脸识别
本篇博文基于MATLAB实现人脸识别,基于几何特征的算法,对人脸从图像采集、预处理、到特征点定位提取,校验通过;主要利用YCbCr肤色模型,通过连通分量提取算法定位人脸;对RGB图像通过形态学图像处理算法选定区域,再进行细化算法,找到其人脸坐标并提取出来;然后利用PCA与特征脸算法计算特征值完成识别。
不脱发的程序猿
2023/05/26
7940
MATLAB实现人脸识别
人脸识别简介(使用Python代码)
人脸识别是计算机视觉的一个子领域,它的应用范围非常广泛,现在已经成为世界各地的企业争相竞逐的新技术之一。考虑到市场的盈利现状,未来这项技术还会有更大的需求空间,所以作为机器学习的学习者,自己动手去从头开始构建一个人脸识别工具很有价值。
小小詹同学
2019/11/12
3.1K0
使用python3.7和opencv4.1来实现人脸识别和人脸特征比对以及模型训练
     OpenCV4.1已经发布将近一年了,其人脸识别速度和性能有了一定的提高,这里我们使用opencv来做一个实时活体面部识别的demo
用户9127725
2022/08/08
2K0
Openface人脸识别的原理与过程
Openface人脸识别的原理与过程: https://zhuanlan.zhihu.com/p/24567586 原理可参考如下论文: 《OpenFace: A general-purpose face recognition library with mobile applications》 第一步:找出所有的面孔 我们流水线的第一步是人脸检测。 我们的目标是找出并比较当前像素与直接围绕它的像素的深度。然后我们要画一个箭头来代表图像变暗的方向: 用梯度来代替像素这事看起来没有明确目的,但其实背后的理由
微风、掠过
2018/04/10
3.2K0
Openface人脸识别的原理与过程
简单人脸识别一之使用opencv+cnn网络实现人脸识别
最近在研究目标检测这个方向,看到网上有很多的人脸识别帖子,所以也想着上上手看看。当时是做了三个模型出来,第一个就是网上很通用普遍的opencv+简单三层cnn网络来实现的,说实话效果真的一般吧!具体的下面再细细陈述。第二个是把三层cnn网络换成了残差网络。因为自己刚好也是学习了残差网络。就想着生搬硬套过来,但效果说实话很迷,时好时坏,把我是整蒙逼了,后面也会提的。最后一个是用opencv+MTCNN+FaceNet来实现的,效果就比较好了,训练速度快,检测人脸的准确率也比前两个模型更好。我接下来会写三篇文章来一一介绍!
全栈程序员站长
2022/08/26
2K0
简单人脸识别一之使用opencv+cnn网络实现人脸识别
异质人脸识别研究综述
人脸识别(Face Recognition),是指对输入的图像或视频,判断其中是否存在人脸,进而依据人脸的面部特征,自动进行身份识别。 其过程可分为人脸检测、人脸特征提取和人脸识别三个阶段。人脸识别是身份认证的重要生物识别技术,也是计算机视觉领域研究最多的课题之一,经过近30年的研究,在受控和均匀的可见光条件下的传统人脸识别得到了很大的发展,目前已广泛应用于军事、金融、公共安全和日常生活等领域。
SIGAI学习与实践平台
2019/05/14
2.1K0
异质人脸识别研究综述
基于OpenCv的人脸识别(Python完整代码)
采集人脸图片的方法多种多样,可以直接从网上下载数据集,可以从视频中提取图片,还可以从摄像头实时的采集图片。
全栈程序员站长
2022/06/26
7.5K0
基于OpenCv的人脸识别(Python完整代码)
DeepFace:人脸识别库 DeepFace 简单认知
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/08/21
2K0
DeepFace:人脸识别库 DeepFace 简单认知
相关推荐
基于 opencv 的人脸识别系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验