天天看點

基于face_recognition實作人臉識别

我們的人臉識别基于face_recognition庫。face_recognition基于dlib實作,用深度學習訓練資料,模型準确率高達99.38%。在開始我們的工作前,我們先安裝face_recognition

pip install face_recognition

人臉識别的第一步是檢測照片中的人臉區域,然後将人臉的圖像資料轉換成一個長度為128的向量,這128個資料代表了人臉的128個特征名額,如下所示

基于face_recognition實作人臉識别

對于每一張已知人臉,生成這樣的一個128位的向量。對于一張未知人臉,将它的128位向量和所有已知人臉的128位向量一一比對,找到相似度最高的那一個,即找出了未知人臉對應的人。

我們準備了兩張照片,分别是凱特王妃和威廉王子的單人照,分别存成catherine.jpg和william.jpg,這兩張照片中的人臉作為我們的已知人臉

我們的目标是在下面的合影中識别出兩人的臉并在圖中标出各自的名字。下圖存成unknown.jpg

接下來開始我們的程式設計工作

import cv2

import face_recognitionnames = [    

   "catherine",

   "william",

]

首先我們定義了标簽集,存在names數組中。

标簽名字也是我們圖檔的檔案名。

images = []

for name in names:

   filename = name + ".jpg"

   image = face_recognition.load_image_file(filename)

   images.append(image)

unknown_image = face_recognition.load_image_file("unknown.jpg")

調用face_recognition.load_image_file從圖檔中讀取資料。

這裡讀取了包含已知人臉和未知人臉的圖檔的資料,未知人臉的圖檔就是上面的合影圖檔unknown.jpg。

face_encodings = []

for image in images:

   encoding = face_recognition.face_encodings(image)[0]

   face_encodings.append(encoding)

unknown_face_encodings = face_recognition.face_encodings(unknown_image)

face_recognition.face_encodings會傳回圖檔中的所有的人臉的128位向量。單人照片隻有一張人臉,是以face_recognition.face_encodings(image)[0]隻取第一個元素。合影圖檔中包含了2張人臉,是以unknown_face_encodings包含2個128位向量。

face_locations = face_recognition.face_locations(unknown_image)

for i in range(len(unknown_face_encodings)):    

   unknown_encoding = unknown_face_encodings[i]    

   face_location = face_locations[i]    

   top, right, bottom, left = face_location    

   cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2)    

   results = face_recognition.compare_faces(face_encodings, unknown_encoding)    

   for j in range(len(results)):        

       if results[j]:            

           name = names[j]            

           cv2.putText(unknown_image, name, (left-10, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

unknown_image_rgb = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)

cv2.imshow("Output", unknown_image_rgb)

cv2.waitKey(0)

face_locations存了每張臉的位置資訊。

在循環中我們調用cv2.rectangle框出了檢測到的每張臉。

face_recognition.compare_faces将已知人臉的128位向量和每張未知人臉的128位向量做比較,結果存入results數組中。results數組中的每一個元素都是True或者False,長度和人臉個數相等。results中的每個元素都和已知人臉一一對應,在某一個位置處的元素為True,表示未知人臉被識别成這張已知人臉。

對識别出來的每張人臉,我們調用cv2.putText在圖上标注标簽。

以上是代碼的全部。

令人興奮的時刻又來到了! 我們來檢驗一下我們的成果。

運作上面的程式,可以看到下面的結果

威廉王子和凱特王妃的人臉都被準确地識别出來。綠色的框框出了人臉區域,框的上方标注了識别到的人的名字。

至此,我們成功地實作了人臉識别。

轉自:https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247485480&idx=1&sn=3d9ac92df5d58970e52c8c6a67c4abfd&chksm=ec5ed755db295e43285955e1868a2a6ec7e4a08baf0504a0f8815419055868f87e2247c59756&mpshare=1&scene=23&srcid=0208pvpFGCkaUI4Uztx6aDze#rd

繼續閱讀