File size: 3,466 Bytes
b510add
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cd05a0
b510add
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cd05a0
b510add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
---
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).