10分钟学会使⽤python实现⼈脸识别(附源码)
⽬录
前⾔
⼀、⾸先
⼆、接下来
1.对照⼈脸获取
2. 通过算法建⽴对照模型
3.识别
前⾔
今天,我们⽤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_l') #待更改
#为即将录⼊的脸标记⼀个id
face_id = input('\n User data input,Look at the camera and wait ...')
#sampleNum⽤来计数样本数⽬
count = 0
while True:
#从摄像头读取图⽚
success,img = ad()
#转为灰度图⽚,减少程序符合,提⾼识别度
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为⼈脸标记画框
#成功框选则样本数增加
count += 1
#保存图像,把灰度图⽚看成⼆维数组来检测⼈脸区域
#(这⾥是建⽴了data的⽂件夹,当然也可以设置为其他路径或者调⽤数据库)
rectangle函数opencvcv2.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
#关闭摄像头,释放资源
cv2.destroyAllWindows()
经博主测试,在执⾏
“face_detector = cv2.CascadeClssifier(r'C:\Users\admin\Desktop\python\data\ haarcascade_l')”此语句时,实际路径中的⽬录名尽量不要有中⽂字符出现,否则容易报错。
这样,你的电脑就能看到你啦!
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_l')
#创建⼀个函数,⽤于从数据集⽂件夹中获取训练图⽚,并获取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('')
faces,ids = get_images_and_labels(path)
#训练模型
#保存模型
recog.save('l')
3.识别
检测,校验,输出其实都是识别的这⼀过程,与前两个过程不同,这是涉及实际使⽤的过程,所以我们把他整合放在⼀个统⼀的⼀个⽂件内。
#-----检测、校验并输出结果-----
import cv2
#准备好识别⽅法
recognizer = cv2.face.LBPHFaceRecognizer_create()
#使⽤之前训练好的模型
#再次调⽤⼈脸分类器
cascade_path = "haarcascade_l"
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.(3)
minH = 0.(4)
while True:
ret,img = ad()
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:
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
#释放资源
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
以上就是10分钟学会使⽤python实现⼈脸识别(附源码)的详细内容,更多关于python ⼈脸识别的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。