Python 通过keras(TensforFlow后端)使用来自目录()的flow_输入用于语义图像分割的管道(3个标签)

Python 通过keras(TensforFlow后端)使用来自目录()的flow_输入用于语义图像分割的管道(3个标签),python,keras,image-segmentation,semantic-segmentation,Python,Keras,Image Segmentation,Semantic Segmentation,我正在使用keras(TensorFlow后端),我正在尝试了解如何使用flow_目录中的flow_将我的标签/遮罩引入图像分割(3个标签) 列车图像的尺寸为(144、144、144)-灰度,uint8。相应的标签_图像具有相同的尺寸,但此处值1表示标签1,值2=标签2,值3=标签3,值0表示未标记的像素 由于这是语义分割,对图像中的每个像素进行分类需要使用逐像素交叉熵损失函数。正如我在一些帖子中读到的,keras(或TensorFlow)要求我的标签图片/面具是一个热编码的。因此,我希望我的l

我正在使用keras(TensorFlow后端),我正在尝试了解如何使用flow_目录中的flow_将我的标签/遮罩引入图像分割(3个标签)

列车图像的尺寸为(144、144、144)-灰度,uint8。相应的标签_图像具有相同的尺寸,但此处值1表示标签1,值2=标签2,值3=标签3,值0表示未标记的像素

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

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

但我没有找到答案的问题是: 如何重塑/一个热编码标签图像?keras中是否有一个方便的函数,可以让我转换图像标签

来自keras.preprocessing.image导入ImageDataGenerator
列车\数据发生器=图像数据发生器(重缩放=1./255)
label_datagen=ImageDataGenerator(重缩放=1./255)
列车\u图像\u生成器=列车\u datagen.flow\u来自\u目录(
目录='/train_images',
目标_大小=(144144144),
颜色模式=“灰度”,
类别=无,
class_模式=无,
批次(单位尺寸=4)
列车\u标签\u生成器=标签\u datagen.flow\u来自\u目录(
目录='/label_images',
目标_大小=(144144144),
颜色模式=“灰度”,
类别=无,
class_模式=无,
批次(单位尺寸=4)
列车发电机=zip(列车图像发电机、列车标签发电机)

目前正在研究非常类似的东西,但有10个类。现在还没有完全解决,但关于您对keras内置函数的疑问,请检查:

one_hot_array=keras.utils.to_category(标签数据的数组,nb_类)
这将创建遮罩/标签数据的一个热向量。因此,对于您的情况,假设100个掩码的预期输出为(100,H,W,3),其中3等于您正在处理的类的数量。我不确定的是,你的掩码中是否有背景,以及你应该如何为你的数据构建文件夹。希望这能有所帮助


此外,您的
target_size
处于禁用状态,这是指图像的尺寸(例如高度和宽度)。不应该有第三个值。

是的,你是对的。to_分类函数就是这样做的。我发现ImageDataGenerator不适用于3D图像,您必须编写自己的生成器,有一个教程[用于此]。