前言

今天,我们用Python实现简单的人脸识别技术!

Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的。这里介绍的是准确性比较高的一种。

一、首先

梳理一下实现人脸识别需要进行的步骤:

流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比较高,我们也可以节约在这方面花的时间。

既然用的是python,那自然少不了包的使用了,在看代码之前,我们先将整个项目所需要的包罗列一下:

· CV2(Opencv):图像识别,摄像头调用

· os:文件操作

· numpy:NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库

· PIL:Python Imaging Library,Python平台事实上是图像处理的标准库

二、接下来

1.对照人脸获取

#-----获取人脸样本-----
import cv2#调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
cap = cv2.VideoCapture(0)
#调用人脸分类器,要根据实际路径调整3
face_detector = cv2.CascadeClassifier(r'X:/Users/73950/Desktop/FaceRec/haarcascade_frontalface_default.xml')  #待更改
#为即将录入的脸标记一个id
face_id = input('\n User data input,Look at the camera and wait ...')
#sampleNum用来计数样本数目
count = 0while True:    #从摄像头读取图片success,img = cap.read()    #转为灰度图片,减少程序符合,提高识别度if success is True: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else:   break#检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸#其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighborsfaces = 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        #或者得到800个样本后退出摄像,这里可以根据实际情况修改数据量,实际测试后800张的效果是比较理想的elif count >= 800:break#关闭摄像头,释放资源
cap.realease()
cv2.destroyAllWindows()
复制代码

经博主测试,在执行

“face_detector = cv2.CascadeClssifier(r'C:\Users\admin\Desktop\python\data\ haarcascade_frontalface_default.xml')”此语句时,实际路径中的目录名尽量不要有中文字符出现,否则容易报错。

这样,你的电脑就能看到你啦!

2. 通过算法建立对照模型

本次所用的算法为opencv中所自带的算法,opencv较新版本中(我使用的是2.4.8)提供了一个FaceRecognizer类,里面有相关的一些人脸识别的算法及函数接口,其中包括三种人脸识别算法(我们采用的是第三种)

  • 1.eigenface

  • 2.fisherface

  • 3.LBPHFaceRecognizer

LBP是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。

LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型。

我们在前一部分的同目录下创建一个Python文件,文件名为trainner.py,用于编写数据集生成脚本。同目录下,创建一个文件夹,名为trainner,用于存放我们训练后的识别器。

#-----建立模型、创建数据集-----#-----建立模型、创建数据集-----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')
复制代码

3.识别

检测,校验,输出其实都是识别的这一过程,与前两个过程不同,这是涉及实际使用的过程,所以我们把他整合放在一个统一的一个文件内。

#-----检测、校验并输出结果-----
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_SIMPLEXidnum = 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()
复制代码

现在,你的电脑就能识别出你来啦!

通过其他组合也可以实现开机检测等多种功能,你学会了吗?

下面是博主审稿时的测试结果以及出现的一些问题哦~希望对大家有帮助(呲牙.jpg)

测试结果:

博主审稿测试过程中出现的问题:

(1)版本问题

解决方法:经过博主无数次的失败,提示大家最好安装python2.7,可以直接使用 pip install numpy 以及pip install opencv-python安装numpy 以及对应python版本的opencv

(如果使用的是Anaconda2,pip相关命令可在开始菜单Anaconda2文件夹下的Anaconda Prompt中输入)

点击推文中给出的链接,将github中的文件下载后放至编译文件所在的文件夹下,并更改代码中的相关目录

(2)如果提示“module' object has no attribute 'face'”

解决方法:可以输入 pip install opencv-contrib-python解决,如果提示需要commission,可以在后面加上 --user,即 pip install opencv-contrib-python --user

用Python几行代码实现简单的人脸识别,10分钟完成(附源码)相关推荐

  1. 用Python实现简单的人脸识别,10分钟(附源码)

    前言 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的.这里介绍的是准确 ...

  2. python怎么判断真假_Python不超过10行代码就可实现人脸识别,教你辨别真假

    [[爱编程的南风]Python不超过10行代码就可实现人脸识别,教你辨别真假]http://toutiao.com/group/6518157903055045127/?iid=15906422033 ...

  3. 曝肝三天,两千行Python代码,制作B站视频下载工具(附源码)

    曝肝三天,两千行Python代码,制作B站视频下载工具(附源码) 文章目录 一.准备工作 二.预览 1.启动 2.解析 3.下载中 4.下载完成 5.结果 三.设计流程 1.bilibili_vide ...

  4. 第一行代码-android-第三版-pdf扫描-思维导图-课件-源码

    第一行代码-android-第三版-pdf扫描-思维导图-课件-源码 一帮公众号各种要你关注, 各种压缩包层层套娃要密码, 还要进群, 真他妈日了gou了,找了半天 分享给大家, 毫无套路! pdf扫 ...

  5. python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——增删改查篇

    python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)--增删改查篇 前言 一.主界面的样式 二.学生信息的增,删,改,查 1.增加学生信息 2.删除学生信息 3.更改学 ...

  6. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

  7. wallpaper代码_五行Python代码自动换你的电脑桌面壁纸(内附源码和exe)

    很多行友问行哥,Python能不能自动更换电脑壁纸呀,今天它来了 只需要一行代码,指定图片地址即可更换电脑桌面.加上壁纸文件夹路径,让你随机更换电脑桌面,带来不期而遇的新鲜.使用爬虫技术,自动下载壁纸 ...

  8. Android一行代码实现网络加载GIF闪图(附源码)

    最近项目有个需求是要从网络加载GIF闪图, 但是Android原生的ImageView并不支持Gif... 于是从网上看了些Dome, 发现总是有些这样那样的问题, 譬如: ☹ 没有缓存,还要自己写一 ...

  9. python编程人脸识别工具_几行代码带你实现人脸识别。Python 就是这么简单

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:Python编程与实战 阅读文本大概需要 11分钟. ...

最新文章

  1. 『数据库』数据库的查询可不是只知道Select就可以的--关系数据库系统的查询处理
  2. CF235D-Graph Game【LCA,数学期望】
  3. ShardingSphere(六) 读写分离之mysql 主从同步配置
  4. 监控和调整Linux网络协议栈的图解指南:接收数据
  5. Linux学习笔记(12)
  6. [导入]在windows下建立的自己cvsnt服务器
  7. Centos7 Zabbix监控部署
  8. VNC远程控制软件,五大容易上手的VNC远程控制软件
  9. Stream.min
  10. 【智慧旅游】以阿里飞猪为例浅谈产品升级策略
  11. MOOC中国大学自动评分js脚本
  12. 横幅(banner)设计的成功技术
  13. 【同一电脑原win用户信息迁移到新Win用户下python interpreter显示 no interpreter问题】
  14. CarSim仿真快速入门(十六)—CarSim传感器仿真之ADAS Sensor Objects (2)
  15. 一直无法进入BIOS
  16. JS通过 身份证号码 获取 出生年月日 和 性别
  17. 2017年第四八届C/C++ B组蓝桥杯省赛真题
  18. 担当力2:担责七步骤和担当力
  19. sklearn中的线性回归
  20. android OOBE创建方法

热门文章

  1. R语言使用ggpubr包的ggbarplot函数可视化分组条形图(grouped bar plot)、并添加误差条(error bar、误差条显示平均值+/-sd)、不添加填充色、添加jitter抖动
  2. R语言tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票月收益率数据条形图
  3. R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join)、配对图可视化(根据分类变量的值为散点图上的数据点添加颜色)
  4. R语言层次聚类(hierarchical clustering):特征缩放、抽取hclust中的聚类簇(cutree函数从hclust对象中提取每个聚类簇的成员)、基于主成分分析的进行聚类结果可视化
  5. 机器学习数据预处理之缺失值:后向填充
  6. 从马尔科夫链到吉布斯采样与PageRank
  7. 学术 科研 论文写作 生物信息学
  8. JFinal Nutz
  9. oracle 四分位函数,Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
  10. 医疗实体链接(标准化)论文解读 (附代码) A Lightweight Neural Model for Biomedical Entity Linking