数据采集与预处理:多源数据采集、数据清洗与去重、数据增强技术、标注前的数据质量检查
大家好,我是老蓝。今天咱们聊聊数据采集与预处理这块硬骨头。
说实话,很多团队在标注上翻车,问题往往不在标注本身,而是数据源头就没整干净。我见过太多项目,标注员累死累活标了上万张图,结果一跑模型发现——数据里有大量重复、噪声、甚至格式错误。嗯,这种坑我踩过不止一次。
一、多源数据采集:别让数据来源成为你的短板
数据采集这事儿,看着简单,其实门道不少。我个人习惯把数据来源分成三类:自有数据、公开数据、合成数据。
自有数据是最靠谱的。比如你公司摄像头拍的监控画面、传感器采集的工业数据。这类数据跟你的业务场景最贴合,但量往往不够。我记得有个做自动驾驶的朋友,自己车队跑了三个月才攒了5000张有效图片,根本不够用。
公开数据集是快速补充的好办法。像ImageNet、COCO、OpenImages这些,拿来就能用。但要注意——公开数据跟你的场景可能有偏差。举个例子,你用COCO训练的行人检测模型,放到工厂车间里可能就失灵了,因为光照、角度完全不同。
合成数据这几年越来越火。用3D引擎渲染、GAN生成、或者简单的图像拼接。我在项目中用过Blender渲染工业零件图片,效果出奇的好。但合成数据有个坑:太完美了反而不好。真实世界有噪声、有遮挡、有各种意外情况,合成数据往往缺少这些。
二、数据清洗与去重:脏数据比没数据更可怕
数据清洗,说白了就是给数据「洗澡」。我见过最夸张的一个项目,原始数据里30%都是无效样本——模糊的、过曝的、标注框跑出图片边界的。这种数据喂给模型,后果可想而知。
清洗的第一步是格式统一。不同来源的图片可能是jpg、png、bmp甚至tiff,分辨率也千差万别。我习惯统一转成jpg,分辨率缩放到一个固定范围(比如最短边不低于512像素)。
第二步是异常值处理。对于图像数据,常见的异常包括:全黑图片、全白图片、损坏的文件。写个脚本批量检查就行:
import cv2
import os
def check_image_valid(img_path):
try:
img = cv2.imread(img_path)
if img is None:
return False
# 检查是否全黑或全白
if img.mean() < 5 or img.mean() > 250:
return False
return True
except:
return False
# 批量检查
invalid_files = [f for f in os.listdir('raw_data')
if not check_image_valid(f'raw_data/{f}')]
print(f'发现 {len(invalid_files)} 个无效文件')
数据去重这块,很多人容易忽略。你以为收集了1万张图,其实可能有2000张是重复的。重复数据会让模型过拟合,而且浪费标注资源。
去重的方法我常用两种:
- 感知哈希:计算每张图片的哈希值,汉明距离小于阈值就判为重复。速度快,适合大规模数据。
- 特征匹配:用SIFT或深度学习特征做匹配。更准,但慢一些。
三、数据增强技术:小数据也能做出大效果
数据增强,就是用现有数据生成更多变体。说白了就是「一个样本当多个用」。我刚开始做CV时觉得这玩意儿可有可无,直到有一次项目数据量只有500张,用了增强后模型mAP提升了8个点——嗯,从此再也不敢小看它。
常用的增强方法分几类:
| 类别 | 具体方法 | 适用场景 | 注意事项 |
|---|---|---|---|
| 几何变换 | 旋转、翻转、缩放、裁剪 | 目标检测、分类 | 标注框要同步变换 |
| 色彩抖动 | 亮度、对比度、饱和度调整 | 光照变化大的场景 | 不要过度,否则失真 |
| 噪声注入 | 高斯噪声、椒盐噪声 | 鲁棒性要求高的任务 | 噪声强度要控制 |
| 混合类 | MixUp、CutMix | 分类、检测 | 标签也要混合 |
这里重点说说MixUp。这方法很有意思——把两张图按比例叠加,标签也按同样比例混合。比如一张猫图占0.7,一张狗图占0.3,那标签就是「猫0.7,狗0.3」。我一开始觉得这不胡闹吗?后来发现模型学到的特征更鲁棒了。
def mixup_batch(images, labels, alpha=0.2):
batch_size = images.shape[0]
index = np.random.permutation(batch_size)
lam = np.random.beta(alpha, alpha)
mixed_images = lam * images + (1 - lam) * images[index]
mixed_labels = lam * labels + (1 - lam) * labels[index]
return mixed_images, mixed_labels
四、标注前的数据质量检查:把问题扼杀在摇篮里
这一步最容易被忽视,但恰恰是最关键的。你想想看,如果数据本身有问题,标注员再认真也是白搭。
我习惯在标注前做三轮检查:
- 格式检查:图片能否正常打开?标注文件格式是否正确?路径是否匹配?
- 内容检查:图片是否模糊?目标是否太小?遮挡是否严重?
- 分布检查:各类别样本数量是否均衡?场景分布是否合理?
举个例子,我之前做一个行人检测项目,数据里90%都是白天场景,晚上只有10%。如果直接拿去标注,模型到了晚上就抓瞎。后来我强制要求白天和晚上的比例控制在6:4,效果好了很多。
还有一个容易翻车的地方——标注边界框的合理性。有些图片里的目标太小(比如只有10x10像素),标注员根本看不清,标出来的框误差很大。我一般会过滤掉目标面积小于图片面积1%的样本,或者单独处理。
最后说一句:数据预处理花的时间,会在标注和训练阶段加倍还回来。别急着跳过这一步,省下的时间最后都会变成加班。
公众号:蓝海数据掘金营,微信deep3321