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
---
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
```bash
cd yely_ai_module
pip install -r requirements.txt
```
## Lancer l'API
```bash
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
```bash
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
```json
{
"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
```bash
pytest tests/
```
## Ré-entraîner le modèle
```bash
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).