Détection d’anomalies dans une foule 3/5 : détection de personnes dans une foule
Cette série d’articles plonge au cœur des défis, des concepts et des technologies de l’Intelligence Artificielle appliquée à la détection d’anomalies dans les foules. À travers chaque article, nous explorons une des étapes clés de cette thématique, des enjeux éthiques aux algorithmes innovants, en passant par le décryptage théorique du traitement vidéo par l’IA.
Dans ce troisième article, nous détaillerons une méthode de détection multi-objets adressée à un cas d’utilisation en particulier : la détection de personnes dans une foule.
Nous adresserons les problématiques liées à la construction du dataset, à la sélection des modèles puis leurs entraînements et enfin, à leurs évaluations. Nous mettrons un point d’honneur à ce que notre système puisse fonctionner en temps réel, qu’il soit capable de gérer les occultations partielles de nos cibles, qu’il soit polyvalent en démontrant son efficacité sur des sources d’images de natures diverses et, évidemment, qu’il soit performant. Nous nous assurerons d’une diversité ethniques et de genre des personnes représentées dans notre dataset afin d’éviter d’inclure des biais.
Nous implémenterons plusieurs approches basées sur des architectures One-Step ou Two-Steps dans notre benchmark final.
🎲 Jeux de données
Le jeu de données Common Objects in Context (COCO) est un ensemble de données à grande échelle largement utilisé pour la détection ou la segmentation d’objets. Il comprend plus de 200 000 images avec des annotations pour 80 catégories d’objets (y compris la classe “personne” qui nous intéresse ici). Il constitue une ressource précieuse pour l’entraînement et l’évaluation des modèles de vision par ordinateur.
YOLOv8 fourni un zoo de modèles pré-entraînés sur le dataset COCO. Testons les performances de ce modèle sur des images de foules :
Malgré la détection de certaines cibles, il est évident que les performances du modèle ne semblent bien insatisfaisantes. Cela s’explique en raison de la différence des caractéristiques entre les personnes représentées dans le dataset COCO et celles sur nos images de foules qui sont bien plus petites, en moins bonne qualité et fréquemment occultés. Ce qui confirme notre besoin de constituer un ensemble de données dédié à la détection spécifique de personnes dans les images de foule.
Nous souhaitons que notre dataset final présente des images avec des densités humaines diverses, capturées par différents appareils dans un large panel de décors, qu’ils incluent des personnes de toutes origines ethniques et de tous genres et enfin qu’elles soient de perspectives différentes. Tout cela est réalisé dans le but d’obtenir un détecteur polyvalent.
Notre première tâche a alors été de réaliser un benchmark des datasets existants pouvant réaliser cette tâche. Bien qu’il ne semble pas en exister beaucoup, nous en avons repérés 4 en particulier qui, une fois combinés semblaient contenir toutes les caractéristiques du dataset que nous cherchions à nous constituer :
- CrowdHuman : scènes de foules à densités variables. 15,000 images d’entraînement, 4,370 images de tests, avec en moyenne 23 personnes par image
- CityPersons : piétons enregistrés dans la rue dans 50 villes. 2,975 images d’entraînement, 500 images de test, avec en moyenne 7 personnes par image
- SmartCity : images de vidéo-surveillance capturées dans 10 villes. 50 images d’entraînement et 0 images de test, en moyenne 7 personnes par image
- WiderPersons : images d’un large panel de scénario avec plusieurs cas d’occultations. 8,000 images d’entraînement, 1,000 images de tests, en moyenne 31 personnes par image
Dans un travail postérieur, nous mettrons en œuvre un algorithme de détection de chutes dans un module de détection d’anomalies basé sur les détections de personnes. Il sera alors démontré que notre ensemble de données composé de ces 4 dataset rassemblés manque de diversité en ce qui concerne les poses des humains annotés. Cela affectera les performances de notre modèle pour détecter une personne dans une position inhabituelle ou en train de chuter. Pour atténuer ce problème, nous augmentons davantage la taille de notre ensemble de données avec des ensembles de données tiers dédiés à la détection d’humains en position allongée, assise ou en mouvement :
- NewFall : images de personnes tombées ou allongées. 91 images en tout, avec une personne par image.
- ppl : images de personnes en mouvements ou dans des positions inhabituelles. 658 images d’entraînement, 288 images de test, avec 3 personnes par image en moyenne
Nous devions définir un format standard, commun à toutes les images et annotations de notre dataset final. Nous avons choisi le format de données YOLO et nous avons mis en œuvre des méthodes de traitement des données pour adapter les formats spécifiques à chaque sous-dataset au format YOLO.
Le format YOLO consiste en un fichier *.txt par image dans notre dataset. S’il n’y a aucun objet dans une image, aucun fichier *.txt n’est nécessaire. Le fichier *.txt doit être formaté avec une ligne par objet au format x_centre y_centre largeur hauteur. Les coordonnées de la boîte englobante doivent être normalisées en xywh (de 0 à 1). Enfin, les données sont organisées en deux ensembles, train et val.
Étant donné la taille finale de notre ensemble de données, il y a une probabilité que quelques erreurs de format d’annotation ou d’image se soient glissées. Nous avons alors implémenté des méthodes de nettoyage de données en nous concentrant sur trois anomalies en particulier : les images corrompues, les boîtes annotées en double et les coordonnées non normalisées ou hors limites de l’image. Après le nettoyage, nous disposons de 26 239 images et ~605 000 occurrences d’humains dans notre ensemble de données d’entraînement, ainsi que 5 897 images pour environ ~135 000 occurrences dans notre ensemble de données de validation.
💪 Entraînement de modèles
Maintenant notre dataset construit, nous pouvons entraîner nos modèles. Pour assurer la fiabilité de nos résultats, nous allons entraîner deux modèles One-Step différents, plutôt réputés pour leur rapidité, ainsi qu’un modèle Two-Steps, renommé pour sa fiabilité et son adaptabilité. Nous utiliserons le modèle YOLOv8 pré-entraîné sur COCO comme référence pour la comparaison de résultats.
Faster R-CNN
Le modèle Two-Steps que nous avons sélectionné est le “R101-FPN” du zoo de modèles de Detectron2. Il constitue une variante de l’architecture Faster R-CNN, intégrant un backbone FPN (pour l’extraction hiérarchique des caractéristiques à partir des images d’entrée) ainsi qu’un réseau ResNet bottom-up, composé de quatre étages, chacun comportant des blocs bottleneck. Ce backbone est amélioré par des connexions latérales et un cheminement top-down, conduisant à la formation de pyramides de caractéristiques. L’architecture inclut également un RPN utilisant des couches convolutionnelles pour la classification de l’objet et la régression des ancres.
Sous Detectron2, nous n’avons pas d’époques, nous traitons par itérations. Nous commençons l’entraînement de notre modèle sur un GPU 32GB Nvidia sur 25 000 itérations, en sauvegardant l’état de notre modèle toutes les 1 000 époques. Nous utilisons une batch size de 8 et un learning rate de 0,00025. Nous enregistrons les valeurs de loss de notre modèle sur les datasets d’entraînement et de validation et nous les utiliserons pour déterminer le modèle optimal.
Nous sélectionnons pour la suite le modèle obtenu après 18000 itérations, avant que la valeur de loss de validation ne se stabilise.
RetinaNet
Toujours sous Detectron2 et avec les mêmes paramètres, nous entraînons un modèle One-Step appelé RetinaNet. Son architecture repose également sur un backbone FPN placé au-dessus d’une architecture ResNet en feedforward. À ce backbone, RetinaNet attache deux sous-réseaux, l’un dédié à la classification des boîtes d’ancrage et l’autre à la régression de ces boîtes vers la boîte d’objet réelle. L’architecture du modèle est volontairement plus simple que celle de nos deux autres modèles.
De même que pour le Faster R-CNN, nous sélectionnons le modèle obtenu après 18000 itérations.
YOLO
Enfin, notre dernier modèle entraîné sera une instance de YOLOv8, “YOLOv8n”, possédant 3,2 millions de paramètres. Il s’agit de l’architecture la plus légère et la plus rapide de YOLOv8, mais aussi la moins robuste. Nous utiliserons trois instance de ce modèle pour notre benchmark :
- Le modèle pré-entraîné sur COCO, qui servira de référence à notre benchmark.
- Le modèle entraîné sur les ensembles de données de foule sans inclure les datasets tiers Newfall et ppl.
- Enfin, le modèle entraîné sur l’ensemble de notre dataset.
Les modèles seront entraînés sur 350 epochs, avec des batch size de 16 avec un learning rate de 0.01. Un early stopping avec une patience de 50 epochs a été implémenté et activé pendant l’entraînement.
📈 Résultats
Maintenant nos modèles entraînés, nous pouvons les évaluer sur le dataset qui y est dédié. Pour un objectif de tracking, bien que minimiser le nombre de fausse détections réalisées soit judicieux, nous souhaitons surtout avoir le moins de faux négatifs possibles. Nous chercherons un modèle présentant de bonnes métriques de précision et de recall en portant une attention particulière au recall (capacité du modèle à capturer la totalité des exemples positifs dans le jeu de données). Nous relevons pour chaque modèle évalué les métriques de MaP50, MaP50–95, AP, AR, de temps d’inférence et nous afficherons les matrices de confusions calculées avec le même seuil de confiance de détection fixé à 0.3 et un seuil d’IoU à 0.5 pour l’association de cibles.
Note : Les scores de AP50–95 sont calculés différemment entre les modèles sous Detectron2 et YOLO. Ils doivent cependant induire la même information.
YOLOv8-COCO est le modèle pré-entraîné sur le dataset COCO. YOLOv8-CrowdHuman désigne le modèle entraîné sur les datasets CrowdHuman, CityPersons, SmartCity, WiderPersons. YOLOv8-ppl est similaire à YOLOv8-CrowdHuman mais est en plus fine tuné sur les datasets NewFall et ppl
Notons que l’interprétation des métriques obtenues joue un rôle important dans la sélection du meilleur modèle. Par exemple, un modèle performant a priori mais peu précis dans dans la régression des coordonnées des bounding boxes sera préférable à un modèle peu polyvalent ne générant que trop peu de propositions de boxes. Cependant, une prédiction imprécise ne passant pas le seuil IoU d’association avec un label génèrera à la fois un faux positif et un faux négatif (le label n’étant alors pas détecté non plus), ce qui impact à la fois l’AP et l’AR de notre modèle.
Enfin, l’annotation d’objets de taille minimes comme des personnes fortement occultées reste extrêmement sensibles aux erreurs lors de l’association par IoU. Même si nous supposons les occurrences de celles-ci négligeables par rapport à la taille de notre dataset, nous gardons leurs existences à l’esprit.
🔈 Discussion
Nous nous sommes constitués dans ce travail un dataset d’images de foules volumineux, diversifié et inclusif. Sur ce dataset, nous avons entraîné 4 modèles de 3 architectures différentes avec des approches Two-Steps et One-Step. Nous avons ensuite évalué chacun de ces modèles auquel nous avons ajouté un modèle pré-entraîné servant de baseline à notre benchmark.
Dans le cadre de cet exercice, nous souhaitons obtenir un modèle de détection qui soit optimal pour une tâche de tracking d’objets. Les algorithmes de tracking se basent en général sur une méthode d’association de cibles à travers les frames qui peut être coûteuse en calcul. Cela à l’esprit, nous privilégions alors l’obtention d’un modèle de détection rapide et polyvalent à un modèle qui serait plus fiable mais lent et moins généralisable.
Comme nous pouvions nous en douter, les modèles YOLOv8n-crowdhuman et YOLOv8n-ppl présentent des résultats proches de par les similitudes de leurs entraînement. Nous choisirons par la suite le modèle YOLOv8n-ppl comme prioritaire car estimé plus facilement généralisable.
En observant les résultats obtenus, il semble évident que notre meilleur choix soit d’opter pour le modèle YOLOv8-ppl tant il surpasse ses concurrents sous les aspects qui nous sont les plus importants. Le point en particulier qui plaide en sa faveur est sa rapidité. YOLOv8 traite les images 10x plus vite que notre RetinaNet ou notre Faster R-CNN. Il peut théoriquement traiter jusqu’à 205 frames par secondes contre seulement 20 frames pour le faster R-CNN, ce qui en fait un favori pour une application online comme le tracking de cibles en temps réel. Sa rapidité nous offre plus de champ dans la définition de nos algorithmes de tracking et nous permets de nous concentrer sur la définition d’algorithmes fiables plutôt que rapide (dans la limite, toujours du temps en réel en 30 fps).
De plus, ses autres métriques de performances restent très satisfaisantes. Certes, YOLO n’a que la troisième meilleure métrique de recall de notre benchmark mais celle-ci reste proche de celles de ses prédécesseurs, RetinaNet et Faster R-CNN, que YOLO surpasse largement en terme de précision. En comparant les f1scores50 (sommes harmoniques des scores de AP50 et de AR50) de ces trois modèles, YOLO devance largement Faster R-CNN et RetinaNet avec des scores respectivement de 0.779, 0.732 et 0.695. Gardons cependant à l’esprit que dans une application de tracking, les faux positifs ont un moindre impact sur les résultats que les faux négatifs. Ainsi, il sera toujours intéressant de conserver Faster R-CNN dans notre étude suivante car il présente un meilleur recall que YOLO et un plus grand équilibre AP/AR que RetinaNet.
Enfin, les deux modèles YOLO que nous avons entraînés possèdent de meilleurs métriques MaP50–95 que les autres modèles de notre benchmark qui parviennent à approcher YOLO dans la détection d’objets avec une localisation approximative (IoU de 0.5) mais qui ont des difficultés à effectuer des détections plus précises (IoU supérieur à 0.5).
Nous garderons donc YOLOv8n-ppl comme modèle prioritaire pour la suite de notre étude sur le tracking de personnes dans une foule tout en conservant notre Faster R-CNN qui présente des qualités qui lui sont propres et qui nous fournis une bonne alternative de comparaison.
📘 Annexe : exemples d’inférence
Pour les exemples d’inférences, les résultats sont affichés avec des seuil de confiance différents en fonction des modèles. Ils sont choisis de manière à maximiser le f1 score.
RetinaNet (seuil de confiance : 0.5)
Faster R-CNN (seuil de confiance : 0.5)
YOLOv8n-ppl (seuil de confiance : 0.2)
À propos de l’auteur
Diplômé en ingénierie de l’ISEP et titulaire d’un Master en Data Science et IA de Chalmers University, Axel GAUTRAND a rejoint La Javaness en 2023 en tant que Data Scientist après un stage réussi consacré à la détection d’anomalies dans les foules. À La Javaness, Axel se concentre principalement sur des projets de Computer Vision et d’OCR, notamment pour l’archivage automatisé de documents historiques. Il s’intéresse également à l’impact de l’IA sur la performance sportive et la santé et aux considérations éthiques de cette technologie.