--- 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": ".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).