一、定義
1、介紹
本項目是世界上最強大、簡潔的人臉識別庫,你可以使用Python和命令行工具提取、識別、操作人臉。
本項目的人臉識別是基于業(yè)內(nèi)領先的C++開源庫dlib中的深度學習模型,用Labeled Faces in the Wild人臉數(shù)據(jù)集進行測試,有高達99.38%的準確率。但對小孩和亞洲人臉的識別準確率尚待提升。
Labeled Faces in the Wild是美國麻省大學安姆斯特分校(University of Massachusetts Amherst)制作的人臉數(shù)據(jù)集,該數(shù)據(jù)集包含了從網(wǎng)絡收集的13,000多張面部圖像。
github和官網(wǎng)網(wǎng)址:
https://github.com/ageitgey/face_recognition/blob/master/README_Simplified_Chinese.md
https://face-recognition.readthedocs.io/en/latest/face_recognition.html
2、人臉識別步驟:
1)人臉檢測
要想識別人臉,首先需要在圖像或者視頻幀中找到所有人臉的位置,并將人臉部分的圖像切割出來。
可以使用方向梯度直方圖(HOG)來檢測人臉位置。先將圖片灰度化,因為色彩對于找到人臉位置并無明顯作用,接著計算圖像中各像素的梯度。
通過將圖像變換為HOG形式,我們就可以提取圖像的特征,從而獲取人臉位置。
2)人臉對齊
一張圖片中的人臉可能是傾斜的,或者僅僅是側(cè)臉。為了方便給人臉編碼,需要將人臉對齊成同一種標準的形狀。
人臉對齊的第一步就是人臉是特征點估計。Dlib有專門的函數(shù)和模型,能夠?qū)崿F(xiàn)人臉68個特征點的定位。
找到特征點后,就可以通過圖像的幾何變換(仿射、旋轉(zhuǎn)、縮放),使各個特征點對齊(將眼睛、嘴等部位移到相同位置)。
3)人臉編碼
訓練一個神經(jīng)網(wǎng)絡,將輸入的臉部圖像生成為128維的預測值。
訓練的大致過程為:將同一人的兩張不同照片和另一人的照片一起喂入神經(jīng)網(wǎng)絡,不斷迭代訓練,使同一人的兩張照片編碼后的預測值接近,不同人的照片預測值拉遠。也就是減小類內(nèi)距離,增大類間距離。具體算法參考facenet[3]。
4)識別身份
預先將所有人的連放入人臉庫中,全部用上述的神經(jīng)網(wǎng)絡編碼為128維并保存。識別時,將人臉預測為128維的向量后,與人臉庫中的數(shù)據(jù)進行比對。
比對方法有很多種,可以直接找出閾值范圍內(nèi)歐氏距離最小的人臉,或者訓練一個末端的SVM或者knn分類器,直接生成人的代號(身份)。
knn分類器構建方法可參考這個代碼。
整體的使用python實現(xiàn)人臉識別的代碼可以參考使用OpenCV,Python和深度學習進行人臉識別。
二、通過python代碼實現(xiàn)
1、安裝
1)windows系統(tǒng)?python3.10下安裝 dlib?
Steins-Gate-Divergence-Meter-Clock-VisitorCounter/dlib-19.22.99-cp310-cp310-win_amd64.whl at main · longsongline/Steins-Gate-Divergence-Meter-Clock-VisitorCounter · GitHub文章來源:http://www.zghlxwxcb.cn/news/detail-433678.html
2)安裝?face_recognition 庫文章來源地址http://www.zghlxwxcb.cn/news/detail-433678.html
pip3 install face_recognition
2、代碼案例?
# coding=utf-8
import sys
import cv2
from PIL import Image,ImageDraw,ImageFont
import numpy as np
import face_recognition
# 加載已知人臉圖像
known_image = face_recognition.load_image_file("know_img.jpg")
# 提取已知人臉的編碼
known_face_encoding = face_recognition.face_encodings(known_image)[0]
# 初始化攝像頭
video_capture = cv2.VideoCapture(0)
def cv2AddChineseText(frame, name, position, fill):
font = ImageFont.truetype('simsun.ttc', 30)
img_pil = Image.fromarray(frame)
draw = ImageDraw.Draw(img_pil)
draw.text(position, name, font=font, fill=fill)
return np.array((img_pil))
while True:
# 讀取攝像頭中的圖像
ret, frame = video_capture.read()
# 將圖像轉(zhuǎn)換為RGB格式
rgb_frame = frame[:, :, ::-1]
# 檢測圖像中的人臉
face_locations = face_recognition.face_locations(rgb_frame)
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
# 在圖像中標記人臉位置
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
# 判斷檢測到的人臉是否和已知人臉匹配
matches = face_recognition.compare_faces([known_face_encoding], face_encoding, tolerance=0.38)
# 如果匹配,則標記人臉為已知人臉
name = "unknow"
if True in matches:
name = "know"
# 在圖像中標記人臉位置和姓名
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 1)
frame = cv2AddChineseText(frame, name, (left, top - 38), (0, 0, 255))
# 顯示圖像
cv2.imshow('Video', frame)
# 按下q鍵退出程序
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放攝像頭
video_capture.release()
# 關閉所有窗口
cv2.destroyAllWindows()
到了這里,關于python實現(xiàn)人臉識別(face_recognition)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!