Comme le sujet de la base de photos de terrain me titille depuis très longtemps (cela fait plus de 10 ans que je prends des photos géoréférencées pour contribuer ensuite à OpenStreetMap), j’ai exploré plusieurs aspect du sujet ces derniers week-end pour voir quels problèmes sont à résoudre et quels outils peuvent être utilisés.
J’ai identifié plusieurs sujets:
- la collecte (format des images, résolution, metadonnées, fréquence/intervalle)
- le géoréférencement (précision des GPS intégrés aux smartphones, recalage ou pas, trace GPS plus précise
- le floutage
- le catalogage des métadonnées et leur éventuelle augmentation
- l’accès au catalogue via une API (recherche de photos par position, plage temporelle ou autres métadonnées)
- le stockage et distribution (centralisé ou distribué, la redondance)
En quelques week-ends, j’ai fait un petit PoC que vous pouvez voir sur
https://umap.openstreetmap.fr/fr/map/poc-libresvues_719826
Voici une brève description de chaque étape, je rentrerai dans les détails dans un deuxième temps.
Collecte
Les photos récentes sont prises avec un smartphone à 300€ (Redmi Note 10 Pro), avec un GPS courant (mono fréquence). J’ai utilisé l’appli OpenCamera pour prendre les photos en rafale.
Sur certaines séquences, il y a entre 3 et 4 photos pas seconde. Sur d’autres j’ai limité à 2 par seconde maximum, ce qui est suffisant quand on roule à moins de 30km/h en ville.
Les photos plus anciennes (2019) sont prises avec un iPhone 8 et l’appli Mapillary et récupérées avant envoi à Mapillary.
Géoréférencement
Pour les séquences avec plusieurs photos par seconde, le GPS ne donnant une position environ que toutes les secondes, elles ont et recalées par interpolation à l’aide 'un petit script python et exiftool.
Floutage
J’ai utilisé un modèle d’IA qui fait de la segmentation sémantique, entraîné sur des photos du même type (“cityscapes”). Pour accélérer le temps d’analyse, j’ai utilisé un TPU (Tensor Processing Unit) de chez coral.ai, une filiale de Google. Il s’agit d’un circuit spécialisé pour l’inférence, peu coûteux (25$) et très peu énergivore (quelques W).
Ce n’est pas parfait, mais ça permet d’expérimenter.
Ici encore c’est un script python qui traite une photo en la faisant passer dans le modèle puis en générant un masque des zones à flouter et en effectuant ce floutage.
Voici un exemple:
Photo originale réduite
Segmentation sémantique
Masque des zones à flouter (véhicules, personnes)
Résultat flouté
Une autre approche consiste à rechercher spécifiquement visages et plaques d’immatriculation, par exemple avec opencv.
Catalogage
J’utilise exiftool, qui permet de sortir toutes les metadonnées d’un ensemble de photos sous forme de fichier json.
API pour accéder au catalogue
Le catalogue est chargé dans une base postgresql/postgis.
Quelques dizaines de lignes de python permettent d’exposer une microAPI pour interroger la base.
C’est cette API qu’uMap interroge pour obtenir les géométries des séquences et les positions des photos.
Stockage et distribution
C’est un simple serveur web (nginx) qui sert le contenu directement et sans code particulier.