人臉識(shí)別技術(shù)是基于人的臉部特征,對(duì)輸入的人臉圖像或者視頻流,首先判斷其是否存在人臉,如果存在人臉,則進(jìn)一步的給出每個(gè)臉的位置、大小和各個(gè)主要面部器官的位置信息。
并依據(jù)這些信息,進(jìn)一步提取每個(gè)人臉中所蘊(yùn)涵的身份特征,并將其與已知的人臉進(jìn)行對(duì)比,從而識(shí)別每個(gè)人臉的身份。
1. 人臉識(shí)別步驟
梳理一下人臉識(shí)別實(shí)現(xiàn)的步驟,主要由人臉采集,預(yù)處理,特征提取,匹配與識(shí)別四個(gè)步驟組成
2. 人臉監(jiān)測
人臉識(shí)別首先應(yīng)該先實(shí)現(xiàn)人臉監(jiān)測,要先在一張圖片中捕獲到人臉,再去識(shí)別圖片中的人臉和數(shù)據(jù)庫中人臉數(shù)據(jù)進(jìn)行比較。
人臉檢測的最常見方法是使用"Haar 分類器"?;?Haar 功能的級(jí)聯(lián)分類器的對(duì)象檢測是 Paul Viola 和 Michael Jones 提出的一種有效的對(duì)象檢測、基于機(jī)器學(xué)習(xí)的方法。
進(jìn)行人臉檢測需要大量的圖像數(shù)據(jù)來訓(xùn)練分類器,然后從中提取特征,使用OpenCV可以進(jìn)行人臉的訓(xùn)練和推理,也可以訓(xùn)練自己的分類器為任何對(duì)象進(jìn)行分類,同時(shí)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()
在代碼中,首先對(duì)讀取的圖像進(jìn)行了灰度處理,然后引入級(jí)聯(lián)分類器文件,通過detectMultiScale()函數(shù)來調(diào)用分類器功能
通過rectangle()函數(shù)來標(biāo)記圖像中的面孔,如果發(fā)現(xiàn)人臉,它會(huì)返回檢測到的面部位置,作為左上角(x,y)的矩形,并將”w”作為寬度,將”h”作為高度 。
運(yùn)行效果如下:
3. 錄入人臉功能模塊
導(dǎo)入第三方庫:
import cv2 import os from PIL import Image import numpy as np
OS:主要是對(duì)文件和文件夾進(jìn)行操作,在Python中對(duì)?件和?件夾的操作要借助os模塊??的相關(guān)功能。
PIL:python中最常用的圖形處理庫,PIL支持圖像存儲(chǔ)、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對(duì)圖像的縮放、裁剪、疊加以及圖像添加線條、圖像和文字等操作。
NumPy:一個(gè)由多維數(shù)組對(duì)象和用于處理數(shù)組的例程集合組成的庫??梢詧?zhí)行以下操作:數(shù)組的算數(shù)和邏輯運(yùn)算。傅立葉變換和用于圖形操作的例程。與線性代數(shù)有關(guān)的操作。NumPy 擁有線性代數(shù)和隨機(jī)數(shù)生成的內(nèi)置函數(shù)。
存儲(chǔ)人臉數(shù)據(jù):
facesSamples=[]
存儲(chǔ)姓名數(shù)據(jù):
ids=[]
存儲(chǔ)圖片信息:
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,并返回?cái)?shù)據(jù):
print('id',id) print('fs:',facesSamples) return facesSamples,ids
調(diào)用圖片路徑:
path='./data/jm/'
獲取圖像數(shù)組和id標(biāo)簽數(shù)組和姓名:
faces,ids=getImageAndLabels(path)
加載識(shí)別器:
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標(biāo)簽數(shù)組和姓名 faces,ids=getImageAndLabels(path) #獲取訓(xùn)練對(duì)象 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. 人臉識(shí)別
人臉識(shí)別器已經(jīng)完成,現(xiàn)在要在相機(jī)上捕獲人臉。如果此人之前拍攝并訓(xùn)練過他的臉,識(shí)別器將做出預(yù)測,返回ID名。
使用剛剛訓(xùn)練的識(shí)別器模型(加載trainer.yml),然后就和剛剛“人臉分類器”的步驟一樣去進(jìn)行人臉識(shí)別,并且recognizer.predict將返回每張圖片識(shí)別后的匹配率。
人臉識(shí)別實(shí)現(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) # 人臉識(shí)別 ids, confidence = recogizer.predict(gray[y:y + h, x:x + w]) #print('標(biāo)簽id:',ids,'置信評(píng)分:', 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)
添加名字標(biāo)簽:
#名字標(biāo)簽 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
進(jìn)行安裝
用OPENCV出現(xiàn)這樣的錯(cuò)誤:
cpp error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
這個(gè)錯(cuò)誤可能是因?yàn)閳D片路徑形式書寫錯(cuò)誤,圖片的格式不對(duì),圖片的數(shù)量不一致,路徑中存在中文導(dǎo)致
審核編輯:劉清
-
人臉識(shí)別技術(shù)
+關(guān)注
關(guān)注
0文章
127瀏覽量
14681 -
傅立葉變換
+關(guān)注
關(guān)注
3文章
105瀏覽量
32732 -
OpenCV
+關(guān)注
關(guān)注
31文章
642瀏覽量
42291 -
python
+關(guān)注
關(guān)注
56文章
4822瀏覽量
85933 -
PIL
+關(guān)注
關(guān)注
0文章
19瀏覽量
8759
原文標(biāo)題:OpenCV人臉識(shí)別系統(tǒng)開發(fā)(一):OpenCV人臉監(jiān)測與識(shí)別
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
樹莓派上使用OpenCV和Python實(shí)現(xiàn)實(shí)時(shí)人臉檢測
基于openCV的人臉檢測系統(tǒng)的設(shè)計(jì)
【NanoPi2申請(qǐng)】基于opencv的人臉識(shí)別門禁系統(tǒng)
【LeMaker Guitar申請(qǐng)】基于LeMaker Guitar的人臉識(shí)別系統(tǒng)
【LeMaker Guitar試用體驗(yàn)】之基于Python下的人臉識(shí)別系統(tǒng)【結(jié)貼】
LabVIE人臉識(shí)別
【Raspberry Pi 3試用體驗(yàn)】+Opencv+python的人臉識(shí)別
【AI技能解析】人臉識(shí)別是怎么做到的?
基于QT+OpenCV的人臉識(shí)別-米爾iMX8M Plus開發(fā)板的項(xiàng)目應(yīng)用
【飛凌RK3568開發(fā)板試用體驗(yàn)】使用OpenCV進(jìn)行人臉識(shí)別
基于SeetaFace2和OpenCV實(shí)現(xiàn)人臉識(shí)別
使用DFRobot LattePanda進(jìn)行OpenCV人臉識(shí)別

評(píng)論