一種簡(jiǎn)單而智能的方法:Python也能進(jìn)行面部識(shí)別
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。
本文將介紹圖像處理中的一些重要概念,除了具體解釋每個(gè)步驟之外,還將提供一個(gè)在Python中使用Cv2和DLib庫(kù)輕松進(jìn)行人臉識(shí)別的項(xiàng)目。
感興趣區(qū)域
在使用圖像進(jìn)行面部分析時(shí),最重要的概念之一是定義感興趣區(qū)域(ROI),我們必須在圖像中定義一個(gè)特定的部分,在那里篩選或執(zhí)行一些操作。
例如,如果我們需要篩選汽車的車牌,我們的感興趣領(lǐng)域只停留在車牌上,那么街道、車身和圖片中出現(xiàn)的任何東西都只是輔助部分。在本例中,我們將使用opencv庫(kù),該庫(kù)支持對(duì)圖像進(jìn)行分區(qū)并幫助我們確定感興趣領(lǐng)域。
Haar庫(kù)
本項(xiàng)目中將使用現(xiàn)成的分類器:級(jí)聯(lián)的Haar分類器,這種特定的分類器將始終適用于灰度圖像。
該算法生成了一個(gè)幾何圖形,該幾何圖形將識(shí)別與我們所分析的相似點(diǎn)。因此在本例中,它將嘗試尋找人臉圖案,即眼睛、鼻子和嘴巴。這種分析方法最大的問(wèn)題是產(chǎn)生幻想性視錯(cuò)覺(jué)。
你看到的是人眼還是幾扇窗戶?在希臘詞源學(xué)中,幻想性視錯(cuò)覺(jué)是一種人類的特征。從童年起,我們的大腦就被編程來(lái)識(shí)別物體、圖像中的人臉。利用我們先前獲得的經(jīng)驗(yàn),我們自己的大腦會(huì)根據(jù)我們所認(rèn)識(shí)到的“人類”特征來(lái)尋找一種模式,增加新的人臉面孔。
使用Haar人臉特征分類器
用以下圖像為例:
來(lái)看看識(shí)別這張圖片中的人臉代碼:
- import cv2
- group_of_people_image = cv2.imread('images/image7.jpg')
- frontal_face_classifier = cv2.CascadeClassifier('classifier/haarcascade_frontalface_default.xml')
- image_in_gray_scale = cv2.cvtColor(group_of_people_image,cv2.COLOR_BGR2GRAY)
- faces = frontal_face_classifier.detectMultiScale(image=image_in_gray_scale,scaleFactor=1.3, minNeighbors=6)
- for (x_axis, y_axis, weight,height) in faces:
- cv2.rectangle(group_of_people_image,(x_axis, y_axis), (x_axis + weight, y_axis + height), (255, 0, 0), 2)
該算法將圖像轉(zhuǎn)換為灰度圖像,如前所述,這是分類器操作的一個(gè)基本步驟,然后我們使用dectedMultiScale函數(shù)搜索圖像中的人臉,并通過(guò)繪制矩形來(lái)顯示圖像的位置,當(dāng)定位人臉時(shí)結(jié)果如下:
我們能夠準(zhǔn)確地分析兩張出現(xiàn)的臉(采用矩形的方式將人臉框起來(lái)),有兩個(gè)人完全正面地露出他們的臉,人臉完全顯現(xiàn),所以我們可以清楚地看到他的臉;另一個(gè)人只露出了面部的一部分,所以我們沒(méi)有得到準(zhǔn)確的信息來(lái)確認(rèn)這是一張完整的人臉。
面部特征檢測(cè)
Dlib是一個(gè)擁有一些分類器的庫(kù),可以幫助我們檢測(cè)人臉的某些部分,例如:眼睛、眉毛、鼻子和洋娃娃的區(qū)域。以下圖為例:
現(xiàn)在,使用算法來(lái)識(shí)別圖像中的面部特征點(diǎn):
- import cv2
- import dlib
- import numpy as np
- initial_image = cv2.imread('images/image9.jpg')
- initial_image_in_rgb = cv2.cvtColor(initial_image,cv2.COLOR_BGR2RGB)
- reference_image = initial_image_in_rgb.copy()
- classifier_path = dlib.shape_predictor('classifier/shape_predictor_68_face_landmarks.dat')
- frontal_face_detector = dlib.get_frontal_face_detector()
- rectangles =frontal_face_detector(initial_image,1)
- for k, d inenumerate(rectangles):
- cv2.rectangle(reference_image,(d.left(), d.top()), (d.right(), d.bottom()), (255, 255, 0), 2)
- landmarks = []
- for rectangle in rectangles:
- landmarks.append(np.matrix([[p.x, p.y] for p inclassifier_path(reference_image,rectangle).parts()]))
- for landmark in landmarks:
- for index, point inenumerate(landmark):
- point_center = (point[0, 0], point[0, 1])
- cv2.circle(reference_image,point_center, 3, (255, 255, 0), -1)
- cv2.putText(reference_image,str(index), point_center, cv2.FONT_HERSHEY_COMPLEX, 3, (255, 255, 255), 2)
我們使用的是人臉68個(gè)特征分類器,它試圖更精確地理解點(diǎn)面,這給了我們更多的選擇去分析結(jié)果,其缺點(diǎn)是速度有點(diǎn)慢。所以必須劃定一個(gè)矩形來(lái)確定我們的臉可能在哪里,特征是我們可以識(shí)別的人臉特征,包括臉、嘴、眼睛、眉毛。
一旦用矩形的方式框出了臉,就可以使用功能部件將這些特征返回,最后將得到一些可視化的東西去生成一個(gè)帶有面部點(diǎn)的圖像。結(jié)果是:
這些點(diǎn)對(duì)于幫助識(shí)別表情很重要,例如我們可以識(shí)別出這個(gè)男孩睜著眼睛,閉著嘴巴。把這看作是一種情緒的表現(xiàn),可以說(shuō)這個(gè)男孩很焦慮。當(dāng)一個(gè)人微笑時(shí),它可以幫助理解這種情緒可能表達(dá)的是幸福。
上述例子向我們展示了,Python可以識(shí)別出我們感興趣的區(qū)域,在本文中就是人臉識(shí)別。這個(gè)項(xiàng)目還可以擴(kuò)展到使用機(jī)器學(xué)習(xí)來(lái)檢測(cè),探究圖像中的人是否感到快樂(lè)、悲傷或者憂慮。
包含所有內(nèi)容的項(xiàng)目可從以下網(wǎng)址獲得:https://github.com/LimaGuilherme/facial-recognize