YOLOv7预训练模型与微调模型性能对比及test.py运行报错问题求助
我之前也碰到过类似的问题,咱们一步步拆解解决:
问题分析与解决方案
1. 报错的根本原因
你运行预训练yolov7.pt时用了data/custom.yaml——这个配置里只定义了4个目标类别(加上背景类,代码会创建维度为5的混淆矩阵),但预训练模型是针对COCO 80类训练的,它会输出0-79的类别索引。当模型预测到比如类别16(COCO原生类别)时,你的混淆矩阵只有5列(索引0-4),自然就触发了IndexError:索引16超出了数组的边界。
2. 解决预训练模型测试报错的两种方法
方法一:用COCO原始配置验证预训练模型
如果你只是想先确认预训练模型本身的正确性,可以用COCO官方配置运行测试:
python3 test.py --data "data/coco.yaml" --img 640 --batch 32 --conf 0.001 --iou 0.65 --device 0 --weights yolov7.pt --save-txt
但如果要在你的4类自定义数据集上测试预训练模型,建议用下面的方法。
方法二:修改代码适配自定义类别
打开utils/metrics.py里的process_batch函数,在更新混淆矩阵前,过滤掉不在你自定义类别范围内的预测结果:
找到这一行代码:
self.matrix[gc, detection_classes[m1[j]]] += 1 # correct
替换成:
det_cls = detection_classes[m1[j]] # 只统计你自定义数据集的类别索引(假设你的4类对应索引是0-3) if det_cls in [0, 1, 2, 3]: # 替换成你实际的自定义类别索引 self.matrix[gc, det_cls] += 1
这样就能避免预训练模型输出的其他COCO类别索引越界的问题。
3. 正确对比微调前后模型性能的步骤
要精准对比两个模型在你的4类数据集上的表现,推荐这样做:
- 微调后模型:你已经能正常用
custom.yaml运行test.py,直接保留输出的P、R、mAP等指标即可。 - 预训练模型:用上面方法二修改代码后,再用
custom.yaml运行test.py,就能得到预训练模型在你目标数据集上的同维度指标,方便直接对比。
如果不想修改代码,也可以通过detect.py生成预测结果后自行计算指标:
- 用微调模型生成预测结果:
python3 detect.py --data "data/custom.yaml" --weights runs/train/exp/weights/best.pt --img 640 --save-txt --save-conf
- 用预训练模型生成预测结果:
python3 detect.py --data "data/custom.yaml" --weights yolov7.pt --img 640 --save-txt --save-conf
- 加载你的数据集标注文件和两个模型的预测txt,用YOLO自带的
metrics.py或自定义脚本计算Precision、Recall、mAP等核心指标。不过这种方式不如直接用test.py输出的结果准确,还是更推荐修改代码让test.py正常运行预训练模型的测试。
内容的提问来源于stack exchange,提问作者Ivanna Savonik
相关产品推荐
相关产品推荐

