训练数据的分配 (Data Allocation)

对于深度学习,通常采用 8:1:17:2:1 的比例将数据集分为三部分。

1. 三大集合的定义与作用
数据集名称 英文 比例建议 作用 (通俗解释) 作用 (学术定义)
训练集 Train 80% 课本。模型主要看这些图来学习什么是球、什么是桌子。 用于计算梯度并更新模型权重参数。
验证集 Val 10% 模拟考。训练过程中,模型每学一轮就考一次,看看学偏了没有(防过拟合)。 用于调整超参数(Hyperparameters)和确定最佳模型保存点(Early Stopping)。
测试集 Test 10% 高考。训练彻底结束后,用这部分完全没见过的数据跑一次,作为论文里的最终成绩。 用于评估模型的泛化能力(Generalization Ability)。

⚠️ 视频数据的“致命陷阱”:数据泄露 (Data Leakage)

  • 错误做法(随机切分): 你把所有视频切成 10,000 张图,打乱顺序,随机抽取 8000 张训练,1000 张验证。

    • 后果: 训练集里有“视频A的第5帧”,验证集里有“视频A的第6帧”。这两张图几乎一模一样。模型不需要学会“认识乒乓球”,它只要“背住这个背景”就能得高分。

    • 现象: 训练和验证分数极高(mAP 0.99),但拿去别的地方一用就废。

  • 正确做法(按视频序列切分): 你手头有 10 场比赛的视频。

    • Train: 拿前 8 场比赛的所有帧做训练。

    • Val: 拿第 9 场比赛做验证。

    • Test: 拿第 10 场比赛做测试。

    • 学术叫法: Leave-One-Sequence-OutSequence-based Split

训练策略 (Training Strategy)

迁移学习 (Transfer Learning)
  • 策略: 不从零开始(From Scratch),而是加载 yolov11n-seg.pt (COCO预训练权重)。

  • 理由: COCO 数据集里已经让模型学会了“什么是边缘”、“什么是圆球”。你只需要微调它,让它专门适应“乒乓球”。这能极大加速收敛。

2. 多尺度训练 (Multi-Scale Training)
  • 策略: 虽然你设定了 imgsz=1440,但 YOLO 在训练时,每隔几个 Batch 会随机改变输入图片的大小(比如在 1440 的 $\pm 50\%$ 范围内波动)。

  • 理由: 这让模型学会适应“远处的球(小)”和“近处的球(大)”,提高鲁棒性。

3. 动态数据增强 (Dynamic Data Augmentation)

这是 YOLOv8/v11 的“杀手锏”策略,要在论文里特意提一下:

  • 前期 (Epoch 0-80): 开启 Mosaic(马赛克拼接)和 Mixup

    • 作用: 增加难度,让模型看尽各种奇怪的组合,防止过拟合。

  • 后期 (Epoch 80-100): Close Mosaic (关闭马赛克)

    • 作用: 最后 10-20 轮,关掉那些花里胡哨的增强,让模型看“正常的、完整的”图片。这能让模型在最后阶段通过 L1 Loss 精确修整框的位置,通常能让 mAP 再涨 1-2 个点

4. 预热与余弦退火 (Warmup & Cosine Annealing)
  • Warmup (前 3 轮): 学习率从 0 慢慢爬升。防止一开始步子太大把模型“带沟里去”。

  • Cosine Decay (后续): 学习率按余弦曲线下降(就是你脚本里的 cos_lr=True)。

训练时的训练阶段问题

这是一个非常经典且在工程落地中必然会遇到的问题。在学术界,这通常被称为**“增量学习” (Incremental Learning)** 或 “持续学习” (Continual Learning) 的范畴;在工程界,这叫 “模型迭代” (Model Iteration)

针对你提出的“前期公开集训练 -> 后期部署地私有集训练”或“追加数据”的情况,如果不讲究策略,很容易出现**“灾难性遗忘” (Catastrophic Forgetting)**——即模型学会了新场景,却把以前学的东西忘了(比如本来能识别各种球台,只训练了自家球台后,换个球馆就不认识了)。

策略一:混合训练 (Data Mixing / Re-training) —— 【最稳健,推荐】

如果你有一张算力充足的显卡,这是最推荐的方案。不要试图让模型“接着学”,而是把新旧数据合在一起“重新学”。

  • 操作方法:

    1. 收集阶段: 你有 Dataset_A (公开集/旧数据) 和 Dataset_B (部署地新数据)。

    2. 合并阶段: 将它们的图片和标签物理合并到一个文件夹,或者在 data.yaml 里同时写两个路径(YOLO 支持列表格式)。

      YAML

      # data.yaml
      train:
        - /datasets/public_pingpong/train
        - /datasets/my_lab_pingpong/train  # 新增的数据
      
    3. 训练阶段: 加载官方预训练权重(如 yolov11n-seg.pt),从头开始(Epoch 0)重新训练。

  • 优点: 模型能同时学到通用的特征和特定场景的特征,效果最好,上限最高。

  • 论文/答辩话术:

    “为了解决单一场景数据的局限性,本研究采用了多源数据融合策略 (Multi-source Data Fusion)。将开源数据集的通用特征与部署环境的特定样本进行混合重组,构建了包含多场景分布的统一数据集进行全量训练,从而保证了模型在特定环境下的高精度,同时保留了对复杂变化的泛化能力。”

策略二:微调 (Fine-tuning) —— 【省时间,适合部署后迭代】

如果你不能拿到旧数据(比如旧数据太大了,或者丢失了),或者不想花时间重跑,可以用这个方法。

  • 操作方法:

    1. 底座模型: 拿你第一阶段训练好的 best.pt 作为基础。

    2. 新数据: 准备好只有新场景的 Dataset_B

    3. 训练配置(关键):

      • 加载权重: model='runs/.../best.pt'

      • 学习率变小: 因为模型已经很聪明了,不需要大步调整。将 lr0 设为默认值的 1/10 (例如 0.001)。

      • Epoch 变少: 通常跑 30-50 轮就够了。

      • ⚠️注意: 不要使用 resume=Trueresume 是为了断点续传(恢复优化器状态),而这里我们要开启新的训练任务,只是借用权重。

  • 风险: 灾难性遗忘。模型可能会为了迎合 Dataset_B 而通过大幅修改参数,导致它在 Dataset_A 上的表现暴跌。

  • 论文/答辩话术:

    “采用了迁移学习 (Transfer Learning)域适应 (Domain Adaptation) 技术。利用在公开大规模数据集上预训练的模型权重初始化网络,针对部署场景采集的小样本数据进行微调 (Fine-tuning)。通过降低学习率并缩短训练轮次,使模型参数快速适应目标域 (Target Domain) 的特征分布。”


策略三:冻结骨干 (Freezing Backbone) —— 【针对小样本/防过拟合】

如果你的“部署地数据”非常少(比如只有 50 张图),全量微调容易过拟合。这时可以锁住模型的“眼睛”(提取特征的部分),只训练“脑子”(做判断的部分)。

  • 操作方法: 在 YOLO 的 train.py 或参数中设置 freeze

    • freeze=10: 冻结骨干网络(Backbone),通常是前 10 层。

    • 这意味模型提取线条、形状的能力不变,只改变最后如何分类和画框的能力。

  • 适用场景: 乒乓球还是那个乒乓球,只是球馆的光线变了、背景变了。

  • 论文/答辩话术:

    “为了在小样本目标域数据上防止过拟合,采用了参数冻结策略 (Parameter Freezing)。冻结了特征提取网络(Backbone)的权重,仅对检测头(Head)进行更新。这使得模型保留了强大的特征提取能力,同时能针对特定场景的类别分布进行快速适配。”

训练遇到的问题

问题原因:用yolo11s来训练一个识别乒乓球的模型 先使用一个网上的公开数据及进行的第一阶段的训练,公开数据集的数据量很大(包含四万多张带标注的训练图像)然后采集部署环境的数据来进行第二阶段训练 那么在进行第二阶段训练时是要部署环境的数据及和原来的公开数据及进行整合,进行一次整体训练,还是只使用用该公开数据及训练出来的best模型对我的部署地环境的数据进行训练?

解决方式:推荐使用“中间路线”——即加载第一阶段训练好的 best.pt 作为预训练权重,数据上以“部署环境数据”为主,但最好混入一部分“公开数据”。

选项一:只使用“部署环境数据”继续训练(Fine-tuning)

这是你提到的“用公开数据训练出来的 best 模型对部署地环境的数据进行训练”。

  • 操作方式:yolo 命令中,model=你的第一阶段best.ptdata=只有新环境的数据集.yaml

  • 优点: 训练速度极快,模型会迅速适应你的场地(光线、背景、摄像机角度)。

  • 缺点(核心风险): 会出现**“灾难性遗忘”(Catastrophic Forgetting)**。

    • 通俗解释: 就像一个人本来学了“通识教育”(公开数据),现在只让他死记硬背“特定考题”(新环境数据)。他可能会为了把新题做对,把以前学到的通用特征(比如乒乓球在不同角度的纹理、球体边缘特性)给忘掉。

    • 后果: 如果你的部署环境稍微有一点变化(比如某天拉了窗帘光线变了,或者摄像头碰歪了一点),模型可能直接失效,因为它的泛化能力变差了。

选项二:将“新旧数据整合”进行整体训练

这是你提到的“将部署环境数据和原来的公开数据整合”。

  • 操作方式: model=yolo11s.pt(或者也用你第一阶段的best.pt作为起点),data=包含所有图片的大数据集.yaml

  • 优点: 模型最稳健。它既见过各种通用的乒乓球(公开数据),又见过你场地的球(新数据)。泛化能力强。

  • 缺点:

    1. 数据不平衡: 公开数据通常很大(比如几千张),你自己采集的数据可能只有几百张。如果直接混在一起,模型可能会“淹没”在公开数据里,导致对你特定环境的优化不够。

    2. 训练慢: 数据量大了,训练时间变长。

✅ 最佳实践建议

1. 权重选择 (Weights)

一定要使用你第一阶段训练出来的 best.pt 作为起点。 这就相当于让一个已经懂乒乓球是什么样子的“熟手”来适应新环境,而不是从头教一个小白。

2. 数据集策略 (Data Strategy) —— 关键点

不要完全抛弃公开数据,也不要被公开数据淹没。建议构建一个新的混合数据集:

  • 新环境数据: 100% 全部放入(这是最重要的)。

  • 公开数据: 随机抽取 20% - 50% 放入(作为“复习材料”,防止它忘记球的基本特征)。

  • 注意: 如果你的新数据非常少(比如少于100张),那么公开数据就少放点,或者对新数据多做一些增强(Augmentation),让两者比例不要太悬殊(例如新旧数据比例控制在 1:3 到 1:1 之间)。

3. 超参数调整 (Hyperparameters)

由于你是基于一个已经懂球的模型进行微调,你不需要像第一次那样猛烈地更新参数。

  • Epochs(轮数): 可以少一点(比如第一阶段跑了100轮,第二阶段可能30-50轮就收敛了)。

  • Learning Rate(学习率): 如果是用命令行训练,YOLOv11 默认的优化器通常能处理好,但如果你发现损失值震荡厉害,可以适当调小初始学习率。

总结你的下一步操作:

  1. 清洗数据: 确保你采集的“部署环境数据”标注质量非常高(因为这部分数据权重最高,标错了影响很大)。

  2. 混合数据: 把所有新数据 + 部分旧数据放在一起,生成一个新的 data_v2.yaml

  3. 启动训练命令:

    Bash

    yolo train model=runs/detect/train/weights/best.pt data=data_v2.yaml epochs=50 imgsz=640 ...
    

    (注意 model 指向你第一阶段训练出的权重文件)

这样做,你既能拥有针对特定场地的超高精度,又能保留模型对乒乓球本质特征的理解,即使环境微调也能保持鲁棒性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐