Une plateforme intelligente pour évaluer les véhicules d'occasion
ScanMyCar est une application Streamlit qui combine décodage VIN, extraction de documents, vision par ordinateur et machine learning pour aider les professionnels de l'automobile à estimer précisément le prix d'achat et l'état des véhicules d'occasion.
- Vue d'ensemble
- Fonctionnalités
- Architecture
- Installation
- Guide d'utilisation
- Structure du projet
- Modules clés
- Variables de session Streamlit
- Règles critiques (avant refactor)
- Roadmap
Automatiser l'évaluation des véhicules d'occasion en combinant :
- Décodage VIN via API NHTSA VPIC
- Extraction OCR et parsing de documents (factures, annonces)
- Détection de dommages par vision par ordinateur (YOLO)
- Prédiction ML du risque de panne
- Estimation du prix via modèle de pricing
- Synthèse IA (LLM) pour recommandation finale
Garages professionnels, concessionnaires automobiles, expertises automobiles
| Fonctionnalité | Description | Implémentation |
|---|---|---|
| Décodage VIN | Récupération automatique des métadonnées véhicule | NHTSA VPIC API |
| Préremplissage de formulaire | Extraction intelligente depuis VIN + factures | Heuristiques regex + parsing |
| Upload de documents | Factures PDF, images, annonces | Pdfplumber + OCR |
| Détection de dommages | Identification automatique des zones endommagées | YOLO (ultralytics) |
| Estimation de coûts | Calcul de coûts de réparation | Heuristique bbox + ML |
| Pricing ML | Estimation du prix d'achat | Random Forest (joblib) |
| Prédiction de panne | Score de risque de panne à 12 mois | Modèle ML embarqué |
| Synthèse IA | Recommandation finale et analyse | Groq API (LLM) |
| Historique | Conservation des évaluations en session | Session state Streamlit |
┌──────────────────────────────────────────────────────────────────┐
│ UTILISATEUR (Garage) │
└──────────────────────────────────────────────────────────────────┘
│
┌────────────┴────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ STEP 1: VIN │ │ Upload Factures │
│ + API VPIC │ │ (OCR + parsing) │
└────────┬────────┘ └────────┬─────────┘
│ │
└───────────┬───────────┘
▼
┌──────────────────────┐
│ STEP 2: Informations │
│ (formulaire éditable)│
└──────────┬───────────┘
▼
┌──────────────────────┐
│ STEP 3: Factures │
│ (ajout/vérification) │
└──────────┬───────────┘
▼
┌──────────────────────────────────────┐
│ STEP 4: Photos + Détection │
│ YOLO + Coûts de réparation │
└──────────────┬───────────────────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌────────────┐ ┌────────────┐
│ Pricing │ │ Breakdown │ │ Damages + │
│ ML │ │ ML Model │ │ Repair │
└────┬─────┘ └─────┬──────┘ │ Cost │
│ │ └─────┬──────┘
└──────────────────┼────────────────────┘
▼
┌───────────────────┐
│ LLM (Groq API) │
│ Synthèse finale │
└─────────┬─────────┘
▼
┌───────────────────┐
│ RÉSULTAT FINAL │
│ + RECOMMANDATION │
└───────────────────┘
┌─────────────────────────────────────────────┐
│ INTERFACE UTILISATEUR │
│ (Streamlit + HTML/CSS) │
├─────────────────────────────────────────────┤
│ ORCHESTRATION & LOGIQUE MÉTIER │
│ (app.py - gestion du formulaire) │
├─────────────────────────────────────────────┤
│ MODULES D'ANALYSE & EXTRACTION │
│ ┌─────────┬────────────┬──────────────┐ │
│ │ OCR │ VIN API │ Document │ │
│ │ Parsing │ (NHTSA) │ Processing │ │
│ └─────────┴────────────┴──────────────┘ │
├─────────────────────────────────────────────┤
│ MODÈLES ML & VISION PAR ORDINATEUR │
│ ┌──────────┬────────────┬──────────────┐ │
│ │ Pricing │ Breakdown │ YOLO Damage │ │
│ │ Random │ Predictor │ Detection │ │
│ │ Forest │ │ │ │
│ └──────────┴────────────┴──────────────┘ │
├─────────────────────────────────────────────┤
│ API & SERVICES EXTERNES │
│ ┌──────────┬────────────┬──────────────┐ │
│ │ Groq LLM │ NHTSA API │ Pdfplumber │ │
│ └──────────┴────────────┴──────────────┘ │
└─────────────────────────────────────────────┘
- Python >= 3.8
- pip (gestionnaire de paquets)
- Clés API : Groq (optionnel pour LLM sans serveur)
cd CarScanpython -m venv .venv
# Sur Linux/macOS
source .venv/bin/activate
# Sur Windows
.venv\Scripts\activatepip install -r requirements.txtCréer un fichier .env à la racine du projet :
# Groq API (pour LLM)
GROQ_API_KEY=your_groq_api_key_here
# Autres clés si nécessaire
# DATABASE_URL=...
# OCR_API_KEY=...Les modèles doivent être présents dans le répertoire models/ :
models/modele_prix.pkl— Modèle de pricing (Random Forest)models/modele_liquidite.pkl— Modèle de liquiditémodels/encodeurs_prix.pkl— Encodeurs pour pricingmodels/encodeurs_liquidite.pkl— Encodeurs pour liquiditémodels/car_damage_model.pt— Modèle YOLO pour détection de dommages
Note : Ces fichiers sont générés via les notebooks de training et doivent être téléchargés séparément.
streamlit run app.pyL'application sera accessible à http://localhost:8501
- Entrer le VIN (17 caractères) du véhicule
- L'API NHTSA remplit automatiquement certains champs (marque, modèle, année, etc.)
- Optionnel : Upload des factures (PDF, JPG, PNG) pour préremplissage intelligent
- Les factures sont parsées et leurs informations extraites (km, accidents, état pneus, etc.)
- Cliquer sur « Suivant » pour continuer
Important : Ne pas auto-naviguer après lecture du VIN. L'utilisateur doit explicitement cliquer « Suivant ».
- Vérifier/corriger les champs préremplis
- Compléter les champs manquants :
- Kilométrage, portes, places
- Carburant, transmission, entrainement
- État batterie/pneus/freins
- Historique d'entretien
- Problèmes moteur signalés
- Les badges
[VIN]et[Facture]indiquent la source des données - Cliquer sur « Suivant »
- Ajouter/vérifier les factures d'entretien et réparations
- Les nouvelles factures sont parsées et préremplissent automatiquement certains champs
- Cette étape est critique pour la validation humaine
- Cliquer sur « Suivant »
- Upload des photos du véhicule
- Détection automatique des dommages via YOLO
- Affichage des dommages avec confiance et estimation des coûts de réparation
- Affichage de la prédiction ML de risque de panne (probabilité à 12 mois)
- Cliquer sur « Terminer l'évaluation »
- L'IA génère une synthèse et une recommandation finale
- Estimation du prix brut (Argus)
- Pénalité de liquidité (temps de revente estimé)
- Coûts de réparation (dommages détectés)
- Score de risque de panne
- Recommandation synthétisée par l'IA basée sur tous les facteurs
CarScan/
├── app.py # Application principale Streamlit
├── api_call.py # Wrapper LLM, OCR, appels API
├── damage_detector.py # Détection YOLO de dommages
├── breakdown_predictor.py # Modèle ML prédiction panne
├── pricing_engine.py # Modèle ML estimation prix
├── requirements.txt # Dépendances Python
├── README.md # (Ce fichier)
├── Logo_ScanMyCar.png # Logo de l'application
├── .env # Variables d'environnement (à créer)
├── autos.csv # Dataset de référence (optionnel)
├── models/ # Répertoire des modèles ML
│ ├── modele_prix.pkl
│ ├── modele_liquidite.pkl
│ ├── encodeurs_prix.pkl
│ ├── encodeurs_liquidite.pkl
│ └── car_damage_model.pt
├── temp_photos/ # Photos uploadées (temporaire)
├── model_training.ipynb # Notebook d'entraînement des modèles
├── pricing_and_resale_time_models.ipynb # Notebook de pricing & liquidité
└── Exemple de test complet/ # Fichiers de test/documentation
Responsabilités :
- Gestion complète du wizard (4 étapes)
- Gestion de la session Streamlit (
eval_data,eval_photos, etc.) - Navigation entre pages (landing, evaluate, evaluations, profile)
- Préremplissage via VIN et factures
- Affichage badges
[VIN]et[Facture] - Construction du prompt final pour l'IA
Points d'entrée clés :
_map_vpic_result_to_eval_data()— Transformation résultat VIN APIparse_invoice_files()— Orchestration du parsing des facturesprefill_eval_data_from_invoice_text()— Extraction heuristique depuis texte_build_formulaire()— Construction du résumé texte pour l'IAevaluate_car_page()— Wizard principal (4 steps)
Responsabilités :
- Appel à l'API Groq (LLM)
- Extraction OCR de documents (PDF, images)
- Construction du prompt système
Fonctions principales :
api_call(formulaire_text)— Envoi du prompt à l'IAextract_document_text(data, filename)— OCR + parsing documentsearch_parts_prices()— Recherche de prix de pièces (optionnel)
Responsabilités :
- Chargement du modèle YOLO
- Détection de dommages sur images
- Estimation des coûts de réparation
Fonctions principales :
load_model()— Cache la ressource YOLOdetect_damage(image_path)— Retourne liste de bounding boxes + confiancesestimate_damage_cost(damages)— Calcul heuristique : $200 base + $0.05/pixel
Responsabilités :
- Chargement du modèle ML de prédiction
- Évaluation du risque de panne à 12 mois
Fonction principale :
predict_breakdown_probability(vehicle_features)→(prob_pct, risk_level)- Retourne probabilité en % et niveau de risque (low, moderate, high, very high)
Responsabilités :
- Préparation des features pour le modèle Random Forest
- Encoding des variables catégorielles
- Prédiction du prix et calcul de la pénalité de liquidité
Fonction principale :
estimer_prix_et_liquidite(data_dict)→(prix_estime, malus_liq, jours_revente)
| Variable | Type | Scope | Description |
|---|---|---|---|
eval_step |
int (1-4) |
Session | Étape courante du wizard |
eval_data |
dict |
Session | Données du formulaire principal |
eval_photos |
list[File] |
Session | Photos uploadées |
eval_invoices |
list[File] |
Session | Factures uploadées |
invoice_text_parts |
list[str] |
Session | Texte extrait des factures (parsé) |
parsed_invoice_names |
list[str] |
Session | Noms des factures déjà parsées (pour éviter reparse) |
_prefilled_fields |
list[str] |
Session | Clés remplies par VIN (pour badges) |
_invoice_prefilled_fields |
list[str] |
Session | Clés remplies par factures (pour badges) |
damage_results |
list[dict] |
Session | Résultats détection dommages par photo |
all_damages |
list[dict] |
Session | Agrégation de tous les dommages |
repair_cost |
float |
Session | Coût total estimé des réparations |
evaluations |
list[dict] |
Session | Historique des évaluations (session courante) |
logged_in |
bool |
Session | État d'authentification utilisateur |
user |
dict |
Session | Infos utilisateur (email, company_name, etc.) |
page |
str |
Session | Page active (landing, evaluate, evaluations, profile) |
eval_data = {
# Identifiant véhicule
"vin": "1HGBH41JXMN109186",
# Métadonnées VIN
"marque": "Honda",
"modele": "Civic",
"annee": 2018,
"carrosserie": "Sedan",
"taille_moteur": 1.8,
"cylindres": 4,
"entrainement": "Traction",
"finition": "EX",
"usine": "Japan",
"securite": "...",
# Données utilisateur
"km": 85000,
"portes": 4,
"places": 5,
"type_carburant": "Essence",
"transmission": "Manuelle",
"vitesses": 5,
# État du véhicule
"condition": "Bon",
"owners": "Second",
"accidents": 0,
"entretien": "Good",
"etat_batterie": "Good",
"etat_pneus": "Good",
"etat_freins": "Good",
"engine_issues": False,
"damages": "Quelques rayures mineures",
# Métadonnées
"_prefilled_fields": ["marque", "modele", "annee"],
"_vin_fetched": "1HGBH41JXMN109186",
}