gpt4 book ai didi

python - 如何在图像分类中创建用于马赛克增强的类标签?

转载 作者:行者123 更新时间:2023-12-03 16:18:15 25 4
gpt4 key购买 nike

要以CutMixMixUp类型扩展创建类标签,我们可以使用beta(例如np.random.betascipy.stats.beta),并对两个标签执行以下操作:

label = label_one*beta + (1-beta)*label_two
但是,如果我们 多于两个图片,该怎么办?在 YoLo4中,他们尝试了一种有趣的增强方法 马赛克增强来解决对象检测问题。与 CutMixMixUp不同,此增强使用 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)
enter image description here

但是,这里有更多激励您的示例。数据来自 Cassava Leaf竞赛。

但是,为了从扩展样本中获得正确的标签,我们尝试了类似的方法,假设对于外循环和内循环内的批次中的每个交互,如果我们能够计算 4个样本的分布,例如每个样本如何它们覆盖了 mosaic_image内的区域,因此我们可以将它们乘以 a的分布概率。
    # Iterate over the full indices 
for j in range(len(indices)):

b = tf.random.uniform([],0,1) # this is beta dist with alpha=1.0
P = tf.cast( tf.random.uniform([],0,1)<=1.0, tf.int32)

for i in range(len(rand4indices)):
....
WIDTH = tf.cast( DIM * tf.math.sqrt(1-b),tf.int32) * P
a = tf.cast(WIDTH*WIDTH/DIM/DIM,tf.float32)

最佳答案

我们已经知道,在 CutMix 中,λ是来自Beta分布Beta(α,α)的浮点数。我们已经看到,当α=1时,它的性能最佳。现在,如果我们始终授予α==1,则可以说 λ是从均匀分布中采样的。
简而言之,我们可以说λ只是一个浮点数,其值将为0到1。
因此,仅对于 2张图片,
如果我们对第一个图像使用λ,那么我们可以简单地通过1-λ来计算剩余的未知部分。
但是对于3张图像,如果我们将λ用于第一张图像,则无法从该单个λ计算其他2个未知数。如果我们确实想要这样做,则需要2个随机数用于3张图像。同样,我们可以说对于图像的n号,我们需要n-1号随机变量。在所有情况下,总和应为1。 (例如λ + (1-λ) == 1)。如果总和不是1,则标签将是错误的!
为此, Dirichlet分布可能会有所帮助,因为它有助于生成总计为1的数量。Dirichlet分布的随机变量可以看作是Beta分布的多元概括。

>>> np.random.dirichlet((1, 1), 1)  # for 2 images. Equivalent to λ and (1-λ)
array([[0.92870347, 0.07129653]])
>>> np.random.dirichlet((1, 1, 1), 1) # for 3 images.
array([[0.38712673, 0.46132787, 0.1515454 ]])
>>> np.random.dirichlet((1, 1, 1, 1), 1) # for 4 images.
array([[0.59482542, 0.0185333 , 0.33322484, 0.05341645]])
CutMix 中,图像的裁剪部分的大小与 λ有关,后者对相应的标签加权。
enter image description here
enter image description here
因此,对于多个 λ,您还需要相应地计算它们。
# let's say for 4 images
# I am not sure the proper way.

image_list = [4 images]
label_list = [4 label]
new_img = np.zeros((w, h))

beta_list = np.random.dirichlet((1, 1, 1, 1), 1)[0]
for idx, beta in enumerate(beta_list):
x0, y0, w, h = get_cropping_params(beta, full_img) # something like this
new_img[x0, y0, w, h] = image_list[idx][x0, y0, w, h]
label_list[idx] = label_list[idx] * beta

关于python - 如何在图像分类中创建用于马赛克增强的类标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65181294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com