论文阅读九:yolov4的各种数据增广技术random erasing、cutout、mixup、cutmix、mosaic等

   yolov4的发布,让很多做工程的都很兴奋,但其实静下来仔细研究,发现yolov4其实是一个成功的调参例子,作者用到了大量前人的技术,加以组合,实现了速度和精度的完美平衡,读yolov4的论文会发现,作者深厚的论文基础,以及对论文中技术的使用,都值得我们学习。工程项目中,算法搭建完之后,复杂的应用环境中,总是遇到各种各样的问题,使得算法精度上不去,算法停留到瓶颈出,只有尝试各种解决问题的方法,才能在一次次实验中突破算法瓶颈,而这些解决问题的方法就来自平时论文的积累,因此,接下里将以yolov4的论文为导向,阅读和研究里面提到的各种trick。

一、Random Erasing

论文:https://arxiv.org/abs/1708.04896
代码:https://github.com/zhunzhong07/Random-Erasing
   Random Erasing是2017年厦门大学提出来的,发表在CVPR上
   为了解决遮挡问题作者提出了Random Erasing,同时可以提高CNN的范化能力,Random-Erasing非常简单,就是在一个mini-batch中,随机选择一个图片,然后在该图片上的任何一个地方,选择一个随机尺寸进行覆盖,覆盖值可以看作是增加的噪声,Random Erasing 和Random cropping 、Random flipping具有一定的互补性。Random Erasing 已经被增加到torchvision.transforms中,可以在直接使用。
   Random Erasing 希望在遮挡目标的部分信息的同时,CNN依旧可以正确分类,就逼迫CNN利用局部没有遮挡的部分进行正确分类。
   论文中的可视化例子:
在这里插入图片描述   这种简单粗暴的做法,在理想的图像数据中,例如CIFAR-10 和 CIFAR-100中也许有用,但是在实际的分类图片中,需要慎重使用,可以借鉴该论文的思想:就是有意识的覆盖掉图片中目标的一部分,可以模拟目标的遮挡。

二、Cut Out

论文:https://arxiv.org/abs/1708.04552
代码: https://github.com/uoguelph-mlrg/Cutout

   Cut Out是2017年由圭尔夫大学提出,并且发表在CVPR
   出发点和随机擦除一样,也是模拟遮挡,目的是提高泛化能力,实现上比random erasing简单,随机选择一个固定大小的正方形区域,然后采用全0填充就OK了,当然为了避免填充0值对训练的影响,应该要对数据进行中心归一化操作,norm到0。
    本文和随机擦除几乎同时发表,难分高下(不同场景下谁好难说),区别在于在cutout中,擦除矩形区域存在一定概率不完全在原图像中的。而在Random Erasing中,擦除矩形区域一定在原图像内。
    Cutout变相的实现了任意大小的擦除,以及保留更多重要区域。需要注意的是作者发现cutout区域的大小比形状重要,所以cutout只要是正方形就行,非常简单。具体操作是利用固定大小的矩形对图像进行遮挡,在矩形范围内,所有的值都被设置为0,或者其他纯色值。而且擦除矩形区域存在一定概率不完全在原图像中的(文中设置为50%)

三、Mixup

论文:https://arxiv.org/abs/1710.09412
代码:https://github.com/facebookresearch/mixup-cifar10
3.1、算法伪代码
伪代码
   从上面的伪代码可以看到,mixup的具体做法是,从两个batch中取出两个训练样本(x1,y1)和(x2,y2),其中x1和x2是训练数据,y1和y2是其对应的标签,将x1和x2按照一定的比例进行混合,生成最终的训练数据x,其对应的标签y1和y2也按照同样的比例进行混合,生成标签y。标签y1和y2是one-hot vector编码,可以理解为对k个类别的每个类给出样本属于该类的概率。加权以后就变成了"two-hot",也就是认为样本同时属于混合前的两个类别。

3.2、官方代码:

def mixup_data(x, y, alpha=1.0, use_cuda=True):
    '''Compute the mixup data. Return mixed inputs, pairs of targets, and lambda'''
    if alpha > 0.:
        lam = np.random.beta(alpha, alpha)
    else:
        lam = 1.
    batch_size = x.size()[0]
    if use_cuda:
        index = torch.randperm(batch_size).cuda()
    else:
        index = torch.randperm(batch_size)
    mixed_x = lam * x + (1 - lam) * x[index,:]
    y_a, y_b = y, y[index]
    return mixed_x, y_a, y_b, lam

def mixup_criterion(y_a, y_b, lam):
    return lambda criterion, pred: lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)

   pytorch代码中有些细节实现和伪代码不一样,需要说明的是:1、工程实现上,要用同样的miniti-batch加载并mixup,这样,可以减少I/O。2、不混合label,而是用加权的输入在两个label上分别计算cross-entropy loss,最后把两个loss加权作为最终的loss。由于cross-entropy loss的性质,这种做法和把label线性加权是等价的。

3.3、理解:
   线性是最简单的一种操作,而这种简单的操作在现有的数据上生成虚拟数据,填充样本空间,从而减少在样本空间以外测试时的震荡数量。

四、cutmix

论文:https://arxiv.org/abs/1905.04899v2
代码:https://github.com/clovaai/CutMix-PyTorch
1、cutmix的算法
在这里插入图片描述
    x A x_{A} xA x B x_{B} xB是训练样本, y A y_{A} yA y B y_{B} yB是对应的样本标签,M是mask掩码,cutmix的具体做法是,将A样本随机取出一块,覆盖到B样本上,新生成的数据标签是A的标签和B的标签按照一定的比例进行混合。
   cutmix和mixup很相似,cutmix 相当于cutout + mixup,论文里指出,二者的不同是cutmix是用图片的一部分完全代替另一个图片的一部分,而mixp是将两张图片按照一定的比例完全混合,cutmix生成的图片更自然。
   论文中将cutout、mixup和cutmix做了对比,并且使用cam技术进行了可视化,作者发现:cutout 可以利用剩下的图片信息做出正确的判断;mixup 在选择识别需要的线索时,表现得很迷茫;cutmix 可以准确的定位到两种类别,从而提高了cutout 的性能。实验结果图如下:
在这里插入图片描述
2、cutmix的官方代码
在这里插入图片描述
和mixup类似,这里不作详细解释,一看即明了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值