Abordagens Inovadoras para Detecção de Anomalias em Vigilância por Vídeo
Testando vários modelos pra detectar atividades estranhas em dados de vídeo.
― 12 min ler
Índice
Como eu não consegui acessar câmeras de vigilância reais durante meus estudos, todos os vídeos que usei eram apenas alguns que eu baixei. Os dados de vídeo precisam de muito poder computacional para serem processados. Infelizmente, eu não tinha um servidor de GPU chique na minha empresa ou laboratório de pesquisa, então tive que me virar com um computador normal que tinha 32 GB de RAM e um processador Intel Core i9 decente. Eu também tinha uma placa de vídeo Nvidia GeForce RTX2080, que me deu um pequeno empurrão.
Nesta parte, vamos falar sobre os testes que fiz, onde combinei dois modelos para checar como eles detectaram atividades incomuns (ou Anomalias). Vou explicar como os resultados mudaram dependendo se eu os executei em paralelo ou um após o outro. Depois, vou compartilhar os experimentos que fiz para detectar objetos e anomalias, que me ajudaram a descobrir quais modelos funcionaram melhor para cada situação. Finalmente, vou concluir com um resumo de tudo.
Pré-processamento de Dados
Aqui, vou explicar como preparei os dados para os testes.
Como mencionado anteriormente, os vídeos frequentemente mostram ações normais interrompidas por ações incomuns. Por causa disso, tive que cortar os vídeos em pedaços para focar nas atividades incomuns e analisá-las melhor. Mesmo com essa abordagem, lidar com todos esses dados de vídeo foi uma verdadeira dor de cabeça por causa de quanto havia.
Carregar todos os vídeos de uma vez estava fora de cogitação porque a memória do meu computador simplesmente não aguentava. Para lidar com esse problema, decidi usar uma ferramenta especial chamada gerador. Pense nisso como um garçom trazendo os pratos um de cada vez em vez de servir toda a refeição de uma vez.
Meu primeiro teste foi ver como diferentes geradores funcionavam. Experimentei quatro tipos diferentes:
- Um gerador que cria sequências de vídeo movendo uma janela ao longo do vídeo.
- Um gerador que também usa uma janela deslizante, mas sobrepõe as sequências.
- Um gerador que usa um passo dinâmico para coletar imagens de cada vídeo.
- Um gerador que combina a janela deslizante com o passo dinâmico.
O terceiro gerador acabou sendo a melhor opção. Por quê? Porque resolve alguns grandes problemas que os outros têm. Para os dois primeiros geradores, o tempo que os modelos demoram para aprender depende da duração dos vídeos—vídeos longos significam tempos de aprendizado mais longos. Além disso, decidir o tamanho da janela deslizante é complicado; ela precisa capturar toda a ação, ou o modelo pode não aprender corretamente.
Claro, o terceiro gerador não é perfeito também. Ele tem seu próprio problema ao lidar com vídeos de diferentes comprimentos. Por exemplo, com ações curtas, o tempo entre as imagens é curto, enquanto para vídeos mais longos, pode haver uma longa espera entre as imagens. Assim, vídeos curtos têm imagens mais detalhadas, enquanto vídeos longos podem parecer menos claros.
Esse terceiro gerador me permite criar sequências que não precisam que as imagens estejam sobrepostas, o que é legal. Ao mudar o tamanho do passo, posso decidir quão rápido quero detectar as coisas, seja por sequência ou por vídeo. Essa flexibilidade me ajuda a lidar com vídeos finitos e em andamento.
Depois de escolher meu gerador, tive que decidir sobre o tamanho das minhas imagens. Ajustei o tamanho e descobri que o melhor tamanho era... bem, digamos que funcionou perfeitamente.
Para o tamanho da sequência, testei vários comprimentos entre 15 e 30 imagens. Como meus vídeos rodam a uma certa velocidade (30 quadros por segundo), percebi que usar 20 imagens era o ideal.
Para ver como cada experimento funcionou, criei meu próprio método para definir o passo ao escolher as imagens. Assim, eu poderia testar meus modelos nas mesmas condições que durante o treinamento, fosse checando um vídeo inteiro ou trabalhando com sequências. Meu objetivo principal é ajudar as pessoas a monitorar streams contínuos, então vou me concentrar no desempenho relacionado à Detecção de sequências.
Depois de configurar minhas sequências, deixei meus dados um pouco mais vivos aplicando algumas técnicas de aprimoramento como efeitos de espelho, zooms e mudanças de brilho. Isso ajudou a multiplicar meus dados sem me desviar muito da realidade.
Em seguida, olhei para diferentes maneiras de pré-processar os dados—basicamente, como limpar e preparar as imagens. Comecei com truques padrão do mundo da visão computacional: calcular como as coisas se movem entre as imagens, comparar imagens para encontrar diferenças e aplicar máscaras.
Minhas descobertas? O método de fluxo óptico não me impressionou nem um pouco. Ele ficou em 50% de precisão durante o treinamento. O método de diferença entre imagens trouxe resultados um pouco melhores, mas também piorou quando usei uma máscara. Surpreendentemente, quando apenas usei aumento de dados, os resultados foram os melhores. Sem nenhum pré-processamento, minha precisão foi baixa, embora a retenção fosse alta. Com apenas o aumento de dados, consegui obter uma precisão decente e uma boa retenção.
Então, passei para alguns métodos de pré-processamento mais avançados usando modelos especializados para detecção de anomalias. Pensei em usar algo chamado DINO. Depois de testá-lo, percebi que levava muito tempo para processar, então não era prático para minhas necessidades em tempo real. No entanto, ele se saiu bem na detecção de tiros sem precisar de treinos extras.
Para a detecção de brigas, as coisas não foram tão bem, o que me levou a excluir os Transformers de Visão dos meus planos e focar em modelos que atendiam melhor às minhas necessidades.
Agora, vamos falar sobre o YOLO, meu favorito para detectar objetos nos meus vídeos e descobrir o que as pessoas estão fazendo. Ele fez um bom trabalho, então o adicionei à minha configuração.
Experimentos em Modo Série
Agora, é hora de ver como meus modelos se saíram quando empilhados um após o outro. Comecei quebrando meus vídeos para pegar cada frame, que depois passei pelo YOLO para detectar todos os diferentes objetos nas imagens. Depois disso, juntei o vídeo de volta e passei por outro modelo chamado CGRU para checar as anomalias.
Comparei esse método com o uso do CGRU sozinho, e os resultados foram bem reveladores. Acontece que, adicionar o YOLO não mudou muito como o modelo se comportou. Isso significa que o modelo realmente não prestou muita atenção às caixas delimitadoras durante o treinamento. Também melhorei meu pré-processamento usando as caixas delimitadoras para criar máscaras que focaram nas partes da imagem com os objetos e tiraram o máximo de fundo que consegui.
Para qualquer imagem sem detecção de objeto, tive duas escolhas: ou mantinha a imagem original ou a substituía por uma preta. Testei ambas as opções, e enquanto se saíram de maneira semelhante, vi pequenas diferenças. Usar um fundo preto parece melhorar a detecção de ações normais, mas prejudicou a precisão para brigas e incêndios. Isso pode acontecer quando detalhes importantes são perdidos durante a detecção, fazendo com que o modelo ignore informações cruciais.
Percebi rapidamente que as configurações dos parâmetros de detecção de objetos, como confiança e limites de sobreposição, eram essenciais. Eu havia definido o nível de confiança em 55 por cento para meus testes.
Agora, quando se tratava de detectar ações realizadas por pessoas, a versão 7 do YOLO se destacou ao contornar seus "esqueletos", similar ao que o OpenPose faz. Então, fiz a estimativa de pose em meus vídeos para ver como isso impactava a detecção de comportamentos. Para manter as coisas simples, concentrei-me apenas nas classes de Briga e Tiro, já que nem todas as anomalias precisavam de humanos.
Depois, testei se a estimativa de pose melhorava as coisas. Inicialmente, tirei os fundos dos vídeos para afiar a detecção, mas logo percebi que isso poderia prejudicar a detecção de outros tipos de anomalias. Então, trouxe o fundo de volta e retreinei meu modelo para ver se ainda conseguia detectar coisas como incêndios.
Em termos de desempenho geral, adicionar a classe de incêndio não mudou muito, mas os resultados mostraram uma queda na detecção de tiros, já que alguns deles foram marcados como incêndios. Isso me levou a trocar meu modelo multi-classe por uma configuração normal/anormal para ver como o YOLO influenciava as coisas. Treinei dois novos modelos—um sem fundos e outro com eles.
Independentemente do pré-processamento, combinar diferentes tipos de anomalias melhorou consistentemente o desempenho dos meus modelos. No entanto, a inclusão de anomalias não relacionadas, como incêndios, tendia a prejudicar os resultados. Também percebi que usar o YOLO para preparar meus dados aumentava a precisão.
Processamento em Modo Paralelo
Em seguida, decidi rodar meus modelos em paralelo. A ideia aqui era detectar objetos enquanto analisava o tempo, depois combinar os resultados para melhorar a precisão. Meu primeiro experimento foi combinar o CGRU treinado na categoria "tiro" com o YOLO, usando uma regra simples: se o modelo previu "normal" mas avistou uma arma, ele mudaria a saída para "tiro".
Para a detecção de incêndios, fiz o mesmo. Avaliei como essa combinação funcionou para cada sequência de vídeo e defini um limite de confiança em 55 por cento.
Os resultados para detectar incêndios foram promissores. A combinação de CGRU e YOLO melhorou a detecção de incêndios, enquanto a detecção de tiros não mostrou nenhuma mudança. À primeira vista, parecia que ambos os modelos estavam captando as mesmas características para a detecção de tiros, o que indicou o quão importante era a precisão do YOLO para o desempenho geral.
Decidi ajustar as regras para detectar tiros um pouco. Como o YOLO usa cálculos para descobrir se um objeto foi detectado, pensei: "Ei, talvez um tiro deva registrar apenas se estiver perto de uma pessoa." Então, treinei um modelo novo que incluía imagens de armas e algumas outras imagens para ver como ele se saía.
Meu novo modelo para detectar pessoas se saiu melhor do que antes, embora a detecção de armas ainda tivesse seus altos e baixos. Quando comparei os resultados, o desempenho do meu novo modelo para detecção de tiros teve um bom pequeno impulso.
Depois, olhei para reduzir falsos positivos. Após novas avaliações enquanto ainda mantinha tudo sob controle, vi que havia menos alarmes falsos. No entanto, isso significou que os verdadeiros positivos caíram ligeiramente também, mostrando a necessidade de precisão no YOLO.
Dada a gravidade das anomalias que eu estava tentando detectar, eu queria manter o modelo que tinha a menor taxa de falsos negativos, mesmo que isso significasse permitir alguns falsos alarmes. Além disso, treinar um único modelo de detecção de objetos para cobrir todas as minhas anomalias tornaria a vida mais simples.
Comparação de Desempenho para Cada um dos Nossos Modelos
Hora de compartilhar como todos os modelos se saíram no geral! Eu tinha três distintos para detectar brigas, tiros e incêndios. Vou avaliá-los com base na classificação de vídeo (uma detecção por vídeo) e na velocidade para detectar anomalias em um fluxo contínuo (uma detecção por sequência).
Para brigas, o modelo se saiu bem ao checar vídeos inteiros, alcançando cerca de 85,6% de precisão, mas ficou aquém em streams contínuos com 63,1%. A detecção de tiros disparou para 86,5% de precisão em vídeos inteiros, mas caiu ligeiramente em sequências com 91,8%, mostrando que se sai melhor em cenários estáticos. Por outro lado, a detecção de incêndios foi sólida, marcando 83,8% para vídeos e subindo para 86,0% para sequências, revelando que é um bom desempenho!
Quando combinei todos os meus conjuntos de dados para um modelo multi-classe, notei algumas tendências interessantes. Apesar de ter mais dados, o desempenho da detecção caiu para as classes de incêndios e tiros em streams contínuos, mas no geral meu modelo multi-classe se manteve razoavelmente bem.
Olhando para vídeos de incidentes da vida real, meu modelo multi-classe se saiu respeitavelmente. As velocidades com que ele conseguia processar dados também não eram ruins, registrando tempos de detecção entre 104 e 744 milissegundos.
Conclusões
Através de todos esses testes e ajustes, o que eu aprendi? Se você simplesmente quer detectar qualquer incidente, um modelo binário (normal/anômalo) é o caminho a seguir. Pode não identificar exatamente o que deu errado, mas cobre todas as bases.
Por outro lado, se seu objetivo é identificar um tipo específico de anomalia, como uma briga ou um incêndio, ficar com um modelo especializado deve gerar melhores resultados. Se você quiser misturar todos os tipos de anomalias e deixar um humano descobrir os detalhes depois, um modelo normal/anômalo atende às suas necessidades perfeitamente.
Resumindo, experimentar com esses modelos foi uma jornada e tanto. É verdade que a detecção em tempo real nem sempre é perfeita, mas com os ajustes e abordagens certas, conseguimos chegar perto o suficiente para fazer insights valiosos para manter um olho na segurança!
Título: Real-Time Anomaly Detection in Video Streams
Resumo: This thesis is part of a CIFRE agreement between the company Othello and the LIASD laboratory. The objective is to develop an artificial intelligence system that can detect real-time dangers in a video stream. To achieve this, a novel approach combining temporal and spatial analysis has been proposed. Several avenues have been explored to improve anomaly detection by integrating object detection, human pose detection, and motion analysis. For result interpretability, techniques commonly used for image analysis, such as activation and saliency maps, have been extended to videos, and an original method has been proposed. The proposed architecture performs binary or multiclass classification depending on whether an alert or the cause needs to be identified. Numerous neural networkmodels have been tested, and three of them have been selected. You Only Looks Once (YOLO) has been used for spatial analysis, a Convolutional Recurrent Neuronal Network (CRNN) composed of VGG19 and a Gated Recurrent Unit (GRU) for temporal analysis, and a multi-layer perceptron for classification. These models handle different types of data and can be combined in parallel or in series. Although the parallel mode is faster, the serial mode is generally more reliable. For training these models, supervised learning was chosen, and two proprietary datasets were created. The first dataset focuses on objects that may play a potential role in anomalies, while the second consists of videos containing anomalies or non-anomalies. This approach allows for the processing of both continuous video streams and finite videos, providing greater flexibility in detection.
Autores: Fabien Poirier
Última atualização: 2024-11-29 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2411.19731
Fonte PDF: https://arxiv.org/pdf/2411.19731
Licença: https://creativecommons.org/licenses/by-nc-sa/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.
Ligações de referência
- https://github.com/cs60050/TeamGabru
- https://www.kaggle.com/datasets/naveenk903/movies-fight-detection-dataset
- https://www.kaggle.com/datasets/yassershrief/hockey-fight-vidoes
- https://github.com/metal3d/keras-video-generators
- https://arxiv.org/ftp/arxiv/papers/2205/2205.10756.pdf
- https://github.com/ultralytics/yolov5
- https://github.com/meituan/YOLOv6
- https://pjreddie.com/projects/pascal-voc-dataset-mirror/
- https://cocodataset.org/
- https://www.othello.group
- https://www.univ-paris8.fr/UR-Laboratoire-d-Intelligence-Artificielle-et-Semantique-des-Donnees-LIASD