Aller au contenu principal

Affluence locale

Pour suivre l'affluence locale, en se basant sur le scénario établi, les caméras vont nous envoyer les positions des personnes qu'elles détectent. Chaque caméra n'a conscience que d'elle-même, elle ne regroupe pas toute seule les informations avec les autres caméras, une même personne peut donc être présente dans les données de 2 caméras, et donc identifiées comme 2 personnes différentes. Il est donc nécessaire d'effectuer aussi un traitement des données pour identifier les personnes qui sont les mêmes.

On utilise 4 routes pour le faire :

  • POST /cameras qui permet d'enregistrer une caméra en indiquant ses données (son identifiant, sa position, sa rotation), ainsi que la zone qu'elle filme
  • PUT /cameras/[serial] qui permet à une caméra d'actualiser ses données, en transmettant son identifiant et les positions des personnes détectées
  • GET /areas qui permet de récupérer les données de toutes les zones déclarées. Cela comprend les caméras enregistrées sur chaque zone, ainsi que les personnes détectées
  • GET /areas/[id] qui permet de récupérer les données d'une zone en particulier

Traitement des données

Comme expliqué en introduction de cette page, il est nécessaire de regrouper les positions des personnes détectées pour déterminer si 2 caméras ne voient pas la même personne. Pour cela, plusieurs scénarios ont été imaginés :

  • mettre à jour les données lors de la mise à jour des données d'une caméra. Les données pour les zones seront ainsi à jour, mais si trop de caméras envoient des mises à jour trop souvent, cela risque de poser problème
  • ne mettre à jour que de temps en temps les données des zones, par exemple toutes les 5 secondes en arrière plan. Les données ne seront pas complètement à jour, mais la requête de mise à jour des données d'une caméra est allégées
  • ne mettre à jour les données des zones que lorsque un appel est fait sur l'API pour les récupérer. Les données seront à jour, mais cela implique de stocker plus de données sur les caméras, et de complexifier l'algorithme permettant de regrouper les positions entre les caméras

Pour l'instant, nous sommes partis sur la première solution, mais il est probable qu'une migration soit effectuée vers la deuxième ou la troisième plus tard.

Pour traiter les données, on veut identifier si 2 personnes détectées par 2 caméras sont en réalité les mêmes. Pour cela, on va utiliser comme pour le tracking visuel l'algorithme hongrois, qui permet d'associer des éléments de façon optimale (voir le tracking prédictif pour plus d'informations).
On va donc appliquer cet algorithme aux positions connues et aux positions données par la caméra, ce qui forme les deux groupes de sommets pour appliquer l'algorithme, et relier les sommets des deux groupes par des arêtes de poids égal à la distance entre les points.

hungarian

En appliquant l'algorithme et en ne considérant comme la même personne que les positions suffisamment proches, on peut alors construire une nouvelle liste de positions mise à jour, qui contient à la fois les anciennes et nouvelles positions actualisées.

Cependant, TypeScript ne semble pas se prêter à ce genre d'algorithmes mathématiques, c'est pourquoi il a été choisi de faire un petit service à côté en Python, avec un seul endpoint qui se charge d'appliquer l'algorithme, auquel l'API fait appel lorsqu'elle reçoit les données d'une caméra. A terme, il est probable que ces deux APIs fusionnent afin de ne pas avoir plusieurs APIs qui tournent à la fois.