2017-11-21 2 views
0

Ich arbeite mit vielen Bildern (10M +) in einem einzigen Verzeichnis (keine Unterordner für jede Klasse) und verwenden Sie ein Pandas DataFrame, um die Klassenbezeichnung zu verfolgen. Die Anzahl der Bilder passt nicht in den Speicher, daher muss ich Minibatches von der Festplatte lesen. Bisher habe ich Keras .flow_from_directory() verwendet, aber ich muss Bilder in einen Unterordner pro Klasse verschieben (und pro Zug/Validierungs-Split). Es funktioniert gut, aber es wird nur sehr unpraktisch, wenn ich verschiedene Teilmengen von Bildern verwenden und Klassen auf verschiedene Arten definieren möchte. Hat jemand eine alternative Strategie, die eine Datenbank (z. B. pandas.DataFrame) verwendet, um das Lesen von Minibatches zu verfolgen, anstatt Bilder in Unterordner zu verschieben?Keras: behalten Sie alle Bilder in einem einzigen Verzeichnis

Antwort

0

Sie benötigen einen benutzerdefinierten Datengenerator.

import numpy as np 
import cv2 
def batch_generator(ids): 
    while True: 
     for start in range(0, len(ids), batch_size): 
      x_batch = [] 
      y_batch = [] 
      end = min(start + batch_size, len(ids)) 
      ids_batch = ids[start:end] 
      for id in ids_batch: 
       img = cv2.imread(dpath+'train/{}.jpg'.format(id)) 
       #img = cv2.resize(img, (224, 224), interpolation = cv2.INTER_AREA) 
       labelname=df_train.loc[df_train.id==id,'column_name'].values 
       labelnum=classes.index(labelname) 
       x_batch.append(img) 
       y_batch.append(labelnum) 
      x_batch = np.array(x_batch, np.float32) 
      y_batch = to_categorical(y_batch,120) 
      yield x_batch, y_batch 

Dann können Sie den Generator rufen nur mit ids (oder Bildnamen) numpy Array wie folgt:

model.fit_generator(generator=batch_generator(ids_train_split), \ 
       steps_per_epoch= \ 
       np.ceil(float(len(ids_train_split))/float(batch_size)),\ 
       epochs=epochs, verbose=1, callbacks=callbacks, \ 
       validation_data=batch_generator(ids_valid_split), \ 
       validation_steps=np.ceil(float(len(ids_valid_split))/float(batch_size))) 
Verwandte Themen