Ce référentiel contient des modèles formés signalés dans le document "Quo Vadis, la reconnaissance d'action? Un nouveau modèle et l'ensemble de données de cinétique" de Joao Carreira et Andrew Zisserman. Le document a été publié sur ArXIV en mai 2017 et sera publié en tant que document de conférence CVPR 2017.
"Quo Vadis" a introduit une nouvelle architecture pour la classification vidéo, le Convnet 3D gonflé ou i3d. Ici, nous publions des modèles I3D Inception-V1 formés sur la division de formation de l'ensemble de données cinétique.
Dans notre article, nous avons rapporté des résultats de pointe sur les ensembles de données UCF101 et HMDB51 à partir de ces modèles affinés. Les modèles I3D pré-formés sur la cinétique ont également été placés en premier au CVPR 2017 Charades Challenge.
Le référentiel comprend également un point de contrôle pré-formé à l'aide des entrées RVB et formé à partir de zéro sur Kinetics-600.
Nouveau : le prétraitement vidéo que nous avons utilisé a maintenant été open source par Google. Pour le configurer, vérifiez ces instructions dans le dépôt Medioppe de Google.
Avertissement: ce n'est pas un produit Google officiel.
Suivez d'abord les instructions pour installer Sonnet.
Ensuite, clonez ce référentiel en utilisant
$ git clone https://github.com/deepmind/kinetics-i3d
Exécutez l'exemple de code en utilisant
$ python evaluate_sample.py
Avec les drapeaux par défaut, cela construit le modèle i3D à deux voies, charge les points de contrôle I3D pré-formés dans la session TensorFlow, puis transmet un exemple de vidéo via le modèle. L'exemple de vidéo a été prétraité, avec des tableaux RVB et Flow Numpy fournis (voir plus de détails ci-dessous).
Le script produit la norme du tenseur des logits, ainsi que les 20 premières classes de cinétique prédites par le modèle avec leurs valeurs de probabilité et de logit. En utilisant les drapeaux par défaut, la sortie doit ressembler à ce qui suit aux différences de précision numérique:
Norm of logits: 138.468643
Top classes and probabilities
1.0 41.8137 playing cricket
1.49716e-09 21.494 hurling (sport)
3.84312e-10 20.1341 catching or throwing baseball
1.54923e-10 19.2256 catching or throwing softball
1.13602e-10 18.9154 hitting baseball
8.80112e-11 18.6601 playing tennis
2.44157e-11 17.3779 playing kickball
1.15319e-11 16.6278 playing squash or racquetball
6.13194e-12 15.9962 shooting goal (soccer)
4.39177e-12 15.6624 hammer throw
2.21341e-12 14.9772 golf putting
1.63072e-12 14.6717 throwing discus
1.54564e-12 14.6181 javelin throw
7.66915e-13 13.9173 pumping fist
5.19298e-13 13.5274 shot put
4.26817e-13 13.3313 celebrating
2.72057e-13 12.8809 applauding
1.8357e-13 12.4875 throwing ball
1.61348e-13 12.3585 dodgeball
1.13884e-13 12.0101 tap dancing
Le fichier de test peut être exécuté en utilisant
$ python i3d_test.py
Cela vérifie que le modèle peut être construit correctement et produit des formes correctes.
Le modèle par défaut a été formé sur ImageNet puis cinétique; D'autres drapeaux permettent de charger un modèle pré-formé uniquement sur la cinétique et de sélectionner uniquement le flux RVB ou le flux. Le script multi_evaluate.sh
montre comment exécuter toutes ces combinaisons, générant l'exemple de sortie dans le répertoire out/
.
Les data/checkpoints
du répertoire contient les quatre points de contrôle formés. Ceux qui sont juste entraînés sur la cinétique sont initialisés en utilisant les initialiseurs par défaut SONNET / TENSORFLOW, tandis que ceux pré-formés sur ImageNet sont initialisés en bootstrapant les filtres à partir d'un modèle 2D Inception-V1 en 3D, comme décrit dans l'article. Surtout, les flux RVB et d'écoulement sont entraînés séparément, chacun avec une perte de classification SoftMax. Pendant le temps de test, nous combinons les deux flux en ajoutant les logits avec une pondération égale, comme indiqué dans le code evalute_sample.py
.
Nous nous entraînons à l'aide de SGD synchrone à l'aide de tf.train.SyncReplicasOptimizer
. Pour chacun des flux RVB et de flux, nous agrégeons 64 répliques avec 4 répliques de sauvegarde. Pendant l'entraînement, nous utilisons 0,5 abandon et appliquons Batchnorm, avec une taille de minibatch de 6. L'optimiseur utilisé est SGD avec une valeur de moment de 0,9, et nous utilisons la désintégration du poids 1E-7. Les modèles RVB et d'écoulement sont formés pour les étapes de 115k et 155k respectivement, avec les calendriers de taux d'apprentissage suivants.
RVB:
Couler:
En effet
Les modèles sont formés à l'aide de la division de la cinétique. Sur l'ensemble de tests de cinétique, nous obtenons la précision supérieure-1 / top 5 suivante:
Modèle | Imagenet + cinétique | Cinétique |
---|---|---|
RGB-I3D | 71.1 / 89.3 | 68.4 / 88.0 |
Flow-I3d | 63.4 / 84.9 | 61,5 / 83.4 |
I3d à deux stream | 74.2 / 91.3 | 71.6 / 90.0 |
La publication de l'ensemble de données DeepMind Kinetics n'a inclus que les ID YouTube et les heures de début et de fin des clips. Pour les exemples de données ici, nous utilisons une vidéo à partir de l'ensemble de données UCF101, pour lequel toutes les vidéos sont fournies en entier. La vidéo utilisée est v_CricketShot_g04_c01.mp4
qui peut être téléchargée à partir du site Web UCF101.
Notre prétraitement utilise des bibliothèques internes, qui ont maintenant été open source, vérifiez le dépôt de médiat de Google. Il fait ce qui suit: pour les deux flux, nous échantillons des trames à 25 images par seconde. Pour la cinétique, nous coupons en outre les vidéos au début et à la fin des heures fournies.
Pour RVB, les vidéos sont redimensionnées en préservant le rapport d'aspect de sorte que la plus petite dimension est de 256 pixels, avec une interpolation bilinéaire. Les valeurs de pixels sont ensuite redimensionnées entre -1 et 1. Pendant l'entraînement, nous sélectionnons au hasard un recadrage d'image 224x224, tandis que pendant le test, nous sélectionnons le recadrage d'image Center 224x224 dans la vidéo. Le fichier .npy
fourni a donc une forme (1, num_frames, 224, 224, 3)
pour RVB, correspondant à une taille de lot de 1.
Pour le flux de flux, après avoir échantillonné les vidéos à 25 images par seconde, nous convertissons les vidéos en niveaux de gris. Nous appliquons un algorithme de flux optique TV-L1, similaire à ce code d'OpenCV. Les valeurs de pixels sont tronquées à la plage [-20, 20], puis redimensionnées entre -1 et 1. Nous n'utilisons que les deux premières dimensions de sortie et appliquons la même culture que pour RVB. Le fichier .npy
fourni a donc une forme (1, num_frames, 224, 224, 2)
pour le flux, correspondant à une taille de lot de 1.
Voici des GIF montrant les fichiers .npy
fournis. À partir des données RVB, nous avons ajouté 1 puis divisé par 2 pour sauver entre 0 et 1. Pour les données de flux, nous avons ajouté un troisième canal de tous les 0, puis ajouté 0,5 à l'ensemble du tableau, de sorte que les résultats se situent également entre 0 et 1 et 1
Pour plus de détails sur le prétraitement, vérifiez ceci, reportez-vous à notre article ou contactez les auteurs.
Brian Zhang, Joao Carreira, Viorica Patraucean, Diego de Las Casas, Chloe Hillier et Andrew Zisserman ont aidé à préparer cette version initiale. Nous tenons également à remercier les équipes derrière l'ensemble de données de cinétique et le document de création original sur lequel cette architecture et cette code sont basés.
Pour contribuer à ce référentiel, vous devrez d'abord signer le Contrat de licence des contributeurs Google (CLA), prévu dans le fichier contributing.md. Nous pourrons alors accepter toutes les demandes de traction, mais ne visons pas actuellement à s'étendre à d'autres modèles qualifiés.
Pour toutes les questions, vous pouvez contacter les auteurs du document "Quo Vadis", dont les e-mails sont répertoriés dans le document.