1. 基于OpenCV的人脸识别模型
一般安装过opencv后,配置文件的路径为: /usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml
import cv2
filepath = "test.jpg"
img = cv2.imread(filepath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# OpenCV人脸识别分类器
# /usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml
classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects):
for faceRect in faceRects:
x, y, w, h = faceRect
cv2.rectangle(img, (x, y), (x + h, y + w), (0, 255, 0), 2)
cv2.imshow("image", img)
c = cv2.waitKey(10)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 有三种人脸识别的算法:
-
Eigenfaces: 是通过 PCA(主成分分析)实现的,它识别人脸数据集的主成分,并计算出待识别图像区域相对于数据集的发散程度(020k),该值越小,表示差别越小,0值表示完全匹配。低于4k5k都是相当可靠的识别。
-
FisherFaces: 是从 PCA发展而来,采用更复杂的计算,容易得到更准确的结果。低于4k~5k都是相当可靠的识别。
-
LBPH: 将人脸分成小单元,并将其与模型中的对应单元进行比较,对每个区域的匹配值产生一个直方图。它允许待检测人脸区域可以和数据集中图像的形状、大小不同,更方便灵活。参考值低于50则算是好的识别,高于80则认为比较差。
2. pypi: face_recognition
本项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工具提取、识别、操作人脸。代码实现基于业内领先的C++开源库 dlib
中的深度学习模型,用 Labeled Faces in the Wild
人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。
确定项目依赖:
face_recognition_models
Click>=6.0
dlib>=19.3.0
numpy
Pillow
scipy>=0.17.0
当然现在的项目在Jetson上运行效率很低,使用的是多核CPU运算,未能通过GPU提速。
2.1. 查找 & 定位人脸
import face_recognition
image = face_recognition.load_image_file("xxx.jpg")
face_locations = face_recognition.face_locations(image)
2.2. 识别人脸关键点
包括眼睛、鼻子、嘴和下巴:
import face_recognition
image = face_recognition.load_image_file("xxx.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
2.3. 识别人脸的身份
import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
results = face_recognition.compare_faces([biden_encoding], unknown_encoding)