Simple Science

La science de pointe expliquée simplement

# Informatique # Vision par ordinateur et reconnaissance des formes # Apprentissage automatique

Approches innovantes pour la détection des anomalies dans la vidéosurveillance

Tester différents modèles pour détecter des activités inhabituelles dans les données vidéo.

Fabien Poirier

― 14 min lire


Techniques de détection Techniques de détection d'anomalies vidéo temps réel d'activités inhabituelles. Tester des modèles pour la détection en
Table des matières

Comme je n'ai pas pu accéder à de vraies caméras de surveillance pendant mes études, toutes les vidéos que j'ai utilisées étaient juste des trucs que j'ai téléchargés. Les données vidéo nécessitent beaucoup de puissance de calcul pour être traitées. Malheureusement, je n'avais pas de serveur GPU fancy dans ma boîte ou mon labo de recherche, donc je devais me contenter d'un ordi classique avec 32 Go de RAM et un bon processeur Intel Core i9. J'avais aussi une carte graphique Nvidia GeForce RTX2080, ce qui me donnait un petit coup de pouce.

Dans cette partie, on va parler des tests que j'ai faits où j'ai combiné deux modèles pour voir à quel point ils détectaient bien les activités inhabituelles (ou Anomalies). Je vais expliquer comment les résultats ont changé selon que je les ai exécutés en parallèle ou les uns après les autres. Ensuite, je partagerai les expériences que j'ai réalisées sur la Détection d'objets et d'anomalies, ce qui m'a aidé à déterminer quels modèles fonctionnaient le mieux pour chaque situation. Enfin, je terminerai avec un récapitulatif de tout.

Prétraitement des données

Ici, je vais expliquer comment j'ai préparé les données pour les tests.

Comme dit plus tôt, les vidéos montrent souvent des actions normales interrompues par des trucs inhabituels. À cause de ça, j'ai dû découper les vidéos en morceaux pour me concentrer sur les activités inhabituelles et mieux les analyser. Même avec cette approche, gérer toutes ces données vidéo était un vrai casse-tête à cause de la quantité.

Charger toutes les vidéos en une seule fois, c'était pas possible parce que la mémoire de mon ordi ne pouvait pas le supporter. Pour régler ce souci, j'ai décidé d'utiliser un outil spécial appelé générateur. Pense à ça comme un serveur qui te ramène des plats un à un plutôt que de servir tout le repas d'un coup.

Mon premier test a été de voir comment différents générateurs fonctionnaient. J'ai essayé quatre types différents :

  1. Un générateur qui crée des séquences vidéo en déplaçant une fenêtre le long de la vidéo.
  2. Un générateur qui utilise aussi une fenêtre glissante mais qui chevauche les séquences.
  3. Un générateur qui utilise un pas dynamique pour collecter des images de chaque vidéo.
  4. Un générateur qui combine la fenêtre glissante avec le pas dynamique.

Le troisième générateur s'est révélé être la meilleure option. Pourquoi ? Parce qu'il résout des gros problèmes que les autres ont. Pour les deux premiers générateurs, le temps que mettent les modèles à apprendre dépend de la longueur des vidéos : plus les vidéos sont longues, plus les temps d'apprentissage sont longs. De plus, décider de la taille de la fenêtre glissante est délicat ; elle doit capturer l'action entière, sinon le modèle peut mal apprendre.

Bien sûr, le troisième générateur n'est pas parfait non plus. Il a son propre souci quand il s'agit de vidéos de longueurs différentes. Par exemple, pour les actions courtes, le temps entre les images est court, alors que pour les vidéos plus longues, il peut y avoir une longue attente entre les images. Donc, les vidéos courtes obtiennent des images plus détaillées, tandis que les longues risquent d'être moins claires.

Ce troisième générateur me permet de créer des séquences qui n'ont pas besoin que les images se chevauchent, c'est cool. En changeant la taille du pas, je peux décider à quelle vitesse je veux détecter des choses, que ce soit par séquence ou par vidéo. Cette flexibilité m'aide à gérer les vidéos finies et celles en cours.

Une fois que j'ai choisi mon générateur, j'ai dû décider de la taille de mes images. J'ai ajusté la taille et j'ai trouvé que la meilleure taille était... disons que ça a parfaitement fonctionné.

Pour la taille de la séquence, j'ai testé différentes longueurs entre 15 et 30 images. Puisque mes vidéos sont à une certaine vitesse (30 images par seconde), j'ai découvert qu'utiliser 20 images était optimal.

Pour voir comment chaque expérience se déroulait, j'ai créé ma propre méthode pour définir le pas lors de la sélection des images. Comme ça, je pouvais tester mes modèles dans les mêmes conditions que pendant l'entraînement, que je vérifie une vidéo entière ou que je travaille avec des séquences. Mon objectif principal est d'aider les gens à surveiller des flux continus, donc je vais me concentrer sur la performance liée à la détection de séquences.

Après avoir mis en place mes séquences, j'ai rendu mes données un peu plus vivantes en appliquant quelques techniques d'amélioration comme des effets miroir, des zooms et des changements de luminosité. Cela a aidé à multiplier mes données sans trop s'éloigner de la réalité.

Ensuite, j'ai regardé différentes façons de prétraiter les données, c’est-à-dire comment nettoyer et préparer les images. J'ai commencé avec des trucs standard du monde de la vision par ordinateur : calculer comment les choses bougent entre les images, comparer des images pour trouver des différences et appliquer des masques.

Mes constatations ? La méthode du flux optique ne m'a pas impressionné du tout. Elle est restée à 50 % de précision tout au long de l'entraînement. La méthode de différence inter-image a donné des résultats légèrement meilleurs, mais encore une fois, elle s'est détériorée quand j'ai utilisé un masque. Étonnamment, quand j'ai juste utilisé l'augmentation de données, les résultats étaient les meilleurs. Sans aucun prétraitement, ma précision était faible, même si le rappel était élevé. Avec juste l'augmentation de données, j'ai réussi à obtenir une précision décente et un rappel solide.

J'ai ensuite passé à des méthodes de prétraitement plus avancées en utilisant des modèles spécialisés pour la détection d'anomalies. J'ai pensé à utiliser quelque chose appelé DINO. Après l'avoir essayé, j'ai remarqué que ça prenait beaucoup de temps de traitement, donc ce n'était pas pratique pour mes besoins en temps réel. Cependant, ça a bien fonctionné pour la détection de tirs sans avoir besoin d'entraînement supplémentaire.

Pour la détection de combats, ça ne s'est pas aussi bien passé, ce qui m'a amené à exclure les Vision Transformers de mes plans et à me concentrer sur des modèles qui convenaient mieux à mes besoins.

Maintenant, parlons de YOLO, mon allié pour repérer des objets dans mes vidéos et comprendre ce que les gens font. Ça a bien fonctionné, donc je l'ai intégré dans ma configuration.

Expériences en mode série

Maintenant, il est temps de voir comment mes modèles ont performé quand je les ai empilés les uns après les autres. J'ai commencé par décomposer mes vidéos pour saisir chaque image, que j'ai ensuite passé par YOLO pour repérer tous les objets différents dans les images. Après ça, j'ai remis la vidéo ensemble et l'ai passée par un autre modèle appelé CGRU pour vérifier les anomalies.

J'ai comparé cette méthode avec l'utilisation de CGRU tout seul, et les résultats étaient assez révélateurs. Il s'avère que l'ajout de YOLO n'a pas beaucoup changé la performance du modèle. Cela signifie que le modèle ne faisait pas vraiment attention aux boîtes englobantes pendant l'entraînement. J'ai aussi amélioré mon prétraitement en utilisant les boîtes englobantes pour créer des masques qui se concentraient sur les parties de l'image avec les objets et éliminaient autant que possible l'arrière-plan.

Pour toute image manquant de détection d'objet, j'avais deux choix : soit garder l'image d'origine, soit la remplacer par une noire. J'ai testé les deux options, et bien qu'elles aient donné des résultats similaires, j'ai remarqué de légères différences. Utiliser un fond noir semble améliorer la détection des actions normales, mais ça a nui à la précision pour les combats et les incendies. Cela pourrait se produire quand des détails importants sont manqués pendant la détection, faisant que le modèle ignore des informations cruciales.

J'ai rapidement réalisé que les paramètres de détection d'objets, comme le seuil de confiance et de chevauchement, étaient essentiels. J'avais fixé la barre de confiance à 55 % pour mes tests.

Quand il s'est agi de détecter les actions effectuées par des gens, la version 7 de YOLO a pris les devants en outlineant leurs "squelettes", un peu comme ce que fait OpenPose. Donc, j'ai effectué une estimation de pose sur mes vidéos pour voir comment ça impactait la détection des comportements. Pour simplifier, je me suis concentré uniquement sur les classes Combat et Tir, puisque pas toutes les anomalies nécessitaient la présence de l'humain.

Ensuite, j'ai testé si l'estimation de pose améliorait les choses. Au début, j'ai retiré les arrière-plans des vidéos pour affiner la détection, mais j'ai vite réalisé que cela pouvait fausser la détection d'autres types d'anomalies. Donc, j'ai réintroduit l'arrière-plan et réentraîné mon modèle pour voir s'il pouvait toujours repérer des trucs comme des incendies.

En termes de performance globale, l'ajout de la classe feu n'a pas trop changé, mais les résultats ont montré une baisse dans la détection des tirs puisque certains d'entre eux étaient étiquetés comme des incendies. Cela m'a conduit à remplacer mon modèle multiclass par un réglage normal/anormal pour voir comment YOLO influençait les choses. J'ai formé deux nouveaux modèles : un sans arrière-plans et un avec.

Quoi qu'il en soit du prétraitement, combiner différents types d'anomalies a constamment amélioré les performances de mes modèles. Cependant, l'inclusion d'anomalies non liées, comme les incendies, avait tendance à nuire aux résultats. J'ai aussi remarqué que l'utilisation de YOLO pour préparer mes données a boosté la précision.

Traitement en mode parallèle

Ensuite, j'ai décidé de faire fonctionner mes modèles en parallèle. L'idée ici était de détecter des objets tout en analysant le temps, puis de combiner les résultats pour améliorer la précision. Mon premier essai était de combiner CGRU entraîné sur la catégorie "tir" avec YOLO, en utilisant une règle simple : si le modèle prédisait "normal" mais repérait une arme, il changerait la sortie en "tir".

Pour la détection des incendies, j'ai fait la même chose. J'ai évalué l'efficacité de cette combinaison pour chaque séquence vidéo et fixé un seuil de confiance à 55 %.

Les résultats de la détection des incendies étaient prometteurs. La combinaison de CGRU et YOLO a amélioré la détection des incendies, tandis que la détection des tirs n'a pas montré de changement. À première vue, il semblait que les deux modèles prenaient les mêmes caractéristiques pour la détection des tirs, ce qui indiquait combien la précision de YOLO était importante pour la performance globale.

J'ai décidé de peaufiner un peu les règles de détection des tirs. Puisque YOLO utilise des calculs pour déterminer si un objet a été détecté, je me suis dit "Hé, peut-être qu'un tir devrait seulement s'enregistrer s'il est près d'une personne." Donc, j'ai formé un nouveau modèle incluant des images de pistolets et quelques autres images pour voir comment ça fonctionnait.

Mon nouveau modèle pour la détection des personnes a mieux réussi que précédemment, bien que la détection des armes ait encore ses hauts et ses bas. En comparant les résultats, j'ai vu que la performance de mon nouveau modèle pour la détection des tirs avait eu un joli petit coup de pouce.

Ensuite, j'ai cherché à réduire les faux positifs. Après de nouvelles évaluations tout en gardant un œil sur tout, j'ai effectivement vu moins de fausses alertes. Cependant, cela signifiait que les vrais positifs avaient légèrement baissé, montrant la nécessité de la précision dans YOLO.

Étant donné la gravité des anomalies que j'essayais de détecter, je voulais garder le modèle avec le taux de faux négatifs le plus bas, même si cela signifiait accepter quelques fausses alertes. De plus, former un seul modèle de détection d'objet pour couvrir toutes mes anomalies simplifierait vraiment la vie.

Comparaison des performances de chacun de nos modèles

Maintenant, il est temps de partager comment tous les modèles ont performé dans l'ensemble ! J'avais trois modèles distincts pour détecter les combats, les tirs et les incendies. Je vais les évaluer sur leur classification vidéo (une détection par vidéo) et sur leur vitesse pour repérer les anomalies dans un flux continu (une détection par séquence).

Pour les combats, le modèle a bien fonctionné en vérifiant des vidéos entières, atteignant environ 85,6 % de précision, mais a échoué en flux continu à 63,1 %. La détection des tirs a grimpé à 86,5 % de précision pour les vidéos entières mais a légèrement chuté dans les séquences à 91,8 %, montrant qu'elle fonctionne mieux dans des scénarios statiques. D'un autre côté, la détection des incendies était solide, marquant 83,8 % pour les vidéos et grimpant à 86,0 % pour les séquences, révélant que c'est une performeuse fiable !

Quand j'ai combiné tous mes ensembles de données pour un modèle multiclass, j'ai remarqué des tendances intéressantes. Malgré une plus grande quantité de données, la performance de détection a chuté pour la classe feu et la classe tir dans les flux continus, mais dans l'ensemble, mon modèle multiclass se tenait pas mal.

En regardant des vidéos d'incidents réels, mon modèle multiclass a performé respectablement. Les vitesses auxquelles il pouvait traiter les données n'étaient pas mauvaises non plus, enregistrant des temps de détection entre 104 et 744 millisecondes.

Conclusions

À travers tous ces tests et ajustements, qu'est-ce que j'ai appris ? Si tu veux simplement détecter un incident, un modèle binaire (normal/anormal) est la voie à suivre. Ça ne va peut-être pas pinpoint ce qui a mal tourné, mais ça couvre toutes les bases.

D'un autre côté, si ton but est de repérer un type spécifique d'anomalie, comme un combat ou un incendie, s'en tenir à un modèle spécialisé devrait donner de meilleurs résultats. Si tu veux mélanger toutes sortes d'anomalies et laisser un humain déterminer les détails plus tard, un modèle normal/anormal convient parfaitement à tes besoins.

En gros, expérimenter avec ces modèles a été un vrai parcours. C'est vrai que la détection en temps réel n'est pas toujours parfaite, mais avec les bons réglages et approches, on peut s'en rapprocher suffisamment pour obtenir des aperçus précieux pour surveiller la sécurité !

Source originale

Titre: Real-Time Anomaly Detection in Video Streams

Résumé: 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.

Auteurs: Fabien Poirier

Dernière mise à jour: Nov 29, 2024

Langue: English

Source URL: https://arxiv.org/abs/2411.19731

Source PDF: https://arxiv.org/pdf/2411.19731

Licence: https://creativecommons.org/licenses/by-nc-sa/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Articles similaires