【问题标题】:how to load label data presented in raster format into Keras/Tensorflow如何将光栅格式的标签数据加载到 Keras/Tensorflow 中
【发布时间】:2018-09-20 21:55:35
【问题描述】:

我想使用 CNN 网络将 2 个对象(二进制:“0:对象不存在,1:对象存在”)分割成形状,但我遇到了数据问题。训练数据是 150 幅图像,格式为“jpg”,而基本事实(标签数据)也是 150 幅 0 和 1 的“png”栅格图像(产生黑白图像)。

现在的问题是如何在 Keras/Tensorflow 中加载这种混合的训练图像和标签图像,如果有一个虚拟示例和/或演示如何在 Python 中执行此操作,我将不胜感激。

【问题讨论】:

  • 您的意思是说标签不是文本(0 或 1)并且它们本身不是图像吗?我还假设标签图像文件名中没有提到 0 或 1?
  • @AtulShanbhag 是的,你是对的。标签不是文本,而是图像,因此对于每个训练图像都有一个标签图像,并且该标签图像是 0 和 1 的栅格(0 表示特征不存在,1 表示特征存在)。换句话说,标签图像是每个训练图像中存在的特征的掩码
  • 我的假设是,文件名没有 0 或 1,所以我们可以从文件名中找出它的类,对吗?
  • @AtulShanbhag 是的。本质上,标签只是根据特征形状掩蔽的训练图像。

标签: python tensorflow keras conv-neural-network convolution


【解决方案1】:

您可以使用ImageDataGenerator 类及其flow_from_directory() 方法定义一个用于读取输入图像的生成器和另一个用于读取标签的生成器,然后将这两个生成器组合在一个生成器中。只要确保输入和标签图像的目录结构和(顺序)文件名相同即可:

data_image_gen = ImageDataGenerator(...)
data_label_gen = ImageDataGenerator(...)

image_gen = data_image_gen.flow_from_directory(image_directory,
                # no need to return labels
                class_mode=None,
                # don't shuffle to have the same order as labels
                shuffle=False)

image_gen = data_image_gen.flow_from_directory(label_directory,
                color_mode='grayscale',
                # no need to return labels
                class_mode=None,
                # don't shuffle to have the same order as images 
                shuffle=False)

def final_gen(image_gen, label_gen):
    for data, labels in zip(image_gen, label_gen):
        # divide labels by 255 to make them like masks i.e. 0 and 1
        labels /= 255.
        # remove the last axis, i.e. (batch_size, n_rows, n_cols, 1) --> (batch_size, n_rows, n_cols)
        labels = np.squeeze(labels, axis=-1)

        yield data, labels

# ... define your model

# fit the model
model.fit_generator(final_gen(image_gen, label_gen), ...)

【讨论】:

  • 你能解释一下你的解决方案到底发生了什么。因为让我感到困惑的是标签数据本质上是具有对象形状作为掩码的训练图像(例如,我们正在检测汽车,因此汽车像素被分配为 1,周围区域为 0)
  • @aminevsaziz 你熟悉 Keras 中的ImageDataGenerator 吗?它用于从 numpy 数组或硬盘加载图像批次(动态)。现在,在我的回答中,我定义了两个生成器,一个用于输入图像,另一个用于它们对应的标签,这些标签也是图像。他们一起从硬盘读取训练数据并生成批量训练数据。然后您可以使用fit_generator 方法使用生成器来拟合您的模型。此外,如果标签是“png”文件,那么当您读取它们时,值将在 [0,255] 范围内,因此答案中除以 255。
  • 感谢您的详细解释。在我将您的答案分配为解决方案之前,是否有任何方法可以在没有 keras api 的情况下在 tensorflow 中处理/加载数据(训练和标签)。如果有办法请包含在上面的答案中。
  • @aminevsaziz 有Tensorflow dataset api。但是,我不太熟悉它,所以我不能将它包含在我的答案中(至少,在我对它有很好的理解之前)。
  • 谢谢。我会将您的答案分配为解决方案,我希望有人可以在没有 keras api 的情况下添加一些有用的东西。
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多