YOLOv5训练未识别新增类别、输出标签异常问题咨询
YOLOv5扩充类别训练异常问题解答
(1)training from scratch(从头训练)的定义
YOLOv5官方定义的从头训练,指不加载任何预训练权重,网络所有层的参数全部随机初始化,在你配置的完整数据集(即原有80类+新增26类合并后的全量106类数据)上做全参数迭代更新,不存在“只训练新增类别”的模式。
注意你当前执行的命令不属于严格的从头训练:传入了--weights yolov5s.pt意味着加载COCO预训练权重做迁移学习,只有修改类别数后自动重建的检测头输出层是随机初始化的,主干网络、特征融合层的参数都从预训练权重起步。如果要触发官方的从头训练流程,需要将权重参数改为--weights '',搭配你用的hyp.scratch-high.yaml超参文件才符合要求。
(2)数据集扫描阶段仅识别1个类别、仅生成单类cache文件的原因
该问题核心出在数据集配置或标注文件的匹配逻辑上,按排查优先级排序:
- 类别ID映射错误:YOLO要求标注文件里的类别ID为从0开始的连续整数,和数据集yaml文件中
names列表的索引严格一一对应。COCO原80类的官方ID不是连续的0-79,如果你直接把新增类ID从80开始顺排,或者标注里写的ID和names列表索引对不上,扫描程序会直接过滤所有ID不匹配的标注,仅统计能匹配上的类别。 - 旧缓存干扰:如果你之前在同一路径下训练过原80类的coco128,目录下残留的旧
labels.cache文件会被程序直接读取,不会重新扫描你新增的标注数据,只会统计旧缓存里记录的类别。 - 路径配置错误:检查yaml文件里的
train、val路径,是否同时覆盖了原有coco128的图片/标注目录、以及你新增数据的存放目录。如果路径拼写错误、或只指向了某一个新增类的单独文件夹,程序自然只能扫到路径下存在的那1个类的标注。
你提到训练可视化图像里能看到新增类的训练痕迹,本质是标注ID和类别名错位,程序把新增类的标注错误分配给了ID匹配上的其他类,不是真的识别到了所有新增类别。
(3)训练轮次日志仅展示原有80类、不显示新增类的原因
该问题是第二个问题的连锁结果:
YOLOv5训练过程中的逐类指标统计,完全依赖数据集扫描阶段生成的cache文件里记录的有效类别列表。如果扫描阶段没有正确识别到全部26个新增类的有效标注,cache里没有对应类别的记录,训练时这些类别就没有对应的监督信号计算损失和指标,自然不会出现在日志的类别统计栏里。
哪怕你已经把模型结构的nc参数改成106、日志显示输出层维度切换到106,只要标注数据没有正确加载,检测头对应新增类的输出通道全程没有有效梯度回传,相当于这部分参数根本没有参与训练,和你“模型没训新增数据”的推测一致。
快速修复步骤
- 全量删除所有数据集标注目录下的
labels.cache文件,清除旧缓存干扰 - 核对数据集yaml配置:确认
nc参数值为106,names列表按顺序写全106个类名,索引从0到105连续无重复、无错位 - 抽样检查新增类的标注文件:确认每一行第一个值的类别ID和
names列表的索引完全对应,没有ID越界、错写、和原有类ID重复的问题 - 核对yaml中的
train、val路径,确认路径下同时包含原有coco128和新增数据的图片、标注文件,无拼写错误
内容的提问来源于stack exchange,提问作者MatPar
相关产品推荐
相关产品推荐

