如何在 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
的示例/使用。
Albumentations
imaug
的示例/使用。
tf.keras.preprocessing.image.ImageDataGenerator
的示例/使用。
tf.keras - ImageDataGenerator
网址:Building powerful image classification models using very little data
【讨论】:
感谢所有这些参考!你知道如何将 imaug 与 tensorflow 输入管道(tfdata.Dataset)集成吗? 虽然不完全是您问题的答案;您可能会发现这很有用:kaggle.com/rsk2327/densenet-imaug。请参阅代码中的 iaa.您可以使用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 图像增强功能?的主要内容,如果未能解决你的问题,请参考以下文章