自定义Yolov5训练报AssertionError标签类别超限问题咨询
报错根因
这个AssertionError的触发逻辑是训练启动时程序扫描所有标注文件,检测到存在类别ID为15的标签,和你在custom_data.yaml中配置的2个类别(合法ID范围为0-1)冲突。你修改coco128.yaml的操作完全无效——训练命令中通过--data参数指定了加载custom_data.yaml,运行时不会读取coco128的配置。
排查步骤
- 检查LabelImg标注配置:标注时如果此前用LabelImg处理过COCO类别数据集,工具会默认保留COCO的80类列表,如果你没有提前加载自定义的2类配置,标注下拉框会混入COCO类别,误选到第16个类别(ID从0开始计数,对应ID15)就会生成错误标注。
- 批量扫描错误标注:在Colab中运行以下代码,自动定位所有标注异常的文件,无需手动逐个排查:
import os # 替换为你自己的标注文件夹路径 label_paths = [ "/content/train_data/labels/train", "/content/train_data/labels/val" ] nc_config = 2 # 你配置的类别总数 error_info = [] max_cls = -1 for label_dir in label_paths: for file_name in os.listdir(label_dir): if not file_name.endswith(".txt"): continue file_path = os.path.join(label_dir, file_name) with open(file_path, "r", encoding="utf-8") as f: for line in f.readlines(): line = line.strip() if not line: continue cls_id = int(line.split(" ")[0]) max_cls = max(max_cls, cls_id) if cls_id >= nc_config: error_info.append((file_path, cls_id)) print(f"扫描完成,当前标注集中最大类别ID为:{max_cls}") print(f"共检测到{len(error_info)}处错误标注:") for path, cid in error_info: print(f"文件:{path},异常类别ID:{cid}")
- 检查目录文件残留:确认训练集、验证集的labels文件夹中,没有混入其他数据集(比如之前下载的COCO128)的标注文件,避免无关文件被程序误读。
修复方案
- 根据上述代码输出的错误文件路径,用LabelImg打开对应图片,将错误类别的标注框重新指定为你定义的2个类别(对应ID0、ID1)后保存标注。
- 将你之前修改过的
coco128.yaml恢复为官方默认内容,训练自定义数据集不需要修改该文件,随意改动反而可能引发其他配置冲突。 - 后续标注新数据时,提前在LabelImg中加载仅包含你2个类别的
classes.txt文件,避免类别列表混入其他数据集的类别导致ID标注错误。 - 所有标注修复完成后,重新运行原训练命令即可正常启动训练。
内容的提问来源于stack exchange,提问作者Fachri Ramdhan
相关产品推荐
相关产品推荐

