You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:25:09