一篇文章“手把手”教你學會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()
至此,應該就能識别出你了,大功告成!
記得三連!