python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器
想要能人臉識別,我們需要訓練一個識別器處理。訓練的話就需要之前已經標注好的訓練集,在前一篇文章中,我們創建了一個已經標注好的訓練集。現在,是時候用這個訓練集來訓練一個人臉識別器了。當然,是用OpenCV Python。
準備
首先,我們在(前一篇文章的)同目錄下創建一個叫Python文件,名為trainner.py,用于編寫數據集生成腳本。同目錄下,創建一個文件夾,名為trainner,用于存放我們訓練后的識別器。
現在,項目目錄大概如此:
其他亂七八糟的文件、目錄,都是之前的文章中創建的。
在開始之前,我們先安裝一個Python庫,Pillow:
pip install pillow
開始Coding
導入庫
編寫訓練程序需要先做是:
導入opencv庫
導入os庫,用于方法文件
導入numpy庫,用于計算
導入pillow庫,用于處理圖像
其實就是這樣:
import cv2
import os
import numpy as np
from PIL import Image
現在我們初始化識別器和人臉檢測器:
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 有可能是 recognizer = cv2.createLBPHFaceRecognizer()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
如果face.LBPHFaceRecognizer_create或createLBPHFaceRecognizer顯示不存在,則需要下載opencv-contrib-python:
pip install opencv-contrib-python
當然用IDE的也行:
載入訓練數據
恩,現在我們來創建一個函數,用于從數據集文件夾中獲取訓練圖片,然后從圖片的文件名中獲取到這個素材相應的id。需要remind的是,根據前文,圖片的格式是User.id.samplenumber。
給函數起個名字,就叫get_images_and_labels吧(Python不建議用駝峰),然后參數需要有素材的文件夾:
def get_images_and_labels(path):
在函數中,我們需要的做的有:
從數據集文件夾中載入訓練圖片
獲取到人臉和id
整理成list并返回
獲取圖片:
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:
image = Image.open(image_path).convert('L')
image_np = np.array(image, 'uint8')
image_id = int(os.path.split(image_path)[-1].split(".")[1])
faces = detector.detectMultiScale(image_np)
for (x, y, w, h) in faces:
face_samples.append(image_np[y:y + h, x:x + w])
ids.append(image_id)
以上代碼,使用了Image.open(image_path).convert(‘L’)通過圖片路徑并將其轉換為灰度圖片。
接下來我們通過image_np = np.array(image, 'uint8')將圖片轉換成了Numpy數組,Numpy數組的邏輯結構和普通的數組無異,但是是經過優化的。
為了獲取到id,我們將圖片的路徑分裂一下并獲取相關信息,即image_id = int(os.path.split(image_path)[-1].split(".")[1])
接下來的一個循環for (x, y, w, h) in faces則是將圖片和id都添加在list中。
再return一下即可。
訓練
差不多完成了,現在我們調用一下這個函數,然后將我們的數據喂給識別器去訓練吧。
faces, Ids = get_images_and_labels('dataSet')
recognizer.train(faces, np.array(Ids))
recognizer.save('trainner/trainner.yml')
現在只要我們運行這些代碼,程序就會在trainner文件夾中創建一個trainner.yml文件。
這個yml文件,存著我們的訓練好的數據,以后識別會用到的。
完整代碼
import cv2
import os
import numpy as np
from PIL import Image
# recognizer = cv2.createLBPHFaceRecognizer()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()
def get_images_and_labels(path):
image_paths = [os.path.join(path, f) for f in os.listdir(path)]
face_samples = []
ids = []
for image_path in image_paths:
image = Image.open(image_path).convert('L')
image_np = np.array(image, 'uint8')
if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
continue
image_id = int(os.path.split(image_path)[-1].split(".")[1])
faces = detector.detectMultiScale(image_np)
for (x, y, w, h) in faces:
face_samples.append(image_np[y:y + h, x:x + w])
ids.append(image_id)
return face_samples, ids
faces, Ids = get_images_and_labels('dataSet')
recognizer.train(faces, np.array(Ids))
recognizer.save('trainner/trainner.yml')
先這樣吧
若有錯誤之處請指出,更多地關注煎魚。
總結
以上是生活随笔為你收集整理的python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三坐标测量圆直径_RationalDMI
- 下一篇: python输入一个字母_python