使用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仅返回匹配布尔值,无法区分相似度高低,因此会出现多匹配的情况。要获取最相似的结果,需通过人脸编码的欧氏距离判断(距离越小,相似度越高),具体步骤如下:
- 使用
face_recognition.face_distance()计算当前人脸编码与所有已知人脸编码的距离 - 找到距离最小的索引,对应最相似的已知人脸
- 验证最小距离是否在设定的容忍度范围内,确认匹配有效性
修改后的代码:
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
相关产品推荐
相关产品推荐

