数据集构建与标注:AI 项目最被低估的工程量——从采集到质检

· 约 6 分钟 ·
本文目录(10 节)

同一条样本被两个人标成不同类别时,先调模型通常解决不了问题。需要回头检查类别定义、边界案例和复核流程。下面从标注规范写起,依次讨论抽样、人员校准、一致性检查和数据版本,让训练结果能够追溯到具体的数据决定。

前置阅读:建议先读 数据采集与爬虫、数据清洗实战。

采集:先合规,再谈量

数据三问:有权用吗?够用吗?分布对吗?

  • 合规:爬虫遵守 robots 协议和网站条款;人脸、语音等生物信息有专门法规(国内个保法对人脸信息是「单独同意」级别);商用场景别碰「仅研究用途」的数据集(ImageNet 就是)。
  • 量:经验法则是类别数 × 每类几百到几千样本起步,但更靠谱的是画学习曲线——用 10%、30%、100% 数据分别训练,看效果是否还在涨,还在涨就说明加数据有用。
  • 分布:训练集和线上真实分布的偏差(distribution shift)是隐形杀手。我见过用白天照片训练的检测模型,上线后夜景全废——采集计划里就要覆盖时间、设备、地域等关键维度。

标注规范:最重要的那几页纸

标注质量的上限在规范里就决定了。一份能用的标注规范必须包含:

  1. 每个类别的精确定义 + 边界案例。「缺陷」和「划痕」的边界在哪?0.5mm 以下的算不算?每个模糊类别配 5~10 个正反例图。
  2. 处理规则:遮挡怎么办、模糊怎么办、截断怎么办、不确定怎么办(建议设「跳过」而不是逼标注员猜)。
  3. 标注粒度:框要贴边还是留余量?多边形顶点密度多少?

规范不是写完就完了——先用 200 个样本做试标注,让标注员把疑问暴露出来,规范迭代 2~3 轮再放量。试标注阶段暴露的分歧案例,是规范里最值钱的内容。

工具实操:Label Studio

开源标注工具里 Label Studio 覆盖面最广(图像框选/多边形、文本分类/NER、音频、视频都有),自建部署一条命令:

pip install label-studio
label-studio start   # 浏览器打开 http://localhost:8080

工作流:建项目 → 选模板(如 Object Detection)→ 导入数据 → 配置标注界面(XML 可定制类别和快捷键)→ 分发任务 → 导出 COCO/YOLO/JSON。团队协作时给每个标注员建账号,后面算一致性要用到「谁标的」这个信息。CV 场景的备选是 CVAT(框选类更专业),文本场景还有 doccano。

质检:用 Kappa 量化「靠不靠谱」

两个标注员标同一批数据,一致率 90% 听起来不错?去掉「随机也能蒙对」的部分再看——这就是 Cohen’s Kappa:

κ=po−pe1−pe\kappa = \frac{p_o - p_e}{1 - p_e}

pop_o 是观察到的一致率,pep_e 是随机一致率(按各自类别分布算出来的期望一致率)。二分类各占一半时,随便标都有 50% 一致,κ\kappa 会把这部分水分挤掉。

from sklearn.metrics import cohen_kappa_score

labeler_a = [1, 0, 1, 1, 0, 1, 0, 0, 1, 1] * 50
labeler_b = [1, 0, 1, 0, 0, 1, 0, 1, 1, 1] * 50
kappa = cohen_kappa_score(labeler_a, labeler_b)
print(f"Kappa = {kappa:.3f}")

判读标准:κ>0.8\kappa > 0.8 优秀;0.6~0.8 可以接受但要抽查;< 0.6 说明规范有歧义或标注员没培训到位,必须停下来整改。质检流程上再加两道保险:10% 样本插入「已知答案的金标题」测标注员准确率;每周抽样复核,错误案例回流到规范里。

降本三板斧:预标注、主动学习、弱监督

标注是计件的,省标注就是省钱。三种策略按实施难度排序:

预标注(Pre-labeling):先用现有模型(哪怕是通用模型)自动标一遍,人工只做修正。实测修框比画框快 3~5 倍。Label Studio 支持接 ML backend 做这件事。

主动学习(Active Learning):不是随机挑样本让人标,而是让模型挑「最拿不准的」——预测概率最接近 0.5 的、各模型意见分歧最大的样本优先标注。同样标注预算下,主动学习选出的样本信息量是随机样本的几倍:

# 最简主动学习:不确定性采样
probs = model.predict_proba(X_unlabeled)
uncertainty = 1 - probs.max(axis=1)          # 最大概率越小越不确定
query_idx = uncertainty.argsort()[-500:]      # 挑最不确定的 500 个送标注

弱监督(Weak Supervision):Snorkel 的思路——用一堆粗糙的「标注函数」(关键词规则、正则、已有模型、知识库)给数据打带噪声的标签,再用生成模型学习这些函数的准确率和相关性,融合出概率标签。人工从「逐条标注」升级为「写规则」,一个人能覆盖几十万样本。

版本管理:数据集也要 git

代码有 git,数据呢?改动数据集(加了新批次、修了错标)后,「这个模型是用哪版数据训的」必须可回答。DVC(Data Version Control)是标准答案:数据文件本身进对象存储,git 里只存元信息指针,dvc add / dvc push 后数据版本和代码版本一起被 commit 锁定。轻量替代方案是给数据集打语义化版本号(dataset-v1.3)+ 变更日志,无论如何不要出现「最新的数据在谁谁电脑的移动硬盘里」。

我做的标注质量实验

工业质检项目里,我把同一批 5000 张缺陷图按三种方式处理,训练同一个检测模型:

数据版本缺陷召回率说明
原始标注(无质检)71.3%抽查发现约 8% 漏标、5% 错类
修复错漏标后84.6%同样的模型和超参,+13 个点
修复 + 主动学习扩 2000 张89.1%扩的是边界样本,不是随机样本

修复标注错误带来的提升,超过了我之前两个月调模型的全部努力。从那以后我立项先问数据、再谈模型。

踩坑与排查

症状可能原因排查方法
不同标注员结果差很多规范歧义/培训不足算 Kappa;组织对齐会过边界案例
模型在测试集好、上线差训练/线上分布不一致对比两批数据的特征分布;补采缺口场景
标注进度慢、返工多没做试标注就放量补试标注轮;规范加边界案例图
某类别召回率特别低该类样本少或标注系统性漏标分层检查各类别标注质量
数据版本对不上实验记录无版本管理上 DVC 或至少版本号+变更日志
预标注越标越偏模型偏差被固化保留随机抽样的纯人工标注做对照

动手练习

  1. 选一个 100 条文本分类小数据集,找一位同学各自独立标注,计算你们的 Cohen’s Kappa,分歧案例逐条讨论。
  2. 用 Label Studio 完成一个小目标检测项目的全流程:导入、标注、导出 YOLO 格式。
  3. 写一个主动学习循环:初始 100 条标注训练 → 不确定性采样 50 条 → 重训,重复 5 轮,和随机采样对比效果曲线。

面试常问

Q:标注一致性怎么评估?Kappa 为什么比一致率好? 简单一致率包含了「随机碰巧一致」的水分,类别分布越不均匀水分越大。Cohen’s Kappa 用两个标注员各自的类别边缘分布算出随机期望一致率 pep_e,把这部分扣除后再归一化,得到的是「超出随机的真实一致性」。0.8 以上才可认为标注规范是清晰的。

Q:标注预算有限,怎么花最值? 优先级:先把规范打磨清楚(试标注暴露歧义),再上预标注减半工作量,然后用主动学习把预算花在信息密度最高的边界样本上,最后保留少量金标数据做持续质检。随机标注一万条不如精选标注三千条。

Q:弱监督适用什么场景? 标注极贵但规则/知识好写的场景:医疗影像(专家时薪高)、海量文本分类(关键词规则覆盖大部分情况)。它的核心权衡是用标签噪声换规模,配合对噪声鲁棒的训练方法(或后续小规模精标微调)效果最好。

数据集工程的信条:Garbage in, garbage out 是 AI 领域唯一没有例外的定律。

相关阅读:数据采集与爬虫、数据清洗实战、LLM 预训练数据工程、工业视觉质检项目。

💬 评论

这套方案在哪一步卡住了?也欢迎补充你的实现方式或踩坑经验。

正在连接评论服务,首次访问可能需要几秒…