You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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生成预测结果后自行计算指标:

  1. 用微调模型生成预测结果:
python3 detect.py --data "data/custom.yaml" --weights runs/train/exp/weights/best.pt --img 640 --save-txt --save-conf
  1. 用预训练模型生成预测结果:
python3 detect.py --data "data/custom.yaml" --weights yolov7.pt --img 640 --save-txt --save-conf
  1. 加载你的数据集标注文件和两个模型的预测txt,用YOLO自带的metrics.py或自定义脚本计算Precision、Recall、mAP等核心指标。不过这种方式不如直接用test.py输出的结果准确,还是更推荐修改代码让test.py正常运行预训练模型的测试。

内容的提问来源于stack exchange,提问作者Ivanna Savonik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:52:37