第二章:标注数据采集与预处理
数据是AI模型的燃料,这话一点不假。但说实话,很多人把精力全花在调模型上,却忽略了数据本身的质量。我见过太多项目,模型结构再花哨,数据一塌糊涂,结果就是白忙活。这一章,咱们就聊聊怎么把数据这块地基打牢。
核心观点:标注数据的质量,直接决定了模型的天花板。数据采集和预处理,不是体力活,是技术活。
2.1 数据采集策略:别瞎抓,要有章法
数据采集听起来简单,不就是找图、找文本嘛?但实际做起来,坑特别多。我个人习惯,先问三个问题:
- 业务场景是什么? 比如做自动驾驶,你需要的是雨天、夜晚、隧道这些真实场景,而不是网上随便找的风景照。
- 数据分布是否均衡? 我遇到过项目,正样本和负样本比例1:1000,模型直接学废了。
- 数据来源是否合规? 这个容易被忽略,但一旦出事,后果很严重。
常用的采集策略,我整理了一张表:
| 策略 | 适用场景 | 注意事项 |
|---|---|---|
| 公开数据集 | 通用任务(分类、检测) | 注意版权和标注质量 |
| 爬虫采集 | 互联网公开数据 | 遵守robots协议,别踩红线 |
| 人工采集 | 特定场景(工业缺陷、医疗影像) | 成本高,但质量可控 |
| 数据合成 | 稀缺场景(极端天气、罕见故障) | 需要验证合成数据的真实性 |
我的经验: 做工业质检项目时,我们用了80%的真实数据+20%的合成数据,效果比纯真实数据还好。但要注意,合成数据不能太假,否则模型会学到伪特征。
2.2 数据清洗方法:脏数据是模型的天敌
数据采集回来,千万别急着用。先洗一遍。我见过最夸张的情况,一个图像分类数据集里,有20%的图片是模糊的、重复的、甚至标签错的。这种数据喂进去,模型能学好才怪。
数据清洗,我一般分三步走:
- 去重: 重复数据会让模型过拟合。用哈希值或特征比对,把重复的干掉。
- 去噪: 模糊图片、乱码文本、异常值,统统过滤掉。比如图像,可以检查分辨率、亮度、对比度。
- 纠错: 标签错误是最隐蔽的坑。我曾经有个项目,标注员把“猫”标成了“狗”,模型学了半天,猫狗不分。
避坑指南: 我曾经在文本分类项目里,发现大量“空字符串”和“纯标点符号”的数据。这些数据看似无害,但会让模型学到奇怪的模式。一定要做空值检查和长度过滤。
清洗代码示例(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适合流式处理 |
统一格式时,我建议做三件事:
- 定义字段规范: 比如类别名称用英文还是中文?坐标是归一化还是绝对值?
- 写转换脚本: 把不同格式统一成一种。我习惯用COCO格式,因为它生态好,工具多。
- 做格式校验: 检查字段是否缺失、类型是否正确、坐标是否越界。
避坑指南: 我曾经在YOLO格式里,发现标注坐标出现了负数。原因是标注工具的一个bug。从那以后,我每次转换完都会做一次合法性校验,确保所有坐标都在[0,1]范围内。
知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个检查清单,做数据准备时对照着来。
说白了,数据准备这件事,没有捷径。但只要你把采集、清洗、增强、格式统一这四个环节做扎实了,模型训练就成功了一半。我这些年踩过的坑,大部分都出在数据上。所以,别急,慢慢来,把数据伺候好了,模型自然会给你回报。