如何为图像分类中的马赛克增强创建类标签?

M.I*_*nat 9 python keras tensorflow pytorch data-augmentation

要在CutMixorMixUp类型扩充中创建类标签,我们可以对两个标签使用beta例如np.random.betaorscipy.stats.beta和执行以下操作:

label = label_one*beta + (1-beta)*label_two
Run Code Online (Sandbox Code Playgroud)

但是如果我们有两个以上的图像呢?在YoLo4 中,他们尝试了一种有趣的增强,称为Mosaic Augmentation,用于对象检测问题。与CutMix或不同MixUp,这种增强创建了具有4 个图像的增强样本。在物体检测的情况下,我们可以计算每个实例坐标的偏移,从而可以获得正确的基本事实,这里。但是对于仅图像分类的情况,我们怎么做呢?

这是一个启动器

import tensorflow as tf
import matplotlib.pyplot as plt 
import random

(train_images, train_labels), (test_images, test_labels) = \
tf.keras.datasets.cifar10.load_data()
train_images = train_images[:10,:,:]
train_labels = train_labels[:10]
train_images.shape, train_labels.shape

((10, 32, 32, 3), (10, 1))
Run Code Online (Sandbox Code Playgroud)

这是我们为此增强编写的函数;(`内-外循环太丑了!请建议我们是否可以有效地做到这一点。)

label = label_one*beta + (1-beta)*label_two
Run Code Online (Sandbox Code Playgroud)

增强样本,目前标签错误。

data, label = mosaicmix(train_images, train_labels, 32)
plt.imshow(data[5]/255)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


但是,这里还有一些示例可以激励您。数据来自木薯叶竞赛。

Uzz*_*der 4

我们已经知道,在CutMix中,\xce\xbb是来自 beta 分布 Beta(\xce\xb1,\xce\xb1) 的浮点数。我们已经看到,当 时\xce\xb1=1,它表现最好。现在,如果我们\xce\xb1==1总是授予,我们可以说它\xce\xbb是从均匀分布中采样的。

\n

简单地说\xce\xbb,它只是一个浮点数,其值为 0 到 1。

\n

因此,仅对于2 个图像,\n如果我们用于\xce\xbb第一个图像,那么我们可以简单地通过 计算剩余的未知部分1-\xce\xbb

\n

但对于 3 个图像,如果我们使用\xce\xbb第一个图像,我们无法从该单个图像计算其他 2 个未知数\xce\xbb。如果我们真的想这样做,我们需要 3 个图像的 2 个随机数。同样,我们可以说,对于n图像的数量,我们需要n-1数量随机变量。在所有情况下,总和应该是1. (例如,\xce\xbb + (1-\xce\xbb) == 1)。如果总和不是1,标签就会错误!

\n

为此目的 狄利克雷分布可能会有所帮助,因为它有助于生成总和为 1 的数量。狄利克雷分布随机变量可以视为 Beta 分布的多元推广。

\n
>>> np.random.dirichlet((1, 1), 1)  # for 2 images. Equivalent to \xce\xbb and (1-\xce\xbb)\narray([[0.92870347, 0.07129653]])  \n>>> np.random.dirichlet((1, 1, 1), 1)  # for 3 images.\narray([[0.38712673, 0.46132787, 0.1515454 ]])\n>>> np.random.dirichlet((1, 1, 1, 1), 1)  # for 4 images.\narray([[0.59482542, 0.0185333 , 0.33322484, 0.05341645]])\n
Run Code Online (Sandbox Code Playgroud)\n

CutMix中,图像裁剪部分的大小与\xce\xbb相应标签的权重有关。

\n

在此输入图像描述

\n

在此输入图像描述

\n

所以,对于多个\xce\xbb,您还需要相应地计算它们。

\n
# let\'s say for 4 images\n# I am not sure the proper way. \n\nimage_list = [4 images]\nlabel_list = [4 label]\nnew_img = np.zeros((w, h))\n\nbeta_list = np.random.dirichlet((1, 1, 1, 1), 1)[0]\nfor idx, beta in enumerate(beta_list):\n    x0, y0, w, h = get_cropping_params(beta, full_img)  # something like this\n    new_img[x0, y0, w, h] = image_list[idx][x0, y0, w, h]\n    label_list[idx] = label_list[idx] * beta\n
Run Code Online (Sandbox Code Playgroud)\n