接收相同(非随机)的图像数据集增强

Receiving the same (not random) augmentations of image dataset

dataset = tf.data.Dataset.range(1, 6) 

def aug(y):
    x = np.random.uniform(0,1)
    if x > 0.5:
         y = 100
    return y

dataset = dataset.map(aug)
print(list(dataset))

运行这段代码,那么dataset中的所有元素都是原样,或者都等于100。如何让每个元素都单独转换呢? 我下面更具体的问题基本上是问这个

我通过以下方式创建我的分割训练集:

dataset = tf.data.Dataset.from_tensor_slices((image_paths, mask_paths))

然后我将增强函数应用于数据集:

def augment(image_path, mask_path)):
    //use tf.io.read_file and tf.io.decode_jpeg to convert paths to tensors
    
    x = np.random.choice([0,1])
    if x == 1:
        image = tf.image.flip_up_down(image) 
        mask = tf.image.flip_up_down(mask)

    return image, mask

training_dataset = dataset.map(augment)
BATCH_SIZE=2
training_dataset = training_dataset.shuffle(100, reshuffle_each_iteration=True)
training_dataset = training_dataset.batch(BATCH_SIZE)
training_dataset = training_dataset.repeat()
training_dataset = training_dataset.prefetch(-1)

然而,当我可视化我的训练数据集时,所有图像都应用了相同的翻转——它们要么上下翻转,要么不翻转。正如我所期待的那样,它们会有不同的翻转——有些是颠倒的,有些不是。

为什么会这样?

您可以使用均匀随机函数或其他概率分布

tf.random.uniform(
shape, minval=0, maxval=None, dtype=tf.dtypes.float32, seed=None, name=None
)

甚至你可以使用 TensorFlow 或 Keras 中的预构建方法进行翻转

tf.keras.layers.experimental.preprocessing.RandomFlip(
mode=HORIZONTAL_AND_VERTICAL, seed=None, name=None, **kwargs
)

您需要使用 tensorflow 操作(不是 numpy 或正常 python),因为 tf.data.Dataset.map() 将映射函数作为图形执行。将函数转换为图形时,numpy 和 base python 被转换为常量。增广函数只有运行np.random.uniform(0,1)一次,存为常量

Note that irrespective of the context in which map_func is defined (eager vs. graph), tf.data traces the function and executes it as a graph.

以上内容的来源是here

一种解决方案是使用tensorflow操作。我在下面包含了一个例子。请注意,if 中的 y 值必须转换为与输入相同的数据类型。

dataset = tf.data.Dataset.range(1, 6) 

def aug(y):
    x = tf.random.uniform([], 0, 1)
    if x > 0.5:
        y = tf.cast(100, y.dtype)
    return y

dataset = dataset.map(aug)
print(list(dataset))