用于语义分割的 ImageDataGenerator

Posted

技术标签:

【中文标题】用于语义分割的 ImageDataGenerator【英文标题】:ImageDataGenerator for semantic segmentation 【发布时间】:2020-01-22 19:06:24 【问题描述】:

我正在尝试使用 Keras 进行语义分割,当尝试加载图像时,我使用 flow_from_directory 方法收到此错误。

Found 0 images belonging to 0 classes.
Found 0 images belonging to 0 classes.

这是我的代码。

from tensorflow.keras.applications.resnet50 import preprocess_input
from tensorflow.keras.preprocessing.image import ImageDataGenerator

data_generator = ImageDataGenerator()
train_generator = data_generator.flow_from_directory(
                                        directory="../input/Training_dataset/Images",
                                        target_size=(IMG_SIZE, IMG_SIZE),
                                        batch_size=16,
                                        class_mode=None,
                                        classes=None
                                        )

mask_generator = data_generator.flow_from_directory(
    directory="../input/Training_dataset/Masks/all",
    class_mode=None,
    classes=None,
    batch_size = 1,
    )

我已阅读此问题,但解决方案无效Keras for semantic segmentation, flow_from_directory() error

【问题讨论】:

【参考方案1】:

您需要将图像保存在一个子文件夹中,例如在图像和蒙版目录中创建一个名为“img”的文件夹。

-- image
   -- img
      -- 1.jpg
      -- 2.jpg
-- mask
   -- img
      -- 1.png
      -- 2.png

数据生成器应该是这样的:-

seed = 909 # (IMPORTANT) to transform image and corresponding mask with same augmentation parameter.
image_datagen = ImageDataGenerator(width_shift_range=0.1,
                 height_shift_range=0.1,
                 preprocessing_function = image_preprocessing) # custom fuction for each image you can use resnet one too.
mask_datagen = ImageDataGenerator(width_shift_range=0.1,
                 height_shift_range=0.1,
                 preprocessing_function = mask_preprocessing)  # to make mask as feedable formate (256,256,1)

image_generator =image_datagen.flow_from_directory("dataset/image/",
                                                    class_mode=None, seed=seed)

mask_generator = mask_datagen.flow_from_directory("dataset/mask/",
                                                   class_mode=None, seed=seed)

train_generator = zip(image_generator, mask_generator)

如果您想为语义分割模型制作自己的自定义数据生成器以更好地控制数据集,您可以查看我的 kaggle 内核,其中我使用 camvid 数据集训练 UNET 模型。

https://www.kaggle.com/mukulkr/camvid-segmentation-using-unet

如果您需要更好的增强功能,您可以查看这个很棒的 GitHub 存储库 - https://github.com/mdbloice/Augmentor

【讨论】:

这适用于图像,但在尝试拟合模型时我收到错误AttributeError: 'zip' object has no attribute 'shape' 谢谢无论如何我检查你的内核 我没有收到任何 AttributeError 可以准确判断您在哪里收到此错误。 尝试这样做后train_generator = zip(image_generator, mask_generator) model.fit_generator(train_generator, steps_per_epoch=167,epochs=10) 我有相同的目录结构。但是我的图像名称是“img (1).png”,而掩码名称是“img (1)_mask.png”……这样行吗?

以上是关于用于语义分割的 ImageDataGenerator的主要内容,如果未能解决你的问题,请参考以下文章

CVPR2022用于域适应语义分割的域无关先验

用于语义分割的全卷积神经网络

U-net 与 FCN 背后的直觉用于语义分割

图像预处理和数据增强应该如何用于语义分割?

用于语义分割的 PASCAL VOC 中的地面实况像素标签

论文阅读BiSeNet V2用于实时语义分割的双边网络