Ressources numériques en sciences humaines et sociales OpenEdition Nos plateformes OpenEdition Books OpenEdition Journals Hypothèses Calenda Bibliothèques OpenEdition Freemium Suivez-nous

Configuration d’un environnement d’annotation sous QGIS

L’annotation de données, ou la saisie de données, est un préalable essentiel à l’IA. Car plus il y aura de données, si possible de bonne qualité, et mieux elle apprendra.

L’IA permet d’atteindre des facteurs d’échelle tels que dessiner 1000 emprises de stationnement pour l’entraînement, peut potentiellement vous permettre d’en détecter des dizaines de milliers, voire soyons fous, des millions.

Dans le précédent article, nous avons esquissé quelques réflexions autour de l’annotation de données sous QGIS vis-à-vis de celle sur des logiciels plus classiques en IA comme LabelStudio.

Ici, nous nous intéresserons à la configuration de l’environnement technique sous QGIS pour l’annotation, toujours en nous intéressant aux emprises de stationnement.

Tout d’abord, définissons ce que nous voudrons caractériser sur ces emprises :

  • La géométrie bien entendu ;
  • La forme du stationnement (voir billet précédent) qui peut être en bataille, épi ou longitudinal (parallèle) ;
  • La destination Personnes à Mobilité Réduite.

Environnement

L’annotation doit remplir plusieurs objectifs :

  • Obtenir beaucoup de données ;
  • Avoir des données de bonne qualité ;
  • Fournir aux annotateurs un environnement de travail adapté.

Selon moi, les trois piliers de l’annotation pourraient être ceux-ci :

Concernant la charge mentale associée à la tâche d’annotation, il est essentiel de fournir un environnement adapté, ergonomique : double écran, outils conviviaux. Il est important de faire des pauses, de s’arrêter lorsqu’une fatigue cognitive apparaît, de diversifier les tâches.

Concernant la reconnaissance, il est inutile de se le cacher : l’annotation pâtit d’une mauvaise image, peu valorisée d’un point de vue sociétal, mal payée, souvent dissimulée, car confiée le plus souvent à des “travailleurs du clic”, le plus souvent localisés dans des pays du tiers-monde ou en voie de développement. Alors qu’il s’agit du métier essentiel de l’IA.

La reconnaissance de cette activité est un point essentiel : il est important de la rétribuer correctement, y compris symboliquement. Les auteur.es de ces annotations ne sont jamais cités, noyés dans la masse des données.

Géométrie et sémantique

Précédemment, nous avons vu que l’intérêt de QGIS était de pouvoir dissocier la saisie des géométries de celle des attributs.

Il y a deux façons principales de saisir les objets, pour lesquels on pourra juger de la rapidité, à augmenter, et de la charge mentale associée, à réduire au maximum.

La première consiste à saisir les géométries dans une première passe, puis d’éditer les attributs sémantiques dans une seconde.

La seconde consiste à saisir objet par objet, soit pour chaque objet de le dessiner, puis de saisir ses attributs.

Je ne me suis pas intéressé à des études sur la charge cérébrale associée à l’annotation, mais il me semble qu’un continuum de mêmes activités, ou d’activités similaires, est à la fois à même d’atteindre une certaine rapidité, mais aussi de réduire la charge mentale d’un cerveau qui changera moins de mode à chaque fois.

Personnellement, dans le cas présent, je découperais le projet en trois phases

  • La saisie des géométries ;
  • Une pause ☁️ ;
  • La caractérisation de la forme de stationnement ;
  • Une pause ☁️ ;
  • La caractérisation de la place PMR ou pas PMR ;
  • Fini !

Ergonomie du poste de travail

N’étant pas ergonome, je vous laisserai le soin de consulter vers des articles traitant de ce sujet.

Concernant la station assise, je pense qu’elle pourrait être questionnée. La tâche d’annotation étant une tâche harassante, je pense qu’il faut nous autoriser à bouger, à agiter ses jambes, et donc de s’autoriser la station debout.

Concernant les écrans, dans l’idéal, il faut disposer :

  • d’un écran pour la saisie des géométries, par exemple à gauche ;
  • d’un autre pour la visualisation ou l’édition des attributs, à droite.

Cependant, si vous n’avez pas de double écran, vous pouvez émuler cet environnement en choisissant d’insérer la table d’attributs dans le dock à droite grâce à ce bouton :

Déplacez ensuite la table à droite :

Comme sur l’image ci-dessus, vous pouvez alléger l’interface en supprimant le contrôle des couches, puisque vous n’agirez que sur la couche Places, et en positionnant l’outil d’ajout de polygones à gauche.

Concernant les souris, certaines souris assez sophistiques disposent de touches configurables dont certaines pourraient correspondre à des classes différentes de l’objet : un bouton pour PMR, un autre pour Non PMR, par exemple.

Dessin

Pour dessiner les places, vous pouvez activer l’outil de forme, en choisissant le mode Rectangle à partir de trois points.

Dans ce mode, vous saisissez deux points, le troisième point crée un rectangle déporté, projeté. Le rectangle s’agrandit au fur et à mesure où vous éloignez le troisième point.

Formulaires

Type liste de valeurs

Dans un premier temps, nous allons créer un formulaire afin de remplir l’ensemble de ces champs.

Concernant la forme du stationnement, nous pouvons créer un champ forme et configurer le formulaire sous la forme classique d’une liste déroulante :

Derrière, la donnée est modélisée d’une façon propre, respectant le standard.

Cependant, lors du remplissage, cela demandera deux clics : un clic pour déployer pour la liste et un clic pour choisir l’item.

Deux clics :

Personnellement, afin de faciliter la saisie, je préfèrerai créer un champ par forme de type booléen : bataille, epi et longitudinal

Même si cette modélisation n’est pas correcte d’un point de vue standard, elle permettra de n’opérer qu’un seul clic en cochant directement le type de forme.

N’oublions pas l’adage, :

🧙 Le mieux est parfois l’ennemi du bien

Cela dit, cela n’empêche pas par la suite de transformer la donnée au bon standard et de réunir les valeurs des trois colonnes dans un champ forme.

L’expression QGIS de transformation sera :

CASE
WHEN bataille is TRUE THEN 'bataille'
WHEN epi is TRUE THEN 'épi'
WHEN longitudinal is TRUE THEN 'longitudinal'

Ainsi, dans le process, nous aurions la donnée d’annotation à transformer ensuite en donnée brute, celle qui pourrait être par exemple diffusée en OpenData. Attention cependant à veiller à la compatibilité des deux modèles.

Cas booléen simple

Intéressons-nous à présent à la caractérisation PMR ou pas PMR.

Pour cela, les choses sont assez simples : il suffit de créer un champ PMR de type booléen. Ainsi, nous aurons une case à cocher pour dire si la place est PMR ou pas.

Il est possible de choisir la valeur NULL pour avoir trois modalités :

  • FALSE (Non PMR)
  • TRUE (PMR)
  • NULL (vide, soit pas caractérisée).

Visuellement, on peut faire la différence sur la case à cocher entre une place Non PMR et une place non caractérisée car la place avec la valeur NULL apparaîtra avec un rectangle gris.

Tandis que la place Non PMR (FALSE) apparaîtra avec un rectangle non coché.

Décocher la case nécessitera de cliquer deux fois, ce qui peut être pénible à la longue, d’autant plus qu’il y a bien davantage de places Non PMR que de places PMR.

Ce que je préfère faire est de créer deux champs booléens :

  • pmr
  • non_pmr

En mettant la valeur à FALSE (décoché) par défaut à toutes les deux.

  • S’il y a FALSE pour les deux, alors cela veut dire que la place n’a pas été caractérisée.
  • S’il y a l’une des deux valeurs, alors cela signifie que la place a été caractérisée.
  • Par contre, s’il y a les deux valeurs à TRUE, cela doit provoquer une erreur.

Vous pouvez faire ce contrôle de cohérence dans QGIS, dans les contraintes en ajoutant l’expression sur les deux champs :

pmr is not non_pmr

Ainsi, on aura ceci si les champs sont mal remplis :

NB : Vous pouvez changer le message en “NON MAIS OH CA VA PAS LA TÊTE !”

Par contre, si les informations sont bien saisies, on a :

🎉 Youpi !

Saisie multiple

Le plugin QuickMultiAttributeEdit permet de changer très facilement les attributs d’un ensemble d’objets, par exemple pour mettre un ensemble de places en non PMR.

Vous les sélectionnez, puis changez la valeur en ouvrant la fenêtre facilement par le raccourci F10.

Des fois, il y a des plugins tout simples qui vous changent la vie !

Configurer la vue attributaire

Dans le cadre d’une saisie en deux temps, la seconde passe s’intéresse à l’édition des attributs associés à la place de stationnement.

Passez dans un premier temps la table en mode formulaire en ayant préalablement sélectionné dans la vue formulaire des propriétés de la couche uniquement les champs qui vous intéressent pour le remplissage (ma phrase est un peu trop longue, j’espère que vous avez suivi), de façon encore une fois à alléger l’interface et réduire la charge.

Le entités sont ordonnées par fid. Cela peut être bien : si vous vous étiez arrêté.e la veille à l’entité 500, notez que vous devrez reprendre à la 501e.

En haut, pour la visualisation rapide, vous pouvez afficher une expression qui vous indiquent les entités qui n’ont pas encore été remplies :

format('%1 %2',"fid", if(pmr is FALSE and non_pmr is FALSE , 'à voir', 'ok'))

Vous pouvez même filtrer les entités qui seront seulement à regarder en allant dans le filtre avancé de la table en bas en tapant pmr is FALSE and non_pmr is FALSE :

Il y a des boutons très pratiques qui permettent de naviguer aisément sur la carte d’entité en entité, que je vous conseille d’activer (soit le déplacement à échelle constante (pan), soit le zoom sur l’entité (1)) :

Clavier

https://upload.wikimedia.org/wikipedia/commons/6/60/Christian_Clavier_2011.jpg

Utiliser le clavier est très efficace par rapport à utiliser la souris.

En effet, la souris nécessite :

  • de solliciter le cortex visuel pour déplacer la souris là où c’est nécessaire ;
  • de solliciter le poignet, ce qui peut, à terme, faire mal aux articulations ;
  • d’activer plusieurs régions et organes de notre corps ;
  • Et nous sommes de gros feignants.

Vous pouvez le plugin Go2NextFeature pour passer d’une entité à une autre. Notamment, le raccourci F6 permet avec cette extension de passer à la prochaine entité.

Personnellement, je préfère configurer moi-même mes raccourcis. Notamment, je configure un raccourci Control+Flèche droite pour aller à l’entité suivante et Control+Flèche gauche pour la précédente.

Aller dans Préférences, Raccourcis Clavier

Après avoir cliqué sur Modifier, tapez votre combinaison de touches, pour moi Control + Flèche droite

Chercher également “Modifier l’entité précédente de la table d’attributs”

Conclusion

Dans cet article, nous avons vu quelques réflexions autour de la modélisation des données pour l’annotation en envisageant un modèle de données basique.

Nous avons vu comment configurer les champs de formulaires, y compris avec des contraintes.

Nous avons aussi vu comment configurer l’environnement de travail, ainsi que la vue formulaire en table d’attributs pour naviguer aisément entre entités, cibler celles à qualifier.

Nous avons vu comment configurer des raccourcis Clavier.

Nous avons, je l’espère, ri de temps en temps.

A suivre

Dans un prochain article, nous verrons comment renseigner automatiquement des champs utiles grâce aux expressions QGIS.

Goodie

Vous avez peut-être remarqué ce raccourci très utile à côté du nom de ma couche :

C’est grâce au plugin Attribute Shortcut.

Un clic sur cette icône affiche automatiquement la table attributaire. Très simple et pratique.

Annotation GéoIA

Dans ce billet, nous allons nous intéresser à l’annotation de données sous QGIS vis-à-vis d’autres outils plus classiques en IA comme Label Studio ou LabelMe, en nous intéressant à l’objet parking.

L’annotation de données sous QGIS peut être considérée comme une variante très proche, finalement, voire même équivalente, de la digitalisation de données (au sens où peuvent l’entendre les dessinateurs classiques).

Sur un outil carto, les finalités de la digitalisation et de l’annotation sont assez différentes : pour l’une, le porter-à-connaissance, l’observation et l’analyse du territoire, pour l’autre l’entraînement d’IA, mais la technique demeure assez similaire.

Une différence notable entre les deux concerne le contenu de la tâche : tandis que la digitalisation de données cartographiques concerne en général, dans un même continuum, soit une diversité d’objets : des routes, des infrastructures, des bâtiments, soit une diversité d’attributs, comme des niveaux de caractérisation (par exemple pour l’occupation du sol), l’annotation IA, elle, se concentre en général sur un objet bien précis qu’on vise à détecter sur des images, que l’on saisira à la chaîne, si nécessaire en le déclinant sur un nombre limité de classes, ce qui confère à l’opération un caractère moins esthétique et gratifiant, plus répétitif et monotone.

Le séquençage d’opérations pour l’annotations sous QGIS se différencie d’outils comme Label Studio ou LabelMe sur plusieurs points.

Label Studio

Les logiciels classiques d’annotation IA fonctionnent image par image, en général non géoréférencées, bien que cela n’empêche nullement d’utiliser des jpeg ou encore des png auxquels associer des world files (que QGIS peut d’ailleurs générer lors d’atlas), respectivement jpw et pngw.

Sous Label Studio, on crée un projet, par exemple Parkings :

Il faut préciser quelle interface d’annotation utiliser, ici segmentation par polygones.

Il faudra ensuite définir les classes d’objet. Pour cela, un petit état de l’art s’impose.

Standards de données et configuration de l’annotation

Nous nous intéresserons à la forme du stationnement.

Pour l’état de l’art, on peut regarder :

  • les schémas de données liés au stationnement ;
  • les données existantes sur le sujet.

Concernant les schémas de données, nous pouvons aller sur :

  • schema.data.gouv.fr;
  • le wiki d’OSM.

Sur schema.data.gouv.fr, il existe un schéma associé aux emprises de stationnement :

https://schema.data.gouv.fr/macaron-ai/onstreet-parking-schema

Le schéma définit les champs suivants :

🙁Nous ne voyons pas de champ sur la forme de stationnement.

Par contre, nous voyons un champ places calculées. Or, le calcul du nombre de places dépend de la forme du stationnement, en plus de ses dimensions en largeur et longueur.

En effet, un rangement en bataille comporte plus de places qu’un rangement en épi sur la même surface.

Il est important de connaître la forme du stationnement pour déduire le nombre de places

Il est dommage que ce champ Forme n’apparaisse pas dans le schéma. Mais il est toujours possible de faire une proposition pour améliorer le standard !

En revanche, nous trouvons l’information de la forme de stationnement sur le Wiki d’OpenStreetMap

https://wiki.openstreetmap.org/wiki/FR:Street_parking

OSM peut être d’une aide très précieuse, à la fois pour récupérer des données d’annotation, mais aussi pour accéder à des standards folksonomiques très complets.

Nous trouvons la même modélisation pour la donnée d’emprises de stationnement de la Ville de Paris :

Revenons-en à notre annotation sous Label Studio.

Nous définissons nos classes de cette façon :

On importe les images et on commence à saisir les données.

Concernant la saisie proprement dite, on choisit le libellé, puis on dessine.

A noter qu’on peut utiliser un raccourci clavier pour chaque classe, 1 pour bataille, 2 pour épi et 3 pour longitudinal.

Aussi, le combinaison Ctrl+Enter permet de soumettre l’annotation, et de passer à l’image suivante.

Les raccourcis clavier permettent d’être beaucoup plus rapide et sollicitent moins les articulations que la souris.

On voit que le processus est différent sous Label Studio par rapport à QGIS, car sous QGIS, on dessine l’objet, puis on le classe (logique pour un logiciel de carto).

On peut noter que Label Studio ne permet donc pas de procéder en deux phases, à savoir :

  • Une tâche graphique consistant à dessiner les objets, qui pourrait être confiée à un dessinateur expert ;
  • Une tâche sémantique consistant à classer chaque objet selon sa catégorie, qui pourrait dans le cas présent être confiée à n’importe qui.

De ce point de vue, QGIS autorise une certaine souplesse et une organisation du travail que ne permet pas Label Studio (séparation du dessin et de la sémantisation).

A noter qu’on pourrait très bien alimenter Label Studio pour la tâche de caractérisation sémantique à partir des produits de QGIS.

Cela aurait un intérêt afin de profiter de l’interface de labellisation de Label Studio mais cela demande en revanche de l’ingénierie de la donnée pour exporter, réaffecter les classes à la géodonnée d’origine. L’intérêt est selon moi assez faible.

Il vaut mieux essayer de faire de QGIS une station d’annotation performante, ce que nous approfondirons par la suite, d’autant plus que si vous amenez des collègues à contribuer, cela peut être le prétexte à une mini-formation QGIS 😉.

Label Studio est néanmoins un excellent outil d’annotation. Il permet d’annoter collaborativement grâce son accès web, de suivre facilement l’état d’avancement du projet d’annotation, et d’identifier l’auteur.e de chacune.

QGIS permet néanmoins de s’en approcher par l’utilisation de bases de données type PostgreSQL, de vues ou de Virtual Layers, ce que nous verrons dans un prochain billet.

Voici comment exporter les annotations sous Label Studio :

Par souci de commodité, j’ai choisi de limiter l’annotation à un objet surfacique.

Voici le résultat.

[
    {
        "id": 36,
        "annotations": [
            {
                "id": 30,
                "completed_by": 1,
                "result": [
                    {
                        "original_width": 981,
                        "original_height": 822,
                        "image_rotation": 0,
                        "value": {
                            "points": [
                                [
                                    50.67154310273576,
                                    42.736486486486484
                                ],
                                [
                                    27.88350276882387,
                                    71.62162162162163
                                ],
                                [
                                    26.32655591371188,
                                    84.7972972972973
                                ],
                                [
                                    27.034259029671876,
                                    86.82432432432432
                                ],
                                [
                                    35.243615174807836,
                                    81.25
                                ],
                                [
                                    36.65902140672783,
                                    73.1418918918919
                                ],
                                [
                                    59.588602363831725,
                                    43.41216216216216
                                ]
                            ],
                            "closed": true,
                            "polygonlabels": [
                                "épi"
                            ]
                        },
                        "id": "r1KkcNC-WY",
                        "from_name": "label",
                        "to_name": "image",
                        "type": "polygonlabels",
                        "origin": "manual"
                    }
                ],
                "was_cancelled": false,
                "ground_truth": false,
                "created_at": "2025-08-18T06:22:54.603031Z",
                "updated_at": "2025-08-18T06:36:13.453192Z",
                "draft_created_at": "2025-08-18T06:20:50.017499Z",
                "lead_time": 937.94,
                "prediction": {},
                "result_count": 1,
                "unique_id": "47da71f6-5e78-4b57-a4a6-21c8acb2bf46",
                "import_id": null,
                "last_action": null,
                "bulk_created": false,
                "task": 36,
                "project": 20,
                "updated_by": 1,
                "parent_prediction": null,
                "parent_annotation": null,
                "last_created_by": null
            }
        ],
        "file_upload": "bcc78a2c-01.jpeg",
        "drafts": [],
        "predictions": [],
        "data": {
            "image": "\/data\/upload\/20\/bcc78a2c-01.jpeg"
        },
        "meta": {},
        "created_at": "2025-08-18T06:16:25.727527Z",
        "updated_at": "2025-08-18T06:36:13.522814Z",
        "inner_id": 1,
        "total_annotations": 1,
        "cancelled_annotations": 0,
        "total_predictions": 0,
        "comment_count": 0,
        "unresolved_comment_count": 0,
        "last_comment_updated_at": null,
        "project": 20,
        "updated_by": 1,
        "comment_authors": []
    }
]

points comprend les coordonnées de chaque point du polygone. Cependant, il s’agit de coordonnées relatives aux dimensions de l’image, et non de coordonnées géographiques.

Les données annotées sont à des formats JSON, ou XML, non natifs pour les SIG si bien que pour les intégrer à ces derniers, il sera nécessaire de réaliser quelques transformations, et de créer quelques scripts.

LabelMe

Sur LabelMe, le processus est un peu différent, et plus proche de QGIS.

On saisit un objet, puis on renseigne sa classe.

Les classes s’alimentent au fur et à mesure qu’on progresse dans l’annotation.

Finalement, ce comportement peut être atteint sous QGIS en utilisant le type “Valeurs uniques” dans la configuration du formulaire QGIS (bien cocher “Editable”)

Nous obtiendrons ceci à la saisie d’un objet :

IA et géo

La librairie GeoAI de Qiusheng Wu vise à spatialiser l’ensemble des traitements de données IA.

Ce sont comme des branchements aux librairies IA les plus communes (telles que torch), ce qui est bien pratique pour consolider l’environnement de travail et ne pas faire des aller-retours entre un environnement IA classique et SIG.

Signalons aussi l’outil geodeep qui permet de détecter des arbres, voitures, routes depuis des images aériennes.

Une des réalisations de Qiusheng Wu est la librairie SamGeo.

Segment Anything est un modèle qui, sur la base d’un point ou d’un rectangle posé sur une image, parvient à deviner la surface à considérer. On voit rapidement l’intérêt pour la géomatique.

SamGeo peut fournir un objet surfacique géoréférencé à intégrer directement dans votre SIG à partir d’un point géoréférencé ou d’une BBOX.

Voici un résultat que l’on peut obtenir avec SamGeo :

Notons d’ailleurs l’existence du plugin GeoOSAM qui intègre SAM dans QGIS.

QGIS

L’annotation de données sous QGIS peut emprunter une variété de chemins.

Grilles

Sous QGIS, pour une tâche de segmentation, ou de détection, on doit découper la zone à investiguer en carreaux afin de préparer les données nécessaires à l’entraînement d’une IA. Chacun de ces carreaux fournira l’image sur laquelle réaliser l’entraînement.

Dans certains cas, les dalles à utiliser fourniront naturellement les images sur lesquelles réaliser l’entraînement.

Dans ce cas, pour avoir la grille associée, il suffit d’en créer le tableau d’assemblage. en choisissant le tableau contenant les dalles

Ce tableau d’assemblage fournira la grille de suivi de l’état d’avancement des annotations. Nous verrons comment activer ce suivi dans un prochain billet.

Dans le cas où la zone serait très grande ou les données d’une précision telle que cela nécessiterait de considérer un tamis plus fin, il sera nécessaire de réaliser soi-même la grille.

Voici comment générer une grille sous QGIS :

On utilisera l’atlas pour générer les images le long de la grille.

Remarque sur d’autres objets de couverture

On pourrait se dire que des objets type parcelles fourniraient des objets corrects à partir desquels réaliser l’atlas et les images d’entraînement, mais cela a plusieurs inconvénients :

  • Les parcelles seront de taille différente, et les images en sortie correspondront à des échelles différentes ;
  • Si deux parcelles saisies sont contigües, certains objets pourront apparaître sur deux images, voire plus, ce qui équivaut à surentraîner le modèle IA sur ces objets.

La grille garantit une homogénéité des tailles et qu’il n’y ait pas de recouvrement, et donc d’objets surreprésentés.

Sachant qu’il est d’usage d’associer aux IA une fonction d’augmentation qui génèrera une variante synthétique, augmentée, du jeu de données, où les images auront été tournées, changées d’échelle (zoomées/dézoomées), ce qui permettra d’envisager une variété de situations possibles, soit de généraliser un maximum, sans avoir à réaliser davantage d’annotations.

Ici, nous avons considéré sous QGIS le cas d’usage “saisie de parkings”.

Masques basiques

Sur une tâche de type classification, où l’on doit classer des places préalablement détectées, par exemple en place PMR / place non PMR, QGIS permettra, par le biais des masques, dans l’atlas, de faire abstraction de ce qui environne la place de façon à ce que l’IA ne cherche pas à y trouver des motifs.

Sous QGIS, on utilisera le style :

  • Polygones inversés ;
  • Ensemble de règles ;
  • L’expression @atlas_featureid = $id

Voici comment générer l’atlas dans ce cas de figure :

(1) Dans un premier temps, on choisit la couche Places sur laquelle réaliser l’export.

(2) Il est important que l’identifiant de l’objet apparaisse dans le fichier d’export image, sinon on ne retrouvera pas nos petits 🐥.

On insère la carte. Comme on ne peut préjuger de l’orientation de la place, on choisit une image carrée de même hauteur et largeur

Voici le rendu pour cette place :

On exporte les images dans un dossier datasets dans lequel on mettra un dossier :

  • IS-PMR (pour les images de places PMR)
  • NOT-PMR (pour les images de places non PMR)

Pour cela, on utilise l’option de filtrage lors de l’export de l’atlas :

Ici, les images seront à mettre dans le dossier IS-PMR.

L’expression handicapee is False sera à utiliser pour le dossier NOT-PMR

Masques avancés

Dans d’autres cas où l’on devrait considérer l’environnement proche, par exemple pour l’élimination de faux positifs lors d’une détection de places de parkings, on pourra :

  • Appliquer une marge autour de la place assez significative pour intégrer l’environnement :
  • Réaliser différents types de masques, plus ou moins progressifs, et tester les performances du modèle selon ces derniers.

Voici un exemple avec un masque de type “dégradé selon la forme” :

Cas d’une place qu’on a notée comme “bien détectée”, qui servira à l’entraînement

Cas d’une place qu’on a notée comme “mal détectée”, qui servira à l’entraînement

Nous sommes sur cette image à proximité d’un terrain de sport et l’IA a détecté le marquage du terrain comme celui d’une place de parking.

Sous Label Studio ou LabelMe, la réalisation de ces masques nécessiterait de post-traiter les images et de réaliser un script, par exemple sous Python, ce qui serait plus complexe.

En résumé

Nous avons :

  • Pressenti que QGIS pouvait fournir un environnement approprié pour annoter des images ;
  • Analysé qu’il permettait d’organiser le travail et de répartir les tâches en fonction des envies et compétences de chacun, notamment en séparant les tâches géométriques des tâches de caractérisation sémantique ;
  • Observé qu’il fournissait un environnement de choix pour produire les images d’entraînement, sans nécessité de programmation, grâce à la fonction Atlas.

A suivre

Dans de prochains billets, nous verrons :

  • Comment configurer QGIS afin de saisir/annoter des objets de manière efficace, toujours sur l’exemple des parkings ;
  • Comment utiliser les expressions pour pré-renseigner certaines valeurs ;
  • Comment suivre l’avancement des annotations dans un cadre collaboratif.

Line meteor gradients with data-defined start and end colors

Doing line gradients in QGIS is an interesting challenge.

Anita Graser gave a hack in a post.

Lutra Consulting had an idea of gradient colored meshes, but they didn’t reach their goal to develop it.

But the question asked by Tammo on Twitter was quite special. Tammo wanted to apply gradients on lines, and data-define the starting and ending color along a certain color ramp.

https://twitter.com/tammojan/status/1361629516804800512

Here is my result, that I also gave on StackOverflow. It uses a hack based on interpolating points along a line and coloring them based on their position.

How to do this ?

First, set your line to geometry generator to Points

Then, apply this expression to have interpolated points along the line :

collect_geometries(
  array_foreach(
    generate_series(0, length($geometry), 0.000001), -- here, we add a point every 0.000001 unit (I am in WGS84)
    line_interpolate_point($geometry, 
    @element
  )
)
You can not see it, but there are very little points !

Here is a zoomed-in image of the line :

The points are very near from one another. I don’t know if you can see them. That’s why it looks like lines.

Finally, just set the filling color according to the position of the point along the line, and along the subsetted color ramp :

ramp_color( -- this function allows you to select one particular color along a color ramp
  'Viridis', -- I ❤ Viridis
  scale_linear(
    @geometry_part_num, -- @geometry_part_num is the number of the point along the line (its position)
    0, @geometry_part_count, -- @geometry_part_count is the number for points along the line
    "start"/10, "end"/10 -- my values are between 0 and 10, so 10/10 gives 1 (the max of the color ramp)
  )
)
Here it is !

What if you made them meteors ?

Just set the size of each point from a min to a max :

scale_linear(
  @geometry_part_num,
  0, @geometry_part_count,
  0, 10 -- 10 : max size
)

So, what could be the use of such a rendering ?

Imagine you want to visualize the routes that connect the places with the most people, or that will connect places with few people.

Or, for instance, imagine you want to see the “cost” of going from one place to another, depending on relief.

This type of rendering could be useful to see the change of a particular variable between two states (before – after or origin – destination).