第二章:标注数据采集与预处理

数据是AI模型的燃料,这话一点不假。但说实话,很多人把精力全花在调模型上,却忽略了数据本身的质量。我见过太多项目,模型结构再花哨,数据一塌糊涂,结果就是白忙活。这一章,咱们就聊聊怎么把数据这块地基打牢。

核心观点:标注数据的质量,直接决定了模型的天花板。数据采集和预处理,不是体力活,是技术活。

2.1 数据采集策略:别瞎抓,要有章法

数据采集听起来简单,不就是找图、找文本嘛?但实际做起来,坑特别多。我个人习惯,先问三个问题:

  • 业务场景是什么? 比如做自动驾驶,你需要的是雨天、夜晚、隧道这些真实场景,而不是网上随便找的风景照。
  • 数据分布是否均衡? 我遇到过项目,正样本和负样本比例1:1000,模型直接学废了。
  • 数据来源是否合规? 这个容易被忽略,但一旦出事,后果很严重。

常用的采集策略,我整理了一张表:

策略 适用场景 注意事项
公开数据集 通用任务(分类、检测) 注意版权和标注质量
爬虫采集 互联网公开数据 遵守robots协议,别踩红线
人工采集 特定场景(工业缺陷、医疗影像) 成本高,但质量可控
数据合成 稀缺场景(极端天气、罕见故障) 需要验证合成数据的真实性

我的经验: 做工业质检项目时,我们用了80%的真实数据+20%的合成数据,效果比纯真实数据还好。但要注意,合成数据不能太假,否则模型会学到伪特征。

2.2 数据清洗方法:脏数据是模型的天敌

数据采集回来,千万别急着用。先洗一遍。我见过最夸张的情况,一个图像分类数据集里,有20%的图片是模糊的、重复的、甚至标签错的。这种数据喂进去,模型能学好才怪。

数据清洗,我一般分三步走:

  1. 去重: 重复数据会让模型过拟合。用哈希值或特征比对,把重复的干掉。
  2. 去噪: 模糊图片、乱码文本、异常值,统统过滤掉。比如图像,可以检查分辨率、亮度、对比度。
  3. 纠错: 标签错误是最隐蔽的坑。我曾经有个项目,标注员把“猫”标成了“狗”,模型学了半天,猫狗不分。

避坑指南: 我曾经在文本分类项目里,发现大量“空字符串”和“纯标点符号”的数据。这些数据看似无害,但会让模型学到奇怪的模式。一定要做空值检查和长度过滤。

清洗代码示例(Python):

import cv2
import numpy as np

def clean_image(image_path):
    img = cv2.imread(image_path)
    if img is None:
        return False  # 图片损坏
    h, w = img.shape[:2]
    if h < 100 or w < 100:
        return False  # 尺寸太小
    blur = cv2.Laplacian(img, cv2.CV_64F).var()
    if blur < 100:
        return False  # 模糊图片
    return True

2.3 数据增强技术:让数据“变”出花样

数据不够?增强来凑。但增强不是乱变,要有物理意义。你想想看,做车牌识别,你把车牌上下翻转,那还叫车牌吗?

常用的增强方法,我分成三类:

  • 几何变换: 翻转、旋转、裁剪、缩放。适合位置敏感的任务,比如目标检测。
  • 色彩变换: 亮度、对比度、饱和度、色相调整。适合光照变化大的场景。
  • 噪声注入: 高斯噪声、椒盐噪声、模糊。适合鲁棒性要求高的任务。

我个人的习惯是,先做离线增强(生成固定数量的新样本),再做在线增强(训练时实时变换)。离线增强适合小数据集,在线增强适合大数据集。

小技巧: 做图像分类时,我常用RandomHorizontalFlip和ColorJitter的组合。这两个操作计算量小,但效果显著。记住,增强强度要适中,太强会破坏语义信息。

增强代码示例(PyTorch):

from torchvision import transforms

train_transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomRotation(degrees=15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2),
    transforms.ToTensor(),
])

2.4 标注格式统一化:别让格式坑了你

标注格式,看似小事,实则大事。我见过团队,有人用XML,有人用JSON,有人用TXT。最后合并数据时,光格式转换就花了一周。嗯,这里要注意,从一开始就定好标准。

常见的标注格式:

任务类型 推荐格式 说明
图像分类 文件夹结构 / CSV 简单直观,适合小规模
目标检测 COCO JSON / YOLO TXT COCO格式通用性强,YOLO格式轻量
语义分割 PNG掩码 / COCO JSON PNG掩码直接,JSON带元数据
文本标注 JSONL / CSV JSONL适合流式处理

统一格式时,我建议做三件事:

  1. 定义字段规范: 比如类别名称用英文还是中文?坐标是归一化还是绝对值?
  2. 写转换脚本: 把不同格式统一成一种。我习惯用COCO格式,因为它生态好,工具多。
  3. 做格式校验: 检查字段是否缺失、类型是否正确、坐标是否越界。

避坑指南: 我曾经在YOLO格式里,发现标注坐标出现了负数。原因是标注工具的一个bug。从那以后,我每次转换完都会做一次合法性校验,确保所有坐标都在[0,1]范围内。

知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个检查清单,做数据准备时对照着来。

标注数据采集与预处理 · 知识体系 数据准备全流程 数据采集策略 数据清洗方法 数据增强技术 标注格式统一化 公开数据集 爬虫采集 人工采集 数据合成 去重 去噪 纠错 几何变换 色彩变换 噪声注入 COCO JSON YOLO TXT PNG掩码 JSONL 数据质量 = 模型性能的上限

说白了,数据准备这件事,没有捷径。但只要你把采集、清洗、增强、格式统一这四个环节做扎实了,模型训练就成功了一半。我这些年踩过的坑,大部分都出在数据上。所以,别急,慢慢来,把数据伺候好了,模型自然会给你回报。


专注资料整理