使用wyzely-detect多脸识别触发DeepFace IndexError,求持续识别方案
问题解决:多脸场景下程序崩溃及DeepFace相关疑问
错误原因定位
报错核心是utils/utils.py第141行的df.iloc[-1]["identity"]触发索引越界,说明画面出现多张人脸时,DeepFace返回的DataFrame要么为空,要么原代码逻辑仅适配单脸场景——它直接取最后一行数据,未考虑多脸时需遍历所有检测结果的情况。
修复方案:适配多脸识别
修改recognize_face函数,使其支持多脸场景并逐个识别:
- 先判断DataFrame是否为空,避免索引越界
- 遍历所有检测到的人脸,而非仅取最后一行
- 调整返回逻辑,支持返回多张脸的识别结果
修改后的recognize_face函数示例:
def recognize_face(frame, db_path, model_name="VGG-Face", detector_backend="opencv"): try: # DeepFace默认支持多脸检测 df = DeepFace.find(img_path=frame, db_path=db_path, model_name=model_name, detector_backend=detector_backend, enforce_detection=False) if df.empty: return [] # 遍历所有人脸,收集识别结果 face_details = [] for _, row in df.iterrows(): face_details.append({ "identity": str(Path(row["identity"])), "distance": row["distance"] }) return face_details except Exception as e: print(f"识别出错: {str(e)}") return []
主程序调用时适配多脸返回结果:
# 原单脸判断改为遍历多脸结果 if face_details := utils.recognize_face(frame, db_path): for face in face_details: # 处理每张脸的业务逻辑,比如画框、显示信息等 print(f"识别到人脸: {face['identity']}, 相似度: {face['distance']}")
关于DeepFace的限制问题
这不是DeepFace的限制,DeepFace本身支持多脸检测和识别,问题出在wyzely-detect仓库的代码仅适配了单脸场景,未处理多脸返回的DataFrame结构。
替代方案(如需换库)
若不想修改现有代码,或需要更灵活的多脸处理,可考虑以下开源库:
- dlib:成熟的人脸检测+识别库,支持多脸,精度较高
- OpenCV:自带LBPH人脸识别模块,轻量易集成
- InsightFace:针对亚洲人脸优化的库,支持多脸检测识别,性能出色
内容的提问来源于stack exchange,提问作者Lakshay Lamba
相关产品推荐
相关产品推荐

