python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器
想要能人臉識(shí)別,我們需要訓(xùn)練一個(gè)識(shí)別器處理。訓(xùn)練的話就需要之前已經(jīng)標(biāo)注好的訓(xùn)練集,在前一篇文章中,我們創(chuàng)建了一個(gè)已經(jīng)標(biāo)注好的訓(xùn)練集。現(xiàn)在,是時(shí)候用這個(gè)訓(xùn)練集來(lái)訓(xùn)練一個(gè)人臉識(shí)別器了。當(dāng)然,是用OpenCV Python。
準(zhǔn)備
首先,我們?cè)?前一篇文章的)同目錄下創(chuàng)建一個(gè)叫Python文件,名為trainner.py,用于編寫(xiě)數(shù)據(jù)集生成腳本。同目錄下,創(chuàng)建一個(gè)文件夾,名為trainner,用于存放我們訓(xùn)練后的識(shí)別器。
現(xiàn)在,項(xiàng)目目錄大概如此:
其他亂七八糟的文件、目錄,都是之前的文章中創(chuàng)建的。
在開(kāi)始之前,我們先安裝一個(gè)Python庫(kù),Pillow:
pip install pillow
開(kāi)始Coding
導(dǎo)入庫(kù)
編寫(xiě)訓(xùn)練程序需要先做是:
導(dǎo)入opencv庫(kù)
導(dǎo)入os庫(kù),用于方法文件
導(dǎo)入numpy庫(kù),用于計(jì)算
導(dǎo)入pillow庫(kù),用于處理圖像
其實(shí)就是這樣:
import cv2
import os
import numpy as np
from PIL import Image
現(xiàn)在我們初始化識(shí)別器和人臉檢測(cè)器:
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
當(dāng)然用IDE的也行:
載入訓(xùn)練數(shù)據(jù)
恩,現(xiàn)在我們來(lái)創(chuàng)建一個(gè)函數(shù),用于從數(shù)據(jù)集文件夾中獲取訓(xùn)練圖片,然后從圖片的文件名中獲取到這個(gè)素材相應(yīng)的id。需要remind的是,根據(jù)前文,圖片的格式是User.id.samplenumber。
給函數(shù)起個(gè)名字,就叫g(shù)et_images_and_labels吧(Python不建議用駝峰),然后參數(shù)需要有素材的文件夾:
def get_images_and_labels(path):
在函數(shù)中,我們需要的做的有:
從數(shù)據(jù)集文件夾中載入訓(xùn)練圖片
獲取到人臉和id
整理成list并返回
獲取圖片:
image_paths=[os.path.join(path, f) for f in os.listdir(path)]
新建兩個(gè)list用于存放:
face_samples=[]
ids=[]
遍歷圖片路徑,導(dǎo)入圖片和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’)通過(guò)圖片路徑并將其轉(zhuǎn)換為灰度圖片。
接下來(lái)我們通過(guò)image_np = np.array(image, 'uint8')將圖片轉(zhuǎn)換成了Numpy數(shù)組,Numpy數(shù)組的邏輯結(jié)構(gòu)和普通的數(shù)組無(wú)異,但是是經(jīng)過(guò)優(yōu)化的。
為了獲取到id,我們將圖片的路徑分裂一下并獲取相關(guān)信息,即image_id = int(os.path.split(image_path)[-1].split(".")[1])
接下來(lái)的一個(gè)循環(huán)for (x, y, w, h) in faces則是將圖片和id都添加在list中。
再return一下即可。
訓(xùn)練
差不多完成了,現(xiàn)在我們調(diào)用一下這個(gè)函數(shù),然后將我們的數(shù)據(jù)喂給識(shí)別器去訓(xùn)練吧。
faces, Ids = get_images_and_labels('dataSet')
recognizer.train(faces, np.array(Ids))
recognizer.save('trainner/trainner.yml')
現(xiàn)在只要我們運(yùn)行這些代碼,程序就會(huì)在trainner文件夾中創(chuàng)建一個(gè)trainner.yml文件。
這個(gè)yml文件,存著我們的訓(xùn)練好的數(shù)據(jù),以后識(shí)別會(huì)用到的。
完整代碼
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')
先這樣吧
若有錯(cuò)誤之處請(qǐng)指出,更多地關(guān)注煎魚(yú)。
總結(jié)
以上是生活随笔為你收集整理的python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三坐标测量圆直径_RationalDMI
- 下一篇: 仅售2999元起!一文看懂魅族20系列