IntroductionGenèse du projetIdentification des objetsArchitecture
DealTracker - Introduction

DealTracker - Introduction

À propos de DealTracker

DealTracker est un outil qui m'a demandé plusieurs années de développement. C'est mon projet personnel le plus abouti, donc si vous ne deviez en connaitre qu'un seul ça devrait être celui-ci. Il s'agit d'un système trouvant automatiquement les meilleures affaires publiées sur les sites d'annonces d'occasion, disponible à tous.

Vous pouvez aller voir mon site internet à l'adresse suivante: https://www.dealtracker.org.

Technologies mises en place

DealTracker repose sur une architecture en plusieurs parties:

Finetuning de modèles de vision permettant d'identifier des objets précis parmi des millions d'images diverses

Résoudre ce problème non trivial m'a demandé deux ans, et 200 000 annotations manuelles.

Le modèle est un classificateur d'images à 146 classes basé sur un ensemble stacké de 4 architectures issues de timm, dont les logits sont fusionnés par deux couches de méta-modèles. L'architecture est entrainée avec un pipeline itératif d'active learning. Chaque modèle, prédicteurs de base ou méta-modèle, est optimisé avec Optuna.

Pour garantir la pertinence et la diversité des exemples annotés, je sélectionne les images non annotées où le modèle est le plus incertain, puis j'applique un algorithme de sélection par diversité (farthest-first traversal sur les embeddings).

Pour gérer le déséquilibre de classes, j'ai utilisé:

  • la Focal Loss
  • Une métrique d'évaluation personnalisée spécifique au problème
  • une data augmentation agressive (AugMix, rotation, perspective, color jitter...).

Tout a été développé avec PyTorch, à bas niveau. Le worker GPU est dans un processus séparé (aioprocessing.AioQueue) avec swap à chaud de modèles, gestion de mémoire explicite, gestion de backpressure dans le pipeline avec sémaphore.

Inférence en production

Le pipeline d'inférence traite les annonces en continu via une architecture asynchrone à plusieurs étapes:

  • Récupération des images
  • Inférence GPU (PyTorch + TensorRT)
  • Agrégation multi-images
  • Filtrage par règles linguistiques
  • Calcul de l'attractivité d'une annonce par rapport au prix médian d'un objet

Le débit du pipeline est de 450 annonces par minutes sur une RTX 3060 Ti.

Service de données, front-end

Pour servir les données à haute performance, j'ai mis en place une API FastAPI.

Côté Front-end, je tenais à avoir les meilleures performances possibles, je me suis donc orienté vers NextJS (app router), avec un output constitué uniquement de fichiers statiques. J'ai beaucoup travaillé sur l'interface et l'optimisation du SEO.

Cette partie m'a demandé de travailler sur des sujets divers:

  • Filtrages géographiques avec Géopandas
  • Design de l'API pour limiter les appels à la base de données
  • Optimisation de la vitesse de service des informations au niveau du cache
  • Définition des flux de données entre le front-end et le backend
  • Étude des meilleures librairies front-end disponible