面部识别项目添加大量人脸后出现IndexError: list index out of range问题求助
解决人脸编码时的IndexError问题
嘿,这个问题我之前处理批量人脸编码的时候也遇到过!你的IndexError本质原因很明确:某张图片里没有检测到人脸,face_recognition.face_encodings()返回了空列表,你直接用[0]取第一个元素就触发了越界错误。结合你有2600张图片的情况,大概率是这两个问题导致的:要么是图片本身没人脸/人脸不清晰,要么是你路径拼接错了导致加载了不存在的文件。下面给你具体的解决思路:
1. 修复路径拼接问题(最可能的元凶)
你当前用"datasets/" + f拼接路径,但os.walk会遍历./datasets下的所有子目录,比如如果有./datasets/user1/photo.jpg,f是photo.jpg,但datasets/photo.jpg根本不存在,加载的是无效文件自然检测不到人脸。正确的做法是用os.path.join()拼接完整路径:
face = face_recognition.load_image_file(os.path.join(dirpath, f))
2. 添加空列表检查,跳过无脸图片
即使路径正确,也难免有图片质量差、没人脸的情况,所以必须先判断编码列表是否为空,再取元素:
encodings = face_recognition.face_encodings(face, model="cnn") if encodings: encoding = encodings[0] encoded[f.split(".")[0]] = encoding print("Encoding image", f) else: print(f"⚠️ Warning: No face detected in {os.path.join(dirpath, f)}, skipping...")
3. 可选:记录错误日志方便排查
如果想后续手动处理有问题的图片,可以把错误信息写入日志文件:
import logging # 初始化日志配置 logging.basicConfig( filename='encoding_errors.log', level=logging.WARNING, format='%(asctime)s - %(message)s' ) # 在跳过图片时记录 logging.warning(f"No face detected in {os.path.join(dirpath, f)}")
修改后的完整代码
import os import pickle import face_recognition import logging # 初始化错误日志 logging.basicConfig( filename='encoding_errors.log', level=logging.WARNING, format='%(asctime)s - %(message)s' ) def encode_photos(): encoded = {} for dirpath, dnames, fnames in os.walk("./datasets"): for f in fnames: if f.endswith(".jpg") or f.endswith(".png"): # 拼接正确的图片路径 img_path = os.path.join(dirpath, f) try: face = face_recognition.load_image_file(img_path) # 获取人脸编码,先判断是否为空 encodings = face_recognition.face_encodings(face, model="cnn") if encodings: encoding = encodings[0] # 用文件名(不含后缀)作为键 encoded[f.split(".")[0]] = encoding print("Encoding image", f) else: print(f"⚠️ Warning: No face detected in {img_path}, skipping...") logging.warning(f"No face detected in {img_path}") except Exception as e: print(f"❌ Error processing {img_path}: {str(e)}") logging.error(f"Error processing {img_path}: {str(e)}") with open('dataset_faces.dat', 'wb') as f: pickle.dump(encoded, f) print("Encoding complete and saved in dataset_faces.dat")
这样修改后,程序会自动跳过无法检测到人脸的图片,也能正确处理子目录里的图片,不会再中途崩溃,还能记录问题图片方便后续排查。
内容的提问来源于stack exchange,提问作者cfive
相关产品推荐
相关产品推荐

