4. 数据采集与标注:训练数据采集规范、数据标注工具使用、数据增强策略、数据集管理
数据,说白了就是AI ISP的“燃料”。模型再牛,没有高质量的数据喂进去,出来的效果也是一塌糊涂。我在这个领域摸爬滚打这些年,见过太多项目因为数据问题翻车——要么采集不规范导致模型泛化差,要么标注质量差让训练白费功夫。这一章,咱们就把数据采集到管理的全流程捋清楚。
4.1 训练数据采集规范
数据采集不是拿着相机随便拍就完事了。我刚开始做ISP调试时,就犯过这个错——在实验室里拍了上千张完美光照的图片,结果模型一上真实场景直接崩了。为什么?因为真实世界的噪声、动态范围、色温变化,实验室根本模拟不全。
这里我总结了一套采集规范,供你参考:
| 维度 | 要求 | 说明 |
|---|---|---|
| 光照条件 | 覆盖全光照范围 | 从0.1 lux到100000 lux,包含室内、室外、黄昏、夜晚 |
| 色温覆盖 | 2000K - 10000K | 白炽灯、荧光灯、日光、阴天、混合光源都要有 |
| 场景多样性 | 至少20类场景 | 人像、风景、文字、夜景、逆光、运动等 |
| 传感器组合 | 3-5种主流sensor | 不同像素尺寸、不同动态范围的sensor都要覆盖 |
| 分辨率 | 从VGA到4K | 确保模型能适应不同分辨率输入 |
另外,采集时还要注意元数据的记录。我习惯用JSON格式记录每张图片的拍摄参数:
{
"image_id": "IMG_20240315_143200",
"sensor": "IMX766",
"iso": 400,
"exposure_time": 1/30,
"aperture": 1.8,
"color_temperature": 5200,
"scene_type": "indoor_portrait",
"light_source": "fluorescent",
"lux_value": 320
}
这些元数据在后续的数据分析和模型调优中非常有用。比如,你可以快速筛选出低光照场景的数据,看看模型在暗光下的表现。
4.2 数据标注工具使用
标注是数据准备中最耗时、最枯燥的环节。但没办法,没有标注就没有监督学习。我这些年用过不少标注工具,这里推荐几个实用的:
- LabelImg:轻量级,适合快速标注目标检测框。Python写的,跨平台,上手快。
- CVAT:功能全面,支持视频标注、关键点标注、语义分割。适合团队协作。
- Supervisely:企业级平台,内置AI辅助标注,能大幅提升效率。
- Label Studio:开源灵活,支持自定义标注模板,适合特殊需求。
对于AI ISP来说,标注的内容和普通视觉任务不太一样。除了常规的物体检测框,我们还需要标注:
- 噪声区域:标注图像中噪声明显的区域,用于训练降噪模型。
- 过曝/欠曝区域:标注动态范围问题的区域,用于训练HDR重建。
- 色偏区域:标注白平衡不准确的区域,用于训练AWB校正。
- 模糊区域:标注运动模糊或失焦区域,用于训练去模糊。
4.3 数据增强策略
数据增强,说白了就是“无中生有”。但这里的“无中生有”不是瞎编,而是基于物理规律的合理变换。我见过有人把图像旋转90度后拿去训练去噪模型,结果模型把水平纹理当成了噪声——这就是不懂物理规律乱增强的后果。
对于AI ISP,我推荐以下增强策略:
| 增强类型 | 具体操作 | 适用场景 |
|---|---|---|
| 光度增强 | 亮度调整、对比度调整、伽马校正 | 模拟不同曝光条件 |
| 色彩增强 | 色温偏移、饱和度调整、色调旋转 | 模拟不同光源环境 |
| 噪声增强 | 添加高斯噪声、泊松噪声、散粒噪声 | 模拟不同ISO下的噪声 |
| 几何增强 | 随机裁剪、水平翻转、小角度旋转 | 提升空间不变性 |
| 模糊增强 | 高斯模糊、运动模糊、失焦模糊 | 模拟对焦不准或运动 |
这里有个关键点:增强的参数范围要合理。比如亮度调整,我一般控制在原始亮度的±30%以内。调太多,图像就失真了,模型学到的反而是伪影。
4.4 数据集管理
数据集管理,听起来简单,做起来全是坑。我见过一个团队,数据散落在每个人的电脑里,文件名乱七八糟,版本混乱,最后训练时发现数据对不上——那叫一个崩溃。
我建议用以下方式管理数据集:
- 统一目录结构:按场景、光照、传感器等维度分层组织。
- 版本控制:用DVC或Git LFS管理数据集版本,每次更新都要记录变更日志。
- 数据清单:维护一个CSV文件,记录每张图片的路径、标注文件路径、元数据。
- 质量检查:定期抽样检查标注质量,确保标注一致性。
下面是一个我常用的目录结构示例:
dataset/
├── raw/ # 原始采集数据
│ ├── indoor/
│ ├── outdoor/
│ └── night/
├── annotated/ # 标注后的数据
│ ├── train/
│ ├── val/
│ └── test/
├── augmented/ # 增强后的数据
│ ├── brightness/
│ ├── noise/
│ └── blur/
├── metadata.csv # 数据清单
└── changelog.md # 变更日志
最后,我想强调一点:数据管理不是一次性工作,而是持续的过程。每次模型训练后,都要分析哪些场景效果不好,然后针对性地补充数据。这样,你的数据集会越来越完善,模型效果也会越来越好。