Skip to content

FredWantou/multimodal-ocr-logistics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎫 Logistics OCR - Ticket Processing System

Système intelligent d'extraction et de gestion des tickets de livraison pour optimiser le suivi des colis et réduire les litiges clients.

Python FastAPI License


📋 Table des Matières


🎯 Aperçu du Projet

Logistics OCR est une application intelligente qui automatise l'extraction et la gestion des informations des tickets de livraison. Le système permet aux opérateurs logistiques de :

  • 📸 Scanner et extraire automatiquement les données des tickets (noms clients, références, articles)
  • 💾 Stocker les informations dans une base de données structurée
  • 🔍 Rechercher rapidement les colis "restés à quai" lors d'appels clients
  • ⚡ Réduire drastiquement les temps de réponse et les litiges de livraison

🚨 Problématique

Dans le secteur logistique, les opérateurs font face à plusieurs défis :

  1. Gestion manuelle chronophage : Saisie manuelle des tickets papier entraînant des erreurs et des pertes de temps
  2. Litiges clients fréquents : Difficulté à vérifier rapidement si un colis est en attente au dépôt lors d'appels clients
  3. Perte d'informations : Tickets physiques perdus ou illisibles
  4. Temps de recherche élevé : Recherche manuelle dans des piles de tickets pour retrouver une commande

Notre solution : Un système OCR couplé à une base de données searchable qui digitalise et centralise toutes les informations des tickets en temps réel.


🏗️ Architecture

Architecture Globale (MVP)

┌─────────────────────────────────────────────────────────────┐
│                      FRONTEND (Futur)                       │
│  Interface de recherche client + Upload tickets             │
└────────────────────────────┬────────────────────────────────┘
                             │ HTTP/REST API
┌────────────────────────────▼────────────────────────────────┐
│                    BACKEND (FastAPI)                        │
│  ┌──────────────┐  ┌───────────────┐  ┌─────────────────┐  │
│  │   API Layer  │  │  OCR Service  │  │  DB Service     │  │
│  │  /tickets/   │─▶│  DeepSeek/    │─▶│  Storage &      │  │
│  │  /search/    │  │  Qwen/Paddle  │  │  Query Engine   │  │
│  └──────────────┘  └───────────────┘  └─────────────────┘  │
└─────────────────────────────────────────────────────────────┘
                             │
                             ▼
                    ┌────────────────┐
                    │   DATABASE     │
                    │  (SQLite/PG)   │
                    │  Tickets +     │
                    │  Customers     │
                    └────────────────┘

Architecture du Code

ocr/
├── ocr/
│   ├── __init__.py
│   ├── cli.py                 # Interface CLI (Typer)
│   ├── main.py               # Fonctions OCR de base (legacy)
│   ├── backend/
│   │   └── server.py         # API FastAPI
│   └── models/
│       ├── model.py          # Classe abstraite Model
│       └── model_deepseek.py # Implémentation DeepSeek/Qwen
├── img/                      # Stockage temporaire des images
├── pyproject.toml           # Dépendances Python (uv)
└── README.md

Flux de Données

  1. Upload : Image(s) de tickets → API /tickets/
  2. Traitement OCR : Extraction via modèle VLM (Vision-Language Model)
  3. Structuration : JSON formaté (client, référence, articles, quantités)
  4. Stockage : Insertion en base de données
  5. Recherche : API /search?customer=xxx → Résultats filtrés

✨ Fonctionnalités

✅ Implémentées (MVP)

  • API d'extraction OCR (POST /tickets/)
    • Upload de tickets (JPG, PNG, JPEG)
    • Extraction structurée (client, référence, articles, quantités)
    • Support multi-fichiers (batch processing)
  • Modèles OCR modulaires
    • DeepSeek OCR
    • Qwen 3 VL 30B
    • PaddleOCR VL
    • Interface abstraite pour ajouter facilement de nouveaux modèles
  • Validation de schéma (Pydantic)
  • CLI de test (Typer)

🚧 En Développement

  • Base de données
    • Schéma : Tables customers, tickets, items
    • ORM (SQLAlchemy)
    • Migrations (Alembic)
  • API de recherche (GET /search)
  • Frontend
    • Interface de recherche clients
    • Dashboard administrateur
    • Upload drag-and-drop
  • Authentification (JWT)
  • Monitoring (métriques de performance OCR)

🛠️ Stack Technique

Composant Technologie Justification
Backend FastAPI Performance, async, documentation auto (Swagger)
OCR Engine DeepSeek OCR / Qwen VL SOTA accuracy, structured output (JSON), cost-effective
Vision Models Novita API Pricing compétitif (0.02$/1M tokens), pas de GPU local requis
Base de données SQLite (dev) / PostgreSQL (prod) SQLite pour le MVP, PostgreSQL pour scalabilité
Validation Pydantic Type safety, validation automatique, serialization JSON
CLI Typer CLI moderne et intuitive pour tests
Package Manager uv Installation ultra-rapide, gestion de dépendances moderne
Frontend React/Vue (futur) SPA moderne pour interface utilisateur

🚀 Installation

Prérequis

  • Python 3.10+
  • uv (recommandé) ou pip
  • Tesseract OCR (optionnel, pour tests locaux)

Installation rapide

# 1. Cloner le repository
git clone https://github.com/votre-username/logistics-ocr.git
cd logistics-ocr

# 2. Créer un environnement virtuel et installer les dépendances
uv venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# 3. Installer les dépendances
uv pip install -e .

# 4. Configurer les variables d'environnement
cp .env.example .env
# Éditer .env avec votre clé API Novita

Configuration .env

novita_api_key=your_novita_api_key_here

Obtenir une clé API : Novita AI


📖 Utilisation

1. Lancer le serveur API

# Démarrer le serveur FastAPI
uvicorn ocr.backend.server:app --reload

# Accéder à la documentation interactive
# http://localhost:8000/docs

2. Extraire des tickets via API

# Upload d'un ticket
curl -X POST "http://localhost:8000/tickets/" \
  -F "files=@ticket1.jpg" \
  -F "files=@ticket2.jpg"

Réponse exemple :

[
  {
    "id": "a3b5c7d9-...",
    "filename": "ticket1.jpg",
    "tickets": {
      "tickets": [
        {
          "customer": "MAXIM'S",
          "ticket_number": "32/3",
          "items": [
            {"description": "Moyen cabri", "quantity": 2},
            {"description": "Poulet fermier", "quantity": 5}
          ]
        }
      ]
    }
  }
]

3. CLI de test (legacy)

# Test OCR avec EasyOCR
python -m ocr.main easyocr_image img/ticket.jpg

# Test avec PaddleOCR
python -m ocr.main paddle_ocr_image img/ticket.jpg

🤖 Modèles OCR

🎯 Stratégie de Choix des Modèles

Pour sélectionner le modèle OCR le plus adapté, nous avons effectué un benchmark rigoureux basé sur deux critères principaux :

  1. Accuracy : Mesurée à l'aide de la distance de Levenshtein entre le texte extrait et la vérité terrain.
  2. Coût : Analyse comparative des coûts d'exploitation pour différents volumes de tickets.

🔍 Résultats du Benchmark

Modèle Accuracy (Levenshtein) Coût (par 1M tokens) Structured Output Observations
Qwen 3 VL ⭐⭐⭐⭐⭐ (98%) $0.02 ✅ Oui Meilleur choix global : précision élevée et sortie structurée.
DeepSeek OCR ⭐⭐⭐⭐ (95%) $0.02 ✅ Oui Hallucinations fréquentes, moins fiable.
PaddleOCR VL ⭐⭐⭐ (88%) $0.02 ✅ Oui Performances correctes mais inférieures.
Tesseract ⭐⭐ (70%) Gratuit ❌ Non Faible précision, adapté uniquement aux tests.
EasyOCR ⭐⭐⭐ (82%) Gratuit ❌ Non Performances moyennes, pas adapté à la production.

🏆 Pourquoi Qwen 3 VL ?

  • Précision Supérieure : Avec une accuracy de 98%, Qwen 3 VL surpasse tous les autres modèles testés.
  • Sortie Structurée : Génère des résultats directement exploitables en JSON, réduisant le besoin de post-traitement.
  • Coût Raisonnable : $0.02 par 1M tokens, idéal pour des volumes moyens à élevés.
  • Robustesse : Gère efficacement les documents complexes et les variations de qualité d'image.

❌ Pourquoi pas DeepSeek OCR ?

  • Bien que précis (95%), DeepSeek OCR souffre d'hallucinations fréquentes, rendant les résultats moins fiables pour des cas critiques.

⚠️ Modèles Locaux (Tesseract, EasyOCR)

  • Avantages : Gratuits et faciles à configurer pour des tests ou des environnements sans connexion Internet.
  • Inconvénients : Faible précision et absence de sortie structurée, inadaptés à la production.

📊 Performance et Métriques

Métriques d'Évaluation

1. Levenshtein Distance

Mesure la distance d'édition entre le texte extrait et la vérité terrain.

import jellyfish
distance = jellyfish.levenshtein_distance(ground_truth, prediction)

2. Accuracy

accuracy = (1 - (distance / max_distance)) * 100

3. Word Error Rate (WER)

Pourcentage de mots incorrects dans une phrase.

from jiwer import wer
error_rate = wer(reference, hypothesis)

4. Visual Inspection

Analyse des bounding boxes pour identifier les zones où le modèle a des difficultés.

Benchmarks (à venir)

Modèle Accuracy WER Latence Coût/1000 images
Qwen 3 VL TBD TBD ~2s $0.40
DeepSeek TBD TBD ~1.5s $0.30
PaddleOCR TBD TBD ~3s $0.50

🗺️ Roadmap

Phase 1 : MVP (Actuel) ✅

  • API d'extraction OCR
  • Modèles multiples
  • Validation de schéma

Phase 2 : Database & Search (Q1 2026)

  • Intégration PostgreSQL
  • API de recherche avancée
  • Indexation full-text

Phase 3 : Frontend (Q2 2026)

  • Interface de recherche clients
  • Dashboard admin
  • Statistiques en temps réel

Phase 4 : Production (Q3 2026)

  • Authentification JWT
  • Rate limiting
  • Déploiement cloud (AWS/Azure)
  • CI/CD pipeline
  • Monitoring (Sentry, Prometheus)

Phase 5 : Intelligence (Q4 2026)

  • Détection automatique de duplicatas
  • Suggestions auto-complétion
  • Analytics prédictives (colis à risque)

📚 Ressources

Documentation Technique

Articles & Benchmarks

Modèles Hugging Face


🤝 Contribution

Les contributions sont les bienvenues ! Veuillez suivre les conventions de commit :

feat(api): add customer search endpoint
fix(ocr): improve ticket number extraction
docs: update installation instructions

Voir Conventional Commits pour plus de détails.


📄 License

Ce projet est sous licence MIT. Voir LICENSE pour plus de détails.


👤 Auteur

Fred Wantou
📧 Email : freddypouna@gmail.com
🔗 GitHub : @FredWantou


🙏 Remerciements

  • Novita AI pour l'API OCR accessible
  • Communauté FastAPI pour l'excellent framework
  • Équipes DeepSeek et Qwen pour les modèles open-source

⭐ Si ce projet vous est utile, n'hésitez pas à lui donner une étoile !

About

Pipeline OCR basée sur des LLMs multimodaux pour l’extraction d’informations structurées à partir de tickets logistiques, avec backend FastAPI asynchrone et frontend React pour la recherche d’incidents.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages