Keras 如何使用带有多标签掩码的ImageDataGenerator进行多类图像分割?

Keras 如何使用带有多标签掩码的ImageDataGenerator进行多类图像分割?,keras,deep-learning,image-segmentation,categorical-data,one-hot-encoding,Keras,Deep Learning,Image Segmentation,Categorical Data,One Hot Encoding,为了进行多类分割,需要对掩模进行一次热编码。例如,如果我有一个形状为224x224x3的100个图像,有5个不同的类别,我会有一组形状为(1002242245)的遮罩,即最后一个维度(通道)指的是像素的类别。以包含6个类的灰度蒙版为例,其中每个像素的标签为1-6,我可以使用tf.keras.utils.to_category轻松地将其转换为我需要的分类蒙版 如果我使用keras提供的ImageDataGenerator,我知道我可以为图像和遮罩创建一个生成器,然后将它们压缩在一起解决问题(如下面

为了进行多类分割,需要对掩模进行一次热编码。例如,如果我有一个形状为224x224x3的100个图像,有5个不同的类别,我会有一组形状为(1002242245)的遮罩,即最后一个维度(通道)指的是像素的类别。以包含6个类的灰度蒙版为例,其中每个像素的标签为1-6,我可以使用tf.keras.utils.to_category轻松地将其转换为我需要的分类蒙版

如果我使用keras提供的ImageDataGenerator,我知道我可以为图像和遮罩创建一个生成器,然后将它们压缩在一起解决问题(如下面的代码所示),但我困惑的是,在使用ImageDataGenerator时,如何将遮罩转换为这种分类的热编码结构?ImageDataGenerator只在保存为图像的目录中查找文件,因此我无法转换掩码,然后将它们保存为numpy数组(一个热编码掩码),以便生成器拾取,因为图像不能有超过4个通道,对吗?有没有办法告诉发电机进行这种转换?或者这是否因此限制了我在问题中可以使用的类的数量

一个解决方案是用我已经完成的sequence类编写我自己的定制生成器,但我很想了解这是否可以用Keras内置的ImageDataGenenerator实现?在网络上编写lambda层是解决方案吗

mask_categorical = tf.keras.utils.to_categoricl(mask) #converts 224x224 grayscale mask to one-hot encoding version



imgDataGen = ImageDataGenerator(rescale=1/255.)

maskDataGen = ImageDataGenerator()

imageGenerator =imageDataGen.flow_from_directory("dataset/image/",
                                                class_mode=None, seed=40)

maskGenerator = maskDataGen.flow_from_directory("dataset/mask/",
                                               class_mode=None, seed=40)

trainGenerator = zip(imageGenerator, maskGenerator)