数据集里 6000 张图,想训一个 YOLO 做预标注(不是最终部署)——是把所有类别塞一个模型,还是按大类拆多个?答案要看你的类别怎么分。
场景 1:类别相近 → 一个大模型
比如都是路面场景:person、car、bus、truck、traffic_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 / YOLO11s:6000 张的甜蜜点,训练 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 更实用。
