数据增强:Mixup,Cutout,CutMix | Mosaic

转自:https://www.jianshu.com/p/639f9ecc1328

1.几种数据增强的比较

  • Mixup:将随机的两张样本按比例混合,分类的结果按比例分配;
  • Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变;
  • CutMix:就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配

     

     

区别
上述三种数据增强的区别:cutout和cutmix就是填充区域像素值的区别;mixup和cutmix是混合两种样本方式上的区别:mixup是将两张图按比例进行插值来混合样本,cutmix是采用cut部分区域再补丁的形式去混合图像,不会有图像混合后不自然的情形。
优点
(1)在训练过程中不会出现非信息像素,从而能够提高训练效率;
(2)保留了regional dropout的优势,能够关注目标的non-discriminative parts;
(3)通过要求模型从局部视图识别对象,对cut区域中添加其他样本的信息,能够进一步增强模型的定位能力;
(4)不会有图像混合后不自然的情形,能够提升模型分类的表现;
(5)训练和推理代价保持不变。

2.What does model learn with CutMix?

作者通过热力图,给出了结果。CutMix的操作使得模型能够从一幅图像上的局部视图上识别出两个目标,提高训练的效率。由图可以看出,Cutout能够使得模型专注于目标较难区分的区域(腹部),但是有一部分区域是没有任何信息的,会影响训练效率;Mixup的话会充分利用所有的像素信息,但是会引入一些非常不自然的伪像素信息。

 

 

3. 查看CutMix代码

代码地址:https://github.com/clovaai/CutMix-PyTorch
生成裁剪区域

 

"""输入为:样本的size和生成的随机lamda值"""
def rand_bbox(size, lam):
    W = size[2]
    H = size[3]
    """1.论文里的公式2,求出B的rw,rh"""
    cut_rat = np.sqrt(1. - lam)
    cut_w = np.int(W * cut_rat)
    cut_h = np.int(H * cut_rat)
 
    # uniform
    """2.论文里的公式2,求出B的rx,ry(bbox的中心点)"""
    cx = np.random.randint(W)
    cy = np.random.randint(H)
    #限制坐标区域不超过样本大小
 
    bbx1 = np.clip(cx - cut_w // 2, 0, W)
    bby1 = np.clip(cy - cut_h // 2, 0, H)
    bbx2 = np.clip(cx + cut_w // 2, 0, W)
    bby2 = np.clip(cy + cut_h // 2, 0, H)
    """3.返回剪裁B区域的坐标值"""
    return bbx1, bby1, bbx2, bby2

整体流程

 

"""train.py 220-244行"""
for i, (input, target) in enumerate(train_loader):
    # measure data loading time
    data_time.update(time.time() - end)
 
    input = input.cuda()
    target = target.cuda()
    r = np.random.rand(1)
    if args.beta > 0 and r < args.cutmix_prob:
        # generate mixed sample
        """1.设定lamda的值,服从beta分布"""
        lam = np.random.beta(args.beta, args.beta)
        """2.找到两个随机样本"""
        rand_index = torch.randperm(input.size()[0]).cuda()
        target_a = target#一个batch
        target_b = target[rand_index] #batch中的某一张
        """3.生成剪裁区域B"""
        bbx1, bby1, bbx2, bby2 = rand_bbox(input.size(), lam)
        """4.将原有的样本A中的B区域,替换成样本B中的B区域"""
        input[:, :, bbx1:bbx2, bby1:bby2] = input[rand_index, :, bbx1:bbx2, bby1:bby2]
        # adjust lambda to exactly match pixel ratio
        """5.根据剪裁区域坐标框的值调整lam的值"""
        lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1) / (input.size()[-1] * input.size()[-2]))
        # compute output
        """6.将生成的新的训练样本丢到模型中进行训练"""
        output = model(input)
        """7.按lamda值分配权重"""
        loss = criterion(output, target_a) * lam + criterion(output, target_b) * (1. - lam)
    else:
        # compute output
        output = model(input)
        loss = criterion(output, target)

3. 查看CutOut代码

 

import torch
import numpy as np


class Cutout(object):
    """Randomly mask out one or more patches from an image.
    Args:
        n_holes (int): Number of patches to cut out of each image.
        length (int): The length (in pixels) of each square patch.
    """
    def __init__(self, n_holes, length):
        self.n_holes = n_holes
        self.length = length

    def __call__(self, img):
        """
        Args:
            img (Tensor): Tensor image of size (C, H, W).
        Returns:
            Tensor: Image with n_holes of dimension length x length cut out of it.
        """
        h = img.size(1)
        w = img.size(2)

        mask = np.ones((h, w), np.float32)

        for n in range(self.n_holes):
            y = np.random.randint(h)
            x = np.random.randint(w)

            y1 = np.clip(y - self.length // 2, 0, h)
            y2 = np.clip(y + self.length // 2, 0, h)
            x1 = np.clip(x - self.length // 2, 0, w)
            x2 = np.clip(x + self.length // 2, 0, w)

            mask[y1: y2, x1: x2] = 0.

        mask = torch.from_numpy(mask)
        mask = mask.expand_as(img)
        img = img * mask

        return img

4.Mosaic数据增强方法

Yolov4的mosaic数据增强参考了CutMix数据增强方式,理论上具有一定的相似性。CutMix数据增强方式利用两张图片进行拼接,但是mosaic利用了四张图片,根据论文所说其拥有一个巨大的优点是丰富检测物体的背景,且在BN计算的时候一下子会计算四张图片的数据。

实现思路

1.每次读取四张图片

 

 

2.分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好。

 

 

 

3.进行图片的组合和框的组合




作者:毛十三_
链接:https://www.jianshu.com/p/639f9ecc1328
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<think>嗯,用户想了解数据增强技术中的MixupCutMix、RandAugment和Random Erasing的实现方式及应用场景。我需要先回忆这些方法的基本概念和原理,然后整理它们的实现步骤,最后讨论它们的应用场景。 首先,Mixup。我记得Mixup是通过线性插值混合两个图像和它们的标签。具体来说,就是将两张图片按一定比例叠加,标签也按同样的比例混合。比如,使用公式$I_{mix} = \lambda I_A + (1-\lambda) I_B$,标签则是$\lambda y_A + (1-\lambda) y_B$。实现时通常在一个batch内随机选择两张图片,lambda来自Beta分布。应用场景主要是图像分类,能提高模型泛化能力,特别是在数据不足时。需要注意标签平滑的问题,可能需要配合交叉熵损失函数调整。 然后是CutMix。这个方法应该是将一张图像的部分区域替换为另一张图像的对应区域,标签则根据区域面积比例混合。比如,随机生成一个矩形区域,用另一张图的该区域覆盖原图。公式可能是$I_{cutmix} = M \odot I_A + (1-M) \odot I_B$,其中M是二进制掩码。标签混合比例是覆盖区域的面积占比。实现时同样在batch内选图,随机生成位置和大小。应用场景包括目标检测和分类,因为保留了局部信息,可能对检测任务更友好。YOLO v4用了CutMixMosaic,说明在检测中有效。 接下来是RandAugment。这个我记得是自动化数据增强的一种方法,通过随机选择变换操作和强度。具体实现是预设一组变换(比如旋转、剪切、颜色调整等),每次随机选几个应用,强度也是随机决定。和AutoAugment不同,RandAugment不需要额外训练,直接随机选择,减少了计算开销。应用场景是需要高效增强的情况,适合资源有限的环境,比如移动端模型训练。 Random Erasing,应该是随机擦除图像中的一块区域,用随机值或均值填充。这模拟了遮挡,增强模型对部分遮挡的鲁棒性。实现时随机选择区域的位置和大小,然后填充。应用场景包括分类和识别任务,特别是在存在遮挡的现实场景中,比如人脸识别或车辆检测。 现在要确认这些方法的实现细节是否正确,有没有混淆。比如,MixupCutMix的区别在于Mixup是整体混合,而CutMix是局部替换,所以标签的计算方式不同。RandAugment和AutoAugment的区别在于自动化方式,前者更简单。Random Erasing类似于CutOut,但可能填充方式不同。 应用场景方面,Mixup适合分类,CutMix适合检测,因为保留局部结构。RandAugment适合资源有限的情况,而Random Erasing提升遮挡鲁棒性。 需要检查引用中的内容是否符合。比如引用3提到Mixup在目标检测有效,引用2提到YOLO v4用CutMixMosaic。引用4有MixupCutMix的参数设置。需要确保回答中的信息与引用一致,比如Mixup的lambda来自Beta分布,CutMix的lambda由区域面积决定。 可能用户需要具体的代码示例,但用户问题主要是实现方式和应用,所以给出伪代码或关键步骤即可。比如Mixup的lambda生成,图像混合;CutMix的掩码生成;RandAugment的随机选择变换;Random Erasing的区域擦除。 最后,确保回答结构清晰,分点说明每个方法,包括原理、实现、应用场景,并引用相关的引用来源。然后生成相关问题,如比较不同方法的优缺点,实际应用中的选择等。</think>### 数据增强技术:MixupCutMix、RandAugment、Random Erasing #### 1. **Mixup** **原理与实现** Mixup通过对两个样本及其标签进行线性插值生成新样本,增强模型对特征分布的平滑性理解。 - **数学公式**: $$ I_{\text{mix}} = \lambda I_A + (1-\lambda) I_B $$ $$ y_{\text{mix}} = \lambda y_A + (1-\lambda) y_B $$ 其中$\lambda \sim \text{Beta}(\alpha, \alpha)$,通常$\alpha \in [0.1, 0.4]$[^3][^4]。 - **实现步骤**: 1. 随机选取一个批次内的两幅图像$I_A$和$I_B$。 2. 生成$\lambda$并混合图像和标签。 - **应用场景**: 图像分类任务中缓解过拟合,尤其适用于小数据集。 --- #### 2. **CutMix** **原理与实现** CutMix通过替换图像局部区域并混合标签,增强模型对局部特征的鲁棒性。 - **数学公式**: $$ I_{\text{cutmix}} = M \odot I_A + (1-M) \odot I_B $$ 其中$M$为二进制掩码,$\lambda$由掩码面积比例决定[^2]。 - **实现步骤**: 1. 随机生成矩形区域的位置和大小。 2. 用$I_B$的对应区域覆盖$I_A$,并调整标签比例。 - **应用场景**: 目标检测和分类任务(如YOLOv4),保留局部信息以提高泛化能力。 --- #### 3. **RandAugment** **原理与实现** RandAugment通过随机组合多种基础增强操作(如旋转、剪切、颜色变换)并控制强度,降低人工设计策略的成本。 - **关键参数**: - $N$:每次选取的增强操作数量(如2-3)。 - $M$:增强强度(如1-10)[^1]。 - **实现步骤**: 1. 预定义增强操作集合(如平移、对比度调整)。 2. 随机选择$N$个操作并施加到图像。 - **应用场景**: 资源受限场景(如移动端模型训练),需高效自动化增强。 --- #### 4. **Random Erasing** **原理与实现** Random Erasing通过随机遮挡图像区域,模拟现实中的遮挡场景。 - **实现步骤**: 1. 随机选择遮挡区域的位置和大小。 2. 用随机值、均值或噪声填充该区域。 - **应用场景**: 人脸识别、目标检测等需应对遮挡的任务[^2]。 --- ### 方法对比与选型建议 | 方法 | 核心思想 | 适用任务 | 优势 | |---------------|--------------------|----------------|--------------------------| | **Mixup** | 全局线性混合 | 分类 | 提升特征分布平滑性 | | **CutMix** | 局部区域替换 | 分类、检测 | 保留局部结构信息 | | **RandAugment**| 随机组合基础增强 | 通用 | 自动化、低计算成本 | | **Random Erasing**| 模拟遮挡 | 分类、检测 | 增强遮挡鲁棒性 | --- ### 代码示例(关键逻辑) **Mixup** ```python def mixup(images, labels, alpha=0.2): lam = np.random.beta(alpha, alpha) shuffled_idx = torch.randperm(images.size(0)) mixed_images = lam * images + (1 - lam) * images[shuffled_idx] mixed_labels = lam * labels + (1 - lam) * labels[shuffled_idx] return mixed_images, mixed_labels ``` **CutMix** ```python def cutmix(images, labels, beta=1.0): lam = np.random.beta(beta, beta) h, w = images.shape[2], images.shape[3] cx, cy = np.random.randint(w), np.random.randint(h) cut_w, cut_h = int(w * (1-lam)), int(h * (1-lam)) mask = torch.ones_like(images) mask[:, :, cy:cy+cut_h, cx:cx+cut_w] = 0 mixed_images = images * mask + images[shuffled_idx] * (1 - mask) mixed_labels = lam * labels + (1 - lam) * labels[shuffled_idx] return mixed_images, mixed_labels ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值