(La figure ci-dessus est tirée du site de la source de recherche et développement)
PredNet? https://coxlab.github.io/prednet/ Bill Lotter, Gabriel Kreiman, and David Cox (2016)
Un modèle d'apprentissage en profondeur qui prédit les futures images de la vidéo. Il existe différentes démos dans CoxLab (lien ci-dessus), qui est la source de recherche et développement, donc si vous regardez, vous obtiendrez une image.
C'est une histoire qui s'est enthousiasmée vers le milieu de 2016, donc il peut y avoir des sentiments maintenant, mais Je vais résumer ce que j'ai appris en apprenant réellement. (Plutôt que d'expliquer les algorithmes et les concepts, nous parlerons principalement de l'apprentissage et de l'environnement.)
Le code étant accessible au public (https://github.com/coxlab/prednet), il est possible de former le modèle sans lire l'article.
Afin d'exécuter le code d'origine tel quel, il est nécessaire de préparer l'environnement de Python2 + Keras1. Veuillez noter que la dernière version est Python3 + Keras2, donc c'est un peu vieux. J'ai essayé de le porter sur Keras2, mais l'apprentissage a échoué, alors j'ai décidé de le faire avec Keras1. Je ne l'ai pas fait, mais je pense qu'il est possible de le porter sur Python3.
La principale référence dans l'article est Image de la caméra embarquée par KITTI [^ 1].
Il y a process_kitti.py
dans le script qui a étégit clone
, donc si vous l'exécutez,
--Téléchargement des données
Le fera automatiquement. Mais c'est ** très ** lent. Dans l'environnement que j'ai utilisé, il m'a fallu trois jours complets pour télécharger les données. Il peut ou non être proche de 100 Go au total, mais je pense toujours qu'il est trop tard.
Une fois que les données sont prêtes, exécutez kitti_train.py
pour commencer à apprendre.
Ici aussi, il y a quelques mises en garde.
C'est difficile à dire car cela dépend de l'environnement, mais dans l'environnement que j'ai utilisé (GeForce GTX TITAN 6082MiB), cela prenait environ 5 minutes par époque. Le réglage par défaut est de former 150 époques, donc cela prend un peu plus de 12 heures au total. Je pense que c'est un temps d'apprentissage assez raisonnable pour un modèle qui intègre LSTM.
Voici la courbe d'apprentissage: On peut dire que les paramètres sont suffisamment stables. Si rien n'est falsifié, le taux d'apprentissage sera réduit à 1/10 lorsque epoch = 75, mais à ce moment, la perte diminuera fortement. La perte d'entraînement (ligne bleue) a diminué, mais la perte de validation (ligne orange) a toujours tendance à diminuer, vous voudrez peut-être en savoir un peu plus.
Une autre chose à noter est que la perte (MAE) mesurée pendant l'apprentissage est ** mesurée différemment ** de la MAE rapportée dans l'article. Il est rapporté dans l'article que le MAE a finalement atteint 3,13e-3 (= 0,00313), mais ce MAE mesure "l'erreur de pixel entre la trame prédite et la trame réelle". Par contre, la perte rapportée par Keras lors de l'entraînement est la même au sens de MAE, mais il s'agit d'une mesure de "l'erreur entre la sortie de l'unité d'erreur E et la matrice zéro" [^ 2]. En fait, l'erreur finale du modèle entraîné cette fois (axe vertical dans le graphique ci-dessus) était de 1,780e-2 (= 0,01780) pour l'entraînement et de 2,36e-2 (= 0,0236) pour la validation. L'ordre est différent.
Lorsque le modèle a été effectivement appliqué aux données de test, le MAE dans le cadre (le même que la méthode de mesure dans l'article) était de 3,927e-3, ce qui était légèrement inférieur à la précision rapportée dans l'article, mais il semble être proche de l'exactitude rapportée dans l'article. est.
L'image résultante est montrée ci-dessous, mais je vais d'abord expliquer comment lire l'image résultante. Cette vidéo est de 10 Hz (10 ips, c'est-à-dire que 1 seconde contient 10 images), et la prédiction est de 10 images, soit 1 seconde. Même s'il s'agit d'une prédiction de 10 trames, on peut dire qu'il s'agit en fait d'une prédiction une trame d'avance car la prédiction est faite après avoir reçu la trame précédente en entrée. Si vous dessinez un diagramme de quelle image vous prédisez à partir de quelle image, il ressemble à ce qui suit. ** (Notez que la structure RNN existe dans le modèle, donc vous vous «souvenez» de l'entrée jusqu'à présent et utilisez également ces informations.) **
Il est également mentionné dans l'article (également inclus dans le code) qu'il fait vraiment des prédictions quelques images à l'avance (appelées extrapolation), auquel cas la figure suivante Sera: Les premières images réchauffent le modèle avec l'image précédente pour intégrer l'état dans le RNN. Après cela, sans passer aucune image correcte, je pense que ma sortie est correcte et commence l'extrapolation. Veuillez noter que tous les résultats de prédiction affichés ci-dessous ne sont pas extrapolés.
Les résultats de la prédiction sont les suivants (extrait):
Comme indiqué dans l'article, nous pouvons prédire correctement les lignes blanches et les ombres sur les routes. Mouvements étranges à propos de la voiture (je ne peux pas apprendre car il n'y a pas beaucoup de données à déplacer latéralement vers moi? Par exemple, dans la cinquième image, la voiture traverse devant moi et la prédiction est étrange) À moins que ce ne soit le cas, c'est tout à fait prévisible. L'action de tourner la poignée (6ème image) semble bien gérée.
[^ 1]: Institut de technologie de Karlsruhe (KIT) et Institut technologique de Toyota à Chicago (TTI-C), en collaboration avec KITTI. TOYOTA publie également l'ensemble de données vidéo de la caméra embarquée. [^ 2]: L'unité d'erreur E divise la différence entre la trame prédite et la trame réelle en "partie positive" et "partie négative" et applique ReLU, qui est les "pixels de la trame prédite et de la trame réelle". C'est différent de «erreur».
Recommended Posts