YELY_AI_Module / README.md
danielxdata's picture
Ajoute la doc de soutenance, corrige Vercel->Netlify, bouton stats
6cd05a0
|
Raw
History Blame Contribute Delete
3.47 kB
metadata
title: YELY AI Module
emoji: ⛽
colorFrom: blue
colorTo: green
sdk: docker
pinned: false
license: mit
app_port: 7860
short_description: Solution d'IA basée sur la vision par ordinateur

YELY — Module IA de vérification pompiste

Module autonome livré pour le cahier des charges YELY : lecture automatique du terminal de pompe (prix, volume, prix du litre), calcul et vérification de cohérence, exposés via une API.

Contrairement à la version précédente du prototype (qui s'appuyait sur PaddleOCR/EasyOCR, des OCR génériques), ce module utilise un modèle CRNN entraîné sur nos propres données (models/crnn_fuel_pump_best.pt) — voir docs/LIMITATIONS.md pour un bilan honnête de sa précision actuelle et des pistes d'amélioration.

Structure

yely_ai_module/
├── app/
│   ├── main.py           # API FastAPI (/analyze)
│   ├── preprocessing.py  # détection écran + découpage en lignes
│   ├── recognizer.py     # chargement du CRNN + inférence
│   ├── postprocess.py    # normalisation numérique, calculs, cohérence
│   ├── rules.py          # moteur de règles métier (blocage/succès)
│   └── config.py         # seuils configurables (config.yaml)
├── models/
│   └── crnn_fuel_pump_best.pt   # modèle sérialisé (livrable)
├── train/                # scripts d'entraînement (reproductibilité)
├── tests/                # tests unitaires (postprocess, règles)
├── web/                  # interface web de démo (déploiement Netlify)
├── docs/                 # documentation par module + limites identifiées
├── Dockerfile            # déploiement Hugging Face Spaces
└── requirements.txt

Installation

cd yely_ai_module
pip install -r requirements.txt

Lancer l'API

uvicorn app.main:app --host 0.0.0.0 --port 8000

Ne pas utiliser --reload en usage normal : ça redémarre tout le worker (et donc recharge le modèle CRNN, ~30-60s) à chaque modification de fichier.

Appeler l'API

curl -X POST http://127.0.0.1:8000/analyze \
  -F "image=@photo_pompe.jpg" \
  -F "fuel_price=700" \
  -F "driver_id=chauffeur-42" \
  -F "pompiste_id=pompiste-7" \
  -F "station_id=station-3"

Réponse

{
  "success": true,
  "image_quality": "valid",
  "detected_liters": 14.28,
  "detected_amount": 10000.0,
  "fuel_price": 700.0,
  "calculated_amount": 9996.0,
  "calculated_liters": null,
  "is_consistent": true,
  "confidence_score": 0.93,
  "message": "Données vérifiées avec succès.",
  "driver_id": "chauffeur-42",
  "pompiste_id": "pompiste-7",
  "station_id": "station-3",
  "transaction_datetime": "2026-07-05T20:00:00+00:00",
  "photo_reference": "<uuid>.jpg"
}

Champs conformes au §13 du cahier des charges. Le fuel_price fourni par l'appelant (système YELY) fait toujours autorité sur un prix lu à l'écran (règle métier n°1).

Tests

pytest tests/

Ré-entraîner le modèle

cd train
python prepare_doctr_dataset.py   # si le dataset a changé
python finetune_doctr.py --epochs 60

Voir docs/LIMITATIONS.md avant de ré-entraîner : le principal facteur limitant est la diversité du jeu de données, pas les hyperparamètres.

Déploiement

Voir docs/WORKFLOW.md §6 : frontend (web/) sur Netlify, API sur Hugging Face Spaces (ce dépôt, via le Dockerfile à la racine).