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

Yolov8预训练模型如何新增类别并保留原有类别?

YOLOv8预训练模型新增类别并保留原有类别的解决方案

核心问题分析

直接用新类别小数据集训练会覆盖原有权重,只修改yaml不加旧类别数据会导致模型遗忘旧类别——这是你之前出现问题的根本原因,不用必须在完整COCO+新类别上从头重训,增量训练才是最优方案。

具体实施步骤

  • 准备混合数据集:将需要保留的原有COCO类别数据(可以是全部或你需要的子集)和自定义新类别的标注数据合并,确保每个类别都有足够的标注样本(建议每个类别至少几十张,复杂类别需更多)。
  • 修改配置yaml:在yaml的names列表末尾添加新类别,同步更新nc(类别总数)。比如原COCO是80类,新增1类后nc: 81,names最后加你的新类别名称。
  • 分阶段增量训练:
    1. 加载预训练YOLOv8模型,先冻结backbone(模型的特征提取部分),用较低的学习率训练头部(分类检测层),让模型先学习新类别的特征,同时保留原有backbone的特征提取能力。
    2. 解冻所有层,用稍高的学习率全量微调,让模型融合新旧类别的特征。
      示例代码:
    from ultralytics import YOLO
    
    # 加载官方预训练模型
    model = YOLO('yolov8n.pt')
    
    # 冻结前10层backbone,低学习率训练头部,适配新类别
    model.train(
        data='your_custom_data.yaml',
        epochs=15,
        lr0=0.0001,  # 初始学习率设为常规的1/10
        freeze=10
    )
    
    # 解冻所有层,全量微调,融合新旧类别特征
    model.train(
        data='your_custom_data.yaml',
        epochs=40,
        lr0=0.001,
        freeze=0  # 0表示不冻结任何层
    )
    

避坑指南

  • 禁止只用新类别数据训练:这样模型会完全覆盖原有权重,直接丢失旧类别检测能力。
  • 禁止只修改yaml但不加入旧类别数据:模型没有旧类别的训练样本,推理时旧类别检测效果必然极差。
  • 不建议同时运行两个模型:资源占用高,新增类别越多越难维护,增量训练才是可持续的方案。

折中优化(如果不想用完整COCO数据集)

如果完整COCO数据集太大,你可以只保留需要的原有类别子集(比如你只需要检测人、车、狗),加上新类别数据进行训练,这样训练量大幅降低,同时能保证目标原有类别的检测能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:22:53