Keras-Iterator mit erweiterten Bildern und anderen Funktionen

8

Angenommen, Sie haben einen Datensatz mit Bildern und einigen Daten in einem .csvfür jedes Bild. Ihr Ziel ist es, eine NN mit einem Faltungszweig und einem anderen (in meinem Fall einem MLP) zu erstellen.

Nun gibt es viele Anleitungen ( eine hier , eine andere ) zum Erstellen des Netzwerks, das ist nicht das Problem.

Das Problem hier ist , wie kann ich einen Iterator in Form erstellen , [[convolution_input, other_features], target]wenn die convolution_inputaus einem Keras fließen , dass Augmented Bilder hinzufügt.ImageDataGenerator

Genauer gesagt, wenn das n-te Bild (das ein erweitertes sein kann oder nicht) dem NN zugeführt wird, möchte ich, dass seine ursprünglichen Merkmale darin enthalten sind other_features.

Ich fand nur wenige Versuche ( hier und hier sah der zweite vielversprechend aus, aber ich konnte nicht herausfinden, wie man mit erweiterten Bildern umgeht), um genau das zu tun, aber sie scheinen die mögliche Manipulation des Datensatzes durch den Keras-Generator nicht zu berücksichtigen tut.

Lamberto Basti
quelle
1
Frage: Bist du in Ordnung flowoder brauchst du flow_from_directory? ( flowbedeutet, dass Sie alle Bilder im Speicher behalten können)
Daniel Möller
Nun, ich möchte nur einen Flow, der die Bildtransformation automatisch übernimmt. In meinem Fall habe ich verwendet, flow_from_dataframeda ich Dateinamen, Funktionen und Klassen habe
Lamberto Basti

Antworten:

3

Angenommen, Sie haben eine CSV-Datei, sodass sich Ihre Bilder und die anderen Funktionen in der Datei befinden.

Dabei steht id für den Bildnamen, gefolgt von den Features und Ihrem Ziel (Klasse für die Klassifizierung, Nummer für die Regression).

Geben Sie hier die Bildbeschreibung ein

Definieren wir zuerst einen Datengenerator und später können wir ihn überschreiben.

Lassen Sie uns die Daten aus dem CSV in einem Pandas-Datenrahmen lesen und den Flow_from_Dataframe von Keras verwenden, um aus dem Datenrahmen zu lesen.

df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(df,directory="out/",x_col="id",y_col=df.columns[1:],class_mode="raw",batch_size=1)

Sie können Ihre Erweiterung jederzeit in ImageDataGenerator hinzufügen.

Dinge, die im obigen Code in flow_from_dataframe zu beachten sind, sind

x_col = der Bildname

y_col = normalerweise Spalten mit dem Klassennamen, aber lassen Sie uns diesen später überschreiben, indem Sie zuerst alle anderen Spalten in der CSV bereitstellen. dh feat_1, feat_2 .... bis class_label

class_mode = raw, schlagen Sie dem Generator vor, alle Werte in y unverändert zurückzugeben.

Lassen Sie uns nun den obigen Generator überschreiben / erben und einen neuen erstellen, so dass er [img, otherfeatures], [target] zurückgibt.

Hier ist der Code mit Kommentaren als Erklärungen

def my_custom_generator():
count = 0 #to keep track of complete epoch
while True:
    if(count==len(df.index)): 
        #if the count is matching with the length of df, the one pass is completed, so reset the generator
        generator.reset()
        break
    count+=1
    data = generator.next() #get the data from the generator
    #the data looks like this [[img,img] , [other_cols,other_cols]]  based on the batch size

    imgs = []
    cols = []
    targets = []
    #iterate the data and append the necessary columns in the corresponding arrays 
    for k in range(batch_size):
        imgs.append(data[0][k]) #the first array contains all images

        cols.append(data[1][k][:-1])  #the second array contains all features with last column as class, so [:-1]
        targets.append(data[1][k][-1]) #the last column in the second array from data is the class

    yield [imgs,cols],targets  #this will yield the result as you expect.

Erstellen Sie eine ähnliche Funktion für Ihren Validierungsgenerator. Verwenden Sie train_test_split, um Ihren Datenrahmen bei Bedarf aufzuteilen, 2 Generatoren zu erstellen und diese zu überschreiben.

Übergeben Sie die Funktion in model.fit_generator wie folgt

model.fit_generator(my_custom_generator(),.....other params)
venkata krishnan
quelle
Aber wie kann if(count==len(df.index))man die Epoche verfolgen, wenn der erweiterte Datensatz weitaus zahlreicher ist als der ursprüngliche?
Lamberto Basti
1
Augmentationen werden normalerweise auf Bilder angewendet. Die Anzahl der Bilder wird nur erhöht, wenn Sie sie separat speichern und als eindeutige Instanz im Trainingssatz verwenden. Wie Augmentation hilft, ist, dass während jeder Epoche unterschiedliche Augmentationen zufällig angewendet werden, wodurch sie wie unterschiedliche Bilder aussehen
venkata krishnan
Wow, das ist eine riesige Information. Ich würde empfehlen, es auch der Antwort hinzuzufügen. Warum werden solche wichtigen Informationen nicht explizit in der Keras-Dokumentation beschrieben?
Lamberto Basti
1
Sogar ich habe es mir selbst gedacht, denn wenn wir Schritte pro Epoche im Training erwähnen, teilen wir die Trainingslänge im Allgemeinen durch die Stapelgröße, was bedeutet, dass in einer Epoche alle Bilder nur einmal übergeben werden. Ich hoffe ich habe recht ..
venkata krishnan