Keras 用于语义分割,flow_from_directory() 错误

Raf*_*eta 4 runtime-error keras-2

我试图使用我对 Keras 文档中示例代码的修改,该文档展示了在使用图像掩码代替标签的情况下如何设置 image_datagen.flow_from_directory() (用于图像分割,我们在其中预测一个类)对于每个像素)。

顺便说一下,我设置了 featurewise_center = True ,试图从每个图像的颜色通道中减去所有训练图像的每个颜色通道的平均值,这样在整个训练集中,每个颜色通道的平均值将为 0。我希望这样不是实现此目的的方法。

无论如何,这是我生成错误的代码:

image_datagen = ImageDataGenerator(featurewise_center = True)
mask_datagen = ImageDataGenerator()

image_generator = image_datagen.flow_from_directory(
    '/home/icg/Martin/train_data_graz/images_rect_r640x360',
    class_mode = None,
    batch_size = 1,
    seed = 123)

mask_generator = mask_datagen.flow_from_directory(
    '/home/icg/Martin/train_data_graz/labels_rect_r640x360',
    class_mode = None,
    batch_size = 1,
    seed = 123)

# combine generators into one which yields image and masks
train_generator = zip(image_generator, mask_generator)

model.fit_generator(
    train_generator,
    steps_per_epoch = 1000,
    epochs = 100)
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

Found 0 images belonging to 0 classes.
Found 0 images belonging to 0 classes.
Traceback (most recent call last):
  File "FCN_VGG16.py", line 178, in <module>
    train_generator = zip(image_generator, mask_generator)
  File "/home/icg/rafa/local/lib/python2.7/site-packages/keras/preprocessing/image.py", line 1026, in next
    index_array, current_index, current_batch_size = next(self.index_generator)
  File "/home/icg/rafa/local/lib/python2.7/site-packages/keras/preprocessing/image.py", line 720, in _flow_index
    current_index = (self.batch_index * batch_size) % n
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)

由于某种原因 n = 0。有什么想法为什么会发生这种情况吗?

pet*_*ich 6

您需要将图像放入函数目录中每个类的子文件夹flow_from_directory()中。

\n\n

在你的情况下:

\n\n
/home/icg/Martin/train_data_graz/images_rect_r640x360/images_class01\n/home/icg/Martin/train_data_graz/images_rect_r640x360/images_class02\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:

\n\n

由于您已设置class_modeNone进行语义分割(请参阅评论和帖子):

\n\n
/home/icg/Martin/train_data_graz/images_rect_r640x360/all_images\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我懂了。但是,您仍然需要将所有图像放置在“flow_from_directory”指向的目录的子目录中。这也适用于“class_mode = None”。你尝试过吗? (5认同)
  • 我理解这个过程,就像人们通常进行分类的方式一样。然而,通过语义分割,人们可以拥有许多类别,所有这些类别都可以出现在任何图像中。所以这并不像为猫准备一个文件夹,为狗准备一个文件夹那么简单。需要将每个像素分类为属于一个或另一个类别。为此,人们使用掩模代替标签。对于训练集中的每个图像,都有一个掩码,用于指定每个像素属于哪个类别 - 如果它是属于汽车、猫或正在分类的任何类别的像素。 (4认同)