日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器

發(fā)布時(shí)間:2023/12/19 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

想要能人臉識(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。