YELY_AI_Module / docs /ARCHITECTURE.md
danielxdata's picture
Module IA YELY - CRNN fine-tune, API FastAPI, interface demo
b510add
|
Raw
History Blame Contribute Delete
3.54 kB

Architecture du module IA

Vue d'ensemble

Photo du terminal
      │
      ▼
┌─────────────────────┐
│ preprocessing.py     │  détection de l'écran LCD (contours) puis
│                      │  découpage en 3 lignes (prix / volume / prix_litre)
└─────────┬────────────┘
          ▼
┌─────────────────────┐
│ recognizer.py         │  CRNN fine-tuné : lit chaque ligne, renvoie
│ (models/*.pt)         │  {field, text, confidence} par valeur
└─────────┬────────────┘
          ▼
┌─────────────────────┐
│ postprocess.py        │  normalise les nombres (virgule/point),
│                       │  calcule la valeur manquante, vérifie
│                       │  montant = litres × prix
└─────────┬────────────┘
          ▼
┌─────────────────────┐        ┌─────────────────┐
│ rules.py              │◄──────│ quality.py        │ flou / luminosité
│ décide success/blocage │       └─────────────────┘
└─────────┬────────────┘
          ▼
     réponse API (main.py)

Pourquoi ce découpage en modules séparés

Chaque étage a une responsabilité et une durée de vie différentes :

  • preprocessing et quality : de la vision par ordinateur classique (OpenCV), aucune dépendance au modèle de reconnaissance. Réutilisable même si on change de modèle IA demain.
  • recognizer : la seule brique qui dépend du modèle entraîné. Isolée pour pouvoir la remplacer (nouvelle version du CRNN, ou un autre modèle) sans toucher au reste.
  • postprocess : logique métier pure (aucune I/O, aucun modèle) — donc entièrement testable sans charger le CRNN (voir tests/test_postprocess.py, instantané).
  • rules : la décision finale (bloquer/valider) séparée du calcul, pour pouvoir ajuster les seuils (config.py/config.yaml) sans toucher à la logique de calcul.

Différence avec le prototype précédent (OCR générique)

L'ancienne version du projet (racine du dépôt, src/, api/) utilisait PaddleOCR/EasyOCR : des modèles pré-entraînés génériques, avec toute une mécanique de variantes d'image et de repli entre moteurs pour compenser leur manque de spécialisation. Ce module utilise à la place un modèle entraîné sur nos propres données (voir train/), ce qui simplifie le post-traitement : le CRNN sait déjà quelle ligne correspond à quel champ (par position), il n'y a donc plus besoin d'heuristique de proximité de libellé ni de deviner "quel nombre est le montant" par magnitude — la principale source d'erreur du prototype précédent.

Fichiers clés

Fichier Rôle
app/preprocessing.py détection écran + découpage lignes
app/recognizer.py chargement CRNN + inférence
app/postprocess.py normalisation, calculs, cohérence
app/rules.py porte de décision succès/blocage
app/config.py seuils configurables
app/main.py API FastAPI
train/finetune_doctr.py entraînement du CRNN
docs/LIMITATIONS.md limites connues du modèle actuel