使用DeepFace配合FaceNet如何获取单图中多人脸的对应嵌入向量
问题原因
deepface.commons.functions.preprocess_face方法默认只返回检测到的单张最高置信度人脸的预处理结果,因此你当前只能拿到1个嵌入向量,无法匹配图中实际存在的4张人脸。
解决方案
修改调用参数并批量预测所有检测到的人脸,步骤如下:
- 调用
preprocess_face时新增return_all_faces=True参数,开启多人脸返回支持,返回值为形状(人脸数量, 目标高度, 目标宽度, 通道数)的numpy数组 - 直接将返回的多个人脸批量输入FaceNet模型预测,即可得到对应顺序的所有人脸嵌入向量
- 若检测精度不足,可将检测器后端替换为
backends[4]即retinaface,检测准确率高于mtcnn
修改后参考代码
import deepface as DeepFace from elasticsearch import Elasticsearch from deepface.basemodels import Facenet import os from deepface.commons import functions model = Facenet.loadModel() target_size = (160, 160) embedding_size = 128 backends = ['opencv', 'ssd', 'dlib', 'mtcnn', 'retinaface'] target_path = "/home/niveus/PycharmProjects/deepface-elastic-research/deepface/align_img/deep_aku.jpg" # 新增return_all_faces=True返回所有检测到的人脸 target_imgs = functions.preprocess_face( target_path, target_size = target_size, detector_backend = backends[3], return_all_faces = True ) # 批量预测得到所有人脸嵌入,形状为(4,128) target_embeddings = model.predict(target_imgs) print(target_embeddings.shape) print("所有嵌入向量:", target_embeddings) # 单独取第i个人脸的嵌入用target_embeddings[i]即可
可选扩展
如果需要同时获取每个人脸在原图中的坐标、置信度等元信息,可以先调用functions.detect_faces接口拿到所有人脸的检测结果,再逐个预处理生成嵌入即可。
内容的提问来源于stack exchange,提问作者VISIONEST
相关产品推荐
相关产品推荐

