想象你是一家私房菜馆的老师傅,收了个手艺极佳的学徒。每天只让他做一道红烧肉,练了三个月,他闭着眼都能把这道菜做到满分——可有一天客人点了糖醋排骨,他直接愣在厨房里。问题出在哪?不是他笨,而是他见过的“菜的样子”太少了。 深度学习模型也是这样。你喂它一万张猫图,它就把这堆图的“标准长相”背得滚瓜烂熟,测试时换了个角度、换个光线,它就认不出来了。这种“只认熟脸”的毛病,行话叫过拟合。而图像增强,就是老师傅手里的十八般武艺:把一张图翻个面、转个圈、切一角、调个色、遮一块、和别的图拌一拌——让模型见识同一种东西的千百种做法,它才真正学会“透过表象看本质”,变成一个不挑食的AI美食家。这篇文章,就把这套“厨房秘籍”一次讲透。

岗位关联

图像增强是计算机视觉工程师性价比最高的提点手段:不换模型、不加数据,只靠几十行变换代码,就能显著提升模型泛化、压制过拟合,几乎适用于图像分类、目标检测、语义分割所有视觉任务。

目录
  1. 可视化演示
  2. 认识过拟合:模型为什么“挑食”
  3. 几何变换:给图片翻面、转盘、切块
  4. 色彩变换:给照片调口味
  5. 遮挡增强:蒙眼猜菜练真功
  6. 混合增强:分子料理的魔法
  7. 增强策略:搭配出一周好菜谱
  8. 实战评估:让盲品会来打分
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示六种图像数据增强技术的效果对比:翻转、旋转、裁剪、色彩、遮挡和混合增强,直观理解每种技术如何提升模型泛化能力。

本节配有交互动效(进入视口后自动加载,约 3KB)。

翻转:水平镜像变换 水平翻转保持物体类别不变,是最常用的增强手段 六种增强技术组合使用可大幅提升模型泛化 图像增强通过简单变换生成多样训练样本,有效减少过拟合

认识过拟合:模型为什么“挑食”

私房菜馆里,老师傅只让学徒练一道红烧肉。三个月后学徒把这道菜做到炉火纯青,可客人换个菜名他就傻眼。深度学习模型一模一样:训练时只看过一万张“标准姿势”的猫图,它就能把这几万张图背得滚瓜烂熟——训练准确率99%,可测试时猫翻了个身、换了束光,它立刻犯迷糊。这个“只会背题不会做题”的毛病,就是过拟合。

过拟合的本质是数据多样性不足。真实世界里的猫有胖有瘦、有正脸有侧脸、有白天有黑夜,可训练集只拍到了其中一小部分模样。模型学到的不是“猫的本质”,而是“这几万张图的平均长相”。它把训练集的噪声和细节也当成规律背了下来,导致泛化能力——即应对没见过数据的能力——严重缩水。

用公式拆解一下,模型的预测误差其实由两部分组成:

图像增强就是给学徒加菜谱:把一张猫图翻个面、调个色、切一角,让它变成几十张“不同做法的猫”。模型见识多了,才能真正学会“认出猫的本质”,而不是“背下这张猫的样子”。这,就是让模型“抗造”的第一步。

泛化误差=训练误差+泛化差距⏟过拟合来源\displaystyle \text{泛化误差} = \text{训练误差} + \underbrace{\text{泛化差距}}_{\text{过拟合来源}}
泛化误差是模型在真实世界的总失误率,它等于“课本上的失误”加上“课本与现实的差距”。图像增强要压缩的,正是后半部分。
  1. 训练误差模型在自己“课本”(训练集)上答错的概率。这个值越小,说明它把课本背得越熟。
    训练误差=1N∑i=1N1(y^i≠yi)\displaystyle \text{训练误差} = \frac{1}{N}\sum_{i=1}^{N}\mathbb{1}(\hat{y}_i \neq y_i)
  2. 泛化差距验证集误差与训练集误差之差。它衡量的是“换一道菜还认不认得”——差距越大,挑食越严重。
    泛化差距=验证误差−训练误差\displaystyle \text{泛化差距} = \text{验证误差} - \text{训练误差}

几何变换:给图片翻面、转盘、切块

摆盘是厨师的入门功夫。同一道菜,换个盘子、转个角度、切个小块,客人就觉得是道新菜。几何变换干的正是这件事:把图片水平翻转、随机旋转、随机裁剪、缩放,图像里的物体内容一点没变,但呈现的姿态焕然一新。模型每看到一种新摆盘,就多一次机会学到“核心特征”而不是“固定位置”。

水平翻转是最常用的招数:把图片左右镜像,猫还是那只猫,但脸从朝左变成朝右,直接让数据量翻倍。随机旋转则模拟拍照时相机拿歪的情况,让模型不再依赖“物体必须是正的”这种偏见。随机裁剪模拟取景框在画面里游走,模型必须学会从局部判断整体。缩放则模拟距离远近,远处的猫再小也得认得出来。

以水平翻转为例,它的数学本质就是一个坐标映射。对宽度为 $W$ 的图像,第 $x$ 列的像素翻到对面去:

几何变换不改变像素的“味道”,只改变上桌的“姿态”,所以它几乎不破坏图像的本质信息,是性价比最高的增强手段。就像学徒认清了“红烧肉换个盘子还是红烧肉”——模型从此不再执着于物体出现在画面的哪个位置。

x′=W−1−x\displaystyle x' = W - 1 - x
翻转就是“左右对称地换位置”:最左边一列的像素跑到最右边,次左边跑到次右边,整张图就像照了镜子。这个变换对图像分类完全免费,但对目标检测有一个大坑——后面会讲。
  1. 原坐标范围$x$ 表示图像第几列,从 0 数到 $W-1$,共 $W$ 列。
    x∈{0,1,2,…,W−1}\displaystyle x \in \{0, 1, 2, \dots, W-1\}
  2. 镜像映射新坐标等于总宽度减 1 再减原坐标。第 0 列变第 $W-1$ 列,第 1 列变第 $W-2$ 列,依此类推。
    x′=W−1−x\displaystyle x' = W - 1 - x

色彩变换:给照片调口味

同一块五花肉,放糖是红烧、放辣椒是麻辣,味道天差地别。图像的“口味”则由三个调料决定:亮度、对比度、饱和度。亮度调整模拟白天与黑夜,对比度调整模拟雾天与强光,饱和度调整模拟鲜艳的滤镜与褪色的旧照片。把这几个随机组合起来,就是色彩抖动(Color Jitter),相当于一次端出好几道不同口味的菜。

模型如果只在一种光线下训练,换个环境立刻水土不服。做过安防监控的工程师都知道:白天训练的人脸模型,晚上一上线就频频漏检——不是模型笨,是它从没见过“暗光口味”的图。色彩变换用几行代码模拟出全天候的光线变化,让模型提前把各种“口味”尝个遍。

亮度调整的数学本质,是对每个像素乘一个缩放因子:

色彩变换改的是“卖相”,不动“菜品结构”,所以模型学到的特征更稳健,不会被光线和滤镜吓到。学徒吃遍甜咸辣各种口味的肉,才知道无论怎么调味,本质都是肉——模型也因此练就了“换光线不换判断”的本事。

I′(r,c)=clip(α⋅I(r,c), 0, 255)\displaystyle I'(r, c) = \text{clip}(\alpha \cdot I(r, c),\, 0,\, 255)
每个像素的 RGB 值都乘以同一个系数 α:乘大于 1 的数变亮,乘小于 1 的数变暗。乘完还要“裁剪”一下,防止数值冲出 0 到 255 的合法范围。
  1. 缩放因子采样α 从 0.8 到 1.2 之间随机取一个数,让每一次增强的明暗程度都不相同。
    α∼U(0.8,1.2)\displaystyle \alpha \sim U(0.8, 1.2)
  2. 裁剪函数把超出 0 和 255 的值拉回边界内,避免像素值溢出导致图像出现诡异的色块。
    clip(v,0,255)=min⁡(max⁡(v,0),255)\displaystyle \text{clip}(v, 0, 255) = \min(\max(v, 0), 255)

遮挡增强:蒙眼猜菜练真功

美食训练营里有个狠招:把菜用盖子遮住一半,让学徒只看另一半猜全貌。刚开始学徒频频猜错,但练久了,他学会用残缺信息推断整体——这才是真功夫。Cutout 就是图像界的“蒙眼猜菜”:随机选一个方形区域,把里面的像素涂成 0(黑色),模型被逼着放弃“只盯局部特征”的偷懒策略。

与 Cutout 齐名的还有随机擦除(Random Erasing),它和 Cutout 的区别在于:擦除区域不一定涂黑,而是填上随机噪声或随机颜色,模拟真实世界里物体被其他东西挡住的效果。两者都制造局部遮挡,逼模型调用整张图的线索来识别目标,而不是靠一两个最明显的“作弊点”。

Cutout 的数学实现非常优雅,靠一个掩码矩阵完成:

遮挡增强相当于“故意藏起一半食材让学徒猜”,逼着模型放弃偷懒的捷径,学会真正的判别特征。它是对抗过拟合的一剂猛药,代价是训练难度稍微上升——但正如学徒经过蒙眼训练后功力大增,模型也在“看不清”中练出了火眼金睛。

x~=x⊙(1−M)\displaystyle \tilde{x} = x \odot (1 - \mathcal{M})
这里的 \(\odot\) 表示“逐像素相乘”。\(\mathcal{M}\) 是一张和图像一样大的 0/1 地图,被遮挡的区域标 1,其余标 0。用 \(1-\mathcal{M}\) 一翻转,遮住的地方乘 0 变黑,没遮的地方乘 1 保持原样。
  1. 生成掩码随机挑一个方形区域,区域内每个位置记为 1,区域外记为 0。
    M(r,c)=1[(r,c)∈随机方形]\displaystyle \mathcal{M}(r, c) = \mathbb{1}[(r, c) \in \text{随机方形}]
  2. 翻转掩码把 1 变 0、0 变 1,让“要遮的地方”变成“要乘 0 的地方”。
    (1−M)(r,c)=1−M(r,c)\displaystyle (1-\mathcal{M})(r, c) = 1 - \mathcal{M}(r, c)
  3. 逐元素相乘遮住的位置乘 0 后像素变黑,其余位置乘 1 保持原样,得到最终增强图。
    x~(r,c)=x(r,c)⋅(1−M(r,c))\displaystyle \tilde{x}(r, c) = x(r, c) \cdot (1 - \mathcal{M}(r, c))

混合增强:分子料理的魔法

分子料理店里,两位厨师各端一道菜。MixUp 的做法是“两盘菜打碎搅匀”,每一口都同时带着两样味道;CutMix 则是“左半边是A菜右半边是B菜”,摆盘分界清晰,但夹一筷子就是跨界体验。模型尝到的每一口都“不纯”,反而学会了更宽容的判别方式。

MixUp 的操作是:把两张图按比例 \(\lambda\) 做像素级加权平均,同时把两个标签也按同样比例混合。比如一张猫、一张狗,\(\lambda=0.6\),合成图就是“60% 的猫 + 40% 的狗”,标签也从“猫=1、狗=0”变成“猫=0.6、狗=0.4”这样的软标签。CutMix 则换了个思路:把图 B 的一块矩形区域直接盖到图 A 上,标签按面积占比混合——图 B 盖住了 30% 面积,标签里狗就占 0.3。

MixUp 的核心公式非常简洁:

混合增强打破了“一张图一个标签”的固化思维,让模型在类别的“模糊地带”也能给出合理判断。它经常出现在各大榜单的夺冠方案里,是近年强增强策略中当之无愧的主角。

x~=λxi+(1−λ)xj,y~=λyi+(1−λ)yj\displaystyle \tilde{x} = \lambda x_i + (1-\lambda) x_j, \quad \tilde{y} = \lambda y_i + (1-\lambda) y_j
图像 \(\tilde{x}\) 是两张图按 \(\lambda\) 加权平均的结果,标签 \(\tilde{y}\) 也跟着做同样的加权。图像和标签必须“同步搅拌”,否则模型收到的图文信息对不上号。
  1. 采样混合权重\(\lambda\) 从 Beta 分布随机抽取,让每次混合比例都不同,模型不会形成固定套路。
    λ∼Beta(α,α),α=1.0\displaystyle \lambda \sim \text{Beta}(\alpha, \alpha), \quad \alpha = 1.0
  2. 像素级混合两张图每个位置的颜色按权重相加,生成一张全新的合成图。
    x~(r,c)=λxi(r,c)+(1−λ)xj(r,c)\displaystyle \tilde{x}(r,c) = \lambda x_i(r,c) + (1-\lambda) x_j(r,c)
  3. 标签同步混合独热编码的标签从“非 0 即 1”变成“0.6 属于猫、0.4 属于狗”的软标签,引导模型学习平滑的决策边界。
    y~=λyi+(1−λ)yj\displaystyle \tilde{y} = \lambda y_i + (1-\lambda) y_j

增强策略:搭配出一周好菜谱

单一招式练得再好,天天用也会腻。聪明的厨师会荤素搭配、凉热轮换、口味交替。图像增强同理:把翻转、旋转、裁剪、调色、Cutout、MixUp 组合起来,按合理的顺序和强度一起用,效果远胜单打独斗。这就是组合使用的威力。

组合时要讲究通用流程:一般先做几何变换(翻转、旋转、裁剪、缩放),因为它们改变空间结构;再做色彩变换,调整像素分布;最后上遮挡和混合这类“重口味”强增强。强度控制也很关键——增强太弱等于没做,增强太猛会把图像改得面目全非,模型学到的反而是扭曲的规律。工业界的通行做法是“由弱到强逐步加码”,在验证集上对比效果,找到收益最高的甜点区。

整个增强流水线,本质上就是一系列函数依次作用:

优秀厨师都有一本反复调试的菜谱,工业界的增强策略也成了需要调的超参:多试几组组合,选出验证集收益最高的那一套。原则只有一条——让模型见多识广,但别被“黑暗料理”带偏。

x~=ϕK(⋯ϕ2(ϕ1(x))⋯ )\displaystyle \tilde{x} = \phi_K(\cdots \phi_2(\phi_1(x)) \cdots)
模型训练前,每张原图 \(x\) 都要“过一道流水线”:先被 \(\phi_1\) 处理,再被 \(\phi_2\) 处理,一路传到 \(\phi_K\),最后出来的 \(\tilde{x}\) 才送进模型。每个工序都带随机参数,所以同一张原图每次过线,成品都不一样。
  1. 增强算子集合每个 \(\phi_k\) 代表一种增强操作,可以是翻转、旋转、裁剪、调色、Cutout 或 MixUp。
    ϕk∈{flip,rotate,crop,color,cutout,mixup}\displaystyle \phi_k \in \{\text{flip}, \text{rotate}, \text{crop}, \text{color}, \text{cutout}, \text{mixup}\}
  2. 逐级复合从最内层开始依次作用,前一个算子的输出就是后一个算子的输入,像流水线上的多道工序。
    x1=ϕ1(x),x2=ϕ2(x1),…,x~=ϕK(xK−1)\displaystyle x_1 = \phi_1(x), \quad x_2 = \phi_2(x_1), \quad \dots, \quad \tilde{x} = \phi_K(x_{K-1})

实战评估:让盲品会来打分

菜做得好不好,不能只让做菜的师傅自己说,得请一群没吃过的食客来盲品打分。对模型来说,这群食客就是验证集——它们从没参加过训练,尝到的都是“正常做法的菜”。增强有没有用,必须让验证集来检验,看准确率到底涨没涨。

代码实现上,现代深度学习框架提供了丰富的现成工具:PyTorch 的 transforms、OpenCV 的翻转旋转函数,几行代码就能搭起一条增强流水线。实操时要注意适用场景:目标检测里做翻转,边界框坐标必须同步镜像;医学影像里做翻转要谨慎,左右翻转脑部图像可能把病灶位置搞反;语义分割则要求所有像素级标注跟着一起变换。

评估增强效果的最简单做法,是固定其他条件,只对比“弱增强”和“强增强”两套方案在验证集上的准确率:

盲品会的最终结论是:图像增强不一定每次都暴涨,但绝大多数任务里,它是最廉价、最稳定的“泛化红利”。尤其当你数据少、任务难、过拟合明显的时候,这一桌“花式增强菜”永远值得先尝一尝。

ΔAcc=Accstrong−Accweak\displaystyle \Delta\text{Acc} = \text{Acc}_{\text{strong}} - \text{Acc}_{\text{weak}}
用同一份验证集,分别给两个模型打分:一个只用轻微翻转裁剪,一个用完整增强全家桶。两者之差如果大于 0,说明多花的增强功夫没有白费。
  1. 弱增强基线轻量方案训练出的模型,在验证集上预测正确的比例,作为对照的起跑线。
    Accweak=验证集预测正确数验证集总数\displaystyle \text{Acc}_{\text{weak}} = \frac{\text{验证集预测正确数}}{\text{验证集总数}}
  2. 强增强模型同样结构、同样数据,但训练时换成完整增强流水线,再看它的验证集准确率。
    Accstrong=验证集预测正确数′验证集总数\displaystyle \text{Acc}_{\text{strong}} = \frac{\text{验证集预测正确数}^{\prime}}{\text{验证集总数}}
  3. 收益判断差值大于 0 说明增强有效,且数值越大收益越高;若接近 0 或为负,说明增强过头,该回调强度。
    ΔAcc>0⟹增强有效\displaystyle \Delta\text{Acc} > 0 \quad \Longrightarrow \quad \text{增强有效}

AI 应用场景

自动驾驶:恶劣天气下的“视力矫正”

阶段:数据准备与增强

解决的问题:自动驾驶路采数据以晴天白天为主,夜间、雨天、逆光的样本稀缺。直接用原始数据训练的检测模型,一遇到暴雨夜就频繁误检——模型从没见过“暗光+雨花反光”的猫。传统做法只能靠车队加班加点补采数据,成本极高。

具体案例:某自动驾驶团队用亮度/对比度调整模拟夜间,用随机擦除模拟雨刷遮挡,再用 MixUp 模拟雨中灯光交织的叠影。增强后的训练集让检测模型在暴雨夜的误检率下降了 37%,训练成本几乎为零。

医学影像:小样本下的“一图多吃”

阶段:训练数据扩充

解决的问题:请资深医生标注一张肺部 CT 切片很贵,能拿到的标注样本常常只有几百张。模型在这么小的数据集上极易过拟合,训练准确率 99%、验证准确率却只有 82%。传统做法是小心翼翼到处收集数据,但医疗数据涉及隐私,很难快速扩充。

具体案例:某医疗 AI 团队对肺结节切片做旋转、缩放、裁剪,刻意避开左右翻转(防止破坏解剖结构对称性),再叠加 Cutout 让模型学会从多层面信息判断结节。最终辅助诊断模型在验证集上的 AUC 从 0.87 提升到 0.93。

电商搜索:千变万化的商品图

阶段:模型泛化增强

解决的问题:同一个商品,不同卖家拍摄的角度、光线、背景天差地别,平台模型识别很不稳定。换张白底图就认不出来,加个滤镜就匹配错误。传统做法是人工标注更多样本,但商品上新速度远超标注产能。

具体案例:某电商平台对商品库图像做色彩抖动 + 随机裁剪 + CutMix 组合增强,让模型对换背景、换滤镜、换拍照角度的商品图依然稳定识别。上线后线上点击率实验的转化率提升了 5.2%。

Python 演示

python73 行
import numpy as np def create_demo_image(h=224, w=224):    """生成一张渐变加方块的模拟图像,代替真实照片"""    yy, xx = np.mgrid[0:h, 0:w]    img = np.zeros((h, w, 3), dtype=np.uint8)    img[..., 0] = (xx * 255 // w).astype(np.uint8)    img[..., 1] = (yy * 255 // h).astype(np.uint8)    img[..., 2] = ((xx + yy) * 255 // (w + h)).astype(np.uint8)    img[h // 4: 3 * h // 4, w // 4: 3 * w // 4, :] = 200    return img def horizontal_flip(img):    """水平翻转:镜像图像"""    return img[:, ::-1, :] def rotate90(img):    """旋转90度"""    return np.rot90(img) def random_crop(img, ratio=0.8):    """随机裁剪:取原图中心的80%区域"""    h, w = img.shape[:2]    ch, cw = int(h * ratio), int(w * ratio)    y = np.random.randint(0, h - ch)    x = np.random.randint(0, w - cw)    return img[y:y + ch, x:x + cw] def adjust_brightness(img, factor=1.3):    """亮度调整:乘以系数并裁剪到合法范围"""    return np.clip(img * factor, 0, 255).astype(np.uint8) def cutout(img, side=32):    """Cutout:随机方形区域置0"""    h, w = img.shape[:2]    y = np.random.randint(0, h - side)    x = np.random.randint(0, w - side)    out = img.copy()    out[y:y + side, x:x + side] = 0    return out def mixup(img, img2, lam=0.5):    """MixUp:两张图按权重线性混合"""    return (lam * img + (1 - lam) * img2).astype(np.uint8) def cutmix(img, img2, lam=0.5, ratio=0.3):    """CutMix:把图2的一块区域盖到图1上"""    h, w = img.shape[:2]    bh, bw = int(h * ratio), int(w * ratio)    y = np.random.randint(0, h - bh)    x = np.random.randint(0, w - bw)    out = img.copy()    out[y:y + bh, x:x + bw] = img2[y:y + bh, x:x + bw]    return out def main():    img = create_demo_image()    flip = horizontal_flip(img)    rot = rotate90(img)    crop = random_crop(img)    bright = adjust_brightness(img)    occl = cutout(img)    lam = 0.5    mixed = mixup(img, flip, lam)    cmixed = cutmix(img, flip, lam)    names = ['原图', '水平翻转', '旋转90度', '随机裁剪', '亮度提升', 'Cutout', 'MixUp', 'CutMix']    outputs = [img, flip, rot, crop, bright, occl, mixed, cmixed]    for name, out in zip(names, outputs):        print('%-6s shape=%s 像素范围=%d-%d' % (            name, out.shape, out.min(), out.max())) if __name__ == '__main__':    main()
目的:完整实现本文讲到的七种图像增强方法,用一张模拟图演示每种操作的效果,输出形状和像素范围供验证。
  1. def create_demo_image(h=224, w=224)用渐变色和方块生成一张 224×224 的模拟图片,避免依赖外部图片文件,复制即可运行。
  2. return img[:, ::-1, :]宽度维上步长为 -1 的切片,一行代码实现水平镜像,是翻转增强的核心。
  3. y = np.random.randint(0, h - ch)随机选裁剪起点,让每次裁剪位置都不同,增强就有了随机性。
  4. out[y:y + side, x:x + side] = 0把随机方形区域整体置黑,正是 Cutout 遮住局部、逼模型看全局的思想。
  5. return (lam * img + (1 - lam) * img2).astype(np.uint8)MixUp 的像素级加权求和,两组图按 λ 比例融合成一张新图。
  6. out[y:y + bh, x:x + bw] = img2[y:y + bh, x:x + bw]把图 2 的矩形块盖到图 1 上,这就是 CutMix 与 MixUp 的本质差异:空间拼接而非全局混合。

常见误区

误区听说数据增强能提升泛化,我就把翻转、旋转、调色、Cutout、MixUp 全部开到最大强度,让训练集“面目全非”,结果验证集准确率不升反降。难道增强不是越多越好吗?

正解增强要“适度”。太强会把图像改得超出真实世界的分布范围,模型学到的反而是扭曲的规律——就像把红烧肉做成“彩虹色麻辣味”,学徒反而不知道正常肉该是什么样。合格的增强应该像合理的菜谱变化,而不是黑暗料理。正确做法是固定其他条件,在验证集上做几组强度对比,挑收益最高的甜点区。

为何常见:看到“增强能涨点”就拼命加码,却忽略了过犹不及的道理,也没有用验证集做严格的对照实验。

误区训练集增强效果这么好,验证集和测试集也应该统一走一遍增强流程,这样大家“公平竞赛”,成绩也更漂亮。

正解验证集和测试集的使命是模拟真实世界的原始照片,必须保持原样。增强的目的是拓宽训练分布的覆盖面,如果把验证集也“加料”,测出来的数字就掺了水,不再代表真实水平。这就像盲品会评委必须尝原汁原味的菜,不能先让评委吃一堆调味料。

为何常见:把“数据越多越好”的错误直觉推广到了所有数据集,混淆了训练分布与评估分布的本质区别。

误区做目标检测时,对图像做水平翻转增强,但边界框坐标还是原来的位置。反正标注框只是附带信息,模型应该自己能理解吧?

正解翻转后物体已经跑到了画面的另一边,旧的边界框指向的是错误位置。模型拿着错位标签训练,相当于师父指着糖醋排骨说“这是红烧肉”,越学越乱。所以检测、分割这类带位置标注的任务,增强必须“图像和标注一起变”——翻转图像的同时,边界框中心点的 x 坐标也要做同样的镜像映射。

为何常见:初学者只改了图像文件,忘了监督信号(标注)也是训练数据的一部分,忽略了图像与标签必须严格配对的原理。

误区MixUp 就是把两张图叠起来喂给模型嘛,标签还用第一张图的,省事又高效,模型照样收敛。

正解MixUp 的标签必须同样按 λ 混合,否则模型收到的图像内容是“60% 猫 + 40% 狗”,标签却写着“100% 猫”,梯度信息互相打架,训练会不稳定甚至发散。只有图像和标签一起“搅拌”成软标签,模型才知道这张合成图“既像猫又像狗”,从而学到平滑的决策边界。

为何常见:只盯着图像侧的变化,忘了监督学习的本质是“图像-标签”配对,任何对图像的操作都必须同步映射到标签上。

面试题

Q1. 图像增强最核心的目的是什么?

单选题 · easy

  • A.扩大数据集文件体积
  • B.提升模型的泛化能力← 正确答案
  • C.加快模型训练的速度
  • D.减少模型的参数量

答案:B。图像增强通过翻转、裁剪、调色等手段生成多样化的训练样本,让模型减少过拟合、提升泛化,就像让学徒多见识几种菜的做法。扩大文件体积不是目的,加速训练和减少参数量更与增强无关。

Q2. 水平翻转属于哪一类数据增强?

单选题 · easy

  • A.几何变换← 正确答案
  • B.色彩变换
  • C.遮挡增强
  • D.混合增强

答案:A。水平翻转改变的是图像的空间布局,像素位置发生了镜像移动,属于几何变换。色彩变换管像素值分布,遮挡增强管遮罩,混合增强管多图融合,都和翻转的空间性质不同。

Q3. Cutout 增强的核心操作是什么?

单选题 · easy

  • A.随机裁剪出一个小块
  • B.随机遮挡图像局部区域← 正确答案
  • C.把两张图像拼接起来
  • D.调整图像的亮度对比度

答案:B。Cutout 随机选一个方形区域把像素置黑,本质是局部遮挡,逼模型不要依赖单一局部特征。随机裁剪是保留局部区域,拼接是 CutMix,调亮度是色彩变换,三者都不是 Cutout。

Q4. MixUp 中混合后的标签如何计算?

单选题 · mid

  • A.取两张图标签的最大值
  • B.按 λ 进行加权求和← 正确答案
  • C.保持第一张图的标签
  • D.随机选择其中一个标签

答案:B。MixUp 把两张图的标签也按 λ 加权混合,得到“0.6 猫 + 0.4 狗”的软标签,图像和标签必须同步。取最大值、保持第一张或随机选择都会造成图像内容与监督信号不一致。

Q5. CutMix 与 MixUp 的关键区别是什么?

单选题 · mid

  • A.CutMix 按区域拼接像素← 正确答案
  • B.CutMix 不改变图像内容
  • C.CutMix 只调整图像亮度
  • D.CutMix 不做标签混合

答案:A。CutMix 是空间上的区域拼接:图 B 的一块矩形盖到图 A 上,其余保留;MixUp 是全局像素线性加权。两者都混合标签,都改变图像内容,也都不涉及亮度调整。

Q6. 目标检测任务中使用翻转增强时,还需要做什么?

单选题 · mid

  • A.同步变换边界框坐标← 正确答案
  • B.重新标注所有目标
  • C.把图像先转为灰度图
  • D.不清洗任何标注数据

答案:A。翻转后目标位置镜像,边界框坐标必须跟着做同样的变换,否则训练监督信号错位。重新标注成本太高且没必要;转灰度不是翻转的必要步骤;不清洗数据与翻转增强没有直接关系。

Q7. 验证集和测试集应当如何处理?

单选题 · mid

  • A.和训练集一样做增强
  • B.保持原始数据分布不变← 正确答案
  • C.只做随机裁剪增强
  • D.只使用 MixUp 增强

答案:B。验证集和测试集模拟真实世界的原始数据,必须保持原样才能公正评估模型的真实水平。对它们做增强会污染评估结果,就像盲品会评委不能先吃调味料再打分。

Q8. 下列属于几何变换的增强方法有哪些?

多选题 · hard

  • A.水平翻转← 正确答案
  • B.随机旋转← 正确答案
  • C.颜色亮度调整
  • D.随机裁剪← 正确答案

答案:ABD。水平翻转、随机旋转、随机裁剪都改变像素的空间位置关系,属于几何变换。亮度调整改变的是像素值分布规律,属于色彩变换,不涉及空间结构。

Q9. 关于 CutMix 中 λ 与裁剪框面积的关系,正确的是?

多选题 · hard

  • A.λ 约等于裁剪框面积占比← 正确答案
  • B.λ 与面积大小完全无关
  • C.λ 数值始终保持恒定值
  • D.λ 等于旋转角度数值

答案:A。CutMix 中 λ 表示标签混合权重,与裁剪框面积占比一致:裁剪框越大,图 B 占的面积越多,图 B 的标签权重就越高。λ 与面积无关、恒定不变或等于旋转角度的说法都不正确。

Q10. 关于 MixUp 增强,下列说法正确的有哪些?

多选题 · hard

  • A.在像素层面进行线性混合← 正确答案
  • B.标签也随之线性混合← 正确答案
  • C.只适用于一维序列数据
  • D.生成新的虚拟训练样本← 正确答案

答案:ABD。MixUp 在像素层面对两张图加权求和,生成一张不存在的虚拟样本,标签同步线性混合成软标签。它广泛适用于图像、文本、表格等多种数据类型,并不局限于序列数据。