更新
现在,keras-cv正式支持此功能。
要在CutMix
或MixUp
类型扩充中创建一个类标签,我们可以使用beta
,如np.random.beta
或scipy.stats.beta
,并对两个标签执行以下操作:
label = label_one*beta + (1-beta)*label_two
但是如果我们有两个以上的图像呢?在YoLo4中,他们尝试了一个有趣的增强,称为Mosaic增强,用于对象检测问题。与CutMix
或MixUp
不同,这种增强会创建具有4图像的增强样本。在物体检测的情况下,我们可以计算每个示例坐标的偏移,从而可以得到正确的地面实况here。但是对于仅图像分类的情况,我们如何做到这一点?
这是一个开始。
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))
这是我们为这个增广写的函数;(太丑了,有一个“内外循环”!请建议我们是否能有效地做到这一点。)
def mosaicmix(image, label, DIM, minfrac=0.25, maxfrac=0.75):
'''image, label: batches of samples
'''
xc, yc = np.random.randint(DIM * minfrac, DIM * maxfrac, (2,))
indices = np.random.permutation(int(image.shape[0]))
mosaic_image = np.zeros((DIM, DIM, 3), dtype=np.float32)
final_imgs, final_lbs = [], []
# Iterate over the full indices
for j in range(len(indices)):
# Take 4 sample for to create a mosaic sample randomly
rand4indices = [j] + random.sample(list(indices), 3)
# Make mosaic with 4 samples
for i in range(len(rand4indices)):
if i == 0: # top left
x1a, y1a, x2a, y2a = 0, 0, xc, yc
x1b, y1b, x2b, y2b = DIM - xc, DIM - yc, DIM, DIM # from bottom right
elif i == 1: # top right
x1a, y1a, x2a, y2a = xc, 0, DIM , yc
x1b, y1b, x2b, y2b = 0, DIM - yc, DIM - xc, DIM # from bottom left
elif i == 2: # bottom left
x1a, y1a, x2a, y2a = 0, yc, xc, DIM
x1b, y1b, x2b, y2b = DIM - xc, 0, DIM, DIM-yc # from top right
elif i == 3: # bottom right
x1a, y1a, x2a, y2a = xc, yc, DIM, DIM
x1b, y1b, x2b, y2b = 0, 0, DIM-xc, DIM-yc # from top left
# Copy-Paste
mosaic_image[y1a:y2a, x1a:x2a] = image[i,][y1b:y2b, x1b:x2b]
# Append the Mosiac samples
final_imgs.append(mosaic_image)
return final_imgs, label
扩增样本,当前标签错误。
data, label = mosaicmix(train_images, train_labels, 32)
plt.imshow(data[5]/255)
然而,这里有一些例子来激励你。数据来自Cassava Leaf竞赛。
(来源:googleapis.com)
(来源:googleapis.com)
2条答案
按热度按时间oyt4ldly1#
我们已经知道,在CutMix中,
λ
是Beta分布Beta(α,α)中的浮点数。我们已经看到,当α=1
时,它的性能最好。现在,如果我们总是授予α==1
,我们可以说**λ
是从均匀分布中采样的。简单地说,我们可以说
λ
只是一个浮点数,其值为0到1。因此,仅对于2张图像,如果我们对第一张图像使用
λ
,那么我们可以简单地通过1-λ
计算剩余的未知部分。但是对于3个图像,如果我们使用
λ
作为第一个图像,我们无法从单个λ
计算其他2个未知数。如果我们真的想这样做,我们需要2个随机数为3个图像。同样,我们可以说对于n
数量的图像,我们需要n-1
数量的随机变量。在所有情况下,总和应该是1
。(例如,λ + (1-λ) == 1
)。如果总和不是1
,则标签将是错误的!为此,***狄利克雷分布***可能会有所帮助,因为它有助于生成总和为1的量。狄利克雷分布随机变量可以看作是Beta分布的多变量推广。
CutMix中,图片裁剪部分的大小与
λ
有关系,λ
对对应标签进行加权。因此,对于多个
λ
,您还需要相应地计算它们。wsewodh22#
看待这个问题的另一种方法是考虑宽度和高度维度的分离线。构建马赛克图像时,目标是将4个图像组合成单个图像。我们可以通过在每个维度中随机采样中点(表示分离点)来实现这一点。这消除了采样4个数字总和为1的相当复杂的要求。相反,现在的目标是从均匀分布中采样2个独立的值-这是一种更简单,更直观的替代方案。
所以本质上,我们采样两个值:
要生成每个图像都有明显贡献的真实马赛克,我们可以从
[0.25 0.75]
而不是[0, 1]
中采样值这两个值足以将马赛克问题参数化。马赛克中的每个图像占据由以下坐标跨越的区域:考虑马赛克图像具有维度
W x H
,并且每个维度的中点分别由w
和h
表示。采样的中点也有助于计算类标签。假设我们决定使用每个图像在马赛克中占据的区域作为其对整个类别标签的相应贡献。例如,考虑4个图像属于4个类
{0, 1, 2, 3}
。现在假设0
图像占据左上角,1
占据右上角,2
占据左下角,3
占据右下角。我们可以如下构建类标签L
: