已经训练好的 YOLO 模型,添加新的识别标签(类别)的步骤和注意事项

已经训练好的 YOLO 模型,添加新的识别标签(类别)的步骤和注意事项_第1张图片

在已经训练好 YOLO 模型后添加新的识别标签(类别),可以通过迁移学习的方式高效完成,而不必重新训练整个模型。以下是具体步骤和注意事项:

一、准备工作

  1. 保存原模型:确保有原始训练的 checkpoint 文件(如 best.ptlast.pt)。
  2. 标注新类别数据:为新增类别准备标注数据,格式需与原数据一致(YOLO 格式的 .txt 文件)。
  3. 更新配置文件
    • 修改 data.yaml 增加新类别:
      nc: 81  # 原 80 类 + 新增 1 类
      names: ['person', 'car', ..., 'new_class']  # 添加新类别名称
      

二、迁移学习策略

方法 1:冻结骨干网络,仅训练新类别

适合新增类别与原类别差异较大的场景,可避免遗忘旧知识:

# YOLOv5 示例:冻结前 10 层,仅训练检测头
python train.py --weights yolov5s.pt \
                --data data.yaml \
                --epochs 50 \
                --freeze 0 1 2 3 4 5 6 7 8 9 \
                --lr0 0.001
方法 2:微调整个模型

适合新增类别与原类别相关的场景,需降低学习率防止遗忘:

# YOLOv5 示例:微调整个模型
python train.py --weights yolov5s.pt \
                --data data.yaml \
                --epochs 50 \
                --lr0 0.0001  # 比初始训练小 10 倍
方法 3:为新类别创建单独的检测头

高级方法,需修改模型结构,适合新增类别与原类别差异极大的场景。

三、数据处理策略

1. 数据混合
  • 将新旧数据按比例混合,避免新类别数据过少导致过拟合。
  • 推荐比例:新增数据占总数据的 20%-50%。
2. 数据增强
  • 对新类别数据应用更强的数据增强(如 Mosaic、MixUp),扩充样本多样性。
3. 平衡采样
  • 确保训练时新旧类别样本均衡,可使用 class_weights 参数调整:
    # data.yaml 中添加
    class_weights: [1.0, 1.0, ..., 5.0]  # 最后一类为新类别,权重提高 5 倍
    

四、训练流程优化

1. 分阶段训练
  1. 阶段 1:冻结骨干网络,仅训练检测头(10-20 轮)。
  2. 阶段 2:解冻部分层(如最后几个 CSP 模块),微调(10-20 轮)。
  3. 阶段 3:解冻全部层,小学习率微调(10-20 轮)。
2. 早停与检查点
  • 使用早停策略,当验证集性能不再提升时终止训练。
  • 保存多个检查点(如每 5 轮),防止训练中断。

五、验证与部署

1. 验证新增类别性能
  • 使用 val.py 脚本评估模型对新旧类别的检测性能:
    python val.py --weights runs/train/exp/weights/best.pt --data data.yaml
    
2. 导出模型

训练完成后,导出模型用于部署:

# YOLOv5 导出 ONNX 格式
python export.py --weights runs/train/exp/weights/best.pt --include onnx

六、常见问题及解决方法

问题 原因 解决方法
新类别检测率低 数据不足或特征不匹配 增加新类别样本,或对新类别单独进行小学习率训练
旧类别性能下降 灾难性遗忘 降低学习率,增加旧数据比例,或使用知识蒸馏(如保存旧模型作为教师)
训练不稳定 学习率过高或数据不平衡 降低学习率,使用类别权重平衡采样

七、示例:在 YOLOv5 上添加新类别

# 假设已训练好 COCO 80 类模型,现在添加 "cat" 和 "dog" 两个新类别
# 1. 更新 data.yaml
nc: 82
names: ['person', 'bicycle', ..., 'cat', 'dog']

# 2. 准备新类别数据并合并到数据集

# 3. 执行迁移学习(冻结骨干网络)
python train.py --weights yolov5s.pt \
                --data data.yaml \
                --epochs 30 \
                --freeze 0 1 2 3 4 5 6 7 8 9 \
                --lr0 0.001 \
                --batch 16

通过上述方法,你可以高效地为已训练的 YOLO 模型添加新类别,同时保持对原有类别的检测能力。

你可能感兴趣的:(YOLO,YOLO,深度学习,python,人工智能,YOLO,模型添加新的识别标签,YOLO迁移学习,yolov5/yolo11)