CV数据增强与输入管线
一、数据增强分类体系
增强方式分类
| 类型 | 说明 | 适用阶段 |
|---|---|---|
| 离线增强 | 训练前固定生成增强数据,数据量翻倍 | 数据量极小时 |
| 在线增强 | 训练时随机增强,每次epoch看到不同数据 | 通用推荐方式 |
增强方法分类
| 类别 | 方法 | 改变像素信息 | 适用任务 |
|---|---|---|---|
| 几何变换 | 翻转、旋转、裁剪、缩放、仿射变换 | 否 | 分类/检测/分割 |
| 颜色变换 | HSV调整、RGB扰动、对比度、亮度 | 是 | 分类/检测/分割 |
| 噪声注入 | 高斯噪声、椒盐噪声 | 是 | 分类/检测 |
| 随机擦除 | Cutout、随机擦除区域 | 是 | 分类/检测 |
| 图像混合 | MixUp、CutMix、Mosaic | 是 | 分类/检测 |
| 自动搜索 | AutoAugment、RandAugment | 是 | 分类 |
| 边缘增强 | 锐化、浮雕、边界检测 | 是 | 分类/检测 |
| 超像素化 | 超像素分割后处理 | 是 | 分类 |
二、基础数据增强详解
几何变换
| 方法 | 说明 | 注意事项 |
|---|---|---|
| 水平翻转 | 左右镜像 | 检测/分割需同步变换框/掩码 |
| 垂直翻转 | 上下镜像 | 检测/分割需同步变换框/掩码 |
| 随机旋转 | 0~360度旋转 | 检测框需同步旋转,分割掩码需同步 |
| 随机裁剪 | 从图像中裁剪子区域 | 检测需调整框坐标,分割需调整掩码 |
| 随机缩放 | 放大或缩小 | 多尺度训练的核心 |
| 仿射变换 | 平移+旋转+缩放组合 | 检测/分割需同步变换 |
颜色变换
| 方法 | 说明 | 参数建议 |
|---|---|---|
| HSV调整 | 色相/饱和度/明度微调 | 色相±10%, 饱和度±20%, 明度±20% |
| RGB扰动 | 三通道随机偏移 | 偏移量±0.1 |
| 亮度调整 | 整体亮度变化 | ±30% |
| 对比度调整 | 对比度变化 | ±30% |
| 高斯噪声 | 添加正态分布噪声 | sigma=10~25 |
| 模糊 | 高斯模糊/运动模糊 | kernel_size=3~7 |
三、高级数据增强详解
MixUp
| 维度 | 说明 |
|---|---|
| 原理 | 两张图像按比例alpha混合: x = alphax1 + (1-alpha)x2 |
| 标签 | 标签同步混合: y = alphay1 + (1-alpha)y2 |
| alpha取值 | 通常从Beta(alpha, alpha)分布采样,alpha=0.2~0.4 |
| 效果 | 使类别空间更连续,增强泛化能力 |
| 适用 | 分类任务,检测需特殊处理 |
Cutout
| 维度 | 说明 |
|---|---|
| 原理 | 随机遮挡图像中一个矩形区域(填充0或均值) |
| 作用 | 模拟遮挡,强迫模型学习多个判别区域 |
| 遮挡比例 | 通常遮挡10%~30%面积 |
| 与Dropout关系 | Cutout是空间维度的Dropout |
| 适用 | 分类/检测 |
CutMix
| 维度 | 说明 |
|---|---|
| 原理 | 从一张图裁剪矩形区域粘贴到另一张图上 |
| 标签 | 按粘贴面积比例混合标签 |
| 与Cutout区别 | Cutout填充0,CutMix填充另一张图的内容 |
| 与MixUp区别 | MixUp全局混合,CutMix局部混合 |
| 效果 | 同时利用两张图的信息,比Cutout更有效 |
| 适用 | 分类任务 |
Mosaic
| 维度 | 说明 |
|---|---|
| 原理 | 4张图拼接成1张(2x2网格) |
| 标签 | 4张图的框/标签全部保留 |
| 变体 | 固定角落裁剪(保持边界信息) vs 随机裁剪 |
| 效果 | 等效增大batch_size,丰富背景 |
| 适用 | 目标检测(YOLOv5标配) |
| 注意 | 分割任务需同步处理4张图的掩码 |
SnapMix
| 维度 | 说明 |
|---|---|
| 原理 | 基于类激活图(CAM)的CutMix改进 |
| 核心改进 | 按CAM权重计算混合比例,而非简单面积比 |
| 效果 | 比CutMix更精确的标签混合,在分类任务上优于CutMix/MixUp |
| 适用 | 图像分类 |
GridMask
| 维度 | 说明 |
|---|---|
| 原理 | 用固定间距的网格状遮挡覆盖图像 |
| 参数 | 网格大小d、遮挡比例r |
| 与Cutout区别 | GridMask是结构化遮挡,覆盖更均匀 |
| 适用 | 分类/检测 |
四、AutoAugment与自动增强搜索
AutoAugment
| 维度 | 说明 |
|---|---|
| 核心思想 | 用强化学习自动搜索最优增强策略组合 |
| 搜索空间 | 增强方法选择 + 每种方法的强度参数 |
| 搜索方法 | RNN控制器生成策略→训练子网络→精度作为奖励→强化学习更新 |
| 策略数量 | 可生成约15000种策略组合 |
| 效果 | 比人工选择增强策略更优 |
| 劣势 | 搜索耗时,需要额外计算资源 |
RandAugment
| 维度 | 说明 |
|---|---|
| 改进 | 简化搜索空间为两个参数:增强种类数N + 幅度M |
| 优势 | 无需RL搜索,直接调N和M两个参数 |
| 实用性 | 比AutoAugment更易使用 |
增强策略选择建议
| 阶段 | 推荐策略 | 理由 |
|---|---|---|
| Baseline | 基础几何+颜色变换 | 简单有效,快速验证 |
| 中期提分 | MixUp/CutMix + 基础增强 | 进一步提升泛化 |
| 检测提分 | Mosaic + MixUp | YOLOv5标配组合 |
| 后期精调 | AutoAugment/RandAugment | 自动搜索最优组合 |
| 过拟合时 | 加强增强强度+增加增强种类 | 增强是抗过拟合最有效手段 |
五、TTA(测试时增强)
TTA原理
| 维度 | 说明 |
|---|---|
| 核心思想 | 对测试图像做多种变换后分别预测,再融合结果 |
| 与训练增强区别 | 训练增强增加数据多样性,TTA增加预测稳定性 |
| 常用变换 | 水平翻转、垂直翻转、多尺度缩放、轻微旋转 |
| 融合方式 | 分类:概率平均; 检测:框融合(WBF/NMS); 分割:概率平均 |
TTA实战要点
| 要点 | 说明 |
|---|---|
| 变换选择 | 只用可逆变换(翻转、缩放),不用改变内容的增强 |
| 变换数量 | 3~5种即可,过多收益递减且耗时 |
| 与交叉验证关系 | 有交叉验证时TTA收益降低,但仍有提升 |
| 耗时 | 推理时间翻倍(3种TTA≈3倍时间) |
| 适用场景 | 比赛后期冲刺,推理时间不敏感时 |
六、数据输入管线
大规模图像数据读取方案
| 方案 | 说明 | 适用场景 |
|---|---|---|
| 直接读取 | 每次从硬盘读取图片 | 数据量小(<10K) |
| TFRecord | 将图片序列化为二进制文件 | TensorFlow生态 |
| LMDB | 将图片存入键值数据库 | PyTorch生态,读取快 |
| 预处理缓存 | 预处理结果存入内存/硬盘 | 预处理耗时时 |
TFRecord管线
| 步骤 | 说明 |
|---|---|
| 1. 定义格式 | 用Protocol Buffer定义数据结构(图片路径、标签、图像字节) |
| 2. 序列化写入 | 将每个样本序列化为Example,写入TFRecord文件 |
| 3. 解析读取 | 定义parse函数,从TFRecord解析出图片和标签 |
| 4. 数据生成器 | 使用tf.data.Dataset构建数据管道,支持并行读取和预取 |
PyTorch数据管线
| 组件 | 说明 |
|---|---|
| Dataset | 定义__getitem__返回单个样本(图片+标签) |
| DataLoader | 批量加载、多进程并行、shuffle |
| Albumentations | 在线数据增强,与PyTorch无缝集成 |
| prefetch_factor | 预取batch数,减少IO等待 |
医学大图处理管线
| 步骤 | 说明 |
|---|---|
| 1. 大图裁剪 | 将TIF大图裁剪为固定大小切片(如1024x1024) |
| 2. 有效区域过滤 | 过滤掉空白/背景切片,只保留有组织区域的切片 |
| 3. 切片级训练 | 每个切片作为独立样本训练 |
| 4. 预测拼接 | 将切片预测结果拼回大图坐标空间 |
| 5. 后处理 | 去除碎片、填充空洞、连通域分析 |