人脸识别|deepface使用


deepface--python包人脸识别的使用

  • 介绍
  • 安装
  • 人脸检测和对齐
  • 人脸特征表示
  • 特征向量验证
  • 所需权重位置

介绍 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
FacenetVGG-FaceArcFaceDlib要比 OpenFaceDeepIDDeepFace效果好,但是模型大小有的要大一些。
用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使用】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里面的一些模型需要训练好的权重,所以当选择一些使用一些深度模型时例如retinafaceVGGFace,会先下载权重。这些权重的存储地址类似下面:
/home/path/.deepface/weights/retinaface.h5
显示隐藏文件夹ctr+h

    推荐阅读