Pour créer une étiquette de classe dans CutMix
o MixUp
l'augmentation de type, nous pouvons utiliser beta
comme np.random.beta
o scipy.stats.beta
et faites comme suit pour deux étiquettes :
label = label_one*beta + (1-beta)*label_two
Mais que faire si nous avons plus de deux des images ? Sur YoLo4 ils ont essayé une augmentation intéressante appelée Augmentation mosaïque pour les problèmes de détection d'objets. Contrairement à CutMix
o MixUp
cette augmentation crée des échantillons augmentés avec 4 images. Dans les cas de détection d'objets, nous pouvons calculer le décalage des coordonnées de chaque instance et ainsi obtenir la vérité de terrain appropriée, aquí . Mais pour les cas de classification d'images uniquement, comment faire ?
Voici un démarreur .
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))
Voici une fonction que nous avons écrite pour cette augmentation ; ( trop moche avec une boucle `inner-outer ! Veuillez suggérer si nous pouvons le faire efficacement).
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
Les échantillons augmentés, actuellement avec les mauvaises étiquettes.
data, label = mosaicmix(train_images, train_labels, 32)
plt.imshow(data[5]/255)
Cependant, voici d'autres exemples pour vous motiver. Les données proviennent du Feuille de manioc la concurrence.
Cependant, pour obtenir l'étiquette appropriée à partir de cet échantillon augmenté, nous avons essayé quelque chose comme ceci, disons pour chaque interaction sur les lots à l'intérieur de la boucle externe et de la boucle interne si nous pouvons calculer la distribution de la 4 échantillons, comme la façon dont chacun d'entre eux couvre la zone de mosaic_image
de sorte que nous pouvons les multiplier avec une probabilité de distribution de 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)