发布时间:2024-03-06 08:01
deepface
是一个轻量级的python人脸识别和人脸属性分析(年龄、性别、情感和种族)框架。混合了多种模型:VGG-Face,Google FaceNet,OpenFace,Facebook DeepFace,DeepID,ArcFace和Dlib。该库主要基于 Keras 和 TensorFlow。
人脸识别流程由 4 个常见阶段组成:人脸检测、人脸对齐、人脸特征表示和特征向量验证。Deepface 在后台处理所有这些常见阶段。您只需使用一行代码即可调用其验证、查找或分析功能。
本文只介绍人脸识别,不介绍人脸属性分析。
pip install deepface
注意: 其需要以下包:
numpy>=1.14.0
pandas>=0.23.4
gdown>=3.10.1
tqdm>=4.30.0
Pillow>=5.2.0
opencv-python>=4.2.0.34
opencv-contrib-python>=4.3.0.36
tensorflow>=1.9.0
keras>=2.2.0
Flask>=1.1.2
mtcnn>=0.1.0
lightgbm>=2.3.1
dlib>=19.20.0
retina-face>=0.0.1
可选的检测方法:opencv
,ssd
,dlib
,mtcnn
,retinaface
,默认使用的是opencv,
#人脸检测和对齐
from deepface import DeepFace
detected_face = DeepFace.detectFace(\"img.jpg\", detector_backend = \"opencv\",enforce_detection = True, align = True)
mtcnn
,retinaface
的人脸检测效果要比opencv
,ssd
要好,但是opencv
,ssd
检测速度快。
depface中可以使用的人脸识别特征提取模型有:VGG-Face
, Facenet
, Facenet512
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
。
Facenet
,VGG-Face
,ArcFace
,Dlib
要比 OpenFace
,DeepID
,DeepFace
效果好,但是模型大小有的要大一些。
用deepface提供的函数来提取人脸特征:
from deepface import DeepFace
facerep = DeepFace.represent(img_path, model_name = \'VGG-Face\', model = None, enforce_detection = True, detector_backend = \'opencv\', align = True, normalization = \'base\')
这些模型具有不同的输入和输出形状,例如VGG-Face
需要(224,224,3)的输入形状,输出2622维向量。而Facenet
需要(160,160,3)的输入,输出128维向量。
可以用下面的代码查看输入形状。
from deepface.basemodels import VGGFace
model = VGGFace.loadModel()
input_shape = model.layers[0].input_shape[0][1:3]
用下面的代码查看输出形状。
from deepface.basemodels import VGGFace
model = VGGFace.loadModel()
out_size = model.layers[-1].input_shape[-1]
直接用模型提取人脸特征如下:
from deepface.commons import functions
from deepface.basemodels import VGGFace
model = VGGFace.loadModel()
img = functions.preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_detection = True, detector_backend = \'opencv\', return_region = False, align = True)
facerep = model.predict(img)[0,:]
可以用数据库存储人脸特征向量,新检测的人脸用同样的方法提取特征后直接与数据库中的人脸向量一一比较并确认身份。
deepface特征向量验证时的距离指标有:cosine
,euclidean
,euclidean_l2
。
当使用DeepFace里的verify
函数会对两张图片进行人脸检测并对齐,然后提取特征向量并验证距离。
from deepface import DeepFace
result = DeepFace.verify(img1_path, img2_path = \'\', model_name = \'VGG-Face\', distance_metric = \'cosine\', model = None, enforce_detection = True, detector_backend = \'opencv\', align = True, prog_bar = True, normalization = \'base\')
其返回的结果是类似下面的字典:
{
\"verified\": True
, \"distance\": 0.2563
, \"max_threshold_to_verify\": 0.40
, \"model\": \"VGG-Face\"
, \"similarity_metric\": \"cosine\"
}
也可以不使用封装好的函数而是自己验证两个向量的距离并确定阈值。
因为deepface里面的一些模型需要训练好的权重,所以当选择一些使用一些深度模型时例如retinaface
,VGGFace
,会先下载权重。这些权重的存储地址类似下面:
/home/path/.deepface/weights/retinaface.h5
显示隐藏文件夹ctr+h