【问题标题】:How can I apply imgaug augmentation to a tensorflow dataset created with dataset_from_directory?如何将 imgaug 增强应用于使用 dataset_from_directory 创建的张量流数据集?
【发布时间】:2023-01-22 23:38:56
【问题描述】:

我正在尝试使用 imgaug 对我现有的 trainDataset 应用一些数据扩充。

数据集是使用 dataset_from_directory 创建的,如下所示。

trainDataset = tf.keras.utils.image_dataset_from_directory(
    directory,
    labels='inferred',
    label_mode='int',
    class_names=classNames,
    color_mode='rgb',
    batch_size=64,
    image_size=(224, 224),
    shuffle=True,
    seed=seed,
    validation_split=0.15,
    subset='training',
    interpolation='bilinear',
    follow_links=False,
    crop_to_aspect_ratio=False
)

我尝试应用于数据集的 imgaug 如下所示

augmenter = iaa.Sequential([
    iaa.Fliplr(0.5),
    iaa.Affine(rotate=(-10, 10)),
    iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}),
    iaa.Crop(percent=(0, 0.1)),
    iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.5))),
    iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
    iaa.Multiply((0.8, 1.2), per_channel=0.2),
    iaa.AddToHueAndSaturation((-20, 20))
])

我终其一生都无法弄清楚如何将其实际应用于我的数据集。我试过使用 map 但它不起作用,因为增强器需要一个 numpy 数组?任何帮助,将不胜感激 :)

p.s 这是我第一次发帖,如果遗漏了任何重要的内容,我深表歉意

【问题讨论】:

    标签: python tensorflow machine-learning object-detection image-augmentation


    【解决方案1】:

    您可以使用 tf.data.Dataset.map 方法将 imgaug 扩充应用于您的数据集。 map 方法对数据集的每个元素应用一个函数,函数应该接受一个输入(数据集的单个元素)并返回一个输出(扩充元素)。

    这是一个示例,说明如何使用 map 方法将增强器应用于 trainDataset

    def augment(image, label):
        image = augmenter.augment_image(image)
        return image, label
    
    trainDataset = trainDataset.map(augment)
    

    此函数将图像及其标签作为输入,使用 augmenter.augment_image(image) 应用增强,并返回增强后的图像及其标签。 map 方法将此函数应用于 trainDataset 的每个元素,从而产生一个扩充数据集。

    请注意,augmenter.augment_image 需要一个 numpy 数组,输出也是一个 numpy 数组,因此您可能需要将数据集与 numpy 数组相互转换(如果尚未这样做)。

    还要记住,预处理和数据扩充应该在应用验证拆分之前完成。

    编辑:看起来您正在尝试使用 tfds.as_numpy(image) 将图像转换为 numpy 数组,使用 augmenter.augment_image(image) 应用扩充,然后使用 tf.data.Dataset.from_tensor_slices((image, label)) 将其转换回张量。这不会按预期工作,因为 tf.data.Dataset.from_tensor_slices 创建了一个以给定张量作为元素的新数据集,而 augment 函数的返回值应该是张量(图像,标签)的单个元组。

    下面是一个示例,说明如何修改 augment 函数以在增强后将图像正确转换回张量:

    def augment(image, label):
        image = tfds.as_numpy(image)
        image = augmenter.augment_image(image)
        image = tf.convert_to_tensor(image, dtype=tf.float32)
        return image, label
    

    在这里,tfds.as_numpy(image) 将张量图像转换为一个 numpy 数组,可以将其传递给 augmenter.augment_image(image) 以应用扩充。然后,tf.convert_to_tensor(image, dtype=tf.float32) 将 numpy 数组转换回具有指定数据类型的张量。

    此外,如前所述,您应该在验证拆分之前应用扩充。

    【讨论】:

    • 谢谢你的帮助!我已经按照你提到的那样更改了我的代码,但我认为我搞砸了与 numpy 数组之间的转换,你知道我该如何解决这个问题吗?我目前正在这样尝试:def augment(image, label): image = tfds.as_numpy(image) image = augmenter.augment_image(image) image = tf.data.Dataset.from_tensor_slices((image, label)) return image
    • 我已经编辑它来回答这个评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多