
Análise de Vídeo para Detecção de Atividade Suspeita com Base em Deep Learning
Este artigo explica uma possível implementação da classificação de vídeo. Nosso objetivo é explicar como o fizemos e os resultados obtidos para que você possa aprender com isso.
Ao longo dessa publicação, você encontrará uma descrição geral da arquitetura da solução, da metodologia que seguimos, do conjunto de dados usados, da implementação e dos resultados alcançados.
Sinta-se à vontade para usar essa publicação como ponto de partida para desenvolver seu próprio classificador de vídeo.
O sistema descrito classifica um vídeo em três classes:
1. Atividade criminosa ou violenta
2. Potencialmente suspeita
3. Segura
Nossa proposta para resolver este problema é uma arquitetura baseada em redes neurais convolucionais e recorrentes.
Descrição da Arquitetura da Solução
A primeira rede neural é uma rede convolucional cujo objetivo é extrair características de alto nível das imagens e reduzir a complexidade da entrada. Usaremos um modelo pré-treinado denominado inception, desenvolvido pelo Google. O Inception-v3 é treinado no conjunto de dados ImageNet Large Visual Recognition Challenge. Essa é uma tarefa padrão de visão computacional, na qual os modelos tentam classificar imagens inteiras em mil classes como “zebra”, “dálmata” e “lava-louças”.
Usamos esse modelo para aplicar a técnica de aprendizagem de transferência. Os modelos modernos de reconhecimento de objetos possuem milhões de parâmetros e podem exigir semanas de treinamento. A aprendizagem de transferência é uma técnica que otimiza grande parte deste trabalho, tomando um modelo totalmente treinado para um conjunto de categorias como o ImageNet e retreinando os pesos existentes para novas classes.

A segunda rede neural utilizada foi uma rede neural recorrente. O objetivo dessa rede é dar sentido à sequência das ações retratadas. Esta rede possui uma célula LSTM na primeira camada, seguida por duas camadas ocultas (uma com 1.024 neurônios e ativação ReLu e outra com 50 neurônios com ativação Sigmoid) e a camada de saída é uma camada de três neurônios com ativação Softmax, o que nos dá a classificação final.

Metodologia
O primeiro passo é extrair os quadros (frames) do vídeo. Extraímos um quadro a cada 0,2 segundos e, por meio dele, fazemos uma previsão usando o modelo de inception. Uma vez que estamos usando a técnica de aprendizagem de transferência, não vamos extrair a classificação final do modelo de inception. Ao invés disso, extrairemos o resultado da última camada de agrupamento: um vetor de 2.048 valores (mapa de características de alto nível). Até agora, tínhamos um mapa de características de um único quadro. No entanto, queremos fornecer a noção de sequência ao nosso sistema. Para tanto, não consideraremos os quadros únicos para nossa previsão final. Pegamos um grupo de quadros para classificar um segmento do vídeo ao invés do quadro.
Consideramos que a análise de três segundos de vídeo por vez é suficiente para uma boa previsão da atividade que está acontecendo naquele momento. Para tanto, armazenamos quinze mapas de características gerados pela previsão do modelo de inception: o equivalente a três segundos de vídeo. Assim, concatenamos este grupo de mapas de características em um único padrão, sendo a entrada de nossa segunda rede neural, a recorrente, para obter a classificação final de nosso sistema.

Conjunto de Dados de Treinamento
O conjunto de dados (dataset) usado para o treinamento da rede é composto por 150 minutos de triagem divididos em 38 vídeos. A maioria desses vídeos é gravada em câmeras de segurança de lojas e depósitos. O resultado da obtenção de um quadro, com 0,2 segundo de duração, é ter um conjunto de dados de 45.000 quadros para treinamento — o equivalente a 3.000 segmentos de vídeo, considerando que um segmento de vídeo representa três segundos (ou 15 quadros).
Todo o conjunto de dados foi intitulado por nós e dividido em grupos: 80% para treinamento e 20% para testes.
Observe que o conjunto de dados final é realmente muito pequeno. No entanto, devido à técnica de aprendizagem de transferência, podemos obter bons resultados com menos dados. Sendo assim, quanto mais dados, maior a precisão do sistema; por isso, continuamos trabalhando para obter cada vez mais dados para melhorar nosso sistema.

Implementação
Todo o sistema foi implementado com o Python 3.5.
Usamos o OpenCV para Python para segmentar o vídeo em quadros e redimensioná-los para 200x200px. Uma vez que todos os quadros foram obtidos, fazemos uma previsão no modelo de inception usando cada um deles. O resultado de cada predição é um “valor de transferência”, representando o mapa de características de alto nível extraído daquele quadro específico. Salvamos esse resultado na variável transfer_values e seus respectivos títulos na variável label_train.
Ao obtermos tais variáveis, precisaremos dividi-las em grupos de 15 quadros. O resultado é, então, salvo na variável joint_transfer.

Agora que temos os valores de transferência e seus títulos, podemos usar esses dados para treinar nossa rede neural recorrente. A implementação desta rede está em Keras e o código para criação do modelo é o seguinte:

O código acima descreve a construção do modelo. O próximo passo é treiná-lo:

Após treinarmos o modelo, precisamos salvá-lo da seguinte maneira:

Resultados e Outras Aplicações Possíveis
Após experimentarmos diferentes arquiteturas de rede e hiperparâmetros de ajuste, o melhor resultado que conseguimos alcançar foi 98% de precisão.
Projetamos o seguinte front-end, em que é possível enviar um vídeo e começar a classificá-lo em tempo real. É possível observar como as classes estão em constante mudança, bem como a respectiva precisão para essa classe. Esses valores são atualizados constante

Uma das possibilidades desse classificador de vídeo é conectá-lo a uma câmera de segurança e continuar analisando o vídeo em tempo real e, no momento em que o sistema detecta atividades criminosas ou suspeitas, é possível ativar um alarme ou alertar a polícia.
Além disso, você pode usar um sistema similar treinado com os dados apropriados para detectar diferentes tipos de atividades; por exemplo, com uma câmera instalada em uma escola com o objetivo de detectar bullying.
Referências
· Tutorial de Reconhecimento de Imagem do TensorFlow