如何使用Python制作人脸识别系统(2022/5/28版)持续更新

首先,你必须安装Anaconda Individual Edition。链接如下:Anaconda | Individual Edition

注意:如果你有管理员权限,请安装给ALL Users!!!亲测有效,否则报错!

在安装完毕后,打开Anaconda。

有的网友和我说他们不想安装anaconda, 那么小Q在此给出一个解决方法:

1. 去python.org上下载Python

2. 在Python里运行代码块即可

不知可不可以,请各位不想装Anaconda的大佬们尝试后留言~谢谢!

或者可以在以下链接里写上你的答案哦~

 投票链接:Anaconda安装小调查

点击第一个按钮CMD.exe Prompt

 输入:

pip install numpy -i https://mirrors.aliyun.com/pypi/simple
pip install matplotlib -i https://mirrors.aliyun.com/pypi/simple
pip install pandas -i https://mirrors.aliyun.com/pypi/simple
pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple
pip install tensorflow -i https://mirrors.aliyun.com/pypi/simple
pip install keras -i https://mirrors.aliyun.com/pypi/simple
pip install opencv-contrib-python -i https://mirrors.aliyun.com/pypi/simple

如果报错,请在-i前写上--users !

然后,打开JupyterNotebook

 在拷贝代码前,先在源文件里建立data文件夹和training文件夹。否则,会存储失败

#-----获取人脸样本-----
import cv2
 
#调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
camera = cv2.VideoCapture(0)
#调用人脸分类器,要根据实际路径调整3
face_classifier = cv2.CascadeClassifier(
    cv2.data.haarcascades + 
    'haarcascade_frontalface_default.xml')
#为即将录入的脸标记一个id
face_id = input('\n User data input, Look at the camera and wait ...')
#sampleNum用来计数样本数目
count = int(input("Please enter start index: "))
tot = count + 100
#count是上一个文件的结束号码,如果没有就写0 
while True:    
    #从摄像头读取图片
    success,img = camera.read()    
    #转为灰度图片,减少程序符合,提高识别度
    if success is True: 
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    else:   
        break
    #检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸
    #其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighbors
    faces = face_classifier.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的文件夹,当然也可以设置为其他路径或者调用数据库)
        img_name = "data/User."+str(face_id)+'.'+str(count)+'.jpg'
        print(img_name)
        cv2.imwrite(img_name,gray[y:y+h,x:x+w]) 
        #显示图片
        cv2.imshow('image',img)       
        #保持画面的连续。waitkey方法可以绑定按键保证画面的收放,通过q键退出摄像
           
    if cv2.waitKey(1) == ord('q'):
        break        
        #或者得到100个样本后退出摄像,这里可以根据实际情况修改数据量
        #实际测试后100张的效果是比较理想的
    elif count >= tot:
        break
 
 #关闭摄像头,释放资源

camera.release()
cv2.destroyAllWindows()

注:如果你想要增加准确率,请将100改为800, 更改后代码如下:

#-----获取人脸样本-----
import cv2
 
#调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
camera = cv2.VideoCapture(0)
#调用人脸分类器,要根据实际路径调整3
face_classifier = cv2.CascadeClassifier(
    cv2.data.haarcascades + 
    'haarcascade_frontalface_default.xml')  #待更改
#为即将录入的脸标记一个id
face_id = input('\n User data input, Look at the camera and wait ...')
#sampleNum用来计数样本数目
count = int(input("Please enter start index: "))
tot = count + 800
 
while True:    
    #从摄像头读取图片
    success,img = camera.read()    
    #转为灰度图片,减少程序符合,提高识别度
    if success is True: 
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    else:   
        break
    #检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸
    #其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighbors
    faces = face_classifier.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的文件夹,当然也可以设置为其他路径或者调用数据库)
        img_name = "data/User."+str(face_id)+'.'+str(count)+'.jpg'
        print(img_name)
        cv2.imwrite(img_name,gray[y:y+h,x:x+w]) 
        #显示图片
        cv2.imshow('image',img)       
        #保持画面的连续。waitkey方法可以绑定按键保证画面的收放,通过q键退出摄像
           
    if cv2.waitKey(1) == ord('q'):
        break        
        #或者得到800个样本后退出摄像,这里可以根据实际情况修改数据量,实际测试后800张的效果是比较理想的
    elif count >= tot:
        break
 
 #关闭摄像头,释放资源

camera.release()
cv2.destroyAllWindows()

运行上述代码,在第一个输入框里会看见如下结果:

 输入你的名字后敲一个enter。记住,不要写任何中文字符,否则后面的识别和训练的过程会报错!

接着输入0,如果你要两个人,需要分两次运行。一次输入0,第二次输入100。三个人就以此类推【希望没被我绕晕QAQ】

接着就看着摄像头,慢慢等待指示灯关闭。

 这是一个5人的样例,各位大佬请过目QAQ

然后,在下一个Cell黏贴下列代码

#-----建立模型、创建数据集-----#-----建立模型、创建数据集-----
 
import os
import cv2
import numpy as np
from PIL import Image
#导入pillow库,用于处理图像
#设置之前收集好的数据文件路径
path = 'data'

#初始化识别的方法
recog = cv2.face_LBPHFaceRecognizer.create()

name_map = {'Unknown':0,'在这里输入第一个人的名字(英文)':1,'第二个人':2,'第三个人':3,'第四个人':4,"第五个人":5,"第六个人":6} #如果人数太多,可以删除一部分。如果太少也可以添加一部分
 
#调用熟悉的人脸分类器
detector = cv2.CascadeClassifier(
    cv2.data.haarcascades + 
    '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 = []
    #i = 0

    #遍历图片路径,导入图片和id添加到list中
    for image_path in image_paths:
        #print(i, image_path)
        #i += 1
         
        #通过图片路径将其转换为灰度图片
        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,将图片和路径分裂并获取
        #print(image_path)
        #print(os.path.split(image_path))
        #print(os.path.split(image_path)[-1].split("."))
        #print(os.path.split(image_path)[-1].split(".")[1])
        #id = int(os.path.split(image_path)[-1].split(".")[-2])
        id = 3
        name = os.path.split(image_path)[-1].split(".")[-3]
        if name in name_map:
            id = name_map[name]
        #这部分的作用是删除读取失败的文件
        #print(id)
        faces = detector.detectMultiScale(img_np,1.3,5)
 
        #将获取的图片和id添加到list中
        for(x,y,w,h) in faces:
            face_samples.append(img_np[y:y+h,x:x+w])
            ids.append(id)
        #print(len(face_samples))
    return face_samples,ids
 
#调用函数并将数据喂给识别器训练
print('Training...')
faces,ids = get_images_and_labels(path)
#训练模型
recog.train(faces,np.array(ids))
#保存模型
recog.save('trainner/trainner.yml')
print("Success!You have finished training. Go on and Continue!")

 好啦,当你运行完后,会看见一下情况:

接着,输入:

#-----检测、校验并输出结果-----
import cv2
 
#准备好识别方法
recognizer = cv2.face.LBPHFaceRecognizer_create()
 
#使用之前训练好的模型
recognizer.read('trainner/trainner.yml')
 
#再次调用人脸分类器
#cascade_path = "haarcascade_frontalface_default.xml" 
#face_cascade = cv2.CascadeClassifier(cascade_path)
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 
    'haarcascade_frontalface_default.xml') 
#加载一个字体,用于识别后,在图片上标注出对象的名字
font = cv2.FONT_HERSHEY_SIMPLEX
 
idnum = 0
#设置好与ID号码对应的用户名,如下,如0对应的就是初始
 
names = ['Unknown', '第一个人','第二个人','第三个人', '第四个人',"第四个人","第五个人"]
 
#调用摄像头
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)
    #识别人脸
    #print(gray)
    faces = face_cascade.detectMultiScale(
            gray,
            scaleFactor = 1.3,
            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
 
#释放资源
    if cv2.waitKey(1) == ord('q'):
        break
cam.release()
cv2.destroyAllWindows()

 接着就可以在屏幕里看见你啦!

PS:如果没看见窗口要么就是在任务栏,要么就是你的电脑CPU不要太好。

CPUi5第10代及以上(其他的CPU没有测试过)
电脑Windows10及以上,最好不要Windows11

最后,祝你运行成功!

最新内容1:(更新时间2022/2/12 22:00)

前面好像忘记放上一张效果图了, 效果如下:

最后的最后, 我必须说: 虽然CSDN上很多的都是错误代码, 但是我确保这个教程是正确的 (至少在1年内吧)。

声明

 后续还会有关于AI的其他文章会放在Python和AI这两个专栏里, 全部免费! :-)

玩Python的小Q

2022/2/12


 

  • 17
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值