Utilisation de Keras pour la prédiction vidéo (séries chronologiques)

je veux prédire le prochain cadre d'un (niveaux de gris) vidéo donnée N cadres précédents - utilisant CNNs ou RNNs dans Keras. La plupart des didacticiels et autres informations concernant la prédiction des séries chronologiques et les Kera utilisent une entrée 1-dimensionnelle dans leur réseau, mais la mienne serait 3D (N frames x rows x cols)

actuellement, Je ne suis pas vraiment sûr de ce que serait une bonne approche pour ce problème. Mes idées:

  • en utilisant une ou plusieurs couches LSTM. Le problème ici est que je ne suis pas sûr si ils sont adaptés pour prendre une série d'images au lieu d'une série de scalaires comme entrée. La consommation de mémoire n'exploserait pas? S'il est correct de les utiliser: Comment puis-je les utiliser dans des Keras pour des dimensions supérieures?

  • en utilisant la convolution 3D sur l'entrée (la pile des images vidéo précédentes). Cela soulève d'autres questions: Pourquoi cela aiderait-il alors que je ne fais pas une classification mais une prédiction? Comment puis-je empiler les couches de telle manière que l'entrée du réseau a dimensions (N x cols x rows) et la sortie (1 x cols x rows)?

Je suis assez nouveau au CNNs / RNNs et Keras et apprécierais n'importe quel indice dans la bonne direction.

12
demandé sur Marcin Możejko 2017-03-06 22:08:03

2 réponses

Donc en gros, chaque approche a ses avantages et ses inconvénients. Passons en revue ceux que vous avez fournis et puis d'autres pour trouver la meilleure approche:

  1. LSTM: parmi leurs plus grands avantages est une capacité d'apprendre un modèle de dependiencies à long terme dans vos données. Ils ont été conçus pour pouvoir analyser de longues séquences telles que la parole ou le texte. Cela pourrait également causer des problèmes en raison de paramètres de nombre qui pourraient être vraiment élevé. Autre architectures de réseau récurrentes typiques comme GRU peut surmonter ce problème. Le principal inconvénient est que dans leur Standard (implémentation séquentielle), il est impossible de l'ajuster sur des données vidéo pour la même raison que les couches denses sont mauvaises pour les données d'imagerie - les charges de temps et les invariances spatiales doivent être apprises par une topologie qui n'est absolument pas adaptée pour les attraper de manière efficace. Déplacer une vidéo par un pixel à droite pourrait changer complètement la sortie de votre réseau.

    autre chose qui vaut la peine de mentionner est que la formation LSTM est considéré comme étant similaire à trouver un équilibre entre deux processus de rivalité-trouver de bons poids pour un dense calcul de sortie et trouver une bonne dynamique de mémoire interne dans les séquences de traitement. Trouver cet équilibre peut durer très longtemps, mais une fois qu'il est trouvé - il est généralement assez stable et produit un très bon résultat.

  2. Conv3D: parmi leurs plus grands avantages, on peut facilement trouver une capacité à saisir les invariances spatiales et temporelles de la même manière que Conv2D dans un cas d'imagerie. Cela rend la malédiction de la dimensionnalité beaucoup moins nuisible. Sur l'autre main de la même manière que Conv1D pourrait ne pas produire de bons résultats avec une séquence plus longue - de la même manière - un manque de mémoire pourrait rendre l'apprentissage d'une séquence plus difficile.

De cours on peut utiliser différentes approches comme:

  1. TimeDistributed + Conv2D: à l'aide d'un TimeDistributed wrapper - on peut utiliser certains pré-entraîné convnet comme par exemple Inception cadrer et ensuite analyser les cartes de fonctionnalités de façon séquentielle. Un vraiment énorme avantage de cette approche est la possibilité d'un transfert d'apprentissage. Comme un inconvénient - on peut y penser comme un Conv2.5D - il manque l'analyse temporelle des données.

  2. ConvLSTM: cette architecture n'est pas encore pris en charge par la nouvelle version de Keras (le 6 Mars 2017), mais comme on peut le voir ici il doit être fourni à l'avenir. C'est un mélange d' LSTM et Conv2D et c'est soupçonnés d'être mieux alors l'empilement Conv2D et LSTM.

bien sûr, ce ne sont pas la seule façon de résoudre ce problème, je vais parler de l'un de plus qui pourrait être utile:

  1. empilage: on peut facilement empiler les méthodes supérieures afin de construire leur la solution finale. Par exemple: on peut construire un réseau où au début la vidéo est transformée en utilisant un TimeDistributed(ResNet) puis la sortie est de nourrir Conv3D avec des regroupements spatiaux multiples et agressifs et finalement transformés par un GRU/LSTM calque.

PS:

une autre chose qui vaut également la peine de mentionner est que la forme des données vidéo est en fait 4D(frames, width, height, channels).

PS2:

Dans le cas où vos données sont effectivement 3D(frames, width, hieght) on pourrait utiliser un classique Conv2D (en remplaçant channelsframes) pour analyser ces données (qui effectivement peut informatiquement plus efficace). Dans le cas d'un transfert d'apprentissage vous devriez ajouter une dimension supplémentaire parce que la plupart des CNN les modèles ont été formés sur les données avec la forme (width, height, 3). On peut remarquer que vos données n'ont pas 3 canaux. Dans ce cas, une technique qui est habituellement utilisée est la répétition de la matrice spatiale trois temps.

PS3:

Un exemple 2.5D approche est la suivante:

input = Input(shape=input_shape)
base_cnn_model = InceptionV3(include_top=False, ..)
temporal_analysis = TimeDistributed(base_cnn_model)(input)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis)
output = Flatten()(conv3d_analysis)
output = Dense(nb_of_classes, activation="softmax")(output)
19
répondu Marcin Możejko 2017-03-06 21:51:45

après avoir fait beaucoup de recherches, je suis finalement tombé sur le Keras Exemple pour les

dans la version actuelle de Keras (v1.2.2), Cette couche est déjà incluse et peut être importée en utilisant

from keras.layers.convolutional_recurrent import ConvLSTM2D 

pour utiliser ce calque, les données vidéo doivent être formatées comme suit:

[nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf'
[nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th'
7
répondu Isa 2017-03-07 10:33:56