Ubuntu20.04运行OpenCV Python目标检测代码出现IndexError越界问题求助
报错原因
你遇到的IndexError: list index out of range报错是下标越界导致的,从你打印的日志可以看到检测出的classId包含82,当代码执行classNames[classId-1]时,如果你的classNames列表长度小于等于81,就会触发越界错误。
常见的触发原因有三个:
- 你使用的目标检测模型支持的分类数量大于
classNames列表的长度,比如模型训练时用了90类数据集,但你只加载了80类的名称列表 - 部分OpenCV DNN加载的模型输出的classId默认从0开始计数,你手动减1后会出现负数下标或偏移错误
- 读取类别名称文件时操作不当,漏读了末尾的类别,导致
classNames列表长度不足
修复方案
第一步:先加边界校验避免崩溃
修改循环内的代码,先判断下标合法性再取类别名,临时解决崩溃问题,同时可以打印异常的classId排查问题:
while True: success,img = cap.read() classIds, confs, bbox = net.detect(img,confThreshold=thres) print(classIds,bbox) if len(classIds) > 0: for classId, confidence,box in zip(classIds.flatten(),confs.flatten(),bbox): cv2.rectangle(img,box,color=(0,255,0),thickness=2) # 增加下标合法性校验 idx = classId - 1 if 0 <= idx < len(classNames): show_name = classNames[idx].upper() else: # 未知类别直接显示id,方便排查 show_name = f"UNKNOWN_{classId}" cv2.putText(img, show_name, (box[0]+10,box[1]+30), cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)
第二步:核对模型和类别列表匹配性
- 打印
len(classNames)确认当前类别列表长度,再对照你使用的预训练模型的官方说明,确认模型支持的类别数量是否一致。比如常用的COCO数据集为80类,对应classId范围是1~80,若检测出82这类超过范围的id,说明模型和类别列表不匹配 - 检查类别文件的读取代码,确认有没有漏读行、把空行算入列表的问题,读取时可以增加strip()过滤空行,避免列表长度不对
第三步:确认classId起始值
如果修改后出现大量UNKNOWN_0、UNKNOWN_1这类输出,说明你使用的模型输出的classId是从0开始计数的,把idx = classId - 1改为idx = classId即可。
内容的提问来源于stack exchange,提问作者ArFiction
相关产品推荐
相关产品推荐

