如何将DeepFace.extract_faces()提取的人脸传入DeepFace.find()?
解决DeepFace.extract_faces()结果传入DeepFace.find()的问题
问题根源
你遇到的核心问题是DeepFace.extract_faces()的返回格式和DeepFace.find()的输入要求不匹配:
extract_faces()返回的是列表(哪怕是单人脸图片,也是长度为1的列表),每个元素是包含face(numpy数组)、facial_area的字典,你直接用extracted_face['face']是对列表用字典键取值,必然报错。- 另外,即使拿到了
face数组,也要确保它是DeepFace预期的RGB格式,否则也会触发人脸检测失败的错误。
修正后的代码实现
1. 正确提取人脸numpy数组
先从返回列表里取出单张人脸的字典,再获取对应的数组:
extracted_faces = DeepFace.extract_faces(img_path=img_path, enforce_detection=True) # 先判断是否提取到人脸 if extracted_faces: # 取第一张人脸的numpy数组(多人脸场景可循环处理) face_array = extracted_faces[0]['face'] else: print("当前图片未检测到人脸") # 跳过或处理异常逻辑
2. 传入DeepFace.find()完成匹配
DeepFace.find()支持直接传入numpy数组,但建议加上enforce_detection=False兜底(因为提取后的人脸是裁剪好的,二次检测容易因边缘问题报错):
from deepface import DeepFace img_path = "待处理图片路径" db_path = "人脸数据库路径" # 提取人脸 extracted_faces = DeepFace.extract_faces(img_path=img_path, enforce_detection=True) if not extracted_faces: print("无有效人脸,跳过") else: face_array = extracted_faces[0]['face'] # 若提取的人脸是BGR格式(比如用OpenCV读取的原图),转成RGB # import cv2 # face_array = cv2.cvtColor(face_array, cv2.COLOR_BGR2RGB) # 执行匹配 res = DeepFace.find(img_path=face_array, db_path=db_path, enforce_detection=False) # 处理匹配结果 if not res.empty: # 匹配成功,存入对应文件夹 print(f"匹配到用户: {res.iloc[0]['identity']}") # 写入你的保存逻辑,比如将裁剪后的人脸存入对应匹配文件夹 else: # 无匹配,存入NewFace_01 print("未匹配到已有用户,存入NewFace_01") # 写入保存到新文件夹的逻辑
关键注意点
extract_faces()的返回是列表,必须通过索引(比如[0])获取单张人脸的字典,再取face值- 提取的
face本身就是numpy数组,无需额外转换,但要确认颜色通道是RGB(DeepFace内部默认用RGB处理,若原图是BGR读取的,需要转换) - 对提取后的人脸调用
find()时,建议关闭enforce_detection,避免因裁剪后的人脸无完整背景触发检测失败
内容的提问来源于stack exchange,提问作者Baraa
相关产品推荐
相关产品推荐

