热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python中OpenCV实现人脸识别的实例详解

本文主要介绍了python使用opencv实现人脸识别的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧
本文主要介绍了python使用opencv实现人脸识别的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧

主要有以下步骤:

1、人脸检测

2、人脸预处理

3、从收集的人脸训练机器学习算法

4、人脸识别

5、收尾工作

人脸检测算法:

基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区域应该比前额和脸颊更暗,嘴巴应该比脸颊更暗等情形。它通常执行大约20个这样的比较来决定所检测的对象是否为人脸,实际上经常会做上千次。

基于LBP的人脸检测器基本思想与基于Haar的人脸检测器类似,但它比较的是像素亮度直方图,例如,边缘、角落和平坦区域的直方图。

这两种人脸检测器可通过训练大的图像集找到人脸,这些图像集在opencv中存在XML文件中以便后续使用。

这些级联分类检测器通常至少需使用1000个独特的人脸图像和10000个非人脸图像作为训练,训练时间一般LBP要几个小时,

Haar要一个星期。

项目中的关键代码如下:

initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);

initWebcam
videoCapture.open(cameraNumber);

cvtColor(img, gray, CV_BGR2GRAY);
//有需要则缩小图片使检测运行更快,之后要恢复原来大小
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);

人脸预处理:

实际中通常训练(采集图像)和测试(来自摄像机图像)的图像会有很大不同,受(如光照、人脸方位、表情等),

结果会很差,因此用于训练的数据集很重要。

人脸预处理目的是减少这类问题,有助于提高整个人脸识别系统的可靠性。

人脸预处理的最简单形式就是使用equalizeHist()函数做直方图均衡,这与人脸检测那步一样。

实际中,为了让检测算法更可靠,会使用面部特征检测(如,检测眼睛、鼻子、嘴巴和眉毛),本项目只使用眼睛检测。

使用OpenCV自带的训练好的眼部探测器。如,正面人脸检测完毕后,得到一个人脸,在使用眼睛检测器提取人脸的左眼区域和右眼区域,并对每个眼部区域进行直方图均衡。

这步涉及的操作有以下内容:

1、几何变换和裁剪

人脸对齐很重要,旋转人脸使眼睛保持水平,缩放人脸使眼睛之间距离始终相同,平移人脸使眼睛总是在所需高度上水平居中,

裁剪人脸外围(如图像背景、头发、额头、耳朵和下巴)。

2、对人脸左侧和右侧分别用直方图均衡

3、平滑

用双边滤波器来减少图像噪声

4、椭圆掩码

将剩余头发和人脸图像背景去掉

项目中的关键代码如下:

detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//在左脸区域内检测左眼
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//右眼类似,这样眼睛中心点就得到了
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//再得到两眼的中点,然后计算两眼之间的角度
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//仿射扭曲(Affine Warping)需要一个仿射矩阵
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//现在可变换人脸来得到检测到的双眼出现在人脸的所需位置
warpAffine(gray, warped, rot_mat, warped.size());

//先对人脸左侧和右侧分开进行直方图均衡
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//再合并,这里合并时左侧1/4和右侧1/4直接取像素值,中间的2/4区域像素值通过一定计算进行处理。

//双边滤波
bilateralFilter(warped, filtered, 0, 20.0, 2.0);

//采用椭圆掩码来删除一些区域
filtered.copyTo(dstImg, mask);

收集并训练人脸:

一个好的数据集应包含人脸变换的各种情形,这些变化可能出现在训练集中。如只测试正面人脸,则只需训练图像有完全正面人脸即可。

因此一个好的训练集应包含很多实际情形。

本项目收集的图像之间至少有一秒的间隔,使用基于L2范数的相对错误评价标准来比较两幅图像素之间的相似性。

errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);

再与收集新人脸的阈值相比来决定是否收集这次图像。

可用很多技巧来获取更多的训练数据,如,使用镜像人脸、加入随机噪声、改变人脸图像的一些像素、旋转等。

//翻转
flip(preprocessedFace, mirroredFace, 1);

对每个人收集到足够多的人脸图像后,接下来必须选择适合人脸识别的机器学习算法,通过它来学习收集的数据,从而训练出一个人脸识别系统。

人脸识别算法:

1、特征脸,也称PCA(主成分分析)

2、Fisher脸,也称LDA(线性判别分析)

3、局部二值模式直方图(Local Binary Pattern Histograms,LBPH)

其他人脸识别算法:www.face-rec.org/algorithms/

OpenCV提供了CV::Algorithm类,该类有几种不同的算法,用其中一种算法就可以完成简单而通用的人脸识别。

OpenCV的contrib模板中有一个FaceRecognizer类,它实现以上这些人脸识别算法。

initModule_contrib();
model = Algorithm::create(facerecAlgorithm);

model->train(preprocessedFaces, faceLabels);

这一代码将执行所选人脸识别的整个训练算法。

人脸识别:

1、人脸识别:通过人脸来识别这个人

可以简单调用FaceRecognizer::predict()函数来识别照片中的人,

int identity = model->predict(preprocessedFace);

它带来的问题是它总能预测给定的人(即使输入图像不属于训练集中的人)。

解决此问题的办法是制定置信度标准,置信度过低则可判读是一个不认识的人。

2、人脸验证:验证图像中是否有想找的人

为了验证是否可靠,或者说系统是否能对一个不认识的人进行正确识别,这需要进行人脸验证。

这里计算置信度的方法是:

使用特征向量和特征值重构人脸图,然后将输入的图像与重构图进行比较。如果一个人在训练集中有多张人脸图,用特征向量和特征

值重构后应该有非常好的效果,如果没有则差别很大,表明它可能是一个未知的人脸。

subspaceProject()函数将人脸图像映射到特征空间,再用subspaceReconstruct()函数从特征空间重构图像。

收尾:交互式GUI

利用OpenCV函数很容易绘制一些组件,鼠标点击等。

以上就是python中OpenCV实现人脸识别的实例详解的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • Python 领跑!2019年2月编程语言排名更新
    根据最新的编程语言流行指数(PYPL)排行榜,Python 在2019年2月的份额达到了26.42%,稳坐榜首位置。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 基本价值在于商业落地,解决实际问题;真正的价值在于解决高价值问题,有两类:一解决民生、国力问题,提高国家的综合国力;二让人们的生活真正的更加美好。 近两年,很多学术大牛,进入工业界 ... [详细]
  • 快加入「我的最爱」吧 Python 开发者不容错过的30 个Github 开源专案(上)
    愈来愈多人使用Python来进行不同的功能,例如进行机器学习等。如果想透过Python使用这些功能,可以在GitHub上找开源专题。以下介绍在GitHu ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • AI炼金术:KNN分类器的构建与应用
    本文介绍了如何使用Python及其相关库(如NumPy、scikit-learn和matplotlib)构建KNN分类器模型。通过详细的数据准备、模型训练及新样本预测的过程,展示KNN算法的实际操作步骤。 ... [详细]
  • 深入解析层次聚类算法
    本文详细介绍了层次聚类算法的基本原理,包括其通过构建层次结构来分类样本的特点,以及自底向上(凝聚)和自顶向下(分裂)两种主要的聚类策略。文章还探讨了不同距离度量方法对聚类效果的影响,并提供了具体的参数设置指导。 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • 机器学习(ML)三之多层感知机
    深度学习主要关注多层模型,现在以多层感知机(multilayerperceptron,MLP)为例,介绍多层神经网络的概念。隐藏层多层感知机在单层神经网络的基础上引入了一到多个隐藏 ... [详细]
  • 深入解析监督学习的核心概念与应用
    本文深入探讨了监督学习的基本原理及其广泛应用。监督学习作为机器学习的重要分支,通过利用带有标签的训练数据,能够有效构建预测模型。文章详细解析了监督学习的关键概念,如特征选择、模型评估和过拟合问题,并介绍了其在图像识别、自然语言处理等领域的实际应用。 ... [详细]
author-avatar
千片叶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有