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

人脸识别可检测到人脸但无法获取用户名等信息问题咨询

代码问题排查

你现有代码出现人脸可识别但无法匹配用户名的问题,是3处写法错误导致的:

  • 已知人脸编码存储结构错误:face_recognition.face_encodings() 方法本身返回的是人脸编码的列表,即使输入图片只有1张人脸,返回值也是长度为1的列表。你直接将整个返回列表追加到known_face_encodings中,导致该变量最终是嵌套列表结构,后续人脸比对时维度不匹配,匹配结果不可靠。
  • 索引调用语法错误:你写的all_matches.index[True]是错误语法,index是Python列表的实例方法,调用必须使用圆括号,正确写法为all_matches.index(True);如果将匹配结果转为numpy数组,numpy的ndarray对象没有index方法,不能这么调用。
  • numpy版本判断逻辑错误:你写的all_matches.any()==True in all_matches存在运算优先级问题,代码会先执行True in all_matches得到布尔值,再和all_matches.any()的结果做等值判断,完全不符合预期逻辑。

修正代码

已知人脸加载部分修正

原代码重复加载同一张图片、未正确提取单张人脸编码,修正后如下:

with open('individuals.json') as json_file:
    alldata = json.loads(json_file.read())
    for person in alldata:
        known_face_names.append(person['name'])
        # 单张图片仅加载一次,减少不必要的IO开销
        sample_img = face_recognition.load_image_file(f'images/samples/{person["image"]}')
        known_face_image.append(sample_img)
        # 样本图均为单人照,直接取返回列表的第一个元素作为人脸编码
        face_enc = face_recognition.face_encodings(sample_img)[0]
        known_face_encodings.append(face_enc)

人脸匹配逻辑修正

提供两种可正常运行的写法:

  1. 原生列表写法(无需依赖numpy,适合已知人脸数量少的场景)
all_matches = face_recognition.compare_faces(known_face_encodings, current_face_encoding)
name_of_person = 'Unknown face'
if True in all_matches:
    first_match_index = all_matches.index(True)
    name_of_person = known_face_names[first_match_index]
  1. numpy优化写法(适合已知人脸数量多的场景,支持取匹配度最高的结果,准确率更高)
all_matches = np.array(face_recognition.compare_faces(known_face_encodings, current_face_encoding))
# 计算当前人脸和所有已知人脸的编码距离,值越小匹配度越高
face_distances = face_recognition.face_distance(known_face_encodings, current_face_encoding)
name_of_person = 'Unknown face'
if all_matches.any():
    best_match_idx = np.argmin(face_distances)
    # 确认最佳匹配项确实在匹配列表中,避免误判
    if all_matches[best_match_idx]:
        name_of_person = known_face_names[best_match_idx]
异步加载用户信息说明
  • 可以使用async/await异步方式获取用户信息,但要注意人脸编码计算属于CPU密集型任务,单纯用asyncio协程不会提升运行速度,需要配合线程池/进程池封装编码计算逻辑,避免阻塞视频采集的主循环。
  • 异步方案的适用场景:如果用户信息、人脸样本存储在远程数据库或对象存储中,需要通过网络请求拉取,使用异步加载可以避免拉取数据时摄像头画面卡顿、无响应。
  • 注意:OpenCV的视频帧采集、画面绘制、窗口渲染相关操作必须放在主线程中执行,不能放到异步任务里,否则会出现窗口崩溃、绘制异常的问题。

内容的提问来源于stack exchange,提问作者shaamilBoss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:15:35