人臉識別技術(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瀏覽量
14723 -
傅立葉變換
+關(guān)注
關(guān)注
3文章
105瀏覽量
32801 -
OpenCV
+關(guān)注
關(guān)注
32文章
642瀏覽量
42487 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86277 -
PIL
+關(guān)注
關(guān)注
0文章
19瀏覽量
8791
原文標題:OpenCV人臉識別系統(tǒng)開發(fā)(一):OpenCV人臉監(jiān)測與識別
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
樹莓派上使用OpenCV和Python實現(xiàn)實時人臉檢測
基于openCV的人臉檢測系統(tǒng)的設(shè)計
【NanoPi2申請】基于opencv的人臉識別門禁系統(tǒng)
【LeMaker Guitar申請】基于LeMaker Guitar的人臉識別系統(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人臉識別

評論