使用 flow_from_directory() 使用 keras(TensforFlow 后端)进行语义图像分割(3 个标签)的输入管道

Input pipeline for semantic image segmentation (3 labels) with keras (TensforFlow backend) using flow_from_directory()

我正在使用 keras(TensorFlow 后端),我正在尝试了解如何使用 flow_from_directory 将我的 labels/masks 用于图像分割(3 个标签)。

train_images 具有维度 (144, 144, 144) - 灰度,uint8。相应的 label_images 具有相同的维度,但这里的值 1 表示标签 1,值 2 = 标签 2,值 3 = 标签 3,值 0 表示未标记的像素。

由于这是语义分割,对图像中的每个像素进行分类需要使用像素级交叉熵损失函数。正如我在一些帖子中所读到的,keras(或 TensorFlow)要求我的 label_image/mask 是一个热编码。因此,我希望我的 label_images 是一个具有 3 个通道的图像,其中每个像素将由一个二进制向量组成。示例:[0, 1, 0]。

如何处理存储为0的未标记像素?它们应该编码为 [0, 0, 0] 吗?

但是我找不到答案的问题是: 我如何 reshape/one-hot 正确编码我的 label_images? keras 中是否有一个方便的函数可以让我转换我的 image_labels?

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1. / 255)
label_datagen = ImageDataGenerator(rescale=1. / 255)

train_image_generator = train_datagen.flow_from_directory(
    directory='/train_images',
    target_size=(144, 144, 144),
    color_mode='grayscale',
    classes=None,
    class_mode=None,
    batch_size=4)

train_label_generator = label_datagen.flow_from_directory(
    directory='/label_images',
    target_size=(144, 144, 144),
    color_mode='grayscale',
    classes=None,
    class_mode=None,
    batch_size=4)

train_generator = zip(train_image_generator, train_label_generator)

目前正在研究非常相似但有 10 个 类 的东西。还没有完全实现,但是关于 keras 内置函数的问题,请查看:

one_hot_array = keras.utils.to_categorical(array_of_label_data, nb_classes)

这会为您的 mask/label 数据创建一个单热向量。因此,对于您的情况,假设 100 个掩码的预期输出为 (100, H, W, 3),其中 3 等于您正在使用的 类 的数量。我不确定的是你的面具是否有背景,以及你应该如何为你的数据构建文件夹。希望有所帮助。

此外,您的 target_size 已关闭,这是指图像的尺寸(例如高度和宽度)。不应该有第三个值。