2017-08-04 7 views
1

Ich habe versucht, meine Modifikation des Beispielcodes in der Keras-Dokumentation zu verwenden, die zeigt, wie image_datagen.flow_from_directory() eingerichtet wird, wenn Bildmasken anstelle von verwendet werden Labels (für Bildsegmentierung, bei der wir für jedes Pixel eine Klasse vorhersagen).Keras für semantische Segmentierung, flow_from_directory() Fehler

Übrigens habe ich featurewise_center = True gesetzt, um den Mittelwert jedes Farbkanals aller Trainingsbilder von den Farbkanälen jedes Bildes zu subtrahieren, so dass über das gesamte Trainingsset jeder Farbkanal-Mittelwert 0 ist Ich erwarte, dass dies nicht der Weg ist, dies zu erreichen.

Auf jeden Fall ist hier, mein Code, der den Fehler generiert:

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) 

Und hier ist die Fehlermeldung:

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 

Aus irgendeinem Grund n = 0 Irgendwelche Ideen, warum dies passieren könnte?

Antwort

1

Sie müssen Ihre Bilder in Unterordner pro Klasse in das Verzeichnis für Ihre flow_from_directory() Funktion.

In Ihrem Fall:

/home/icg/Martin/train_data_graz/images_rect_r640x360/images_class01 
/home/icg/Martin/train_data_graz/images_rect_r640x360/images_class02 
… 

Edit:

Da Sie class_mode-None und tun semantische Segmentierung (siehe Kommentare & post) gesetzt haben:

/home/icg/Martin/train_data_graz/images_rect_r640x360/all_images 
+2

Ich verstehe, dass Prozess, die Art und Weise, wie man normalerweise Klassifikationen durchführt. Bei der semantischen Segmentierung hat man jedoch eine Anzahl von Klassen, von denen ALLE in jedem Bild auftreten können. Es ist also nicht so einfach, einen Ordner für Katzen und einen für Hunde zu haben. Man muss jedes Pixel als zu der einen oder anderen Klasse gehörend klassifizieren. Um dies zu tun, verwendet man Masken anstelle von Etiketten. Für jedes Bild im Trainingssatz gibt es eine Maske, die angibt, welcher Kategorie ein Pixel angehört - ob es ein Pixel ist, das Teil eines Autos oder einer Katze ist, oder welche Kategorien auch immer klassifiziert werden. –

+3

Ich verstehe. Trotzdem müssen Sie alle Ihre Bilder in einem Unterverzeichnis des Verzeichnisses ablegen, auf das Sie Ihr 'flow_from_directory' richten. Dies gilt auch für 'class_mode = None'. Hast du das probiert? – petezurich

+1

Aha, das hat den Trick gemacht. Ich hatte den Pfad zu dem Ordner, der die Bilder selbst enthielt, anstatt den Pfad zu dem Ordner, der einen FOLDER mit den Bildern enthielt, abgelegt. Vielen Dank! :-) –

Verwandte Themen