在使用 Ultralytics YOLO训练自定义数据集时,当往数据集中增加新的分类,再进行训练时可能会遇到以下报错,且出现条数非常多:
WARNING ⚠️ ignoring corrupt image/label: Label class 5 exceeds dataset class count 4. Possible class labels are 0-3报警:标签类别超过了设置的类别数量。
明明已经在数据集 YAML 里把类别数nc修改正确,重新运行训练却依旧报同样的错误。本文将完整复盘问题原因、排查思路,并给出解决方案。
一、问题现象
以下是以我的例子遇到的问题现象:
1.我的自定义数据集标签中包含类别5
2.YAML 配置文件已正确设置nc: 6,类别名称 0~5 齐全
3.训练时 YOLO 仍提示类别总数只有 4 类,合法类别仅为 0-3
4.使用:
rm /home/bing/data/AbnormalBallastBedDataset/labels/train.cache rm /home/bing/data/AbnormalBallastBedDataset/labels/val.cache rm /home/bing/data/AbnormalBallastBedDataset/labels/test.cache删除train.cache、val.cache和test.cache后问题依旧存在
二、根本原因
问题并不在 YAML 配置写错,也不在于标签文件本身,而在于YOLO 存在双重缓存机制:
数据集本地缓存生成在数据集
labels/目录下的.cache文件,记录了标签的合法性。Ultralytics 全局缓存位于用户目录
~/.cache/ultralytics,会长期缓存旧的数据集配置,包括最早加载的nc=4这类错误配置。
即使修改了 YAML,YOLO 依然会优先读取全局缓存中的旧类别数,导致无论怎么改配置都不生效,这是该问题最隐蔽、最容易被忽略的核心原因。
三、解决方案
只需要同时清除数据集缓存和Ultralytics 全局缓存,强制 YOLO 重新加载最新 YAML 配置即可。
rm -rf ~/.cache/ultralytics数据集缓存在上面已经删除了,只需要再删除全局缓存即可。
执行完成后,重新启动训练命令,所有类别越界警告会完全消失,模型正常加载全部类别并开始训练。
四、总结
- YOLO 的类别数配置被缓存后,不会自动跟随 YAML 更新
- 只删数据集缓存不够,必须清理全局缓存才能彻底刷新配置
- 后续修改数据集
nc、类别名称、路径等配置后,建议直接执行上述两条命令,避免缓存导致的诡异问题 - 该方法适用于 YOLOv8、YOLOv13 等所有基于 Ultralytics 框架的模型
- 深度学习框架的缓存机制虽然能加速加载,但也常常带来 “改了配置不生效” 的迷惑性问题。遇到类别不匹配、路径不更新这类问题时,优先清理缓存往往能直接解决问题,省去大量排查时间。