Este repositorio contiene modelos capacitados reportados en el documento "Quo Vadis, Reconocimiento de acción? Un nuevo modelo y el conjunto de datos de cinética" de Joao Carreira y Andrew Zisserman. El documento fue publicado en ARXIV en mayo de 2017, y se publicará como un documento de conferencia CVPR 2017.
"Quo Vadis" introdujo una nueva arquitectura para la clasificación de video, el 3D Convnet inflado o I3D. Aquí lanzamos modelos Inception-V1 I3D entrenados en la división de entrenamiento del conjunto de datos de cinética.
En nuestro artículo, informamos resultados de vanguardia en los conjuntos de datos UCF101 y HMDB51 de ajustar estos modelos. Los modelos I3D previamente entrenados en cinética también se colocaron primero en el desafío CVPR 2017 Charades.
El repositorio ahora también incluye un punto de control previamente capacitado que usa entradas RGB y entrenado desde cero en Kinetics-600.
Nuevo : El preprocesamiento de video que utilizamos ahora ha sido de código abierto por Google. Para configurarlo, verifique estas instrucciones en el repositorio de MediaPipe de Google.
Descargo de responsabilidad: este no es un producto oficial de Google.
Primero siga las instrucciones para instalar soneto.
Luego, clone este repositorio usando
$ git clone https://github.com/deepmind/kinetics-i3d
Ejecute el código de ejemplo usando
$ python evaluate_sample.py
Con las banderas predeterminadas, esto construye el modelo I3D de dos transmisiones, carga los puntos de control I3D previamente entrenados en la sesión TensorFlow y luego pasa un video de ejemplo a través del modelo. El video de ejemplo ha sido preprocesado, con RGB y matrices de flujo Numpy proporcionadas (ver más detalles a continuación).
El script produce la norma del tensor de logits, así como las 20 clases de cinética principales predichas por el modelo con sus valores de probabilidad y logit. Usando los indicadores predeterminados, la salida debe parecerse a la siguiente hasta las diferencias en la precisión numérica:
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
El archivo de prueba se puede ejecutar usando
$ python i3d_test.py
Esto verifica que el modelo se puede construir correctamente y produce formas correctas.
El modelo predeterminado se ha entrenado previamente en ImageNet y luego en cinética; Otras banderas permiten cargar un modelo previamente entrenado en cinética y seleccionar solo el RGB o la corriente de flujo. El script multi_evaluate.sh
muestra cómo ejecutar todas estas combinaciones, generando la salida de muestra en el directorio out/
directorio.
Los data/checkpoints
del directorio contienen los cuatro puntos de control que fueron entrenados. Los que solo entrenan en cinética se inicializan utilizando los inicializadores predeterminados de sonnet / tensorflow, mientras que los pre-entrenados en Imagenet se inicializan al arrancar los filtros de un modelo de Inception-V1 2D en 3D, como se describe en el documento. Es importante destacar que las corrientes RGB y de flujo se entrenan por separado, cada una con una pérdida de clasificación Softmax. Durante el tiempo de prueba, combinamos las dos transmisiones agregando los logits con la misma ponderación, como se muestra en el código evalute_sample.py
.
Entrenamos usando SGD sincrónico usando tf.train.SyncReplicasOptimizer
. Para cada una de las corrientes RGB y de flujo, nos agregamos 64 réplicas con 4 réplicas de respaldo. Durante el entrenamiento, usamos 0.5 que abandonamos y aplicamos BatchNorm, con un tamaño de minibatch de 6. El optimizador utilizado es SGD con un valor de impulso de 0.9, y usamos una descomposición de peso 1E-7. Los modelos RGB y de flujo están capacitados para 115k y 155k pasos respectivamente, con los siguientes horarios de tasa de aprendizaje.
RGB:
Fluir:
Esto se debe a que se determinó que los modelos de flujo requerirán más entrenamiento después de una ejecución inicial de 115k pasos.
Los modelos se entrenan utilizando la división de entrenamiento de la cinética. En el conjunto de pruebas de cinética, obtenemos la siguiente precisión de Top-1 / Top-5:
Modelo | Imagenet + cinética | Cinética |
---|---|---|
RGB-I3D | 71.1 / 89.3 | 68.4 / 88.0 |
Flujo-i3d | 63.4 / 84.9 | 61.5 / 83.4 |
Dos transmisión i3d | 74.2 / 91.3 | 71.6 / 90.0 |
El lanzamiento del conjunto de datos de DeepMind Kinetics solo incluyó las ID de YouTube y los tiempos de inicio y finalización de los clips. Para los datos de muestra aquí, usamos un video del conjunto de datos UCF101, para el cual todos los videos se proporcionan en su totalidad. El video utilizado es v_CricketShot_g04_c01.mp4
que se puede descargar desde el sitio web UCF101.
Nuestro preprocesamiento utiliza bibliotecas internas, que ahora han sido de código abierto, consulte el repositorio de MediaPipe de Google. Hace lo siguiente: para ambas transmisiones, muestreamos marcos a 25 cuadros por segundo. Para la cinética, también recortamos los videos en los horarios de inicio y finalización proporcionados.
Para RGB, los videos se redimensionan la relación de aspecto preservador para que la dimensión más pequeña sea de 256 píxeles, con interpolación bilineal. Los valores de píxeles se vuelven a reescalizar entre -1 y 1. Durante el entrenamiento, seleccionamos aleatoriamente un cultivo de imagen 224x224, mientras que durante la prueba, seleccionamos el cultivo de imagen Center 224x224 del video. El archivo .npy
proporcionado tiene forma (1, num_frames, 224, 224, 3)
para RGB, correspondiente a un tamaño por lotes de 1.
Para la transmisión de flujo, después de probar los videos a 25 cuadros por segundo, convertimos los videos a escala de grises. Aplicamos un algoritmo de flujo óptico TV-L1, similar a este código de OpenCV. Los valores de píxeles se truncan al rango [-20, 20], luego se vuelven a ver entre -1 y 1. Solo usamos las dos primeras dimensiones de salida y aplicamos el mismo cultivo que para RGB. El archivo .npy
proporcionado tiene forma (1, num_frames, 224, 224, 2)
para el flujo, correspondiente a un tamaño por lotes de 1.
Aquí hay GIF que muestran los archivos .npy
proporcionados. A partir de los datos de RGB, agregamos 1 y luego dividimos por 2 para rescalar entre 0 y 1. Para los datos de flujo, agregamos un tercer canal de todo 0, luego agregamos 0.5 a la matriz completa, por lo que los resultados también están entre 0 y 1.
Para obtener detalles adicionales sobre el preprocesamiento, consulte esto, consulte nuestro documento o comuníquese con los autores.
Brian Zhang, Joao Carreira, Viorica Patraucean, Diego de Las Casas, Chloe Hillier y Andrew Zisserman ayudaron a preparar este lanzamiento inicial. También nos gustaría agradecer a los equipos detrás del conjunto de datos de cinética y el documento de inicio original sobre el cual se basa esta arquitectura y código.
Para contribuir a este repositorio, primero deberá firmar el Acuerdo de Licencia de Contributor de Google (CLA), proporcionado en el archivo Contributing.MD. Luego podremos aceptar cualquier solicitud de extracción, aunque actualmente no apuntan a expandirse a otros modelos capacitados.
Para cualquier pregunta, puede comunicarse con los autores del documento "Quo Vadis", cuyos correos electrónicos se enumeran en el documento.