Détection d’anomalies dans une foule 3/5 : détection de personnes dans une foule

La Javaness R&D
11 min readSep 23, 2024

--

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.

Quatre photographies : un bus, un parking, une autoroute avec des voitures, plusieurs personnes en train de faire du skateboard. Dans chaque image, chaque objet (voiture, personne, bus) est entouré d’un cadre de couleur et comporte une étiquette qui définit l’objet.
Échantillon d’images du dataset COCO

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 :

Une photographie de plusieurs personnes dans un hall de gare. Certaines personnes sont entourées d’un cadre, d’autre non. Le modèle n’a pas détecté toutes les personnes.
Inférence de YOLOv8n pré-entraîné sur le dataset COCO. Les scores de confiance sont inscrits au dessus de chaque bounding box dont les couleurs varient concordamment
Une image d’une foule de nuit, en extérieur. Certaines personnes sont entourées d’un cadre, d’autres non.
Inférence de YOLOv8n pré-entraîné sur le dataset COCO.

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.

Une photographie de deux hommes. La photographie comporte un axe allant de la gauche vers la droite et du haut vers le bas. Chaque homme est entouré d’un cadre, et au centre de chaque cadre apparaissent les coordonnées du centre, ainsi que la hauteur et la largeur du cadre.
Format de données YOLO
Le contenu du fichier .txt correspondant à l’image ci-dessus. Une ligne de chiffres correspond à une image : classe détectée, puis coordonnées de la bounding box (cadre).
Contenu d’un fichier *.txt de YOLO

É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.

Un échantillon comprenant des images de personnes, en groupes ou seules, de jour ou de nuit, partiellement cachées ou entièrement visibles, en position debout ou couchée.
Echantillon d’images de notre dataset final

💪 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.

Un graphique représentant la loss d’entraînement et de validaition du modèle au cours des itérations. La loss diminue très rapidement puis se stabilise aux alentours de l’itération 18000
Valeurs de loss pendant les itérations de l’entraînement de notre faster R-CNN

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.

Trois couches sont présentées : une couche ResNet, une couche appelée “feature pyramid net”, et une couche “class subnet + box subnet”
Architecture de RetinaNet
Graphique représentant les valeurs de loss d’entraînement et de validation en fonction du nombre d’itérations. La loss diminue rapidement puis se stabilise, également autour de 18000 itérations.
Valeurs de loss pendant les itérations de l’entraînement de RetinaNet

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.

10 graphes représentant les loss et métriques relevées pendant l’entraînement du modèle. Les loss déclinent rapidement puis se stabilisent, et les métriques augmentent rapidement avant de se stabiliser aussi.
Valeurs de loss et métriques relevées pendant l’entraînement de YOLOv8

📈 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)

La photographie de foule dans un hall de gare montrée précédemment. Cette fois-ci, les personnes semblent à peu près toutes bien détectées.
La photographie d’une foule en extérieur montrée précédemment. Les personnes ne sont pas toutes détectées, mais beaucoup plus le sont que dans la première photographie.

Faster R-CNN (seuil de confiance : 0.5)

La photographie de foule dans un hall de gare montrée précédemment. Les personnes semblent à peu près toutes bien détectées par ce modèle également.
La photographie d’une foule en extérieur montrée précédemment. Les personnes ne sont pas toutes détectées, mais beaucoup plus le sont que dans la première photographie. Ce modèle détecte un peu plus de personnes que le précédent.

YOLOv8n-ppl (seuil de confiance : 0.2)

La photographie de foule dans un hall de gare montrée précédemment. Les personnes semblent à peu près toutes bien détectées par ce modèle également.
La photographie d’une foule en extérieur montrée précédemment. Beaucoup plus de personnes sont détectées qu’avec les modèles précédents.

À 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.

--

--

La Javaness R&D

We help organizations to succeed in the new paradigm of “AI@scale”, by using machine intelligence responsibly and efficiently : www.lajavaness.com