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

使用Python face_recognition模块解决相似人脸多匹配问题

解决face_recognition高相似度人脸多匹配问题

问题描述

我正在使用Python face_recognition模块进行100人的人脸识别,但部分人脸(如一对兄弟)相似度极高,导致两人的人脸编码匹配彼此均返回True。我希望仅返回最相似的匹配结果,附上相关代码,寻求解决方案:

for caras in image_face_encoding:
    for known_face_encoding in [known_face_encodings]:

        matches = face_recognition.compare_faces(known_face_encoding, caras, tolerance=0.37)
        print(matches)                    

        name = "Unknow"

        if True in matches:
            first_match_index = matches.index(True)
            name = known_face_names[first_match_index]
            contador=contador+1
            print ('Encontrado!!! ', contador)
            print(name)#input_image

解决方案

原代码依赖compare_faces仅返回匹配布尔值,无法区分相似度高低,因此会出现多匹配的情况。要获取最相似的结果,需通过人脸编码的欧氏距离判断(距离越小,相似度越高),具体步骤如下:

  1. 使用face_recognition.face_distance()计算当前人脸编码与所有已知人脸编码的距离
  2. 找到距离最小的索引,对应最相似的已知人脸
  3. 验证最小距离是否在设定的容忍度范围内,确认匹配有效性

修改后的代码:

contador = 0

for caras in image_face_encoding:
    # 计算当前人脸与所有已知人脸的相似度距离(越小越相似)
    face_distances = face_recognition.face_distance(known_face_encodings, caras)
    # 获取最相似人脸的索引
    best_match_index = face_distances.argmin()
    min_distance = face_distances[best_match_index]
    
    name = "Unknow"
    # 仅当最小距离小于等于容忍度时,判定为匹配成功
    if min_distance <= 0.37:
        name = known_face_names[best_match_index]
        contador += 1
        print('Encontrado!!! ', contador)
        print(name)
    print(name)

关键改动说明

  • 移除了冗余的嵌套循环,face_distance可直接处理整个已知人脸编码列表
  • 通过argmin()定位最相似的人脸,而非取第一个匹配结果
  • 增加距离阈值判断,避免误匹配低相似度的人脸

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:02:44