6000 张图做 YOLO 辅助标注:一个大模型还是拆多个

数据集里 6000 张图,想训一个 YOLO 做预标注(不是最终部署)——是把所有类别塞一个模型,还是按大类拆多个?答案要看你的类别怎么分。

场景 1:类别相近 → 一个大模型

比如都是路面场景:personcarbustrucktraffic_light——目标形态接近、上下文相似,塞一个模型没问题:

# data.yaml
nc: 20
names:
  - person
  - car
  - bus
  - truck
  - traffic_light
  - ...

优点:

  • 只维护一个模型
  • 推理一次拿全部结果
  • 6000 张图对 YOLOv8s / YOLO11s 一点都不多,一晚上跑完
  • 类别之间可能有互相约束(比如”斑马线附近容易有 person”),单模型能学到

场景 2:类别跨度大 → 拆多个模型

要标的东西差别巨大:

交通标志:限速 / 禁停 / 左转 / 右转
车辆:car / bus / truck
家具:chair / table / sofa

三个域完全不同的时候,一个模型很容易顾此失彼——训到最后 mAP 只是 balance 出的中间值。每个域一个小模型

  • 交通标志检测模型
  • 车辆检测模型
  • 家具检测模型

优点:

  • 新加一个大类不用重训全部
  • 小模型训练快、精度高
  • 误检更少(不会拿”椅子”当”汽车”)

缺点:

  • 推理跑多个模型
  • 管理麻烦(模型 → 类别 → 版本)

场景 3:类别很多且分层 → 分级流水线

CVAT / LabelStudio 等专业标注平台常用的做法——粗定位 + 细分类

一级:粗定位(找目标)

  ├─ person
  ├─ vehicle
  ├─ animal
  ├─ traffic_sign
  └─ building

二级:细分类(每个粗类一个小模型)
  ├─ traffic_sign
  │    ├─ speed_limit
  │    ├─ stop
  │    ├─ turn_left
  │    └─ turn_right
  ├─ vehicle
  │    ├─ car / bus / truck / bike
  └─ ...

粗模型只负责”找到候选框”,细分类器(可以是分类模型不是检测)判定具体类别。这套结构对增加新细类特别友好——只改对应二级分类器就行。

配合 SAM 类分割模型:SAM 出 mask → YOLO 分类头判定 → 输出精细标注。这是当前自动标注前沿方案。

6000 张的容量参考

  • YOLOv8n / YOLO11n:几百到几千张就能有效果,训练几十分钟
  • YOLOv8s / YOLO11s6000 张的甜蜜点,训练 1-3 小时
  • YOLOv8m / YOLO11m:需要至少 1 万张才发挥优势
  • YOLOv8l / YOLOv8x:几万张起步

6000 张选 s / m,别上 l 或 x——过拟合概率大。

类别不平衡怎么办

6000 张里可能某些类别几百张、某些类别几十张。方法:

  • 加数据增强:mixup、mosaic、hsv、rotation——Ultralytics 默认就开
  • 加权采样class_weights 让少数类被多次采样
  • 合并罕见类:训不动的类临时合并成”其它”,先跑通再迭代
  • cascade:稀有类先由粗模型定位,再单独训一个二分类判定

辅助标注 vs 最终部署

辅助标注模型要求:

  • Recall 优先(宁多勿少,人工再删)
  • Precision 差点没事
  • 速度不用极致

最终部署模型要求:

  • Precision + Recall 都要
  • 速度 / 显存有约束
  • 需要严格评测

两者训练策略也不一样。辅助标注可以 confidence 阈值调低(比如 0.15),把所有可疑目标都框出来,让人复核。

推荐做法

如果类别 <= 30、都是相似的场景:一个 YOLOv8s / YOLO11s 模型,配合置信度 0.15-0.25 做辅助标注,人工审核补漏。

类别 >= 50 或者跨大类:每个大类一个模型,或者上”检测 + 分类”分级流水线。

一句话总结

类别相近 → 一个大模型;跨度大 → 拆多个;类别多且分层 → 检测 + 分类分级。辅助标注就调低 confidence 让人复核,比追求高 precision 更实用。