Comment estimer le nombre de personnes dans une foule par Machine Learning Appstud Follow Jul 18, 2019 · 8 min read

Introduction

Dans le cadre de nos recherches au Lab Appstud, nous avons essayé de trouver une solution au problème de comptage de personnes dans une foule. L’objectif est de développer un algorithme permettant d’avoir une approximation à partir d’une image de foule en utilisant du traitement d’image et du machine learning.

L’objectif: à gauche une image d’une foule, à droite la sortie d’un algorithme de comptage de personnes.

Comment procéder et pourquoi les algorithmes de détection de personnes classiques ne donnent pas de bons résultats?

Aujourd’hui plusieurs algorithmes pour la détection de personnes existent. YOLO¹ (You Only Look Once) est l’un des algorithmes de détection d’objets les plus connus qui permet de détecter des personnes ainsi que plusieurs autres types d’objets (9000 en version 3).

Détection de personnes par YOLO

Quand on utilise YOLO pour détecter des personnes dans une foule, l’algorithme donne de très mauvais résultats.

Résultat de YOLO sur une image de foule.

Pourquoi YOLO ainsi que d’autres détecteurs de personnes ne réussissent pas?

En effet, YOLO est un algorithme d’apprentissage machine basé sur un réseau de neurones convolutionnel CNN (convolutional neural network). Durant la phase d’apprentissage, YOLO “consulte” des milliers de photos contenant des personnes ainsi que d’autres types d’objets dont on connaît les positions dans l’image (aussi appelé “bounding box”). En regardant quelques images que YOLO a utilisé pour savoir détecter les personnes, on voit clairement que ce sont des images très différentes de notre cas.

Dans les images de foules, les personnes sont partiellement visibles, on voit juste le haut du corps des personnes, ces images sont très différentes de la structure des images que YOLO a utilisé durant sa phase d’apprentissage.

Nous devons concevoir un système plus spécifique pour résoudre notre problème. Plusieurs techniques et approches existent, certaines essayent d’estimer le nombre de personnes directement et d’autres essayent de passer par une étape intermédiaire en calculant une densité de personne dans l’image, ce qui permet de récupérer plus d’informations et permet une meilleure exploitation des images. Par exemple, si on détecte qu’il y a beaucoup de personnes concentrées dans une zone de l’image, on peut mettre en évidence qu’un événement particulier s’y déroule.

Nous avons donc testé une méthode de chaque approche pour les comparer.

Approche régression avec le descripteur LBP par bloc:

Cette technique est basée sur le descripteur LBP (Local Binary Pattern), qui est un vecteur décrivant l’image, et un algorithme de régression tel que le “Kernel Ridge Regression”. En utilisant une base de données d’images étiquetée², c’est à dire qu’on connaît en amont le nombre de personnes et leur position dans l’image, on peut appliquer la méthode suivante:

Dans un premier temps, on divise l’image en blocs, ici en 8X8

Dans un second temps, on calcule pour chaque bloc un histogramme du descripteur LBP uniforme. Chaque bloc est ici décrit par un vecteur de dimension 59.

Résultat du descripteur LBP (avant calcul d’histogramme par bloc)

Ensuite, on concatène les descripteurs, puis on construit un vecteur qui contient le nombre de personnes dans chaque bloc.

Comptage des gens dans chaque bloc et construire un vecteur des résultats

Enfin, on applique une régression (“Kernel Ridge Regression”) sur ces descripteurs, et le vecteur issu de la base de données étiquetée construit lors de l’étape précédente.

Dans nos essais, on a utilisé la base de données ShanghaiTech², qui contient deux parties A et B. La partie A est constituée de 482 images de foules issues d’Internet, la partie B est constituée de 716 images prises des rues métropolitaine de Shanghai. La densité de personnes varie beaucoup entre les deux parties. 300 images de la partie A sont utilisées pour l’apprentissage et les 182 restantes pour tester l’algorithme. Pour la partie B, 400 images sont utilisées pour l’apprentissage et 316 images pour le test.

Pour quantifier la performance de la méthode, on calcule l’erreur de la façon suivante:

Erreur utilisée pour quantifier la performance de l’algorithme

où zi et pi correspond au nombre de personnes présents dans l’image i, et le nombre estimé respectivement. N le nombre total d’images. Les résultat de l’apprentissage sur la partie A donne une erreur de 371 et de 81 pour la partie B. Voici quelques résultats obtenus:

A gauche l’image étiquetée, à droite l’estimation produite par l’algorithme

Dans chaque bloc, nous retrouvons l’estimation du nombre de personnes présentes dans la foule. En sommant ces valeurs, nous obtenons une estimation du nombre de personnes présentes dans la foule.

Comme on peut le constater, notamment sur la dernière photographie, l’algorithme a quelques lacunes dans certains cas.

Nous avons développé une première version en open-source, vous retrouverez le lien en bas de l’article³.

Approche Deep Learning (MCNN)

Une autre approche consiste à essayer d’estimer une densité de personnes, en faisant l’intégrale de cette densité afin d’estimer le nombre total des gens. La motivation de ces approches est qu’elles conservent plus d’informations. Il nous faut donc des images où on connait déjà la densité de personnes. Donc la première étape sera de convertir notre base de données étiquetée par la position des gens en une base de données où pour chaque image on a une image représentant cette densité.

A gauche l’image originale, à droite la représentation de la densité

Calcul de la densité de personnes à partir de la position des personnes dans l’image

Nos recherches nous ont amenées à nous baser sur un article⁴ dans lequel les auteurs ont représenté chaque point correspondant à une tête par une impulsion de Dirac. Cela nous donne une représentation numérique de la densité. Pour pouvoir convertir cette densité en une densité continue, une solution est d’appliquer une convolution à cette densité en utilisant des fonctions gaussiennes. En d’autre termes plus simple, l’idée est de représenter chaque tête par un “chapeau” (fonction gaussienne).

Une telle densité suppose que chaque tête occupe la même surface dans l’image, ce qui n’est pas le cas à cause de la distorsion issue de la projection perspective. En d’autre termes, si on ne change pas la taille du “chapeau” attribuée à chaque personne, cette densité ne sera pas exacte. Il faut donc adapter le paramètre des gaussiens σ pour chaque personne. Plus la taille de la tête d’une personne est grande dans l’image, plus il faut lui attribuer un “chapeau” plus large. Un changement de la largeur d’un chapeau entraîne automatiquement un changement de sa longueur afin de garder un volume constant pour chaque “chapeau” .

Les personnes qui sont loin de la caméra seront représentées par des “chapeaux” moins larges mais plus longs afin de conserver le même volume pour chaque “chapeau”.

Un autre problème se pose: Comment connaître la taille de la tête de chaque personne dans une image ?

Nous pouvons faire une estimation raisonnable. En effet, si on considère la distribution des gens autour de chaque personne comme uniforme (ce qui est correct pour une foule dense), on peut dire que la moyenne de la distance entre chaque personne et ses k personnes voisins peut donner une estimation de la taille de la tête. En d’autres termes, plus la distance de chaque personne à ses voisins est grande, plus la taille de sa tête apparaît grande et plus il faut lui attribuer un “chapeau” plus large.

On pourra donc estimer σ de la façon suivante: σi=0.3 x di. di est la distance moyenne de la personne i à ses k voisins et σi est le paramètre de la fonction gaussienne qui représente la personne i.

Architecture du réseau MCNN

Architecture du réseau MCNN³

Le réseau MCNN (Multi-Column convolution neural network) est constitué de 3 branches de réseaux neuronaux convolutionnels en parallèle, chacun d’eux essayant d’extraire des descripteurs en utilisant différents tailles de filtres, et ce afin de résoudre le problème des personnes apparaissant en différentes tailles, notamment à cause de la perspective et des différentes résolutions d’images.

La sortie des 3 réseaux est concaténée dans une seule matrice puis une couche convolutionnelle 1x1 essaye de trouver une fonction qui estime la densité à partir de ces descripteurs.

Apprentissage du réseau

Pour faire l’apprentissage d’un tel réseau, on procède de la manière suivante:

Faire l’apprentissage de chaque branche du réseau indépendamment Faire l’apprentissage du réseau complet en initialisant les paramètres du réseau avec les paramètres obtenus lors de l’étape précédente.

On suit cette procédure car il est difficile de faire l’apprentissage d’un réseau aussi complexe sans avoir une bonne initialisation des paramètres. Avec cette procédure, l’apprentissage du réseau sera plus facile. L’approche MCNN donne une erreur quadratique moyenne de 173 sur la partie A de la base de données et de 41 sur la partie B.

Conclusion

On constate que l’approche MCNN donne de résultats plus concluants que l’approche LBP avec régression. Cependant, l’approche MCNN est plus complexe que l’approche LBP et plus coûteuse en calcul. Donc pour choisir l’une ou l’autre, tout dépendra du besoin. On pourra apporter une préférence particulière plutôt à la vitesse d’estimation, auquel cas on partira plutôt sur l’approche LBP, qui est assez rapide, peu coûteuse, mais moins précise.

Si on cherche une estimation plus précise, on préfèrera l’approche MCNN, certes plus coûteuse mais qui donnera de meilleurs résultats.

Références:

[1] Joseph Redmon and Ali Farhadi. Yolo9000 : better, faster, stronger. In Proceedings of the IEEE conference on computer vision and pattern recognition, pages 7263–7271, 2017.

[2] https://github.com/desenzhou/ShanghaiTechDataset

[3] https://github.com/appstud/Crowd-Counting-With-LBP

[4] Yingying Zhang, Desen Zhou, Siqin Chen, Shenghua Gao, and Yi Ma. Single-image crowd counting via multi-column convolutional neural network. In Proceedings of the IEEE conference on computer vision and pattern recognition, pages 589–597, 2016.