Python 如何使用Keras中的目录flow_进行多类语义切分?

Python 如何使用Keras中的目录flow_进行多类语义切分?,python,keras,Python,Keras,假设我有100个训练灰度图像和100个RGB训练遮罩,每个大小为512x512。我能够在Keras中使用对面具进行热编码,如下所示 numclasses=3 masks_one_hot=to_categorical(maskArr,numclasses) 其中maskArr是100x512x512x1,而masks\u one\u hot是100x512x3 然而,为了使用ImageDataGenerator和flow\u from\u目录使用trainGenerator从,我尝试保存一个热编

假设我有100个训练灰度图像和100个RGB训练遮罩,每个大小为512x512。我能够在Keras中使用
对面具进行热编码,如下所示

numclasses=3
masks_one_hot=to_categorical(maskArr,numclasses)
其中
maskArr
是100x512x512x1,而
masks\u one\u hot
是100x512x3

然而,为了使用
ImageDataGenerator
flow\u from\u目录
使用
trainGenerator
从,我尝试保存一个热编码的训练图像,然后使用
trainGenerator
读取它们。然而,我注意到,在使用
imwrite
并使用
imread
读取它们之后,它们从一个热编码的512x512x3图像变为512x512x3 RGB图像。也就是说,每个通道的值不是0或1,而是在0-255之间

因此,如果我这样做:

myGenerator = trainGeneratorOneHot(20,'data/membrane/train','image','label',data_gen_args,save_to_dir = "data/membrane/train/aug", flag_multi_class = True,
num_class = 3, target_size=(512,512,3))

num_batch=3
for i,batch in enumerate(myGenerator):
    if(i >= num_batch):
        break
其中
trainGeneratorOneHot
如下所示:

def trainGeneratorOneHot(batch_size,...class_mode=None, image_class_mode=None):

    image_datagen = ImageDataGenerator(**aug_dict)
    mask_datagen = ImageDataGenerator(**aug_dict)
    image_generator = image_datagen.flow_from_directory(train_path,classes = [image_folder], class_mode = image_class_mode, color_mode = image_color_mode,target_size = target_size, ...)
    mask_generator = mask_datagen.flow_from_directory(train_path, classes = [mask_folder], class_mode = class_mode, target_size = target_size,...)
    train_generator = zip(image_generator, mask_generator)

    for (img,mask) in train_generator:
        img,mask = adjustDataOneHot(img,mask)
        yield (img,mask)

def adjustDataOneHot(img,mask):
    return (img,mask)
然后我得到`ValueError:无法将输入数组从形状(512512,1)广播到形状(512512,3,1)


如何解决此问题?

几天前正在处理相同的问题。我发现有必要创建自己的数据生成器类来处理从数据帧中获取数据、对其进行扩充,然后在将其传递给模型之前对其进行热编码。我从未能够让Keras
ImageDataGenerator
处理多个类的语义分割问题

下面是一个数据生成器类,以防对您有所帮助:

def one_hot_编码器(掩码,num_class=8):
热屏蔽=np.zeros(shape=mask.shape,dtype='uint8')
对于范围(8)内的uu:
temp=np.zero(shape=mask.shape[0:2],dtype='uint8')
温度[掩码[:,:,[掩码]!=0]=1
热屏蔽[:,:,]=温度
返回热屏蔽
#图像数据生成器类
类数据生成器(keras.utils.Sequence):
def_uuuinit_uuu(self,dataframe,batch_size,n_classes=8,augment=False):
self.dataframe=dataframe
self.batch\u size=批次大小
self.n_类=n_类
自我增强
#每历元步数
定义(自我):
返回len(self.dataframe)//self.batch\u size
#在训练结束时洗牌并重置索引
终端上的def(自身):
self.dataframe=self.dataframe.reset_索引(drop=True)
#生成数据,提供给培训
定义uu获取项目uu(自身,索引):
已处理的_图像=[]
已处理的_掩码=[]
对于范围内的(自身批量大小):
_image=io.imread(self.dataframe['Images'][index])
_mask=io.imread(self.dataframe['Masks'][index]).astype('uint8');
一个热屏蔽=一个热编码器(热屏蔽,8)
如果(自增强):
#调整大小,然后进行一些扩充
已处理的图像=用于图像的augs图像(图像=图像)/255.0
已处理的\u掩码=用于\u掩码的augs\u(图像=一个\u热\u掩码)
其他:
#仍在调整大小,但没有增加
已处理图像=调整大小(图像=图像)/255.0
已处理遮罩=调整大小(图像=一个热遮罩)
已处理的\u图像。追加(已处理的\u图像)
已处理的\u掩码。追加(已处理的\u掩码)
批处理\u x=np.数组(已处理的\u图像)
批处理y=np.数组(已处理的屏蔽)
退货(批次x、批次y)
此外,这里还有一个链接,指向回购协议,其中包含一些您可能感兴趣的语义分割模型。本文本身展示了作者如何处理多类语义切分