Verwendung von Keras für die Videoprognose (Zeitreihen)

8

Ich möchte den nächsten Frame eines (Graustufen-) Videos vorhersagen, der N vorhergehende Frames gegeben hat - mit CNNs oder RNNs in Keras. Die meisten Tutorials und andere Informationen zur Zeitreihenvorhersage und Keras verwenden einen 1-dimensionalen Input in ihrem Netzwerk, aber meiner wäre 3D (N frames x rows x cols)

Ich bin mir zur Zeit wirklich nicht sicher, was ein guter Ansatz für dieses Problem wäre. Meine Ideen beinhalten:

  • Verwenden einer oder mehrerer LSTM-Ebenen. Das Problem hier ist, dass ich nicht sicher bin, ob sie geeignet sind, um eine Reihe von Bildern statt einer Reihe von Skalaren als Eingabe zu nehmen. Würde der Speicherverbrauch nicht explodieren? Wenn es in Ordnung ist, sie zu verwenden: Wie kann ich sie in Keras für höhere Dimensionen verwenden?

  • Verwenden von 3D-Faltung am Eingang (der Stapel vorheriger Videoframes). Das wirft andere Fragen auf: Warum würde das helfen, wenn ich keine Klassifizierung, sondern eine Vorhersage mache? Wie kann ich die Layer so stapeln, dass der Input des Netzwerks die Dimensionen (N x cols x rows) und die Ausgabe (1 x cols x rows) ?

  • hat

Ich bin ziemlich neu bei CNNs / RNNs und Keras und würde mich über jeden Hinweis in die richtige Richtung freuen.

    
Isa 06.03.2017, 19:08
quelle

2 Antworten

15

Grundsätzlich hat also jeder Ansatz seine Vor- und Nachteile. Lassen Sie uns die von Ihnen zur Verfügung gestellten und dann anderen durchgehen, um den besten Ansatz zu finden:

  1. LSTM : Zu ihren größten Vorteilen gehört die Fähigkeit, langfristige Abhängigkeitsmuster in Ihren Daten zu erkennen. Sie wurden entworfen, um lange Sequenzen wie z.B. Rede oder Text. Dies kann auch Probleme aufgrund von Anzahlparametern verursachen, die wirklich hoch sein können. Andere typische wiederkehrende Netzwerkarchitekturen wie GRU könnten diese Probleme beheben. Der Hauptnachteil ist, dass es in ihrem Standard (sequentielle Implementierung) unmöglich ist, sie auf Videodaten anzupassen, und zwar aus dem gleichen Grund, weshalb dichte Schichten für Bilddaten nicht geeignet sind - eine vollständige Topologie muss eine Menge an Zeit und räumlichen Invarianzen lernen nicht geeignet, um sie effizient zu fangen. Wenn Sie ein Video um ein Pixel nach rechts verschieben, ändert sich möglicherweise die Ausgabe Ihres Netzwerks.

    Es ist noch erwähnenswert, dass das Training LSTM als ähnlich empfunden wird, um ein Gleichgewicht zwischen zwei Konkurrenzprozessen zu finden - gute Gewichte für eine dichte-ähnliche Ausgabeberechnung zu finden und eine gute zu finden Innerspeicher Dynamik in Verarbeitungssequenzen. Dieses Gleichgewicht zu finden, könnte sehr lange dauern, aber wenn es einmal gefunden ist - es ist normalerweise ziemlich stabil und liefert wirklich gute Ergebnisse.

  2. Conv3D : Unter ihren größten Vorteilen kann man leicht eine Fähigkeit finden, räumliche und zeitliche Invarianzen auf die gleiche Weise wie Conv2D in einem Bilderfall zu erfassen. Dies macht den Fluch der Dimensionalität viel weniger schädlich. Auf der anderen Seite - so wie Conv1D bei längeren Sequenzen auch keine guten Ergebnisse liefert - könnte ein Mangel an Speicher das Lernen einer langen Sequenz erschweren.

Natürlich kann man verschiedene Ansätze verwenden wie:

  1. TimeDistributed + Conv2D : Verwenden eines TimeDistributed Wrappers - man kann ein vortrainiertes Convnet verwenden, wie z.B. Inception frameweise und dann die Feature-Maps sequenziell analysieren. Ein wirklich großer Vorteil dieses Ansatzes ist die Möglichkeit eines Transferlernens. Als Nachteil - man könnte darüber nachdenken als Conv2.5D - fehlt eine zeitliche Analyse Ihrer Daten.

  2. ConvLSTM : Diese Architektur wird noch nicht von der neuesten Version von Keras (am 6. März 2017) unterstützt, aber wie man sieht hier sollte es in Zukunft bereitgestellt werden. Dies ist eine Mischung aus LSTM und Conv2D und es wird geglaubt, dass es besser ist als Conv2D und LSTM zu stapeln.

Natürlich sind das nicht die einzigen Wege, um dieses Problem zu lösen, ich werde noch eine erwähnen, die nützlich sein könnte:

  1. Stapeln: Man kann die oberen Methoden leicht stapeln, um ihre endgültige Lösung zu erstellen. Z.B. Man kann ein Netzwerk aufbauen, wo am Anfang das Video mit TimeDistributed(ResNet) transformiert wird, dann die Ausgabe an Conv3D mit multiplen und aggressiven räumlichen Bündeln und schließlich mit einer GRU/LSTM Schicht transformiert wird.

PS:

Noch etwas, das erwähnenswert ist, ist, dass die Form der Videodaten tatsächlich 4D mit (frames, width, height, channels ) ist.

PS2:

Wenn Ihre Daten tatsächlich 3D mit (frames, width, hieght) sind, könnten Sie tatsächlich eine klassische Conv2D verwenden (indem Sie channels in frames ändern), um diese Daten zu analysieren (was tatsächlich rechenwirksamer sein könnte). Im Falle eines transfer learning sollten Sie eine zusätzliche Dimension hinzufügen, da die meisten CNN Modelle auf Daten mit der Form (width, height, 3) trainiert wurden. Möglicherweise stellen Sie fest, dass Ihre Daten nicht über 3 Kanäle verfügen. In diesem Fall wird eine räumliche Matrix dreimal wiederholt

PS3:

Ein Beispiel für diesen 2.5D Ansatz ist:

%Vor%     
Marcin Możejko 06.03.2017, 21:08
quelle
5

Nachdem ich viel recherchiert hatte, bin ich endlich auf das Keras Beispiel gestoßen ConvLSTM2D layer (bereits von Marcin Możejko erwähnt), was genau das tut, was ich brauche.

In der aktuellen Version von Keras (v1.2.2) ist diese Ebene bereits enthalten und kann mit

importiert werden %Vor%

Um diese Ebene zu verwenden, müssen die Videodaten wie folgt formatiert werden:

%Vor%     
Isa 07.03.2017 10:33
quelle