Partage d'expérience Panoramax et computer-vision (IA si vous préférez)

Je vais tenter de résumer ici ce que j’ai appris sur les technos de computer-vision qu’on peut utiliser avec Panoramax. N’hésitez pas à poser des questions, je complèterai le post initial si besoin.

Oui, c’est de “l’IA” mais pas générative, et donc des techniques assez éprouvées et nettement moins problématiques à tout niveau que les IA génératives.

Pour Panoramax, j’ai essentiellement utilisé YOLO (You Only Look Once), proposé par Ultralytics et open-source qui est un outil parmi les plus connus et utilisés.

Il y a plusieurs tâches possibles en vision par ordinateur:

  • le détection
  • la classification
  • la segmentation
  • l’estimation de profondeur ou de distance (ce que ne propose pas YOLO)
    etc

Pour Panoramax, on utilise actuellement les deux premières pour:

  • détecter les visages, plaques d’immatriculation et panneaux du code de la route
  • classer les panneaux détectés

Dans les deux pas les différentes étapes par lesquelles on va forcément passer sont :

  • l’annotation (pour préparer les données pour l’entraînement)
  • l’entraînement du modèle
  • l’inférence, c’est à dire utiliser le modèle pour détecter ou classer

Détection

Elle consiste à chercher dans une image ce qui peut ressemble aux différentes classes d’objets que l’on cherche comme les visages, les plaques d’immatriculation, les panneaux du code de la route.

Il est préférable d’avoir de grandes catégories, sans aller trop dans le détail. On n’a pas par exemple créé une classe pour chaque type de panneau, mais une grande classe avec tout ce qui ressemble à un panneau pour ensuite utilise un modèle de classification.

La détection consomme pas mal de ressources et prend du temps, car il faut passer en revue un grand nombre de pixels. Avec l’augmentation de la définition des images, il faut aller chercher au loin visages et plaques pour les flouter en essayant d’en oublier le moins possible (faux négatifs).

Sur certaines images cela peut dépasser une dizaine de secondes avec des GPU un peu anciens comme ceux que l’on utilise actuellement sur nos serveurs (GTX 1070/1080).
C’est quasiment inexploitable sans GPU (donc sur CPU) où des images 360° de près de 100Mpx peuvent prendre 10 minutes à être analysées !

Annotation pour la détection

L’annotation se fait sur des images typiques, les plus variées possibles en terme de qualité, de type de caméra, de conditions de lumières, pour que le modèle fonctionne correctement avec toute l’étendue de qualité et défauts des images qu’il devra analyser par la suite.

Pour notre modèle principal de détection, on a actuellement de l’ordre de 3000 images annotées, c’est à dire où on a repéré par un rectangle les zones de l’image à détecter en indiquant la classe correspondante (visage, plaque, panneau).

Pour que l’entraînement produise un modèle de qualité, il faut tout annoter systématiquement et de façon homogène sur toutes les images afin de ne pas créer de confusion. Oublier quelques visages sur une image fera que le modèle pourra considérer que ce qui ressemblait à cela ne soit finalement pas des visages à détecter.

Conséquence de ceci: si on veut ajouter une nouvelle classe d’objet à détecter en plus de celles déjà annotées, il faut le faire sur toutes les images déjà annotées. Il est donc préférable de savoir à l’avance ce qu’on va vouloir détecter pour correctement annoter dès le départ.
Pour éviter ça on peut toutefois aussi sélectionner des images nouvelles où seul le nouveau type d’objet à détecter est présent.
Une autre option consiste à entraîner un tout autre modèle mais cela nécessitera de faire une passe d’inférence en plus, assez coûteuse en ressources.

Pour Panoramax, on a profité du passage systématique par l’API de floutage pour ajouter la détection des panneaux qui nous semblait prioritaire. Ceci se fait sans surcoût de temps/ressources au moment de l’inférence mais ceci n’est pas généralisable à tout type d’objet, le risque étant aussi d’amoindrir la précision de détection de ce qui est à flouter (priorité de cette API).

Des logiciels en ligne (qu’on peut aussi faire tourner localement) permettent d’annoter collaborativement les images. Nous avons utilisé label-studio.

A savoir: pour ne pas favoriser une classe plus qu’une autre, il faut tenter d’avoir autant d’annotations dans chaque classe, ce qui est une contrainte supplémentaire quand on veut détecter de nouveaux types d’objets sur une annotation et un modèle existant.

Entraînement pour la détection

Label-studio permet d’exporter les annotations au format attendu par YOLO.

L’entraînement prend du temps et plus il y a d’images annotées, plus cela prend du temps, mais meilleure est le modèle entraîné.

Il faut aussi un GPU avec assez de VRAM, car les images vont être chargées dans le GPU.

On ne part pas de zéro pour l’entraînement, mais d’un modèle YOLO pré-entraîné proposé par Ultralytics qu’on va spécialiser avec nos annotations. En gros, le modèle est capable d’analyser des images et de faire des détections généralistes, mais on va affiner ça, c’est le “fine-tuning”.

YOLO propose différentes versions de modèles, les dernières sont les plus abouties (on en est à la version 12). Il y a aussi différentes tailles de modèles, les plus petits seront plus rapide et auront besoin de moins de VRAM, mais ils seront moins précis, et inversement.
Il y a un juste milieu à trouver entre la précision, les ressources nécessaires et le temps de traitement.

L’entraînement peut prendre du temps, de quelques heures à quelques jours en fonction de la taille du modèle, du GPU utilisé, de la quantité de données annotées.
Ce n’est pas un problème, on ne va pas le refaire tous les jours.

Les données annotées sont séparées en deux, qu’on ne mélangera jamais pour ne pas nuire au résultat :

  • une partie pour l’entraînement
  • une partie pour la validation de l’entraînement, c’est à dire estimer si le modèle est bon ou pas

L’entraînement se fait par étapes successives que l’on appelle “epoch” et à chaque étape on a une phase entraînement et une phase validation pour voir si le modèle s’améliore ou se dégrade epoch après epoch.
Cela permet de faire évoluer (automatiquement) les paramètres d’entraînement et on recommence 10, 100, 1000 fois jusqu’à ce que ça ne s’améliore plus (ou qu’on a fixé un nombre maximale d’epoch).
Oui, c’est la logique de la “pédagogie de la répétition” qu’on applique !

Inférence : utiliser le modèle pour “prédire”

Pour la détection sur Panoramax, plus la résolution de l’image est élevée plus cela va prendre de temps pour deux raisons: plus de pixels à analyser et… besoin de faire des détections à plusieurs résolution.

En effet, on a remarqué que si l’on veut correctement détecter des objets très proches ou lointain, il faut réduire la résolution ou s’approcher de la résolution d’origine pour avoir le moins de faux négatifs.

Les “faux négatifs” correspondent à des parties non détectées alors qu’il aurait fallu les détecter.
Les “faux positifs” sont des détections à tort (une affiche de pizza prise pour un visage, véridique)

Pour les faux négatifs, on peut compléter les données d’entraînement par des photos où des détections ont manqué que l’on va annoter.

Pour les faux positifs, c’est plus compliqué car on ne peut pas aussi directement informer le modèle, sauf en ajoutant ces images sans annotation à part là où c’est pertinent.

Pour les visages et les plaques, les faux positifs sont moins problématiques (légalement) que les faux négatifs, et c’est l’inverse pour les panneaux.

Pour chaque prédiction, l’inférence va retourner une bounding-box et un taux de confiance. On peut décider de flouter avec un taux de confiance bas pour limiter les faux négatifs et ne prendre en compte les panneaux qu’avec un taux de confiance plus élevé.

Résumé sur la détection

  • L’annotation est assez longue et très manuelle, de sa qualité dépendra la qualité du modèle
  • Détecter de nouveaux types d’objets se fait soit:
    • en complétant un modèle existant et donc en complétant (systématiquement) une annotation existante
    • en entraînant un nouveau modèle, mais cela veut dire faire plus d’inférences
  • le temps d’inférence augmente avec la résolution et peut être relativement élevé… donc pas forcément applicable sur l’ensemble des images

Classification

Son but est de trier des images dans leur intégralité.

Dans le cas des panneaux, lors de la phase de détection, on découpe la zone détectée et c’est juste cette zone qu’on va tenter de classer pour reconnaître le type de panneau.

La classification est beaucoup plus économe en ressources car elle se fait sur un nombre limité de pixels, typiquement des images de 224 pixels de côté (donc seulement 0.05 Mpx)

Annotation pour la classification

Ici pas besoin d’outil comme label-studio, on peut simplement ranger dans un même dossier toutes les images d’exemple d’une même classe: un dossier pour les sens interdits, un autre pour les panneaux biche, un pour les panneaux moutons, etc…

On peut descendre dans le détail quand ceux-ci sont utiles et visuellement identiques ou très similaires: un dossier pour chaque valeur de limite de vitesse (il n’y en a qu’une dizaine), par contre il y a trop de valeurs pour les hauteurs maximales pour faire de même.

Quelques dizaines d’exemples peuvent suffire à un premier entraînement.

On peut avoir plusieurs centaines de classes, pour les panneaux on est actuellement à plus de 250 avec de très bons résultats sur plus de la moitié.

Entraînement pour la classification

Il est plus rapide que pour la détection, car il manipule moins de pixels (comme l’inférence d’ailleurs).

Même principe d’epoch et de données d’entraînement et de validation.

On peut reboucler, c’est à dire commencer une première annotation avec quelques classes et un nombre limité d’exemples, entraîner un premier modèle, puis l’utiliser sur le reste des images pour les pré-classer et refaire un tri manuel avant de recommencer.

Sur les panneaux, j’ai fait ça plus d’une douzaine de fois en commençant par une dizaine de types de panneaux pour aboutir à 70000 images annotées en 250 types différents.

J’ai aussi créé des classes “poubelle” qui regroupent les faux positifs issus de la détection. Ceci permet au modèle de bien identifier que ce n’est pas un panneau mais autre chose comme une enseigne qui ressemble à un panneau, voire des panneaux qui ne sont pas dans le code de la route (interdit aux chiens, ou aux… camping-car).

Plutôt que de repartir du modèle pré-entraîné par YOLO, je suis reparti du précédent modèle déjà entraîné sur les panneaux, ce qui permet de bénéficier des acquis précédents.

C’est aussi comme cela que j’ai procédé pour ré-entraîner le modèle de classification sur les panneaux d’un autre pays, en partant du modèle entraîné sur les panneaux français et en le re-spécialisant sur ceux des Pays-Bas. Quelques heures pour annoter, 1h30 pour l’entraînement sur mon laptop.

Inférence pour la classification

Elle est TRES rapide… quelques ms par image.

La prédiction va sortir une liste de classes possibles avec leur probabilité, la première étant la plus probable.Si il y a peu de différence avec la seconde… méfiance mais cela veut dire qu’on a un taux de confiance déjà assez peu élevé car proche de 0.5 !

Pour les tags sémantiques remis dans Panoramax, je me limite à un taux de confiance de 0.8 à 0.9 minimum.

Résumé pour la classification

  • plus facile à annoter
  • beaucoup plus légère en terme de ressources
  • très rapide
  • un grand nombre de classes est possible
  • un bon complément de la détection

Il y a plein de choses possibles, mais voici une façon simple qui pourrait se généraliser pour la détection d’objets via les tags sémantiques dans Panoramax.

En ajoutant un tag sur une partie d’image, on fait une annotation qui peut ensuite est récupérée automatiquement par un script (à écrire, mais pas trop compliqué).

Avec assez de tags sémantiques identiques (quelques centaines), on peut avoir de quoi entraîner un modèle de détection.

Je pense que c’est le moyen le plus simple de faire participer à une annotation collaborative, directement depuis la visionneuse d ePanoramax.

14 Likes

Merci pour ce long exposé (dont je ne suis pas sûr d’avoir tout appréhendé à la première lecture :blush: ).

J’aurais deux questions :

  1. y a-t-il quelque-chose qu’un contributeur lambda puisse faire pour aider dans l’un de ces processus (sur ses propres images versées à Panoramax ou sur des images existantes) ?

  2. Pour les panneaux, je pense que l’objectif est au minimum d’alimenter plus tard des suggestions de cartographie (via Osmose, par exemple). Dans ce cas, il me semble qu’il serait cool de détecter aussi (peut-être indépendamment) les panneaux blancs textuels parfois associés aux panneaux officiels du code de la route. Par exemple le “sauf riverains” sous un panneau sens interdit.
    Je ne suis pas sûr que cette remarque soit très pertinente (mais je me lance quand même) :

    • parceque c’est peut-être beaucoup d’énergie pour pas grand chose
    • parceque sans reconnaissance du texte, cela réduit l’intérêt
    • parcequ’on peut toujours considérer que les contributeurs qui s’appuieront sur ces reconnaissances pour cartogrphier devront obligatoirement s’appuyer sur la consultation de l’image panoramax originale complète (pour bien sûr gérer les erreurs de classification, ou bien pour détecter et interpréter ces panneaux complémentaires).

En tous cas, merci pour ce boulot !

J’ai répondu à la première partie dans le message initial car c’est généralisable.

Pour les panonceaux, oui ils sont plus qu’utiles, voire indispensables pour comprendre le sens complet du panneau principal.

Un cas très courant est le B6d “Arrêt interdit” et ses différents “sauf”:

  • M6h : sauf PMR
  • M6i : sauf recherche électrique

Ceux là, je les ai traité comme une classe différente lors de la classification des panneaux car ils vont le plus souvent ensemble :

On a aussi bien sûr les M9v “sauf vélos”. Certains sont toutefois difficile à exploiter car en texte libre, ce qui inclut même le “RAPPEL” qui n’a pas de type dédié.

Actuellement on voit dans la visionneuse les panneaux détectés, pour certains (pas encore tous), on a leur classification.

J’ai entraîné 2 autres modèles pour les panonceaux:

  • un premier qui va prendre l’extrait d’une photo où figure un panneau (un petit peu étendu vers le bas) et détecter panneau et pannonceau(x) afin de les séparer
  • un second qui va classer les panonceaux

La classification des panonceaux a encore besoin d’être affinée, mais certains types sont déjà plutôt bien traités. L’idéal est de conserver le lien logique entre le panneau et ses panonceaux, pour avoir un ensemble sémantique réutilisable.

Voir cet exemple de tag où le tag ajouté est osm|traffic_sign=FR:B6d;FR:M6h qui traduit qu’ils sont associés.

Dans tous les cas, c’est une aide à trouver les aiguilles dans l’immense meule de foin, mais ça ne remplace pas la validation humaine pour ajouter ces informations par la suite dans d’autres bases (OSM, voire la BD Topo car ça intéresse aussi bien sûr fortement l’IGN et pas mal de services publics).

1 Like

Voici les types de panonceaux annotés actuellement :

M1          M4g      M8a                      M9z-PAR-TEMPS-DE-PLUIE   M9z-SAUF-VEHICULES-AGRICOLES
M11c1-E     M4h      M8b                      M9z-PASSAGE-SURELEVE     M9z-SAUF-VEHICULES-AUTORISES
M2          M4i      M8c                      M9z-PROPRIETE-PRIVEE     M9z-SECOURS
M3a-droite  M4m      M8d                      M9z-RAPPEL               M9z-SIGNAL-AUTO
M3a-gauche  M4s      M8e                      M9Z-SAUF-BUS             M9z-SORTIE-POMPIERS
M3b-droite  M4u      M8f                      M9Z-SAUF-BUS-SCOLAIRE    M9z-SORTIE-VEHICULES
M3b-gauche  M4v      M9c                      M9z-SAUF-CHANTIER        M9z-SUR-LE-TROTTOIR
M3d         M4x      M9d                      M9z-SAUF-CONVOIS-EXCEPT  M9z-TRANSIT
M4a         M4z1     M9v                      M9z-SAUF-CYCLISTES       M9z-VERGLAS
M4b         M4z2     M9z                      M9z-SAUF-DESSERTE        zz
M4c         M5-STOP  M9z-BANDES-RUGUEUSES     M9z-SAUF-LIVRAISONS      zz-panneau
M4d1        M6a      M9z-DES-DEUX-COTES       M9z-SAUF-POLICE
M4d2        M6h      M9z-ECOLE                M9z-SAUF-RIVERAINS
M4e         M6i      M9Z-INTERDIT-HORS-CASES  M9z-SAUF-SERVICE
M4f         M6j      M9z-PARKING-PRIVE        M9z-SAUF-TAXIS

“zz” est une classe “poubelle”

Il y a 16000 images annotées actuellement.

1 Like