此文記錄的人臉識別方法是用pycharm實現的,圖片可自選,文中所選用圖片如下
將此圖片命名為1.png
·face_recognition
基於dlib進行了二次封裝,號稱世界上最簡潔的人臉識別庫。
由於采用的訓練數據集是Labeled Faces in the wild ,采用13000多張人臉作為訓練數據集,歐美人臉居多,故若采用歐美人臉識別准確率更高。
若有能力,可自行訓練得到自己的人臉識別庫,准確率取決於樣本的數量以及質量
·windows上安裝face_recognition庫:pip install -i https://pypi.douban.com/simple face_recogntion
接下來說說人臉識別所需用到的方法,在pycharm軟件上編譯
· load_image_file 這個方法主要用於加載要識別的人臉圖像,加載返回的數據是Numpy數組。記錄了圖片的所有像素的特征向量。
import face_recognition image = face_recognition.load_image_file('imgs/1.png') #1.png是照片名,可自行修改 print(image)
編譯結果:
· face_locations 定位圖中所有的人臉的像素位置,返回值為列表形式,列表中每一行是一張人臉的位置信息,包括【top, right, bottom, left】 這是一組元組。
##face_locations.py import face_recognition from PIL import Image import cv2 #用於框出人臉 #通過load_image_file方法加載待識別圖片 image = face_recognition.load_image_file('imgs/1.png') #通過face_locations方法得到圖像中所有人臉的位置 face_locations =face_recognition.face_locations(image) #打印出圖片中每張人臉、位置信息等、相當於摳圖 for face_location in face_locations: top, right, bottom, left = face_location #解包操作,得到每張人臉的四個位置信息 #摳圖,一張張人臉逐個顯示,打印出像素信息 print("已識別到人臉部位,像素區域為:Top:{}, Right:{}, Bottom:{}, Left: {}".format( top,right,bottom,left)) face_image = image[top:bottom, left:right] pil_image = Image.formarray(face_image) pil_image.show()
若不摳圖,要在原圖的基礎上在人臉位置繪制矩形圖,則可以將上述代碼的倒數三行改為以下代碼
start = (left,top) end = (right,bottom) #在圖片上繪制矩形框,從start坐標開始,end坐標結束,矩形框顏色為(0,0,255) cv2.rectangle(image, start, end, (0, 0, 255), thickness = 2) cv2.imshow('window', image) cv2.waitkey
· face_landmarks 識別人臉關鍵特征點
1)參數仍然是待檢測的圖像對象,返回值是包含面部特征字典的列表,列表長度就是圖像中的人臉數,使用for循環遍歷列表。
2)面部特征包括以下幾個部分:nose_bridge(鼻梁)、 right_eyebrow(右眼眉)、 left_eyebrow(左眼眉)、 righe_eye()、 left_eye()、chin(下巴)、 nose_tip(下鼻部)、 bottom_lip(下嘴唇)
3) 勾勒臉部大體輪廓
##face_landmarks.py識別人臉的關鍵特征點,以數組形式返回 import face_recognition from PIL import Image, Image Draw image = face_recognition.load_image_file('imgs\1.png') #1.png為照片名,可自行修改 face_landmarks_list = face_recognition.face_landmarks(image) #print(landmarks_list) 可要可不要 pil_image = Image_fromarray(image) d = ImageDraw.Draw(pil_image) #生成一張pil圖像 for face_landmarks in face_landmarks_list: facial_feactures = [ 'chin', 'left_eyebrow', 'right_eyebrow', 'nose_bridge', 'nose_tip', 'left_eye', 'right_eye', 'bottom_lip' ] for facial_feature in facial_features: #print("{}每個人的面部特征顯示在以下位置:{}".format (facial_feature, face_landmarks[facial_feature])) d.line(facial_landmarks[facial_feature], width=5) pil_image.show()
編譯結果:(可視化)
· face_encodings 獲取圖像文件中所有面部編碼信息(多維的向量數據)
1)返回值是一個編碼列表,參數仍是要識別的圖像對象,如果后續訪問時,需要注意加上索引或遍歷來進行訪問。每張人臉的編碼信息是一個128維向量。
import face_recognition image = face_recognition.load_image_file('imgs/girl.jpg') #不管圖像有多少人臉信息,返回值都是一個列表 face_encodings = face_recognition.face_encodings(image) for face_encoding in face_encodings: print("信息編碼長度為:{}\n編碼信息為:{}".format(len(face_encoding), face_encoding)
上述代碼的圖片girl.jpg采用的網上一個女生的單人圖,可自行選擇。
編譯結果:
2)面部編碼信息是進行人像對比的重要的參數那下面又要說到另一個方法
· compare_faces 由面部編碼信息進行面部識別匹配
1)主要用於匹配兩個面部特征編碼,利用這兩個特征向量的內積來衡量相似度,根據閾值確認是否是同一個人。
2)第一個參數就是一個面部編碼的列表(可多可少,一般多張臉),第二個參數就是給出單個面部編碼(一般一張臉)。
此方法會將第二個參數和第一個參數中的編碼信息依次進行匹配,返回值是一個Bool的列表,匹配成功則返回True,失敗則False。順序與第一個參數中臉部編碼順序一致。
3)在參數里有一個tolerance=0.6(一般默認0.6),大家可以根據實際的情況進行調整,一般經驗值是0.39,tolerance值越小,匹配越嚴格。
此次采用以下圖片:
以下代碼是為了檢測楊冪究竟有沒有出現在合照中。
-----未完待續-------