2017-08-04 3 views
1

J'essayais d'utiliser ma modification de l'exemple de code dans la documentation de Keras qui montre comment configurer image_datagen.flow_from_directory() dans le cas où les masques d'image sont utilisés à la place de étiquettes (pour la segmentation d'image, où nous prévoyons une classe pour chaque pixel). Par ailleurs, j'ai défini featurewise_center = True pour tenter de soustraire la moyenne de chaque canal de couleur de toutes les images d'entraînement des canaux de couleur de chaque image, de sorte que sur l'ensemble du jeu d'apprentissage, chaque moyenne de canal de couleur soit 0. Je m'attends à ce que ce ne soit pas le moyen d'accomplir cela.Keras pour la segmentation sémantique, erreur flow_from_directory()

Quoi qu'il en soit, voici mon code qui a généré l'erreur:

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) 

Et voici le message d'erreur:

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 

Pour une raison n = 0. Toutes les idées pour lesquelles cela pourrait se produire?

Répondre

1

Vous devez placer vos images dans sous-dossiers pour chaque classe dans le répertoire de votre fonction flow_from_directory().

Dans votre cas:

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

Edit:

Puisque vous avez défini class_mode-None et faire la segmentation sémantique (voir les commentaires & post):

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

Je comprends que processus, la façon dont on fait habituellement la classification. Cependant, avec la segmentation sémantique, on a un certain nombre de classes dont TOUS peuvent apparaître dans n'importe quelle image. Ce n'est donc pas aussi simple que d'avoir un dossier pour les chats et un autre pour les chiens. Il faut classer chaque pixel comme appartenant à l'une ou l'autre classe. Pour ce faire, on utilise des masques à la place des étiquettes. Pour chaque image de l'ensemble d'entraînement, on a un masque qui spécifie à quelle catégorie appartient chaque pixel - si c'est un pixel qui fait partie d'une voiture, ou d'un chat, ou quelles que soient les catégories que l'on classe. –

+3

Je vois. Mais encore - vous devez placer toutes vos images dans un sous-répertoire du répertoire que vous dirigez votre 'flow_from_directory'. Cela s'applique également à 'class_mode = None'. Avez-vous essayé cela? – petezurich

+1

Aha, ça a fait l'affaire. J'avais placé le chemin vers le dossier contenant les images elles-mêmes, plutôt que le chemin vers le dossier contenant un DOSSIER contenant les images. Merci! :-) –