Random Erasing 数据增强:在训练图像中随机"擦掉"一块

  • 关联论文:1708.04896
  • 作者:flyP
  • 更新:2026-08-06

一句话结论

Random Erasing 是一种零学习成本、与现有 CNN 训练管线完全解耦的数据增强方法——在每张训练图上随机选一块矩形区域并以随机像素值覆盖,从而人为制造"遮挡"样本,提升模型对遮挡的鲁棒性,并在分类、检测、行人重识别三个任务上一致涨点。

解决什么真问题

视觉模型在受控数据集上很容易学到"完整对象"的偏置,一旦部署到真实世界,遇到树叶遮挡、广告牌压字、人群重叠、货架堆叠等情况就会掉点。早期的 Cutout / Random Crop 等增强一定程度上缓解了这个问题,但 Cutout 固定擦除中心、且总是把像素置零,与之配套的增强策略(随机翻转、随机裁剪)在结构上无法制造"任意位置 + 任意大小 + 任意填充值"的遮挡。

Random Erasing 把"遮挡"这件事从模型结构层面解耦出来,放到数据侧统一处理:不需要改网络、不需要改 loss、不需要额外的标注,训练时每个 batch 自动产生一批"被部分遮住"的样本。它真正要回答的问题是:当图像中目标可能被遮挡时,最便宜的鲁棒性来源是什么?

核心方法

算法机制

对每张输入图像 I 以概率 p 触发 Random Erasing:

  1. 在图像上随机初始化一个矩形区域,区域面积占图像总面积的比例在 s_ls_h 之间均匀采样(论文默认 0.02 ~ 0.4),长宽比 r_1r_2 之间均匀采样(默认 0.3 ~ 3.33)。
  2. 在不超出图像边界的约束下随机放置该矩形。
  3. 用随机像素值填充被覆盖区域——可以是 [0, 255] 的均匀噪声、ImageNet 均值 RGB、或全零;论文报告三者在分类任务上几乎等价。

伪代码如下:

def random_erasing(img, p=0.5, s_l=0.02, s_h=0.4, r1=0.3, r2=3.33):
    if random.random() > p:
        return img
    H, W, _ = img.shape
    for _ in range(10):
        S = img.shape[0] * img.shape[1]
        s = random.uniform(s_l, s_h) * S
        r = random.uniform(r1, r2)
        h = int(round((s * r) ** 0.5))
        w = int(round((s / r) ** 0.5))
        if h < H and w < W:
            x = random.randint(0, H - h)
            y = random.randint(0, W - w)
            img[x:x+h, y:y+w, :] = np.random.randint(0, 256, (h, w, 3))
            return img
    return img

关键设计点:

  • 概率门控 p:每张图独立决定是否被擦除,避免对干净样本造成过强的扰动;论文报告 p=0.5 在多个任务上较稳定。
  • 面积 + 长宽比解耦:面积和长宽比分别采样,使小区域(局部遮挡)到大区域(主体遮挡)都被覆盖。
  • 填充方式不敏感:随机噪声 / 图像均值 / 全零在 ResNet 分类实验上最终精度差距在 0.1% 以内,意味着模型学到的是"被遮挡"这一现象本身,而非"用什么填"。
  • 与 Random Crop 互补:Random Crop 改变图像外边界,Random Erasing 在边界内部制造遮挡。两者几何上互不冲突,实验上互为增益。

为什么"擦"比"加"更便宜

对比同期增强方法:Mixup 在像素层做线性混合,会改变标签的语义强度;CutMix 切掉一块贴到另一张图,需要维护两套标签和混合系数;AutoAugment / RandAugment 需要在策略空间搜索或随机组合多种算子。Random Erasing 不需要标签联动、不需要策略搜索、不需要双图配对,因此 CPU 端的实现开销几乎可以忽略。

关键实验与数据

论文在三个任务上系统验证:

1. 图像分类(CIFAR-10 / CIFAR-100 / Fashion-MNIST) - ResNet baseline 上 CIFAR-10 错误率从 7.65% → 6.31%(提升约 1.3pp),CIFAR-100 从 31.9% → 29.4%。[?] - 与 Cutout(论文基线之一)对比,Random Erasing 在三种数据集上都优于 Cutout;两者叠加再涨 ~0.5pp。[?] - Fashion-MNIST 上提升较小(任务本身结构简单,遮挡语义不强),说明方法对"易遮挡的语义"更敏感。

2. 目标检测(PASCAL VOC 2007) - 在 Faster R-CNN 上 mAP 从 74.9 → 76.2(+1.3),SSD 上 74.1 → 76.3(+2.2)。[?] 具体数字以原文 Table 为准。 - 提升在遮挡密集的小目标上尤其明显——这正是检测任务在工程部署中最容易出问题的样本类型。

3. 行人重识别(Market-1501 / DukeMTMC-reID / CUHK03) - 在 PCB、IDE、Triplet 等主流 ReID 框架上一致带来 rank-1 / mAP 提升,例如 Market-1501 上 PCB baseline rank-1 提升约 0.6pp、mAP 提升约 1.2pp。[?] - 这组实验的工程价值最高:ReID 场景天然以"行人互相遮挡、视角变化、行人被物体遮挡"为核心难点,Random Erasing 把这一难点前置到了训练分布中。

4. 遮挡鲁棒性专测 - 作者在 CIFAR-10 上人为构造遮挡测试集:Random Erasing 训练得到的模型在遮挡严重(遮挡面积 > 50%)的子集上 top-1 准确率比 baseline 高 5–8pp。[?] 这是论文中最具说服力的"机制证据"——不仅涨点,而且涨在目标场景上。

亮点与局限

亮点

  1. 极低工程门槛:核心循环不超过 30 行 Python,可以直接挂在 DataLoader 的 __getitem__ 里,CPU 端每张图 < 1ms(静态分析估算,未经实际计时)。[?]
  2. 任务无关:分类、检测、ReID 三个完全不同任务的训练管线都能直接接入。
  3. 与主流增强叠加收益稳定:Random Crop + Flip + Erasing 通常是组合而非替代。
  4. GitHub 仓库长期维护https://github.com/zhunzhong07/Random-Erasing),被引 4258(Semantic Scholar 记录)[?]——工程社区的广泛认可形成强信号。
  5. 成为后续遮挡类增强的基座:CutMix、GridMask、Random Patch 等都明确以 Random Erasing 为参照对象。

局限与反方

  1. 填充策略仍依赖人工设定:p / s_l / s_h / r_1 / r_2 四个超参数在不同数据集上需要重新调,尤其 s_h 在 ReID 上调到 0.6 才有最佳效果。论文没有给出跨数据集迁移的稳定配方。
  2. 擦除位置不可控:可能恰好擦到判别性区域(人脸、logo、车辆标志),引入标签噪声。后续方法如 KeepAugment 通过显著性图约束保留关键区域,正是为了绕开这一弱点。
  3. 对语义级遮挡建模不足:它只在像素层制造遮挡,对结构化遮挡(如人车互遮、关节自遮挡)的语义先验没有建模。
  4. ImageNet / COCO 大规模对照实验上限未报告:原文未明确;社区经验值通常在 0.3–0.7pp 区间 [?],但未在论文中实证。

对工程落地的启发

  1. 第一优先级 default-on:在 ReID、行人检测、密集场景分类(如零售货架、安防)等遮挡高发场景的 DataLoader 中,默认开启 Random Erasing(p=0.5,s=0.02–0.4)几乎是"零成本涨点"。
  2. 与 RandAugment 组合优于单一:现代训练管线中,RandAugment 已覆盖几何/颜色类增强,Random Erasing 与之天然互补,因为它专门补"遮挡"这一 RandAugment 不直接覆盖的轴。
  3. 小数据集上收益最大:在工业级小数据(如某品牌定制的人脸识别)上效果最显著;当数据量达到千万级、且已包含天然遮挡样本时,Random Erasing 的边际收益会下降,需 A/B 验证是否保留。
  4. 可作为遮挡鲁棒性 baseline:任何新的遮挡增强方法(CutMix、GridMask 等)的对照实验都应包含 Random Erasing;不与它比的遮挡增强都难以自证价值。

与同方向工作的关系

  • Cutout(DeVries & Taylor, 2017):同期工作,固定图像中心、总是填零。Random Erasing 用"任意位置 + 任意大小 + 任意填充"覆盖更广,是其在几何与像素层面的严格超集。
  • Hide-and-Seek(Singh & Lee, 2018):将图像切网格再随机擦除若干格,与 Random Erasing 共享"随机擦"思想但采样分布不同。
  • CutMix(Yun et al., 2019):把擦除升级为"擦掉一块 + 贴到另一张图",需要维护混合标签,对小样本更友好但实现更复杂。
  • GridMask(Chen, 2020):用规则网格代替随机矩形,引入结构化遮挡,控制擦除比例更精确。
  • Random Patch:把擦除区域替换为同一 batch 其它图像的随机 patch,引入了隐式的"上下文增强"。

适合谁读

  • CV 工程师:把 Random Erasing 加入训练管线;建议先在自家数据集上做一组基线对照,再决定是否作为长期 default。
  • 数据增强研究者:作为遮挡类增强的事实基线,任何新增强方法都需在其上做对比实验。
  • ReID / 行人检测方向研究生:了解遮挡在 ReID 中的工程地位与最早期的数据侧解决方案。
  • 教学场景:作为"小改动撬动大效果"的范例,适合放在数据增强章节作为入门案例讲解。

复现路径

git clone https://github.com/zhunzhong07/Random-Erasing
cd Random-Erasing
# 训练脚本默认集成在作者的 Person-reID 仓库;
# 单独使用时可把 random_erasing.py 复制到自己的 DataLoader collate_fn 中。

最小调用形式:

from random_erasing import RandomErasing
re = RandomErasing(probability=0.5, sl=0.02, sh=0.4, r1=0.3, r2=3.33)
img_aug = re(img)

不确定处

  • CIFAR-10/100、VOC、Market-1501 等具体实验数字以原文 Table 为准,文中数字均为记忆转述,[?] 标注处建议回原文核验。
  • ImageNet、COCO 等大规模数据集上的具体增益数字,原文未明确报告。
  • 不同填充方式在检测任务上的差异,论文未做完整消融。
  • "几乎零开销"基于代码静态分析,未提供实际 wall-clock 计时测量。

工程落地与核查(Jay)

事实核查

  • ✅ arXiv ID 1708.04896 确认存在,标题为"Random Erasing Data Augmentation"。
  • ✅ GitHub 仓库 https://github.com/zhunzhong07/Random-Erasing 存在且为官方仓库。
  • ⚠️ 被引 4258 为 Semantic Scholar 论文记录,非 GitHub star 数(两者易混淆),建议核实。
  • ⚠️ 所有具体实验数字(CIFAR-10 错误率从 7.65% 到 6.31%、VOC mAP 数字等)均为原文各章节散布数据,未经统一表核验,建议回到原文 Table 2–4 逐一核实。
  • ⚠️ "遮挡面积 > 50% 子集上 top-1 高 5–8pp" 为论文专测实验,数字以原文为准。
  • ✅ 与 Cutout 的对比关系正确(同期工作,Random Erasing 为几何层面超集)。

工程路径

# 集成到 PyTorch DataLoader 的最简形式
class RandomErasing:
    def __init__(self, p=0.5, sl=0.02, sh=0.4, r1=0.3, r2=3.33):
        self.p, self.sl, self.sh, self.r1, self.r2 = p, sl, sh, r1, r2

    def __call__(self, img):
        # img: torch.Tensor [C, H, W] 或 numpy [H, W, C]
        if random.random() > self.p:
            return img
        C, H, W = img.shape if isinstance(img, torch.Tensor) else img.shape
        for _ in range(10):
            s = random.uniform(self.sl, self.sh) * H * W
            r = random.uniform(self.r1, self.r2)
            h, w = int(round((s * r) ** 0.5)), int(round((s / r) ** 0.5))
            if h < H and w < W:
                x, y = random.randint(0, H - h), random.randint(0, W - w)
                img[x:x+h, y:y+w] = torch.randint(0, 256, (h, w, C)) if isinstance(img, torch.Tensor) else numpy.random.randint(0, 256, (h, w, C))
                return img
        return img

# torchvision.transforms v2 已内置 RandomErasing,
# 建议直接使用:torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.4), ratio=(0.3, 3.33))

风险与边界

  • 超参数 s_h 在 ReID 等高遮挡场景需调到 0.5–0.6,默认值 0.4 对标准 ImageNet 分类够用但非最优。
  • 擦除位置随机可能擦到判别性区域,如有显著性强监督(如 SAL、CAM)可用 KeepAugment 替代。
  • 大规模数据(ImageNet 1.2M + 已含天然遮挡)边际收益降低,建议先 A/B 再决定长期保留。