为了进行多类分割,需要对掩码进行一次热编码。例如,如果我有100个形状为224x224x3的图像且具有5个不同的类别,则我将拥有一组形状为(100、224、224、5)的蒙版,即最后一个维度(通道)是指像素的类别。以一个包含6个类的灰度蒙版(每个像素的标签为1-6)为例,我可以使用tf.keras.utils.to_categorical轻松将其转换为所需的分类蒙版。
如果我使用keras随附的ImageDataGenerator,我知道我可以为图像和遮罩创建一个生成器,然后将它们压缩在一起以解决问题(如下代码所示),但是我感到困惑的是如何将遮罩转换为使用ImageDataGenerator时这种绝对的一键编码结构? ImageDataGenerator仅在保存为图像的目录中找到文件,因此我无法转换遮罩,然后将它们另存为numpy数组(单热编码的遮罩),供生成器使用,因为图像无法有四个以上的频道对吗?是否以某种方式告诉生成器执行此转换?还是这因此限制了我在问题中可以拥有的课程数量?
一种解决方案是使用完成的序列类编写我自己的自定义生成器,但是我很想了解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)