Le projet est une application de reconnaissance automatique de codes postaux à partir d'images. L'objectif principal est d'extraire les chiffres d'une image et de les classifier correctement pour reconstuire le code postal.
Le projet utilise des techniques de traitement d'images et de machine learning pour identifier les cavités dans les chiffres et les classifier à l'aide de deux méthodes : les k plus proches voisins (k-NN) et les moyennes de classe.
Le projet commence par extraire les chiffres individuels d'une image contenant un code postal. cette étape inclut :
- le prétraitement de l'image (binarisation, suppression du bruit)
- la localisation de chaque chiffre
- l'isolation de chaque chiffre dans une image séparée
Pour chaque chiffre, le projet extrait un vecteur de caractéristiques qui décrit sa forme. les caractéristiques principales sont :
- l'extraction des cavités (zones vides) dans les directions : nord, est, sud, ouest et centre
- le calcul du ratio de chaque cavité par rapport à la surface totale du chiffre
- optionnellement, l'ajout de propriétés géométriques : solidité, orientation et excentricité
le projet propose deux méthodes pour classifier les chiffres :
cette méthode cherche les k chiffres d'entraînement les plus similaires au chiffre à tester et vote pour la classe la plus représentée parmi ces voisins.
cette méthode calcule la moyenne des vecteurs de caractéristiques pour chaque classe de chiffre. pour classifier un nouveau chiffre, on cherche la classe dont la moyenne est la plus proche.
le projet inclut un module d'évaluation qui teste les deux méthodes de classification sur un ensemble d'images de test. les résultats sont sauvegardés dans des fichiers csv avec les métriques de précision.
postal_code_recognition/
├── src/ # code source principal
│ ├── apprentissage.py # extraction des caractéristiques et entraînement
│ ├── classification.py # classification de nouvelles images
│ ├── extraction.py # extraction des chiffres et des cavités
│ ├── evaluation.py # évaluation des performances
│ ├── utils.py # fonctions utilitaires
│ └── visualisation.py # affichage des résultats
├── images/ # images pour l'apprentissage et le test
│ ├── digits/ # 10 images de chiffres pour l'apprentissage
│ └── postal_code/ # images de codes postaux pour le test
├── weights/ # fichiers de poids sauvegardés
│ ├── features.npy # vecteurs de caractéristiques
│ ├── labels.npy # étiquettes correspondantes
│ └── means.npy # moyennes de classe
└── metrics/ # fichiers d'évaluation
└── evaluation_*.csv # résultats des évaluations
Le projet utilise uv pour gérer les dépendances. pour installer l'environnement :
uv syncLes dépendances principales sont :
- numpy : pour le calcul numérique
- opencv-python : pour le traitement d'images
- scikit-image : pour les opérations avancées sur les images
- matplotlib : pour la visualisation
pour entraîner le modèle sur les images de chiffres :
uv run -m src.apprentissagece script va :
- charger toutes les images de chiffres dans
images/digits/ - extraire les caractéristiques de chaque chiffre
- calculer les moyennes de classe
- sauvegarder les poids dans le dossier
weights/
Pour classifier une image de code postal :
uv run -m src.classificationCe script va :
- charger les poids précédemment entraînés
- extraire les chiffres de l'image
- classifier chaque chiffre
- afficher le résultat final
Pour évaluer les deux méthodes sur l'ensemble de test :
uv run -m src.evaluationCe script va :
- tester les deux méthodes (k-NN et moyennes) sur toutes les images de test
- calculer la précision pour chaque image
- sauvegarder les résultats dans des fichiers csv
Ce module gère :
- le chargement et la binarisation des images
- la localisation des composantes connexes
- l'extraction des cavités en utilisant des éléments structurants directionnels
- l'affichage des résultats d'extraction
Ce module contient :
get_feature_vector(): extraction du vecteur de caractéristiques d'un chiffreprocess_image(): traitement complet d'une image pour extraire les vecteurstraining(): entraînement du modèle
ce module implémente :
k_nearest_neighbors(): classification par k plus proches voisinsnearest_means(): classification par moyennes de classeclassify_image(): fonction principale de classification
Ce module propose :
euclidean_distance(): calcul de la distance euclidienne entre deux vecteurssave_features_labels(): sauvegarde des caractéristiques et labelsload_features_labels(): chargement des poids
Ce module permet :
- l'affichage des chiffres et de leurs cavités
- la visualisation des résultats de classification
Ce module évalue les performances avec :
- une liste d'images de test avec leurs étiquettes
- une fonction d'évaluation qui compare les prédictions avec les vraies étiquettes
- la sauvegarde des résultats dans des fichiers csv
- augmenter le nombre d'images d'entraînement pour améliorer la robustesse
- tester d'autres méthodes de classification (svm, réseaux de neurones)
- optimiser les paramètres des algorithmes
- améliorer le prétraitement des images pour gérer différentes qualités
- implémenter une interface graphique pour l'utilisation
Ce projet utilise une approche basée sur les cavités des chiffres. Cette approche fonctionne bien pour les codes postaux imprimés avec une bonne qualité, mais peut rencontrer des difficultés avec :
- les chiffres manuscrits
- les images de mauvaise qualité ou fortement bruitées
- les chiffres avec des formes non standard
Ce projet a été développé comme application pratique des techniques de reconnaissance de chiffres et de classification en machine learning.
- Rosas BEHOUNDJA