基於face_recognition實現人臉識別

上一篇文章50行代碼實現人臉檢測收到了很多朋友的點贊,非常感謝大家的鼓勵。上一篇中我們實現了檢測照片中的人臉並標出人臉特徵點(鼻子,眼睛,眉毛等),這一篇我們將在上一篇的基礎上,進一步實現人臉識別,告訴你照片里的人是誰。

準備工作

我們的人臉識別基於face_recognition庫。face_recognition基於dlib實現,用深度學習訓練數據,模型準確率高達99.38%。在開始我們的工作前,我們先安裝face_recognition

pip install face_recognition

人臉數字化

人臉識別的第一步是檢測照片中的人臉區域,然後將人臉的圖像數據轉換成一個長度為128的向量,這128個數據代表了人臉的128個特徵指標,如下所示

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

圖片數據

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

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

代碼實現

接下來開始我們的編程工作

import cv2import 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)

將人臉的圖像數據轉換成128位向量,已知人臉的向量存入face_encodings數組,未知人臉的圖像數據存入unknown_face_encodings數組。

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在圖上標註標籤。

以上是代碼的全部。

測試

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

運行上面的程序,可以看到下面的結果

威廉王子和凱特王妃的人臉都被準確地識別出來。綠色的框框出了人臉區域,框的上方標註了識別到的人的名字。

至此,我們成功地實現了人臉識別。

後續不定期的更新一些圖像處理方面其他有趣的應用,例如摳圖、實現手繪效果、二維碼識別、驗證碼識別,等等。

歡迎關注~


推薦閱讀:

你以為的人臉識別,其實是萬物互聯
基於AI神經引擎的Face ID,真能讓人放心嗎?
如何用SphereFace+純Python刷分Megaface
【AI美顏演算法】300行Python實現基於人臉特徵的美顏演算法
眼球追蹤技術,可用於操作瀏覽器等,你有什麼創意或看法?

TAG:人脸识别 | Python | OpenCV |