AAAI 2020,数据增强方法:Random Erasing Data Augmentation

Random Erasing Data Augmentation

厦门大学 智能多媒体实验室的一项工作,Leader:李绍滋,发表在AAAI 2020上。

Zhong, Zhun, et al. “Random erasing data augmentation.” Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 34. No. 07. 2020.

1. 摘要:

介绍了一种新的训练卷积神经网络(CNN)的数据增强方法——随机擦除。在训练阶段,随机擦除在图像中随机选择一个矩形区域,并用随机值擦除它的像素。在此过程中,生成不同遮挡程度的训练图像,降低了过拟合的风险,使模型对遮挡具有鲁棒性。随机擦除是无参数学习,易于实现,可以与大多数基于CNN的识别模型集成。随机擦除虽然简单,但它是对常用的数据增强技术(如随机裁剪和翻转)的补充,在图像分类、目标检测和人员再识别方面,与强大的基线相比,可以产生持续的改进。

image-20210508202904732

优点:

  • 一种轻量级方法,不需要任何额外的参数学习或内存消耗。它可以在不改变学习策略的情况下与各种CNN模型集成。
  • 现有数据扩充和正则化方法的补充方法。当两者结合时,随机擦除进一步提高了识别性能。
  • 在图像分类、目标检测和人员重新识别方面不断提高最新的最先进的深度模型的性能。
  • 提高神经网络对部分共包样本的鲁棒性。当我们随机添加遮挡到CIFAR-10测试数据集时,随机擦除显著优于基线模型。

2. 相关工作

目的均为围绕提高CNN等模型的泛化能力,而提出很多的数据增强和正则化方法,例如裁剪、翻转、dropout和batch normalization。遮挡(Occlusion)是影响神经网络泛化能力的一项重要的因素,期望在不同层次遮挡情况下保持模型的基本不变性。强鲁棒性模型可以在物体部分区域被遮挡的情况下,依然有较强的识别能力。

3. 数据集:

任务数据集
Image ClassficationCIFAR-10 CIFAR-100 Fashion-MNIST
Object DetectionPASCAL VOC 2007
Person re-identificationMarket-1501 DukeMTMC-reID CUHK03

4. 方法

描述了随机擦除的详细过程。接下来,介绍了随机擦除在不同任务中的实现。最后,我们分析了随机擦除和随机裁剪之间的差异。

4.1 随机擦除

训练中,随机擦除有一定的概率性, p p p的概率将被随机擦除, 1 − p 1-p 1p的概率是保持不变。

假设图像的面积是 S = W × H S = W \times H S=W×H,随机初始化擦除的面积为 S e S_{e} Se,其中 S e S \frac{S_{e}}{S} SSe的范围在 s l s_{l} sl s h s_{h} sh之间,擦除矩形的长宽比在 r 1 r_{1} r1 r 2 r_{2} r2之间,设置为 r e r_{e} re,则可求得长 H e = S e × r e H_{e}=\sqrt{S_{e} \times r_{e}} He=Se×re ,宽 W e = S e r e W_{e}=\sqrt{\frac{S_{e}}{r_{e}}} We=reSe 。随机初始化一个点 P = ( x e , y e ) \mathcal{P}=(x_{e},y_{e}) P=(xe,ye),并且需要保证这个点所画的框在图像内。 I e = ( x e , y e , x e + W e , y e + H e ) I_{e}=(x_{e},y_{e},x_{e}+W_{e},y_{e}+H_{e}) Ie=(xe,ye,xe+We,ye+He)作为选择的区域。算法实现如下:

image-20210508234007352

4.2 随机擦除用于图像分类

在图像分类中,对图像进行分类。一般来说,训练数据不提供目标的位置,所以我们不能知道目标在哪里。在这种情况下,我们根据Alg. 1对整个图像进行随机擦除。

4.3 与其他方法的比较

随机裁剪是一种有效的数据增强方法,它减少了背景在CNN决策中的贡献,可以基于对象的部分存在而不是聚焦于整个对象来建立学习模型。与随机裁剪相比,随机擦除保留了物体的整体结构,只是遮挡了物体的某些部分。另外,擦除区域的像素被重新分配随机值,这可以看作是给图像添加了噪声。在我们的实验中(第5.1.2节),我们证明了这两种方法在数据扩充方面是互补的。随机擦除(Random Erasing)、随机裁剪(Random cropping)以及它们的组合示例如图所示。

image-20210509000028122

5. 实验

5.1 图像分类

5.1.1 实验设置

针对相同的网络结构,所有的模型都在相同权重初始化情况下,比较是否加入随机擦除的方法。

网络框架包括ResNet,ResNeXt,Wide Residual Networks。

5.1.2 分类评估

结果如下,可见加入了随机擦除方法,模型的测试错误率下降了

image-20210509000845261

接下来是一个消融实验,分别对比了用随机数填充、ImageNet平均值填充、0填充(黑色)、255填充(白色)。最终实验认为采用随机数填充的方式更好。

image-20210509001654858

6. 总结

Over all,全文在图像分类领域大致方法如此,简而言之,选择一个合适面积,一个点,然后画框,框内像素随机替代。

全文还包括在目标检测、人员重识别等方面的应用,此处无需求,暂不考虑。文章中也有很多其他补充的实验,证明了在不同超参数下,以及与其他增强方法,例如Random flipping, Random cropping, Random Erasing等实验的补充。

7. 代码

官方代码:https://github.com/zhunzhong07/Random-Erasing

from torchvision.transforms import *

from PIL import Image
import random
import math
import numpy as np
import torch

class RandomErasing(object):
    '''
    Class that performs Random Erasing in Random Erasing Data Augmentation by Zhong et al. 
    -------------------------------------------------------------------------------------
    probability: The probability that the operation will be performed.
    sl: min erasing area
    sh: max erasing area
    r1: min aspect ratio
    mean: erasing value
    -------------------------------------------------------------------------------------
    '''
    def __init__(self, probability = 0.5, sl = 0.02, sh = 0.4, r1 = 0.3, mean=[0.4914, 0.4822, 0.4465]):
        self.probability = probability
        self.mean = mean
        self.sl = sl
        self.sh = sh
        self.r1 = r1
       
    def __call__(self, img):

        if random.uniform(0, 1) > self.probability:
            return img

        for attempt in range(100):
            area = img.size()[1] * img.size()[2]
       
            target_area = random.uniform(self.sl, self.sh) * area
            aspect_ratio = random.uniform(self.r1, 1/self.r1)

            h = int(round(math.sqrt(target_area * aspect_ratio)))
            w = int(round(math.sqrt(target_area / aspect_ratio)))

            if w < img.size()[2] and h < img.size()[1]:
                x1 = random.randint(0, img.size()[1] - h)
                y1 = random.randint(0, img.size()[2] - w)
                if img.size()[0] == 3:
                    img[0, x1:x1+h, y1:y1+w] = self.mean[0]
                    img[1, x1:x1+h, y1:y1+w] = self.mean[1]
                    img[2, x1:x1+h, y1:y1+w] = self.mean[2]
                else:
                    img[0, x1:x1+h, y1:y1+w] = self.mean[0]
                return img

        return img

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值