如何在 tensorflow tf.data.Dataset 中使用 cv2 图像增强功能?

Posted

技术标签:

【中文标题】如何在 tensorflow tf.data.Dataset 中使用 cv2 图像增强功能?【英文标题】:How to use a cv2 image augmentation function with tensorflow tf.data.Dataset? 【发布时间】:2020-07-08 11:12:44 【问题描述】:

我正在使用tf.data.Dataset 创建我的数据集并使用 keras 训练 CNN。我需要在图像上应用蒙版,蒙版取决于图像的形状,没有预定义的像素坐标。

在网上寻找答案时,我发现 TensorFlow 中有两种访问图像形状的方法(在训练时):

    使用急切执行(在我的情况下默认情况下未启用,我使用的是 tf v 12.0)

    使用会话

我不想使用 Eager Execution,因为它会减慢训练速度,并且不能使用会话,因为我使用 Keras 训练和测试 CNN(我使用 tf.data.Dataset 的迭代器将数据提供给 model.train())。

因此,我无法知道图像的形状,因此无法访问特定像素以进行数据增强。

我使用 OpenCV (cv2) 编写了一个应用掩码的函数。有没有办法将它与 TensorFlow 数据管道集成?

编辑:我找到了解决方案。我使用 tf.py_func 来包装 python 函数

【问题讨论】:

这个问题在这里是题外话。编程问题在这里通常是题外话。有关详细信息,请参阅https://ai.stackexchange.com/help/on-topic。我会将这个问题迁移到 Stack Overflow。 【参考方案1】:

注意:由于您需要图像增强,我想提供一些有关各种图像增强库的信息。这不会向您展示如何将 OpenCV 函数添加到您的 tfdata 管道中。但是,如果您的要求足够标准,您可以使用以下其中一种:

tf.keras.preprocessing.image.ImageDataGenerator imaug albumentations

Python 中的数据增强

    包裹:albumentations 库:外部 网址:Python albumentations library

    包裹:imaug :star: 库:外部 网址:Python imaug library

    包裹:tf.keras.preprocessing.image.ImageDataGenerator 库:外部 网址:Pyhon - TensorFlow ImageDataGenerator library

示例

    albumentations 的示例/使用。

    网址:Example use-cases of Albumentations

    imaug 的示例/使用。

    网址:Data Augmentation for Deep Learning :star::page_facing_up::heavy_check_mark: 很棒的文章 网址:Data Augmentation techniques in python

    tf.keras.preprocessing.image.ImageDataGenerator 的示例/使用。

    网址:Official Example use-case of tf.keras - ImageDataGenerator 网址:Building powerful image classification models using very little data

【讨论】:

感谢所有这些参考!你知道如何将 imaug 与 tensorflow 输入管道(tfdata.Dataset)集成吗? 虽然不完全是您问题的答案;您可能会发现这很有用:kaggle.com/rsk2327/densenet-imaug。请参阅代码中的 iaa.。主要是在 get_seq() 函数中。【参考方案2】:

您可以使用map 转换数据集的元素。然后,您可以使用 tf.py_function 将您的 cv2 函数包装到一个急切执行的 tf op 中。在 tensorflow 1.x 中,您可以使用tf.py_func,但行为有点不同。有关详细信息,请参阅 tf.py_function 文档。

因此,在 TF-2.x 中,它看起来像:

def cv2_func(image, label):
    # your code goes here

def tf_cv2_func(image, label):
    [image, label] = tf.py_function(cv2_func, [image, label], [tf.float32, tf.float64])
    return image, label

train_ds = train_ds.shuffle(BUFFER_SIZE).map(tf_cv2_func).batch(BATCH_SIZE)

【讨论】:

以上是关于如何在 tensorflow tf.data.Dataset 中使用 cv2 图像增强功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tensorflow 2.5 中运行 tensorflow 分析

TensorFlow如何入门?

如何在单核上运行 Tensorflow?

如何在 Google 云中设置 TensorFlow?

如何在 CPU 上运行 TensorFlow

tensorflow 如何在线训练模型