精华内容
下载资源
问答
  • 主要为大家详细介绍了python实现人脸识别经典算法,特征脸法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 视觉处理,opencv+python3.6人脸识别代码,自己录制视频,检测出人脸,并保存视频,学习使用
  • 项目实现利用face++开发一个课堂签到的软件,实现面向摄像头即可完成记录学号、姓名和时间的签到工作。 项目架构 项目使用场景 代码: 流程代码,主文件 #!usr/bin/ # -*- coding: utf-8 -*- import requests ...
  • python实现人脸识别

    千次阅读 2021-07-15 02:40:43
    python实现人脸识别 文章目录python实现人脸识别前言一、项目介绍二、内容1.什么是人脸识别2.实现步骤 前言 让学生了解数字图像处理在人工智能方面的应用。通过一个人脸识别系统的开发,提高学生综合运用面向对象...

    python实现人脸识别


    前言

    让学生了解数字图像处理在人工智能方面的应用。通过一个人脸识别系统的开发,提高学生综合运用面向对象程序设计思想、数字图像处理等专业知识和技术的能力;通过了解人脸识别系统开发方法与步骤,为以后从事图像分析与图像理解等人工智能方面的相关工作奠定基础。


    一、项目介绍

    1. 技术介绍
    cv2: 在本项目中主要用于:
    a. 图像的读取
    b. 图像大小的改变
    c. 人脸的检测(非识别,检测的目的在于裁剪图片,从而减少周围环境的影响)
    d. 存储图片(写明存储的相对/绝对路径)
    f. 通过窗体展示图片(可为窗体赋以名称)
    Tips: 在安装的时候是安装的opencv,但是在导入(import)库的时候是导入cv2。
    numpy:
    a. Python 语言的一个扩展程序库,常被简写为np,支持大量的维度数组与矩阵运算(在线性代数中会学习数组与矩阵及其简单运算),此外也针对数组运算提供大量的数学函数库。
    b. 简而言之,只需要调用一个方法即可完成数组和矩阵的相关运算(在本项目中需要了解矩阵之间的相加减、矩阵之间的乘法、以及矩阵与常数的乘除法)一张图像我们可以采用二维数组的形式进行存储(数字化),二维数组可以用矩阵的形式表示。因此对图像的操作我们可以转为对矩阵的运算,而numpy库恰好为我们提供了丰富的api(接口)帮我们完成运算的工作。
    Tkinter: 图形开发界面库(python常用的GUI库)
    2. 开发工具:
    Pycharm: python语言开发IDE(学生可通过学校邮箱申请免费使用)
    3. 开发环境
    Python: 目前来说任何版本都可以,不过建议使用python3进行编写。

    --------(当你有了以上的基础知识之后就可以开始学习人脸识别了)--------

    二、内容

    1.什么是人脸识别

    首先,我们先了解一下什么叫人脸识别:
    人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。(摘自--百度百科)
    通过上述文字,我们可以注意到三点
    (1)我们的数据必须是包含人脸的图像或者视频流(保证数据的有效性)
    (2)第一步要检测和跟踪到图像或视频流中的人脸
    (3)第二步才是对人脸进行面部识别
    由于我们提供的所有数据集均包含了人脸,因此我们仅需完成第二和第三小点的工作。

    2.实现步骤

    使用python+OpenCV实现人脸识别系统,要求系统带有界面和菜单。人脸识别系统实现步骤如下:
    1、搭建python编译环境,并预导入OpenCV库
    (OpenCV是什么,有什么用已经在第二大部分有详细解释)

    2、创建正面人脸图像采集和识别程序,该程序分为人脸图像采集和人脸图像识别2个部
    (即在“什么是人脸识别”中我们提到的需要同学们完成的两个工作)
    注意,该系统所用图像数据均为灰度图像(什么是灰度图像?为什么要使用灰度图像?针对该问题,同学们可以自行思考,然后百度查阅)。

    3、人脸图像采集步骤,每个人至少采集5-7张正面图像
    (图像数据均会提供,此处同学们可以思考一下5-7张图片,是否是硬性要求?增加和减少采集数量是否会对我们机器的学习产生影响):
    方法一:
    (1) 打开人脸图像并显示在界面上。
    (2) 用鼠标选取人脸各个眼睛中心位置。
    (3) 依据人眼坐标,用下图采集人脸区域,并对人脸区域进行几何归一化。
    在这里插入图片描述

    几何归一化的目的是使用图像缩放技术把原始人脸区域图像缩放到统一的像素大小。比如规定图像大小是64×64,则按照上图人脸区域缩放倍数为β=2d/128。这样通过固定人眼坐标,保证了其他部位如鼻、嘴、脸颊等位置都保持在相对标准的位置,体现人脸在图像平面内的尺度不变性。
    上面说了一大堆,简而言之把所有图像标记好的人脸区域都改变成大小统一的图像,然后进行保存。该项目中,我建议大家统一保存为128×128的大小。
    (4) 对归一化后的人脸区域图像进行灰度归一化。
    灰度归一化的目的是去除一定条件下的光照影响,灰度归一化的方法很多,这里可以使用比较典型的直方图均衡化方法。
    (5)对每个采集的人脸图像按人脸类别进行编号形成人脸库。

    方法二:
    使用我们之前提到的cv2,通过cv.CascadeClassifier()接口,帮助实现人脸的自动检测。这是opencv自带的模型,是官方已经训练好的模型。值得注意的是该方法的参数为字符串类型,指向了模型的存储路径,本项目中我建议将路径指向haarcascade_frontalface_alt.xml。
    上述方法会为我们返回一个分类器,有了分类器就可以进行人脸检测了。通过分类器我们可以调用detectMultiScale使其给我们返回检测的结果。
    具体的使用方法可以参考以下博客,博客中已经解释的非常的清楚了,这里不过多阐述
    https://www.cnblogs.com/lyx2018/p/7073025.html

    ------------------(至此所有的人脸采集工作就结束了)------------------

    Ps:接下来的工作是让计算机把我们采集的所有人的人脸都认识一遍,但是每个人的照片只看一张可能印象不是很深,效果不是很好,因此我们可以每个人的照片都给计算机看个5-7张。

    如果直接给计算机看不同人的图片,它可能会分不清,因为计算机跟人不一样,人可以一眼看出谁是谁,计算机不行。因此我们需要将所有人的图片放在另一个空间里,这个空间是一个可以让计算机很好的分辨不同人的空间,也就是说我们要构建一个特征脸空间
    特征脸空间是什么?为什么构造这个空间可以让计算机分清楚不同人?可以参考下面的博客:https://blog.csdn.net/zouxy09/article/details/45276053 只需要看概念,不需要看matlab的实现,因为我们是用python实现的。
    简而言之,特征脸就是一张像所有人的脸,一张很综合的脸。在数值上只要稍作计算,就可以与某个人的脸的数值一模一样。举个例子,现在有数字4(基粒a)和6(基粒b),我们把单个数字成为“基粒”,如果要说这基粒a,b有什么区别,你可能说不出来。但是你稍微转换一下4变成2 * 2,6变成2 * 3,现在把2作为基粒c。这样子的话我们就可以很清楚的看到,在基粒c的基础上,4和6的区别,那就是4是2个基粒c,6是3个基粒c。有一种找出所有数据的公因数的感觉。然后这个公因数通过倍数的变化可以变成数据集中任意一个数据。那么我们可以利用不同数据与公因数计算的结果作为不同数据之间的差异,通过这个差异让计算机区分开不同的人。
    所以下面让我们开始用PCA方法计算出这个特征脸空间,即我们比喻的公因数。由于涉及到线性代数,同学们直接套公式计算即可,不过能理解其中含义是最好的。

    下文提到的矩阵均可理解为二维数组

    4、创建训练人脸库的特征脸空间——主成分分析(PCA)方法
    (1)创建所有训练样本组成的M×N矩阵trainFaceMat。其中,M为样本个数,N为一个训练样本图像所有像素按列相连的像素值
    (M = 人数[我们提供的数据包含了30个人的人脸数据] * count [5-7] ,也就是说我们有30个人的数据,每个人选出5-7张图片作为训练的数据。现在确定一下数据,假设我们每个人选取7张照片,那么M就等于30 * 7,代表了我们需要用210张图片作为训练数据)(我们让计算机认识每一个人,而每一个人我们给计算机看7张照片,这样可以加深计算机对每个人的印象,那么除了大家选取出来的7张照片以外,每个人脸数据都还有多余的照片没有使用,那么这些没让计算机看过的照片,就可以在计算机认识了每一个人之后用来考验计算机是否真的已经能够正确识别图像中的人是谁)
    (N = 像素点的个数,比如一张图片的大小是60 * 50, 那么N就等于300, 一个N代表这一张人脸的数据)
    (2)计算训练样本的平均值矩阵meanFaceMat,该矩阵为1×N矩阵
    (1 * N就代表目前算出来的平均值矩阵是 一张 人脸的数据,这张平均脸其实就是把上面的M * N的矩阵平均化,把这M张照片的每一个位置对应的数值加起来,然后再除以M。可以理解为把一个M * N的二维数组的每一列都加起来,变成一个1 * N的数组,然后这个数组的每一位都除以M,最后得到一个1 * N的平均值脸)(平均脸的作用就是为了找到一张跟所有人都很像的脸,这个地方就有点找公因数的感觉了)
    (3)计算规格化后的训练样本矩阵normTrainFaceMat,矩阵大小为M×N。计算公式为:

    normTrainFaceMat(i,:)= trainFaceMat(i,:)-meanFaceMat
    

    (这一步的公式包含了python的一点语言,这里的意思是用我们一开始得到的M*N的矩阵减去我们的平均脸,即计算出我每个人的数据跟这个平均脸的差异,我们把计算结果成为差值矩阵)
    (4)计算normTrainFaceMat的协方差矩阵的特征值和特征向量。python中的计算公式为:

     covariance = np.cov(normTrainFaceMat) #根据差值矩阵计算得出协方差矩阵
    eigenvalue, featurevector = np.linalg.eig(covariance)   #求得特征值和特征向量
    

    其中,矩阵featurevector 的列向量为特征向量,eigenvalue为特征值组成的对角阵。
    没有什么算法,大家直接调用numpy提供的函数就可以得到计算结果。
    (5)获取特征值按降序排序对应原矩阵的下标,python中的计算公式为:

    sorted_Index = np.argsort(eigenvalue)
    

    其中,sorted_Index为排序后的特征值在原序列中的索引,这个只是个下标,并不是具体排序后的特征值。
    (6)由于特征向量与特征值是相互对应的,我们可以直接根据刚刚得到的特征值排序后对应原序列中的索引来得到排序后的特征向量,公式如下:

    topk_evecs = featurevector[:, sorted_Index[:-k - 1:-1]]
    

    这是一个由前k个特征向量组成的矩阵,一个特征向量可以理解为一个特征,我们取最具有代表性的k个特征来构成我们的特征空间。选取前k个特征向量的过程我们叫做降维,降维的目的是为了抛弃那些对我们计算影响不大的值,减少计算量,只选前k个而不选排名靠后的原因就是因为后面的数据对我们的影响不大,可以抛弃。K可以取150左右。
    (7)获得训练样本的特征脸空间:

    eigenface = normTrainFaceMat' * eig_vec
    

    注意这个地方的normTrainFaceMat是转置了的,它的右上角有个撇,在numpy中要使用transpose()方法,对其转置,而“ * ”号代表点乘,在numpy中使用dot()函数计算
    得到的矩阵eigenface大小为N×m,每一列是一个长度为N的特征脸,共m列。

    ----------------------------(到这一步,我们就得到了所谓的公因数)--------------------------

    (8)训练样本在特征脸空间的投影:

    eigen_train_sample = np.dot(normTrainFaceMat, eigenface);
    

    上面解释过dot函数是什么,它就代表了两个矩阵之间的点乘
    得到eigen_train_sample为投影样本矩阵,大小为M×m,每一行为一个训练样本图像在特征脸空间的投影。由于m<<N,经过投影可获得更能描述训练样本图像特征的描述。

    —(到目前为止,我们计算出了特征脸空间,也计算出了训练数据在特征空间中的投影)—

    Ps:接下来,我们只需要把要识别的图片,也计算出它的差值矩阵,并且把差值矩阵在特征脸空间上的投影计算出来,这个投影即代表了我们之前提到的公因数的倍数。我们可以把待识别图片的投影与训练数据中每个人的图片的投影通过“距离公式”计算出“距离”,通过观察待识别图片与训练数据中哪个人的投影距离最近,那么待识别图片上的人就是谁。比如我们有编号1-30的训练数据的投影,我们的待识别图片为A,我们计算出A在特征脸空间上的投影与编号1-30的每一个投影的的距离,假设现在计算出A与1号的距离最近,那么我们就可以认为A就是1号。当然这里还存在一个A可能不属于1-30号中的任何一个人,但是这种情况我们在这里不做讨论,大家可以自行思考一下。

    5、人脸识别
    (1)测试人脸归一化。
    读入待识别人脸图像,按照人脸采集步骤选取人脸双眼,然后对测试人脸进行几何归一化和灰度归一化,形成与训练样本相同尺寸的人脸图像区域。
    这个地方仍然可以使用方法一或者方法二
    (2)向特征脸空间进行投影。
    将测试人脸展开为1×N矩阵testFaceMat,N为一个图像所有像素按列相连的像素值。计算规格化后的识别样本矩阵normTestFaceMat:

    normTestFaceMat = normTestFaceMat –meanFaceMat
    

    将normTestFaceMat向特征脸空间投影:

    eigen_test_sample = normTestFaceMat * eigenface
    

    得到eigen_test_sample为待识别人脸的投影样本矩阵,大小为1×m。
    (3)计算eigen_test_sample与eigen_train_sample中各样本的距离
    计算eigen_test_sample与eigen_train_sample中各样本(每行)的欧式距离,距离最小的那个样本则可以认为与待识别样本为同一人。
    在numpy中同样也提供了计算欧式距离的方法,大家可以百度一下,学习如何使用numpy计算出欧氏距离,当然大家可以不用numpy实现的方法,可以自己写一段计算欧氏距离的代码。

    ending: 写的不好的地方还请大家多多包含,文中比喻不恰当的地方也麻烦大家指出来,以后会考虑上传数据和代码的

    展开全文
  • 这篇文章主要为大家详细介绍了face++与python实现人脸识别签到(考勤)功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目实现利用face++开发一个课堂签到的软件,实现面向摄像头即可完成记录学号、姓名...
  • 于是迫不及待的想体验一下opencv的人脸识别,如下文。 必备知识 Haar-like 通俗的来讲,就是作为人脸特征即可。 Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比...
  • 使用face_recognition实现人脸检测、人脸关键点检测、人脸识别。压缩包中包含ipynb文件和图片素材,上传到python.jupyter.vip就能运行,也可以在自己电脑搭建jupyter环境运行。
  • Python实现人脸识别

    万次阅读 多人点赞 2019-05-08 10:28:59
    Python在人脸识别方面功能很强大,程序语言简单高效,下面编程实现一下如何实现人脸识别。分别给出实现代码,作为学习和技术交流。 Python基础环境准备 参见:...

    案例分析

    概述 

              Python在人脸识别方面功能很强大,程序语言简单高效,下面编程实现一下如何实现人脸识别。分别给出实现代码,作为学习和技术交流。

    Python基础环境准备

    参见:Python入门及技术指南_yan_dk的专栏-CSDN博客_python入门指南

    案例实现

    打开显示图片

    import cv2  #opencv库
    
    #读取图片
    image=cv2.imread('imgs/face_exam1.jpg')
    #显示图片窗口
    cv2.imshow('faces',image)
    #窗口暂停
    cv2.waitKey(0)
    #销毁窗口资源
    cv2.destoryAllWindows()

    运行效果图 

    识别图片上的人脸

    import cv2  #opencv库
    
    #读取图片
    image=cv2.imread('imgs/face_exam0.
    展开全文
  • Python的代码资源,能够实现人脸采集、建库和识别 包括详细的运行步骤解说文档
  • 主要介绍了python实现人脸识别代码,还是比较不错的,这里分享个大家,共需要的朋友参考。
  • 写在前面 python代码很简短,不像C++等要写几百行代码,但其实你调用的模块...人脸检测效果图 python完整代码 识别静态图片 # 导入opencv-python库 import cv2 picName = input("请输入你要识别人类的图片名称(如:pi
  • 这篇文章主要介绍了如何通过python实现人脸识别验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 直接上代码,此案例是根据...
  • 5、可以将此库与其他Python库一起使用来进行实时人脸识别。 使用要求 Python 3.3+或Python 2.7 macOS或Linux(Windows未正式支持,但可能有效) 人脸检测 在照片中找到面孔 在照片中找到面孔(使用深度学习) 使用...
  • 基于Python人脸识别源码;基于Python开发的人脸识别源码
  • 这个是使用KNN进行人脸识别,在文件夹中直接运行就行。 knn_examples文件夹中,为train和test文件夹。 train里边放的都是以每个人脸的姓名为名称的子文件夹,每个子文件夹中需要自己添加人脸图片以便进行训练。 ...
  • 主要介绍了图像识别 python+opencv的简单人脸识别,具有一定参考价值,需要的朋友可以参考下。
  • 该项目为Python和GNU Octave / MATLAB实现人脸识别框架,其中包括: 预处理 直方图均衡 本地二进制模式 TanTriggsPreprocessing(Tan,X.和Triggs,B.“增强的局部纹理特征集,用于在困难的光照条件下进行人脸...
  • 在20世纪末,计算机的发展催生了人们对人工智能的研究,为了实现这一技术,那么,对人脸识别技术的研究就显得非常重要而且也是必不可少的。因为计算机的发展,所以近十年来对人脸识别的研究飞速发展,如

    目录

    摘要

    • 一、 需求分析

    • 二、 概要设计

    1. 总功能模块
    2. 录入人脸模块
    3. 实时检测模块
    • 三、 详细设计
    1. 第三方库导入
    2. 建立相关储存文件
    3. 对照人脸获取
    4. 通过算法建立对照模型
    5. 人脸检测识别
    6. 日志返回
    • 四、 执行结果

    • 五、 附录(程序清单)

    • 六、 运行过程遇到的问题

    • 摘要

    在20世纪末,计算机的发展催生了人们对人工智能的研究,为了实现这一技术,那么,对人脸识别技术的研究就显得非常重要而且也是必不可少的。因为计算机的发展,所以近十年来对人脸识别的研究飞速发展,如今已经产生了很多进行人脸识别的方法。但是我们不能满足于现状,伴随着Python这一电脑编程语言的深入开发,Python编程语言相对于C或C++等编程语言的优点也凸显出来。根据Python的优点,我采用了一种以Python编程语言及其图像处理库为基础的人脸识别的方法,通过对人脸图像对比库进行人脸检测、捕获人脸、提取人脸关键部位特征参数、生成特征参数描述文件等一些列步骤,并计算欧氏距离,把人脸图像对比库的人脸图像的欧氏距离与对照组人脸图像的欧氏距离进行对比并判定等得出识别结果。结果表明,该系统对于对照组的人脸图像的识别准确率可达70%,因此,以Python编程语言及其图像处理库为基础的人脸识别方法不仅具有比较高效的识别率,而且也降低了设备的要求,具有一定的实用价值。

    关键词:人脸识别;Python;opencv-python qt5库

    • 一、 需求分析

    本课题主要目的是设计一个实时监控的人脸识别系统,将摄像头部署在需要进行监控的场合,系统初始化完毕后便于自动检测录入人脸和识别并显示个人信息,并实时记录人脸打卡的日志,并将不能识别的人脸标记为“UNKOWN”,系统只能识别预先经过信息采集的人物,在采集阶段,记录人物ID与姓名

    • 二、 概要设计
    • 总功能模块
      整个系统分为三个功能模块,一个是人脸信息采集模块,一个是实时打卡模块,另一个是将打卡时间写入日志文件
      在这里插入图片描述
    • 录入人脸模块
      在这里插入图片描述
      • 实时检测模块
        在这里插入图片描述
    • 三、 详细设计
    1. 第三方库导入
      安装好程序所设计的库:opencv-python ; numpy ; image ; opencv-contrib-python
      在这里插入图片描述

    2. 建立相关储存文件

    在项目工程opencv-人脸识别下建立:
    facedata文件夹:用于储存人脸识别录入的信息
    Haarcascade-frontalface-default : CV2库本身data文件夹中所带的安装包,可以一并放在这个项目目录下,后面可以避免很多因它出现的问题
    *Log.csv:*用于返回实时打开日志文件,记录打卡时间 Maxmenber.csv : 导入录入人脸信息,字段为 “编号,姓名”
    在这里插入图片描述

    1. 对照人脸获取
    import cv2
    #调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
    cap = cv2.VideoCapture(0)
    
    #调用人脸分类器,要根据实际路径调整3
    face_detector = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml')  
    #待更改为即将录入的脸标记一个id
    face_id = input('\n User data input,Look at the camera and wait ...')
    #sampleNum用来计数样本数目
    count = 0
    
    while True:    
        #从摄像头读取图片
        success,img = cap.read()    
        #转为灰度图片,减少程序符合,提高识别度
        if success is True: 
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
        else:   
            break
        #检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸
        #其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighbors
        faces = face_detector.detectMultiScale(gray, 1.3, 5)
    
        #框选人脸,for循环保证一个能检测的实时动态视频流
        for (x, y, w, h) in faces:
            #xy为左上角的坐标,w为宽,h为高,用rectangle为人脸标记画框
            cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0))
            #成功框选则样本数增加
            count += 1  
            #保存图像,把灰度图片看成二维数组来检测人脸区域
            #(这里是建立了data的文件夹,当然也可以设置为其他路径或者调用数据库)
            cv2.imwrite("data/User."+str(face_id)+'.'+str(count)+'.jpg',gray[y:y+h,x:x+w]) 
            #显示图片
            cv2.imshow('image',img)       
            #保持画面的连续。waitkey方法可以绑定按键保证画面的收放,通过q键退出摄像
        k = cv2.waitKey(1)        
        if k == '27':
            break        
            #或者得到80个样本后退出摄像,这里可以根据实际情况修改数据量,实际测试后80张的效果是比较理想的
        elif count >= 80:
            break
    
    #关闭摄像头,释放资源
    cap.realease()
    cv2.destroyAllWindows()
    

    人脸录入成功后将会在facedata文件目录下看到如下(这里录入了三个人的人脸) 在项目下可以看到,在路径文件下也可以看到
    在这里插入图片描述

    LBP是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。
    LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型。

    import os
    import cv2
    import numpy as np
    from PIL import Image
    #导入pillow库,用于处理图像
    #设置之前收集好的数据文件路径
    path = 'data'
    
    #初始化识别的方法
    recog = cv2.face.LBPHFaceRecognizer_create()
    
    #调用熟悉的人脸分类器
    detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    
    #创建一个函数,用于从数据集文件夹中获取训练图片,并获取id
    #注意图片的命名格式为User.id.sampleNum
    def get_images_and_labels(path):
        image_paths = [os.path.join(path,f) for f in os.listdir(path)]
        #新建连个list用于存放
        face_samples = []
        ids = []
    
        #遍历图片路径,导入图片和id添加到list中
        for image_path in image_paths:
    
            #通过图片路径将其转换为灰度图片
            img = Image.open(image_path).convert('L')
    
            #将图片转化为数组
            img_np = np.array(img,'uint8')
    
            if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
                continue
    
            #为了获取id,将图片和路径分裂并获取
            id = int(os.path.split(image_path)[-1].split(".")[1])
            faces = detector.detectMultiScale(img_np)
    
            #将获取的图片和id添加到list中
            for(x,y,w,h) in faces:
                face_samples.append(img_np[y:y+h,x:x+w])
                ids.append(id)
        return face_samples,ids
    
    #调用函数并将数据喂给识别器训练
    print('Training...')
    faces,ids = get_images_and_labels(path)
    #训练模型
    recog.train(faces,np.array(ids))
    #保存模型
    recog.save('trainner/trainner.yml')
    
    1. 人脸检测识别

    在这里插入图片描述

    import cv2
    #准备好识别方法
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    
    #使用之前训练好的模型
    recognizer.read('trainner/trainner.yml')
    
    #再次调用人脸分类器
    cascade_path = "haarcascade_frontalface_default.xml" 
    face_cascade = cv2.CascadeClassifier(cascade_path)
    
    #加载一个字体,用于识别后,在图片上标注出对象的名字
    font = cv2.FONT_HERSHEY_SIMPLEX
    
    idnum = 0
    #设置好与ID号码对应的用户名,如下,如0对应的就是初始
    
    names = ['初始','admin','user1','user2','user3']
    
    #调用摄像头
    cam = cv2.VideoCapture(0)
    minW = 0.1*cam.get(3)
    minH = 0.1*cam.get(4)
    
    while True:
        ret,img = cam.read()
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        #识别人脸
        faces = face_cascade.detectMultiScale(
                gray,
                scaleFactor = 1.2,
                minNeighbors = 5,
                minSize = (int(minW),int(minH))
                )
        #进行校验
        for(x,y,w,h) in faces:
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
            idnum,confidence = recognizer.predict(gray[y:y+h,x:x+w])
    
            #计算出一个检验结果
            if confidence < 100:
                idum = names[idnum]
                confidence = "{0}%",format(round(100-confidence))
            else:
                idum = "unknown"
                confidence = "{0}%",format(round(100-confidence))
    
            #输出检验结果以及用户名
            cv2.putText(img,str(idum),(x+5,y-5),font,1,(0,0,255),1)
            cv2.putText(img,str(confidence),(x+5,y+h-5),font,1,(0,0,0),1)
    
            #展示结果
            cv2.imshow('camera',img)
            k = cv2.waitKey(20)
            if k == 27:
                break
    
    #释放资源
    cam.release()
    cv2.destroyAllWindows()
    
    • 日志返回
      所有的打卡记录将会返回到日志文件中,这有利于管理者查看
      在这里插入图片描述
    • 四、 执行结果

    程序运行:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    • 五、 附录(程序清单)
    import cv2
    import os
    import numpy as np
    from PIL import Image
    import datetime
    import csv
    # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2
    Path = r"D:\python install\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml"
    
    # 人脸识别器分类
    face_detector = cv2.CascadeClassifier(Path)
    
    names = []
    zh_name = []
    with open("maxmember.csv", "r", encoding='UTF-8') as csv_file:
        reader = csv.reader(csv_file)
        for item in reader:
            # print(item)
            names.append(item[2])
            zh_name.append(item[1])
        # print (zh_name)
    
    def data_collection():
        # cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
        videoSourceIndex = 0
        cap = cv2.VideoCapture(cv2.CAP_DSHOW + videoSourceIndex)
        # cv2.CAP_DSHOW是作为open调用的一部分传递标志,
        # 还有许多其它的参数,而这个CAP_DSHOW是微软特有的。
    
        face_id = input('\n 请输入你的ID:')
        print('\n 数据初始化中,请直视摄像机录入数据....')
        count = 0
        while True:
            # 从摄像头读取图片
            sucess, img = cap.read()
    
            # 转为灰度图片
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
            # 检测人脸
            faces = face_detector.detectMultiScale(gray, 1.3, 5)
    
            for (x, y, w, h) in faces:
                cv2.rectangle(img, (x, y), (x + w, y + w), (255, 0, 0))
                count += 1
                # 保存图像
                cv2.imwrite("facedata/Member." + str(face_id) + '.' + str(count) + '.jpg', gray[y: y + h, x: x + w])
                cv2.imshow('data collection', img)
    
            # 保持画面的持续。
            k = cv2.waitKey(1)
            if k == 27:  # 通过esc键退出摄像
                break
            elif count >= 30:  # 得到n个样本后退出摄像
                break
        cap.release()
        cv2.destroyAllWindows()
    
    
    # 人脸数据训练
    def face_training():
        # 人脸数据路径
        path = './facedata'
        recognizer = cv2.face.LBPHFaceRecognizer_create()
        # FaceRecognizer 人脸识别类内的接口函数也是异常简单,
        # 人脸识别的任务也就是两大部分,训练和预测
        '''
        LBP,参数包括半径radius,邻域大小即采样点个数neighbors,
        x和y方向的单元格数目grid_x, grid_y,
        还有两个参数histograms为训练数据得到的直方图,
        labels为直方图对应的标签。
        这个方法也要求训练和测试的图像是灰度图
        
        '''
        def getImagesAndLabels(path):
            imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
            # join函数将多个路径组合后返回
    
            faceSamples = []
            ids = []
            for imagePath in imagePaths:
                # 把它转换成灰度
                PIL_img = Image.open(imagePath).convert('L')
    
                img_numpy = np.array(PIL_img, 'uint8')
                id = int(os.path.split(imagePath)[-1].split(".")[1])
                faces = face_detector.detectMultiScale(img_numpy)
                for (x, y, w, h) in faces:
                    faceSamples.append(img_numpy[y:y + h, x: x + w])
                    ids.append(id)
            return faceSamples, ids
    
        print('数据训练中')
        faces, ids = getImagesAndLabels(path)
        recognizer.train(faces, np.array(ids))
    
        recognizer.write(r'.\trainer.yml')
        # print("{0} faces trained. Exiting Program".format(len(np.unique(ids))))
    
    def face_ientification():
        # 开启摄像头
        cap = cv2.VideoCapture(0)
    
        recognizer = cv2.face.LBPHFaceRecognizer_create()
        recognizer.read('./trainer.yml')
        faceCascade = cv2.CascadeClassifier(Path)
        font = cv2.FONT_HERSHEY_SIMPLEX
    
        idnum = 0
    
        names = ['汪涵', 'Allen', 'zouxuan']
        global namess
    
        cam = cv2.VideoCapture(0)
        # 设置大小
        minW = 0.1 * cam.get(3)
        minH = 0.1 * cam.get(4)
    
        while True:
            ret, img = cam.read()
            # 图像灰度处理
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
            # 将人脸用vector保存各个人脸的坐标、大小(用矩形表示)
            faces = faceCascade.detectMultiScale(
                gray,
                scaleFactor=1.2,  # 表示在前后两次相继的扫描中,搜索窗口的比例系数
                minNeighbors=5,  # 表示构成检测目标的相邻矩形的最小个数(默认为3个)
                minSize=(int(minW), int(minH))  # minSize和maxSize用来限制得到的目标区域的范围
            )
    
            for (x, y, w, h) in faces:
                cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
                idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w])
    
                if confidence < 100:
                    namess = names[idnum]
                    confidence = "{0}%".format(round(100 - confidence))
                else:
                    namess = "unknown"
                    confidence = "{0}%".format(round(100 - confidence))
    
                cv2.putText(img, str(namess), (x + 5, y - 5), font, 1, (0, 0, 255), 1)
                cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)  # 输出置信度
    
            cv2.imshow(u'Identification punch', img)
            k = cv2.waitKey(10)
            if k == 13:
                theTime = datetime.datetime.now()
                # print(zh_name[idnum])
                strings = [str(zh_name[idnum]), str(theTime)]
                print(strings)
    
                # 将获取到的打卡时间重新做一个表格
                with open("log.csv", "a", newline="") as csvFile:
                    writer = csv.writer(csvFile)
                    writer.writerow([str(zh_name[idnum]), str(theTime)])
            elif k == 27:
                cap.release()
                cv2.destroyAllWindows()
                break
    
    while True:
        a = int(input("输入1,录入脸部,输入2进行识别打卡:"))
        if a == 1:
            data_collection()
            face_training()
        elif a == 2:
            face_ientification()
    
    • 六、 运行过程遇到的问题
      见这个连接:报错问题
    展开全文
  • 利用Python实现人脸识别检测

    千次阅读 2019-05-31 23:16:51
    人脸检测是计算机视觉中的一个重要的部分,下面就通过Python来实现一个简易的人脸识别的程序。 基本思想: 通过Python,采用识别人脸,然后标记出来,实现人脸检测的结果。 方法是调用opencv训练好的分类器和...

    人脸检测是计算机视觉中的一个重要的部分,下面就通过Python来实现一个简易的人脸识别的程序。

    基本思想:

    通过Python,采用识别人脸,然后标记出来,实现人脸检测的结果。

    方法是调用opencv训练好的分类器和自带的检测函数检测人脸。

    主要流程:

    1. 加载分类器。我这里用的是haarcascade_frontalface_default.xml。GitHub上的地址为https://github.com/opencv/opencv/blob/master/data/haarcascades
    2. 调用detectMultiScale()函数检测,调整函数的参数可以使检测结果更加精确。
    3. 把检测到的人脸等用矩形(或者圆形等其他图形)画出来。

    示例代码:

    import cv2
    import matplotlib.pyplot as plt
    
    def show(image):
        plt.imshow(image)
        plt.axis('off')
        plt.show()
    
    def imread(image):
        image = cv2.imread(image)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        return image
    
    def facedetect(image):
        image = imread(image)
        # 级联分类器
        detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
        rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10, 10),
                                          flags=cv2.CASCADE_SCALE_IMAGE)
    
        for (x, y, w, h) in rects:
            # 画矩形框
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
        show(image)
    
    
    facedetect("Solvay.jpg")
    
    

    这里面最主要的一个函数就是detectMultiScale()。文档中的解释如下:https://upload-images.jianshu.io/upload_images/5201633-7267daa22248abc5?imageMogr2/auto-orient/

    1. image表示的是要检测的输入图像
    2. objects表示检测到的人脸目标序列
    3. scaleFactor表示每次图像尺寸减小的比例
    4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
    5. minSize为目标的最小尺寸
    6. minSize为目标的最大尺寸

    原始图像为 

    运行代码后的结果如下:

     

    觉得有用不妨点个赞哦~ 

    展开全文
  • import cv2 save_path = 'D:/YOURSPHOTOS/' cv2.namedWindow("camera", 1) # 开启ip摄像头 ...# 打开摄像头 cap = cv2.VideoCapture(video) face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_d.
  • Python实现人脸识别的应用实例

    千次阅读 2019-05-13 23:04:35
    现在人脸识别很火,现在我将举几个例子实现人脸识别的实例。 首先,要先安装相应的模块,在Python中有一个专门的模块叫做face_recognition模块,所以Python来做人工智能还是有很大的优势的。 Github网址为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,265
精华内容 8,506
关键字:

python实现人脸识别

python 订阅