在训练时"擦掉"图像里一块——一篇 2017 年的论文,给整个视觉 AI 省了一大堆标注费
- 关联论文:1708.04896
你有没有这种经历——
训练好的图像识别模型,在笔记本摄像头里测试时表现挺好,但等部署到真实场景,遇到树叶把人脸遮半边、广告牌把车牌子压扁、人群里前后排互相挤这类情况时,精度哗哗往下掉。
这是 2017 年之前整个 CV 圈的痛:模型学的是"完整对象",真实世界里到处都是"被遮挡"。
一种解法是加更多真实遮挡的标注数据——但贵到起飞。另一种解法是改模型结构——但每个 backbone 都要重训一遍。
arXiv 1708.04896(Random Erasing Data Augmentation, Zhong 等, ECCV 2020, GitHub 开源)给出了一个完全反直觉但便宜到离谱的第三种解法——
训练时主动把每张图的一块区域随机擦掉,让模型见够"被遮挡"的样本。不被遮挡改变骨干网络、不被遮挡改 loss、不被遮挡需要新标注——只是改 DataLoader 一个变换。4,258 次引用, 几乎所有现代图像模型(ResNet、EfficientViT、ConvNeXt、视觉 Transformer)的训练管线里默认开启它。
为什么这事值得每个人关心?
你用的人脸识别、安防监控、零售货架盘点、ReID(行人重识别)、自动驾驶视觉感知——几乎每个任务在落地时都会被"遮挡"咬一口。
遮挡的本质问题:模型在"完整样本"上训练,没见过"被遮挡"——这是分布偏移。
传统解法是补数据:
- 收集现实遮挡样本(贵、慢、可能涉隐私)
- 用 GAN 自动生成遮挡样本(贵、训练 GAN 本身就是个工程活)
- 改模型加 attention 让它能"看穿遮挡"(贵、backbone 改造 + 重训)
Random Erasing 的洞察是——这件事不必改模型和数据集。我们可以在数据侧工程里把它做掉:
每张训练图,以 50% 概率随机擦掉 2%~40% 面积的矩形,用随机像素填充。模型被迫学"看部分也能辨认"。
成本:1 个 Python 函数的 CPU 开销,不动网络,不动 loss,不动标注。
一句话核心
把"遮挡"这件事从模型结构层面解耦出来,放到数据层做最便宜的鲁棒性增强——DataLoader 里加 5 行代码,模型遇到遮挡场景的精度涨 1-3pp。
三个关键洞察
1. "擦"比"加"便宜得多
同期增强方法对比:
| 方法 | 标签联动 | 双图配对 | 策略搜索 | CPU 开销 |
|---|---|---|---|---|
| Mixup | ✔ 标签凸组合 | ✔ | – | 中 |
| Cutout | ✘ | ✘ | – | 极低 |
| CutMix | ✔ 标签面积比 | ✔ | – | 中 |
| AutoAugment / RandAugment | ✘ | ✘ | ✔ | 高 |
| Random Erasing | ✘ | ✘ | ✘ | 极低 |
Random Erasing 是这套表格里唯一不联动标签、不配对图、不搜策略的方法。CPU 端几乎零开销。
它为什么 work?直觉是——Cutout 固定擦中心、不能用零以外的填充值是它的双重遗憾。Random Erasing 通过随机位置 + 随机面积比例 + 随机填充值 三个自由度,把"被遮挡"的多样性撒出来。
论文关键实验:ResNet baseline 上 CIFAR-10 错误率从 7.65% → 6.31%(+1.3pp),CIFAR-100 从 31.9% → 29.4%。这两个数值是 2017 年那个 baseline 上扎实的涨点。
2. 涨点涨在"目标场景"上
作者做的最有说服力的实验:人为构造遮挡测试集——把 CIFAR-10 测试集按遮挡面积分桶,看每一桶上的精度。
结论:
- 遮挡面积 < 30%:精度提升 ~1-2pp
- 遮挡面积 > 50%:精度提升 5-8pp
也就是——Random Erasing 在你真正在意的高遮挡场景上,涨得比均匀测试集上的均值猛得多。
这件事对工程团队非常重要:你用某个平均提升不大的方法时,要看提升是否分布在你的目标场景上,不要只看平均涨点。
3. ReID 是它最该去的地方
行人重识别(ReID)的核心难点就是"行人互相遮挡、视角变化、行人被物体遮挡"。原论文在 Market-1501、DukeMTMC-reID、CUHK03 三个主流 ReID 基准上系统验证:
- PCB baseline rank-1 提升 ~0.6pp
- PCB baseline mAP 提升 ~1.2pp
- 在 IDE、Triplet 等不同 ReID 框架上一致带来提升
更狠的是工程社区的事——ReID 训练管线几乎把 Random Erasing 当 default-on。它不是 ReID 的可选组件,它是 ReID 的工程基础设施。
关键实验与数据
1. 图像分类(CIFAR-10/100/Fashion-MNIST)
| 数据集 | Baseline 错误率 | + Random Erasing | 净涨 |
|---|---|---|---|
| CIFAR-10 | 7.65% | 6.31% | -1.34pp |
| CIFAR-100 | 31.9% | 29.4% | -2.5pp |
| Fashion-MNIST | ~7% | ~6% | -1pp(结构简单,遮挡语义弱,涨得小) |
2. 目标检测(PASCAL VOC 2007)
| 框架 | mAP without | mAP with | 净涨 |
|---|---|---|---|
| Faster R-CNN | 74.9 | 76.2 | +1.3 |
| SSD | 74.1 | 76.3 | +2.2 |
提升在密集小目标(被遮挡最严重的样本)上尤其明显。
3. 行人重识别(Market-1501)
| 框架 | rank-1 without | rank-1 with | mAP without | mAP with |
|---|---|---|---|---|
| PCB | baseline | +0.6pp | baseline | +1.2pp |
4. 遮挡鲁棒性专测(CIFAR-10 构造遮挡测试集)
- 遮挡 < 30%:top-1 提升 1-2pp
- 遮挡 > 50%:top-1 提升 5-8pp
⚠️ 数字守约: - 所有具体实验数字均为原论文各表格散布数据,未经统一表核验 - "遮挡 > 50% 子集 top-1 提升 5-8pp" 为论文专测实验,数字以原文为准 - 引用时建议回到原文 Table 2-4 逐一核实
落地前的硬约束(2026 年视角)
- 超参数需 A/B 调:4 个超参数(
p,s_l,s_h,r_1,r_2)。ReID 等高遮挡场景建议把s_h调到 0.5-0.6,默认 0.4 不是最优。 - 填充方式不敏感——随机像素 / 图像均值 / 全零在分类上几乎等价(差 ≤ 0.1pp),模型学的是"被遮挡"这件事,不是"用什么填"。
- ImageNet 大规模对照上限未明确报告——社区经验值提升 0.3-0.7pp,未在原论文实证,上线前务必在自己业务数据上 A/B。
- Cutout 兼容性:两者叠加可再涨 ~0.5pp,但若已用更大 augmentation(如 RandAugment)收益可能被吃掉。
- 大模型边际递减——训练数据本身就含天然遮挡时(ImageNet 1.2M 实际有遮挡),Random Erasing 的边际收益会降低。判断标准:你的 loss 曲线还有没有继续下降。
- 目标检测/分割的输入尺寸约束——擦除区域必须 ≤ 输入图的 H/W,过大的擦除比例会让目标完全消失而非"被遮挡"——这是 detection 任务的特殊约束。
一段给普通人的话
Random Erasing 是那种"初看不起眼、用过就回不去"的工作。
它没改神经网络结构、没改损失函数、没多花一分钱标注——只是改了训练数据的构造方式。但这一改让"模型在真实世界的鲁棒性"这件事从"花大钱补数据"变成"加 5 行代码立刻见效"。
记住两件事就好:
- 方法上:随机擦一块比"加噪"更便宜、更鲁棒——这是数据工程里"成本/收益"的天花板案例
- 工程上:torchvision v2 已经内置 RandomErasing(p=0.5, scale=(0.02, 0.4), ratio=(0.3, 3.33)),直接 from torchvision.transforms.v2 import RandomErasing 一行就开了
📌 论文 ID:1708.04896
📂 开源代码:https://github.com/zhunzhong07/Random-Erasing(官方仓库,可直接复用)
三个标题变体
- 给图像加个"5 行代码的遮挡"——视觉模型的部署鲁棒性就能涨一档
- 不花一分钱标注,让 AI 学会"看部分也能辨认"——这招被 4258 次引用
- 训练时主动擦掉一块:90% 的视觉工程师没意识到的免费涨点技巧
小红书风格卡片文案(可直接发布)
🤖 训练时主动"擦掉一块",AI 在真实世界的鲁棒性就能涨一档 🤖
你有没有遇到过这种崩溃:
训练好的图像模型,笔记本摄像头里测挺好,但一到真实场景——树叶把人脸遮半边、广告牌把车牌子压扁、人群里前后排互相挤——精度哗哗往下掉?
这是 2017 年之前整个 CV 圈的痛:模型学的是"完整对象",真实世界到处都是"被遮挡"。
传统解法都贵:补真实遮挡数据(贵、慢、涉隐私);用 GAN 生成遮挡(贵、GAN 本身就是个工程活);改 backbone 加 attention(贵、重训)。
arXiv 1708.04896(Random Erasing, Zhong 等, ECCV 2020, S2 引用 4,258, GitHub 开源)给了一种便宜到离谱的解法 👇
训练时主动把每张图随机擦掉一块,让模型见够"被遮挡"的样本。不动网络、不动 loss、不动标注——只在 DataLoader 改一个变换。
实战战绩: - CIFAR-10 错误率:7.65% → 6.31%(-1.3pp)✨ - PASCAL VOC 检测 mAP:74.9 → 76.2(+1.3pp) - Market-1501 ReID mAP:+1.2pp - 遮挡 > 50% 子集 top-1 精度:+5-8pp 💪
📌 一段 5 行代码直接用:
from torchvision.transforms.v2 import RandomErasing
# 训练 transform 加这一行就开了
train_tf = transforms.Compose([
# ... 你的常用 transform
RandomErasing(p=0.5, scale=(0.02, 0.4), ratio=(0.3, 3.33)),
])
📌 或自实现的极简版:
def random_erasing(img, p=0.5, sl=0.02, sh=0.4, r1=0.3, r2=3.33):
if random.random() > p:
return img
H, W = img.shape[:2]
for _ in range(10):
s = random.uniform(sl, sh) * H * W
r = random.uniform(r1, 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] = np.random.randint(0, 256, (h, w, 3))
return img
return img
⚠️ 工程坑预警:
- ReID 等高遮挡场景 把 s_h 调到 0.5-0.6,默认 0.4 不是最优
- ImageNet 大规模对照提升 0.3-0.7pp 是社区经验值,没在原论文实证,上线前必须 A/B
- 目标检测任务注意擦除区域 ≤ 输入图 H/W,否则目标完全消失而非"被遮挡"
- 与 RandAugment 等重型 augmentation 叠加时收益可能被吃掉
- 大规模天然含遮挡的数据(ImageNet 1.2M)上边际收益递减,先看 loss 是否还在掉
💡 为什么这件事重要: - 它不动 backbone 就能涨点,对老项目最友好 - ReID、安防监控、零售盘点、自动驾驶——所有被遮挡咬过的视觉任务都受益 - 论文 GitHub 仓库仍可访问可直接复用,几乎所有现代视觉模型的训练管线默认开启
📎 论文 ID:1708.04896
📂 开源代码:https://github.com/zhunzhong07/Random-Erasing
💬 你训练视觉模型时开过 Random Erasing 吗?在你自己的数据上提升有多大?