Este repositório contém modelos treinados relatados no artigo "Quo vadis, reconhecimento de ação? Um novo modelo e o conjunto de dados da Kinetics", de João Carreira e Andrew Zisserman. O artigo foi publicado no ARXIV em maio de 2017 e será publicado como um artigo da CVPR 2017.
"Quo Vadis" introduziu uma nova arquitetura para classificação de vídeo, o 3D ConvNet inflado ou i3d. Aqui, lançamos os modelos INCCECTION-V1 I3D treinados na divisão de treinamento de dados da Cinetics.
Em nosso artigo, relatamos resultados de ponta nos conjuntos de dados UCF101 e HMDB51 de ajustar esses modelos. Os modelos i3d pré-treinados em cinética também foram colocados em primeiro lugar no Charades Challenge 2017 CVPR 2017.
O repositório também inclui agora um ponto de verificação pré-treinado usando entradas RGB e treinado do zero no Kinetics-600.
NOVO : O pré-processamento de vídeo que usamos agora foi de origem aberta pelo Google. Para configurá -lo, verifique estas instruções no repositório de mídia do Google.
Isenção de responsabilidade: este não é um produto oficial do Google.
Primeiro, siga as instruções para instalar o Sonnet.
Em seguida, clone este repositório usando
$ git clone https://github.com/deepmind/kinetics-i3d
Execute o código de exemplo usando
$ python evaluate_sample.py
Com sinalizadores padrão, isso constrói o modelo i3D de dois fluxos, carrega os pontos de verificação i3D pré-treinados na sessão de tensorflow e depois passa um exemplo de vídeo através do modelo. O vídeo de exemplo foi pré -processado, com RGB e Flow Numpy matrizes fornecidas (veja mais detalhes abaixo).
O script gera a norma do tensor de logits, bem como as 20 principais classes de cinética previstas pelo modelo com seus valores de probabilidade e logit. Usando os sinalizadores padrão, a saída deve se parecer com o seguinte até as diferenças na precisão 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
O arquivo de teste pode ser executado usando
$ python i3d_test.py
Isso verifica se o modelo pode ser construído corretamente e produz formas corretas.
O modelo padrão foi pré-treinado na imagenet e depois na cinética; Outros sinalizadores permitem carregar um modelo pré-treinado apenas na cinética e para selecionar apenas o RGB ou o fluxo de fluxo. O script multi_evaluate.sh
mostra como executar todas essas combinações, gerando a saída de amostra no diretório out/
.
Os data/checkpoints
do diretório contêm os quatro pontos de verificação que foram treinados. Os treinados na cinética são inicializados usando os iniciantes padrão do Sonnet / Tensorflow, enquanto os pré-treinados no ImageNet são inicializados com o bootstrapping dos filtros de um modelo 2D INCPECTION-V1 para 3D, conforme descrito no papel. É importante ressaltar que os fluxos de RGB e fluxo são treinados separadamente, cada um com uma perda de classificação Softmax. Durante o tempo de teste, combinamos os dois fluxos adicionando os logits com ponderação igual, como mostrado no código evalute_sample.py
.
Treinamos usando o SGD síncrono usando tf.train.SyncReplicasOptimizer
. Para cada um dos fluxos de RGB e fluxo, agregamos 64 réplicas com 4 réplicas de backup. Durante o treinamento, usamos 0,5 abandono e aplicamos em BatchNorm, com um tamanho de minibatch de 6. O otimizador usado é SGD com um valor de momento de 0,9, e usamos 1E-7 de decaimento de peso. Os modelos de RGB e fluxo são treinados para etapas de 115k e 155k, respectivamente, com os seguintes cronogramas de taxa de aprendizado.
RGB:
Fluxo:
Isso ocorre porque os modelos de fluxo estavam determinados a exigir mais treinamento após uma execução inicial de 115 mil etapas.
Os modelos são treinados usando a divisão de treinamento da cinética. No conjunto de testes de cinética, obtemos a seguinte precisão Top-1 /5 Top-5:
Modelo | Imagenet + cinética | Cinética |
---|---|---|
RGB-I3D | 71.1 / 89.3 | 68.4 / 88.0 |
Flow-I3d | 63.4 / 84.9 | 61.5 / 83.4 |
I3D de dois fluxos | 74.2 / 91.3 | 71.6 / 90.0 |
A liberação do conjunto de dados da DeepMind Kinetics incluiu apenas os IDs do YouTube e os horários de início e término dos clipes. Para os dados de amostra aqui, usamos um vídeo do conjunto de dados UCF101, para o qual todos os vídeos são fornecidos integralmente. O vídeo usado é v_CricketShot_g04_c01.mp4
, que pode ser baixado no site UCF101.
Nosso pré-processamento usa bibliotecas internas, que agora foram o repositório de mídia do Google. Faz o seguinte: Para ambos os fluxos, amostrarmos quadros a 25 quadros por segundo. Para a cinética, também prendemos os vídeos no tempo de início e término fornecido.
Para o RGB, os vídeos são redimensionados, preservando a proporção de aspecto, para que a menor dimensão seja de 256 pixels, com interpolação bilinear. Os valores de pixels são então redimensionados entre -1 e 1. Durante o treinamento, selecionamos aleatoriamente uma colheita de imagem de 224x224, enquanto durante o teste, selecionamos o Centro 224x224 Crop imagens do vídeo. O arquivo .npy
fornecido, portanto, possui forma (1, num_frames, 224, 224, 3)
para RGB, correspondendo a um tamanho em lote de 1.
Para o fluxo de fluxo, depois de provar os vídeos a 25 quadros por segundo, convertemos os vídeos em escala de cinza. Aplicamos um algoritmo de fluxo óptico de TV-L1, semelhante a este código do OpenCV. Os valores de pixel são truncados para o intervalo [-20, 20], depois redimensionados entre -1 e 1. Usamos apenas as duas primeiras dimensões de saída e aplicamos o mesmo corte que para RGB. O arquivo .npy
fornecido, portanto, possui forma (1, num_frames, 224, 224, 2)
para fluxo, correspondendo a um tamanho de lote de 1.
Aqui estão os GIFs mostrando os arquivos .npy
fornecidos. A partir dos dados RGB, adicionamos 1 e depois dividimos por 2 para redimensionar entre 0 e 1. Para os dados de fluxo, adicionamos um terceiro canal de todos 0 e depois adicionamos 0,5 a toda a matriz, de modo que os resultados também estão entre 0 e 1.
Para obter detalhes adicionais sobre o pré -processamento, consulte isso, consulte nosso artigo ou entre em contato com os autores.
Brian Zhang, João Carreira, Viorica Patraucean, Diego de Las Casas, Chloe Hillier e Andrew Zisserman ajudaram a preparar esse lançamento inicial. Também gostaríamos de agradecer às equipes por trás do conjunto de dados da Kinetics e ao artigo de início original no qual essa arquitetura e código se baseiam.
Para contribuir com este repositório, você precisará primeiro assinar o Contrato de Licença de Colaborador do Google (CLA), fornecido no arquivo contribuinte.md. Em seguida, poderemos aceitar quaisquer solicitações de tração, embora atualmente não pretendem expandir para outros modelos treinados.
Para qualquer dúvida, você pode entrar em contato com os autores do artigo "quo vadis", cujos e -mails estão listados no artigo.