← Tous les articles

3 min de lecture Mis à jour le

Reconnaissance de dossards par IA

Purple Rouen · Vision par ordinateur · IA

Lors des éditions 2025 et 2026 de la Purple Rouen, une course organisée par les étudiants, les photographes de l’association Le Studio INSA ont capturé au total des milliers de clichés.

Le problème : comment permettre à des centaines de coureurs de retrouver facilement leurs photos au milieu d’une galerie volumineuse, sans imposer aux photographes un tri manuel long et fastidieux ?

J’ai conçu un pipeline de traitement de bout en bout, mêlant vision par ordinateur, ingénierie des données et un peu de front-end, pour indexer automatiquement chaque photo grâce au numéro de dossard des coureurs.

Détection des dossards

La première étape consiste à isoler les dossards sur les photos. J’ai entraîné un modèle YOLO (You Only Look Once) pour détecter et recadrer (crop) spécifiquement les zones de l’image contenant un dossard.

path: /chemin/vers/dataset
train: images
val: images
nc: 1
names: ['Dossard']
from ultralytics import YOLO

# On charge le modèle de base
model = YOLO("yolov8n.pt") 

results = model.train(
    data="data.yaml",   
    epochs=50,          
    imgsz=640,          
    batch=8,            
)

Mosaïque de crops de dossards détectés et recadrés par le modèle YOLO

Extraction OCR spatial

Une fois ces petits extraits générés, j’ai utilisé l’API Google Cloud Vision pour l’extraction du texte (OCR). Sauf qu’une simple lecture textuelle ne suffit pas : sur un dossard de la Purple Rouen, il y a beaucoup de “bruit” visuel, la distance (“5km”), l’année (“Edition 2026”), ou encore des numéros de téléphone d’urgence.

Pour différencier le vrai numéro du coureur du reste du texte, j’ai mis en place une extraction spatiale. Au lieu de récupérer uniquement le texte, mon script Python enregistre dans un fichier JSON les coordonnées exactes (bounding boxes X et Y) et la hauteur en pixels de chaque mot détecté.

Filtrage géométrique

Une bonne pratique en data engineering, c’est de découpler l’extraction de la transformation. En stockant les retours bruts de Google Vision dans un cache JSON local, j’ai pu développer et affiner ma logique de post-traitement sans jamais avoir à rappeler (et payer) l’API.

Pour trouver le bon numéro de dossard parmi tous les textes lus, j’ai fini par implémenter un post-traitement basé sur la géométrie pure. On isole d’abord les “mots” composés strictement de 3 ou 4 chiffres, puis on élimine ceux écrits trop petit, ce qui filtre d’un coup les mentions du type “Edition 2026” ou les numéros de téléphone. Parmi les nombres qui restent, on garde celui dont la coordonnée Y est la plus haute sur l’image : c’est en général le numéro porté sur la poitrine, au-dessus du reste.

Ce pipeline géométrique regroupe ensuite les numéros trouvés sur les différents crops sous le nom de l’image originale, dans un fichier JSON final prêt à être consommé par le site web.

Conclusion

Ce projet couvre toute la chaîne, de l’entraînement du modèle au script Python d’automatisation, jusqu’à l’intégration front-end de la recherche par dossard.

Les participants peuvent désormais retrouver leurs photos par numéro de dossard plutôt que de parcourir manuellement la galerie complète, sur les milliers de clichés pris par les photographes de l’INSA lors des éditions 2025 et 2026.