OpenCV人脸识别程序检测人脸时触发IndexError索引越界问题咨询
报错原因及解决方案
这个报错是代码缺陷+训练数据不匹配共同导致的,直接触发原因是recognizer.predict()返回的人脸id数值超出了names列表的索引范围。
1. 代码本身的缺陷
现有代码仅判断了置信度是否低于100,没有对返回的id做任何边界合法性校验,只要predict返回的id大于等于names列表的长度,就会直接触发索引越界报错。当前你定义的names列表长度为6,合法索引范围是0~5,只要返回的id≥6就会报错。
2. 训练数据异常的诱发原因
训练模型时分配的人脸标签id,超出了当前names列表的索引范围。比如训练时你给某个人脸分配的标签是6,但names列表最多只到索引5(对应元素W),识别到该人脸时predict就会返回id=6,直接触发越界。
修复方案
首先给代码增加id合法性校验逻辑,替换原有的置信度判断块:
# 检查置信度是否小于100 ==> "0"是完美匹配 if confidence < 100: # 新增边界校验,避免索引越界 if 0 <= id < len(names): id = names[id] else: id = "unknown" confidence = " {0}%".format(round(100 - confidence)) else: id = "unknown" confidence = " {0}%".format(round(100 - confidence))
其次核对训练数据集的标签id,确保所有用到的id都有对应的names列表元素,没有超出索引范围的标签。
内容的提问来源于stack exchange,提问作者KAE_miya
相关产品推荐
相关产品推荐

