调用face_recognition.face_encodings()出现IndexError:列表索引越界
解决
face_recognition.face_encodings() 返回空列表导致的 IndexError 你遇到的IndexError: list index out of range,本质是face_recognition.face_encodings(lmm_image)没有检测到任何人脸,返回了空列表,这时用[0]去索引自然会报错。下面我帮你拆解可能的原因和对应的解决办法:
可能的原因
- 图片中无有效人脸:你的目标图片
wajah_depan_syahdan.jpg里可能没有清晰、完整的人脸,或者人脸占比太小、过于模糊,导致dlib的人脸检测器无法识别。 - 人脸被遮挡:图片里的人脸被口罩、墨镜、帽子或其他物体严重遮挡,超出了检测器的识别范围。
- 图片路径错误:脚本没有正确加载目标图片——比如图片不在当前工作目录,你用了相对路径但路径不对,导致加载的是一张空图或者错误的图片。
- 图片损坏/格式异常:图片文件本身损坏,或者格式不被支持(虽然JPG一般没问题,但特殊编码的图片可能无法被正确解析)。
解决办法
1. 先确认图片内容和加载状态
打开wajah_depan_syahdan.jpg,检查是否有清晰无遮挡的人脸。同时在代码里加一行打印,确认图片是否成功加载:
import face_recognition import cv2 lmm_image = face_recognition.load_image_file("wajah_depan_syahdan.jpg") print("图片形状:", lmm_image.shape) # 正常输出应该是 (高度, 宽度, 3)
如果输出不是类似(xxx, xxx, 3)的格式,说明路径错误,你需要改用绝对路径加载图片,比如:
# Windows示例 lmm_image = face_recognition.load_image_file("C:/your_project_path/wajah_depan_syahdan.jpg") # Linux/macOS示例 lmm_image = face_recognition.load_image_file("/home/your_username/your_project_path/wajah_depan_syahdan.jpg")
2. 先检测人脸位置,确认是否能被识别
在提取编码前,先用人脸定位函数确认检测器是否能找到人脸:
face_locations = face_recognition.face_locations(lmm_image) print(f"检测到的人脸数量:{len(face_locations)}")
如果输出是0,说明确实检测不到人脸,你需要:
- 换一张人脸清晰、无遮挡的图片;
- 对原图片进行预处理:比如裁剪出人脸区域、调整亮度/对比度,让人脸更明显;
- 调整检测参数,提高精度:
# 增加采样次数和上采样次数,提升检测率 face_locations = face_recognition.face_locations(lmm_image, number_of_times_to_upsample=2) lmm_face_encodings = face_recognition.face_encodings(lmm_image, face_locations=face_locations, num_jitters=10)
3. 修改代码,避免直接索引空列表
为了避免程序崩溃,建议先判断编码列表是否为空,再进行后续操作:
lmm_image = face_recognition.load_image_file("wajah_depan_syahdan.jpg") lmm_face_encodings = face_recognition.face_encodings(lmm_image) if not lmm_face_encodings: print("错误:未在目标图片中检测到人脸,请检查图片内容!") # 这里可以添加退出程序或其他处理逻辑 exit() lmm_face_encoding = lmm_face_encodings[0] known_faces = [lmm_face_encoding]
4. 检查图片完整性
如果图片看起来正常但无法被识别,可以尝试用图片查看器重新保存为标准JPG/PNG格式,排除文件损坏的可能。
内容的提问来源于stack exchange,提问作者Maqhfira Putri Rachmat
相关产品推荐
相关产品推荐

