[PYTHON] Vérification et mise en œuvre de la méthode de reconstruction vidéo en utilisant GRU et Autoencoder

Aperçu

Comment va tout le monde. Avec la propagation de l'infection à coronavirus, de nombreuses personnes peuvent travailler ou faire des recherches à domicile. Depuis quelques mois, je regarde chaque jour mon PC à la maison. Je suis vraiment fatigué lol

Maintenant, cette fois, je voudrais me concentrer sur la tâche de reconstruction qui utilise le modèle de génération. En particulier, essayez de reconstruire la "vidéo". (Ce que vous pouvez comprendre dans cet article, ce sont les résultats expérimentaux et la prise en compte de la méthode de reconstruction qui mord le modèle de séries temporelles basé sur l'encodeur-décodeur, qui peut être étendu à la détection d'anomalies des images en mouvement, et le contexte théorique tel que les formules mathématiques. Je ne chasserai pas.)

C'est la reconstruction de ** "image" ** qui est souvent utilisée dans le champ "détection d'anomalies". Il s'agit d'une méthode de calcul du degré d'anomalie en entrant une image dans un modèle codeur-décodeur, en la reconstruisant et en prenant la différence entre l'entrée et la sortie. La VAE est particulièrement connue comme modèle de génération utilisable pour la reconstruction d'images, et récemment, des méthodes de détection d'anomalies utilisant le GAN (AnoGAN, EfficientGAN, etc.) sont également apparues. Voici un exemple d'AnoGAN.

20190420005824.png

L'image ci-dessus est tirée de ici

Cependant, pour une raison quelconque, lorsqu'il s'agit de reconstruire des «vidéos», aucun cas de recherche ne peut être trouvé. (Dans certains cas de "génération" vidéo, certaines méthodes utilisent le GAN.)

(** Addendum (2020/05/26) **: Un exemple d'utilisation de la convolution 3D comme dans Détection d'événements anormaux dans les vidéos en utilisant Spatiotemporal Autoencoder Il semble que l'utilisation de Spatio Temporal Networks (STN) soit recherchée comme tâche d'extraction de fonctionnalités spatio-temporelles telles que les films. [Deep Learning for Anomaly Detection: A Survey](https://arxiv.org/ À partir de abs / 1901.03407). Je ne vois pas beaucoup de littérature en japonais, mais lol. À l'avenir, je voudrais faire un rapport sur l'état de la recherche de ces détections d'anomalies d'images en mouvement sous forme d'article. )

Je pense que la technologie de détection d'anomalies d'image est devenue extrêmement répandue dans le monde pour les applications industrielles. Je pense qu'il y a une certaine demande d'images en mouvement, mais n'est-elle pas très développée?

Bien sûr, si vous ne vous souciez pas de la détection d'anomalies vidéo et de la «reconstruction», il y a diverses choses d'il y a longtemps. (Classification utilisant SVM basée sur des fonctionnalités ST-Patch à l'ancienne, etc.)

Cependant, c'est un monde où le Deep Learning est devenu si populaire. Vous pouvez également reconstruire la vidéo! Cette fois, nous allons implémenter un modèle de reconstruction vidéo en combinant le modèle de séries temporelles GRU et le modèle encodeur-décodeur. ** Tout le code est disponible sur ici. ** **

Modèle de reconstruction vidéo

Le modèle à mettre en œuvre cette fois est illustré ci-dessous.

図4.png

$ \ boldsymbol {x_1, x_2, ..., x_T} $ signifie une vidéo d'une longueur de T, et $ \ boldsymbol {x_t} $ est chaque image. L'encodeur reçoit l'image de chaque image et la mappe sur $ \ boldsymbol {z} $. En répétant ces T fois, la variable latente de longueur de série correspondant à la vidéo d'entrée, $ \ boldsymbol {Z_1, Z_2, ..., Z_T} $ est obtenue. Cette variable latente est modélisée à l'aide de GRU. La sortie à chaque t correspond à $ \ boldsymbol {\ hat {z_t}} $. Le reste est la procédure d'utilisation de cela pour cartographier l'espace d'observation avec le décodeur.

Je ne suis pas sûr que le modèle ci-dessus puisse garantir une exactitude mathématique stricte car je ne suis pas sûr de la plaque de fer de la tâche de reconstruction d'image en mouvement, mais je ne suis pas sûr si elle est particulièrement excellente ou non. Peut être reconstruit. ** **

Voici un supplément de point, mais pourquoi ne pas encoder l'image en mouvement en un point dans l'espace latent. Dans un modèle codeur-décodeur normal, l'image d'entrée est codée avec une seule variable latente. Je pensais que je suivrais cela lors de l'expansion vers une image en mouvement, mais en menant une enquête sur les articles basés sur le GAN dans mes recherches, ** c'est trop pour correspondre à un point dans l'espace latent * J'ai trouvé qu'il y avait une discussion sur *.

Je suis d'accord avec cela, en règle générale dans le passé. Auparavant, j'ai essayé de reconstruire une image en mouvement à l'aide de Keras, mais la méthode ci-dessus n'a pas produit les résultats souhaités.

Par conséquent, cette fois, profitant de cette réflexion, j'ai pensé à traiter les variables latentes de la série, et suis venu définir le modèle ci-dessus.

Apprentissage / vérification du modèle

** Le flux de reconstruction est le suivant. ** **

  1. Préparez un ensemble de données sur l'action humaine
  2. Apprenez avec GRU-AE
  3. Reconstruisez la vidéo en utilisant le modèle entraîné

1.human action dataset Ces données ont été utilisées pour la vérification dans un modèle de génération vidéo appelé MocoGAN, et comme son nom l'indique (je ne connais pas la première apparition), elles montrent des gens marchant et agitant. C'est devenu une chose.

epoch_real_60.png epoch_real_30.png

Vous pouvez le télécharger depuis ici. (L'image ci-dessus est également tirée des données de ce lien.)

2. Apprendre avec GRU-AE

Ensuite, nous entraînerons le modèle en utilisant les données ci-dessus. La fonction de perte est MSE, ce qui minimise naturellement l'erreur entre l'entrée et la sortie. Pour plus de détails sur le modèle, consultez le code d'implémentation (implémenté par PyTorch) de ici.

L'apprentissage a atteint 10 000 itr et la perte a changé comme suit. Il est devenu presque 0 en seconde période, et je ne vois pas beaucoup de changement, mais j'ai l'impression qu'il a convergé en toute sécurité.

ダウンロード.png

3. Reconstruction de la vidéo par modèle

Faites des inférences à l'aide du modèle. Dans l'implémentation ci-dessus, le résultat de la reconstruction est enregistré dans generated_videos dans le dossier logs pour chaque point de contrôle spécifié par l'argument. Comme nous l'avons appris, nous avons montré le comportement suivant. La ligne supérieure de chaque itr est l'entrée et la ligne inférieure est la sortie.

--0 ses yeux Bien sûr, il ne peut pas du tout être reconstruit. real_itr0_no0.png recon_itr0_no0.png

--1 000 itrth Bien qu'il soit flou, il a une forme humaine. real_itr1000_no0.png recon_itr1000_no0.png

--5000 yeux Lorsqu'il atteint 5000 fois, le mouvement est bien reproduit. real_itr5000_no0.png recon_itr5000_no0.png

―― 9000 yeux L'échantillon est subtil, mais l'impression est qu'il est devenu possible de le reconstruire sous une forme presque parfaite. real_itr9000_no0.png recon_itr9000_no0.png

Résumé

Cette fois, j'ai essayé de reconstruire une image en mouvement en utilisant GRU-AE. C'est un modèle simple, mais le fait est qu'il gère les variables latentes dans l'ordre chronologique. En utilisant cette méthode, nous pouvons nous attendre à une extension de la détection des anomalies. Mais pour être honnête, que faites-vous ces jours-ci en tant que nouveauté par rapport au GAN? C'est l'endroit. De plus, il est indéniable qu'il est honnêtement inférieur (certaines parties sont floues) par rapport aux images reconstruites à partir du GAN. (Auparavant, mon article a également introduit VAEGAN) Cependant, c'est une méthode simple et facile à utiliser, donc j'apprécierais que vous puissiez l'essayer.

Recommended Posts

Vérification et mise en œuvre de la méthode de reconstruction vidéo en utilisant GRU et Autoencoder
Mise en œuvre et expérience de la méthode de clustering convexe
Reconstruction d'images animées par Autoencoder en utilisant 3D-CNN
Implémentation de la condition de jugement d'authenticité d'objet à l'aide de la méthode __bool__
[Deep Learning from scratch] Implémentation de la méthode Momentum et de la méthode AdaGrad
Implémentation de TF-IDF à l'aide de gensim
Examen de la méthode de prévision des échanges utilisant le Deep Learning et la conversion en ondelettes - Partie 2
Explication et mise en œuvre de SocialFoceModel
Implémentation de la méthode ML-EM, algorithme de reconstruction en coupe pour scanner
Explication mathématique de la recherche de dichotomie et de trisection et méthode de mise en œuvre sans bogues
Alignement d'images numérisées de papier vidéo animé à l'aide d'OpenCV et de Python
[Python] Implémentation de la méthode Nelder – Mead et sauvegarde des images GIF par matplotlib
Implémentation de l'action de sélecteur Datetime à l'aide de line-bot-sdk-python et exemple d'implémentation du carrousel d'images
[Recommandation] Résumé des avantages et des inconvénients de la méthode de filtrage / mise en œuvre basée sur le contenu et coopérative
Introduction et mise en œuvre de JoCoR-Loss (CVPR2020)
Explication et implémentation de l'algorithme ESIM
Introduction et mise en œuvre de la fonction d'activation
Explication et mise en œuvre du perceptron simple
Implémentation des notifications de bureau à l'aide de Python
Examen de la méthode de prévision des échanges utilisant le Deep Learning et la conversion en ondelettes
Exemple d'utilisation de variables de classe et de méthodes de classe
Implémentation d'un système de dialogue utilisant Chainer [seq2seq]
Implémentation et description à l'aide de XGBoost pour les débutants
Explication et implémentation de l'algorithme Decomposable Attention
Implémentation de réseaux neuronaux "flous" avec Chainer