天天看點

“手把手”教你學會Python人臉識别

一篇文章“手把手”教你學會Python人臉識别

文章目錄

      • 1.準備工作
    • 2.開始操作

Python作為一種火爆的語言,“啥都能幹”,當然少不了用Python實作人臉識别。

廢話不多說,開始。

1.準備工作

環境:

vscode

Win10 20H2

Python 3.7.8

Python有很多外部子產品,使用以下指令安裝OpenCV

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ opencv-python
           

我們還要用到LBPH識别器,它由OpenCV擴充庫提供,需要提前安裝此子產品。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ opencv-contrib-python
           

安裝完成後,在你python安裝目錄下的\Lib\site-packages\cv2\data\目錄下找到haarcascade_frontalface_default.xml并将其複制到程式工作目錄下。(很重要!)

2.開始操作

從視訊中“認識”一個人,需要采集足夠多的人臉圖像資訊讓機器訓練,過程如下所示:

人臉資料采集-------->機器訓練并生成訓練模型檔案

一.人臉資料采集。

通過攝像頭掃描捕捉需要的人臉圖像資訊,在程式所在的目錄建立一個“Facedata”檔案夾, (F大寫,沒有雙引号!) 用來存放采集的人臉資料。代碼如下:

import cv2
import os

#調用内置攝像頭
cap = cv2.VideoCapture(0)
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_id = input('Enter user id:')
print('請看着攝像頭并等待幾秒')

count = 0
while True:
    sucess, img = cap.read()
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray_img, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0))
        cv2.imwrite("Facedata/User." + str(face_id) + '.' + str(count) + '.jpg', gray_img[y: y+h, x: x+w])
        cv2.imshow('face', img)
        count = count+1
        if count > 500:
            break
#關閉并銷毀所有攝像頭
cap.release()
cv2.destoryAllWindows()

           

程式運作結果如下,先要使用者設定一個人臉圖檔标簽。

輸入“0”并按Enter鍵後,攝像頭開始自動采集視訊中的人臉圖像并儲存到“Facedata”檔案夾中。

二.人臉資料訓練。

在程式所在目錄建立一個“face_trainer”檔案夾,存放訓練後的模型檔案。代碼如下:

import numpy as np
from PIL import Image
import os
import cv2

path = 'Facedata'
recognizer = cv2.face.LBPHFaceRecognizer_create()
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

def getImagesAndLabels(path):
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    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 = faceCascade.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'face_trainer\trainer.yml')
print("{0} faces trained.".format(len(np.unique(ids))))

           

最後,導入訓練好的模型開始識别。

import cv2
font = cv2.FONT_HERSHEY_SIMPLEX
recognizer = cv2.face.LBPHFaceRecognizer_create()

recognizer.read('face_trainer/trainer.yml')
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
idnum = 0

names = ['張三', '李四'] # 在這裡更改名字,注意順序!
cam = cv2.VideoCapture(0)
while True:
    sucess, img = cam.read()
    gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    faces = faceCascade.detectMultiScale(gray_img, scaleFactor=1.2, minNeighbors=5, minSize=(32, 32))

    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_img[y:y+h, x:x+w])
        if confidence < 100:
            idnum = names[idnum]
            confidence = '{0}%'.format(round(100-confidence))
        else:
            idnum = 'unknown'
            confidence = '{0}%'.format(round(100-confidence))
        cv2.putText(img, str(idnum), (x+5, y-5), font, 1, (0, 255, 0), 1)
        cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (0, 0, 0), 1)
        cv2.imshow("face", img)
        if cv2.waitKey(1) & 0xFF == 27:
            break
cam.release()
cv2.destroyAllWindows()

           

至此,應該就能識别出你了,大功告成!

記得三連!