人臉識別技術(shù)是基于人的臉部特征,對輸入的人臉圖像或者視頻流,首先判斷其是否存在人臉,如果存在人臉,則進一步的給出每個臉的位置、大小和各個主要面部器官的位置信息。
并依據(jù)這些信息,進一步提取每個人臉中所蘊涵的身份特征,并將其與已知的人臉進行對比,從而識別每個人臉的身份。
1. 人臉識別步驟
梳理一下人臉識別實現(xiàn)的步驟,主要由人臉采集,預(yù)處理,特征提取,匹配與識別四個步驟組成

2. 人臉監(jiān)測
人臉識別首先應(yīng)該先實現(xiàn)人臉監(jiān)測,要先在一張圖片中捕獲到人臉,再去識別圖片中的人臉和數(shù)據(jù)庫中人臉數(shù)據(jù)進行比較。
人臉檢測的最常見方法是使用"Haar 分類器"?;?Haar 功能的級聯(lián)分類器的對象檢測是 Paul Viola 和 Michael Jones 提出的一種有效的對象檢測、基于機器學(xué)習(xí)的方法。
進行人臉檢測需要大量的圖像數(shù)據(jù)來訓(xùn)練分類器,然后從中提取特征,使用OpenCV可以進行人臉的訓(xùn)練和推理,也可以訓(xùn)練自己的分類器為任何對象進行分類,同時OpenCV包含許多預(yù)先訓(xùn)練過的分類器,我們只需要調(diào)用OpenCV的接口就可以。
代碼如下:
#導(dǎo)入cv模塊 import cv2 as cv #檢測函數(shù) def face_detect(): gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY) face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml') face = face_detect.detectMultiScale(gary) for x,y,w,h in face: cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2) cv.imshow('result',img) #讀取圖像 img = cv.imread('face2.jpg') #檢測函數(shù) face_detect() #等待 while True: if ord('q') == cv.waitKey(0): break #釋放內(nèi)存 cv.destroyAllWindows()
在代碼中,首先對讀取的圖像進行了灰度處理,然后引入級聯(lián)分類器文件,通過detectMultiScale()函數(shù)來調(diào)用分類器功能
通過rectangle()函數(shù)來標記圖像中的面孔,如果發(fā)現(xiàn)人臉,它會返回檢測到的面部位置,作為左上角(x,y)的矩形,并將”w”作為寬度,將”h”作為高度 。
運行效果如下:

3. 錄入人臉功能模塊
導(dǎo)入第三方庫:
import cv2 import os from PIL import Image import numpy as np
OS:主要是對文件和文件夾進行操作,在Python中對?件和?件夾的操作要借助os模塊??的相關(guān)功能。
PIL:python中最常用的圖形處理庫,PIL支持圖像存儲、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對圖像的縮放、裁剪、疊加以及圖像添加線條、圖像和文字等操作。
NumPy:一個由多維數(shù)組對象和用于處理數(shù)組的例程集合組成的庫??梢詧?zhí)行以下操作:數(shù)組的算數(shù)和邏輯運算。傅立葉變換和用于圖形操作的例程。與線性代數(shù)有關(guān)的操作。NumPy 擁有線性代數(shù)和隨機數(shù)生成的內(nèi)置函數(shù)。
存儲人臉數(shù)據(jù):
facesSamples=[]
存儲姓名數(shù)據(jù):
ids=[]
存儲圖片信息:
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
加載分類器:
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml'
遍歷列表中的圖片:
for imagePath in imagePaths:
將打開的圖片灰度化:
PIL_img = Image.open(imagePath).convert('L')
將圖片轉(zhuǎn)化為數(shù)組:
img_numpy = np.array(PIL_img,'uint8')
獲取圖片人臉特征:
faces = face_detector.detectMultiScale(img_numpy)
獲取每一張拍攝圖片的id與姓名:
id = int(os.path.split(imagePath)[1].split('.')[0])
做判斷,預(yù)防拍攝無面容圖片:
for x,y,w,h in faces: ids.append(id) facesSamples.append(img_numpy[y:y+h,x:x+w])
打印面部特征與id,并返回數(shù)據(jù):
print('id',id)
print('fs:',facesSamples)
return facesSamples,ids
調(diào)用圖片路徑:
path='./data/jm/'
獲取圖像數(shù)組和id標簽數(shù)組和姓名:
faces,ids=getImageAndLabels(path)
加載識別器:
recognizer = cv2.face.LBPHFaceRecognizer_create()
訓(xùn)練數(shù)據(jù):
recognizer.train(faces,np.array(ids))
保存面部特征到文件夾:
recognizer.write('tupian/tupian.yml')
完整代碼如下:
import os
import cv2
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
#檢測人臉
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
#打印數(shù)組imagePaths
print('數(shù)據(jù)排列:',imagePaths)
#遍歷列表中的圖片
for imagePath in imagePaths:
#打開圖片,黑白化
PIL_img=Image.open(imagePath).convert('L')
#將圖像轉(zhuǎn)換為數(shù)組,以黑白深淺
# PIL_img = cv2.resize(PIL_img, dsize=(400, 400))
img_numpy=np.array(PIL_img,'uint8')
#獲取圖片人臉特征
faces = face_detector.detectMultiScale(img_numpy)
#獲取每張圖片的id和姓名
id = int(os.path.split(imagePath)[1].split('.')[0])
#預(yù)防無面容照片
for x,y,w,h in faces:
ids.append(id)
facesSamples.append(img_numpy[y:y+h,x:x+w])
print('id:', id)
print('fs:', facesSamples)
return facesSamples,ids
if __name__ == '__main__':
#圖片路徑
path='./data/jm/'
#獲取圖像數(shù)組和id標簽數(shù)組和姓名
faces,ids=getImageAndLabels(path)
#獲取訓(xùn)練對象
recognizer=cv2.face.LBPHFaceRecognizer_create()
#recognizer.train(faces,names)#np.array(ids)
recognizer.train(faces,np.array(ids))
#保存文件
recognizer.write('trainer/trainer.yml')
#save_to_file('names.txt',names)
4. 人臉識別
人臉識別器已經(jīng)完成,現(xiàn)在要在相機上捕獲人臉。如果此人之前拍攝并訓(xùn)練過他的臉,識別器將做出預(yù)測,返回ID名。
使用剛剛訓(xùn)練的識別器模型(加載trainer.yml),然后就和剛剛“人臉分類器”的步驟一樣去進行人臉識別,并且recognizer.predict將返回每張圖片識別后的匹配率。
人臉識別實現(xiàn)函數(shù)如下:
def face_detect(img):
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉(zhuǎn)換為灰度
face_detector=cv2.CascadeClassifier(r'haarcascade_frontalface_alt2.xml')
face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))
#face=face_detector.detectMultiScale(gray)
for x,y,w,h in face:
cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
# 人臉識別
ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
#print('標簽id:',ids,'置信評分:', confidence)
if confidence > 80:
cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
else:
cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
cv2.imshow('result',img)
添加名字標簽:
#名字標簽
def name():
path = './tupian/'
# names = []
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
for imagePath in imagePaths:
name = str(os.path.split(imagePath)[1].split('.',2)[1])
names.append(name)
加載監(jiān)控或已保存下來的視頻:
#加載視頻
cap=cv2.VideoCapture(8)
name()
while True:
flag,frame=cap.read()
if not flag:
break
face_detect_demo(frame)
if ord(' ') == cv2.waitKey(10):
break
#釋放內(nèi)存+視頻
cv2.destroyAllWindows()
cap.release()
最終效果如下


5. 遇到的問題
旭日x3派并沒有opencv-contrib-python庫,需要通過
pip install opencv-contrib-python
進行安裝
用OPENCV出現(xiàn)這樣的錯誤:
cpp error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
這個錯誤可能是因為圖片路徑形式書寫錯誤,圖片的格式不對,圖片的數(shù)量不一致,路徑中存在中文導(dǎo)致
審核編輯:劉清
-
人臉識別技術(shù)
+關(guān)注
關(guān)注
0文章
127瀏覽量
15180 -
傅立葉變換
+關(guān)注
關(guān)注
3文章
105瀏覽量
33258 -
OpenCV
+關(guān)注
關(guān)注
33文章
652瀏覽量
44774 -
python
+關(guān)注
關(guān)注
57文章
4876瀏覽量
90013 -
PIL
+關(guān)注
關(guān)注
0文章
19瀏覽量
8962
原文標題:OpenCV人臉識別系統(tǒng)開發(fā)(一):OpenCV人臉監(jiān)測與識別
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
樹莓派上使用OpenCV和Python實現(xiàn)實時人臉檢測
基于LockAI視覺識別模塊:C++人臉識別
基于openCV的人臉檢測系統(tǒng)的設(shè)計
【NanoPi2申請】基于opencv的人臉識別門禁系統(tǒng)
【LeMaker Guitar試用體驗】之基于Python下的人臉識別系統(tǒng)【結(jié)貼】
LabVIE人臉識別
【Raspberry Pi 3試用體驗】+Opencv+python的人臉識別
【AI技能解析】人臉識別是怎么做到的?
基于QT+OpenCV的人臉識別-米爾iMX8M Plus開發(fā)板的項目應(yīng)用
【飛凌RK3568開發(fā)板試用體驗】使用OpenCV進行人臉識別
基于SeetaFace2和OpenCV實現(xiàn)人臉識別
使用DFRobot LattePanda進行OpenCV人臉識別
OpenCV人臉監(jiān)測與識別步驟
評論