4. 数据版本管理与数据集构建
在工业视觉项目中,模型精度往往不是被网络结构卡住的,而是被数据卡住的。同一批产线图像,如果标注口径变了、增强策略改了、训练集与测试集混入了同一卷料,模型指标就会在“看似相同”的数据集上出现不可复现的波动。因此,数据版本管理要解决的核心问题是:让每一次训练都能追溯到唯一确定的数据快照,并让这个快照的构成、划分和偏差可被解释。
一、三类数据的版本控制对象
工业视觉的数据通常分为三层:原始数据、标注数据、增强数据。它们的版本控制策略并不相同。
- 原始数据(raw):相机采集的原始图像或视频帧,是不可再生的证据。版本控制以“批次”为单位,记录采集时间、工位、相机型号、镜头、光源、曝光、增益、产品批次。原始数据原则上只追加、不修改,一旦落盘即冻结。
- 标注数据(label):与原始图像一一对应的标注文件(如 COCO JSON、YOLO txt、掩膜 PNG)。标注会迭代,因此需要独立版本号,并记录标注规范版本、标注人、复核人、修改原因。
- 增强数据(aug):由原始图像加标注经几何、光度变换生成。增强数据不应单独长期存储为“新数据源”,而应保存增强配方(随机种子、变换参数、概率),使其可重放。这样既节省存储,又保证可复现。
二、数据集划分策略
划分不是简单按 8:1:1 随机切分。工业场景中,同一产品、同一卷料、同一班次采集的图像高度相似,随机切分会导致训练集和测试集“近邻泄漏”,测试指标虚高。正确的划分应按采集单元分组:以产品批次、卷料号或采集时段为分组键,整组进入同一子集。
常用比例与适用场景:
| 划分方式 | 比例 | 适用场景 |
|---|---|---|
| 按批次分组划分 | 70/15/15 | 缺陷类型稳定、批次间差异小 |
| 按时间前向划分 | 早期训练 / 中期验证 / 后期测试 | 模拟产线时间漂移,评估泛化 |
| 留一批次交叉验证 | K 折 | 批次少、样本珍贵 |
验证集用于调参和早停,测试集只在最终评估时使用一次。若测试集被反复查看并据此调参,它实际上已退化为验证集,必须重新划分。
三、类别不平衡处理
工业缺陷检测中,划痕、脏污等缺陷可能只占千分之几,而背景占绝大多数。直接训练会让模型偏向多数类。处理手段分三个层次:
- 采样层:对含缺陷图像过采样,或对背景图像欠采样。过采样时注意同一图像的不同增强副本不应跨子集分布。
- 损失层:使用 Focal Loss 或带类别权重的交叉熵。权重可按
w_c = N / (K · n_c)估算,其中 N 为总样本数,K 为类别数,n_c 为第 c 类样本数。 - 增强层:对稀有类做针对性增强,如小目标缺陷的随机缩放、旋转、局部对比度扰动,但增强幅度需与真实成像变化一致,避免引入不存在的形态。
四、数据卡编写
数据卡(Data Card)是数据集的“身份证”,让接手者无需翻代码就能判断该数据集能否用于当前任务。一份可用的数据卡至少包含:数据集名称与版本号、采集设备与工位、图像数量与分辨率、类别定义与每类样本数、标注规范版本、划分方式与各子集数量、增强配方摘要、已知偏差与限制、许可与使用范围。
下面这张图概括了从原始数据到可训练数据集版本的完整链路,以及版本标识的生成位置:
五、一个可执行的数据卡示例
以下是一份面向某金属表面缺陷检测项目的数据卡片段,字段可直接套用:
数据集名称:metal-surface-defect
版本号:v2.3.0
采集设备:Basler acA2440-75um,镜头 25mm,环形白光
工位:冲压线 A 工位,曝光 8000us,增益 6dB
图像数量:12480 张,分辨率 2448×2048
类别定义:
scratch(划痕) n=412
stain(脏污) n=286
dent(凹坑) n=158
background(背景)n=11624
标注规范版本:label-spec-v1.4(最小框面积 12px²)
划分方式:按卷料号分组,70/15/15
训练 8736 / 验证 1872 / 测试 1872
增强配方:随机水平翻转 p=0.5,亮度 ±15%,高斯噪声 σ=3
已知偏差:夜班光照偏暗,样本占比 18%,测试集已覆盖
使用范围:仅限 A 工位同型号产品,跨工位需重新评估
有了这份数据卡,当模型在测试集上 mAP 下降 3 个点时,团队可以快速判断是标注规范变更、增强配方调整,还是划分方式改变导致的,而不是盲目重训。数据版本管理的价值,正在于把“数据变了”这件事从模糊感受变成可定位的工程事实。