import matplotlib.
pyplot as plt
import os
import cv2
import numpy as np
def load_images_from_folder(folder):
images = []
labels = []
if not [Link](folder):
print(f"Erreur : Le dossier {folder} n'existe pas.")
return None, None, None
class_names = sorted([Link](folder)) # Trier les noms pour assurer un
ordre fixe
print(f"Classes détectées : {class_names}")
for label, class_name in enumerate(class_names):
class_path = [Link](folder, class_name)
if not [Link](class_path):
print(f"Attention : {class_path} n'est pas un dossier. Ignoré.")
continue
print(f"Chargement des images de {class_name}...")
for file in [Link](class_path):
img_path = [Link](class_path, file)
# Vérifier si c'est bien une image
if img_path.endswith(('.jpg', '.jpeg', '.png')):
img = [Link](img_path, cv2.IMREAD_GRAYSCALE)
if img is None:
print(f"Erreur : Impossible de lire {img_path}")
else:
img = [Link](img, (128, 128))
[Link](img)
[Link](label)
if len(images) == 0:
print("⚠️ Aucune image n'a été chargée. Vérifiez les chemins et le format
des fichiers.")
return [Link](images), [Link](labels), class_names
# 📂 Modifier le chemin du dossier ici
data_folder = r"C:\Users\usr\Desktop\dataset"
# Charger les images avec messages de vérification
images, labels, class_names = load_images_from_folder(data_folder)
if images is not None:
print(f"\n✅ {len(images)} images chargées avec succès.")
else:
print("\n❌ Échec du chargement des images.")
# Vérifier si des images ont été chargées
if images is None or len(images) == 0:
print("❌ Aucune image trouvée. Vérifiez votre dataset.")
else:
# Affichage de 5 images maximum
num_images = min(5, len(images)) # Afficher au maximum 5 images
[Link](figsize=(10, 5)) # Taille du graphe
for i in range(num_images):
[Link](1, num_images, i + 1) # Ajouter un sous-graph
[Link](images[i], cmap='gray') # Afficher en niveaux de gris
[Link](class_names[labels[i]]) # Afficher la classe correspondante
[Link]("off") # Supprimer les axes
[Link]() # Afficher les images
from sklearn.model_selection import train_test_split
# Normalisation des images (convertir les pixels entre 0 et 1)
images = images / 255.0
# Séparation en train (80%) et test (20%)
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2,
random_state=42)
print(f"Train set : {len(X_train)} images, Test set : {len(X_test)} images")
from [Link] import local_binary_pattern, hog
def extract_features(images):
features = []
for img in images:
# LBP - Analyse de texture
lbp = local_binary_pattern(img, P=8, R=1, method='uniform')
lbp_hist, _ = [Link]([Link](), bins=[Link](0, 11), range=(0,
10))
lbp_hist = lbp_hist.astype("float") / (lbp_hist.sum() + 1e-6) #
Normalisation
# HOG - Formes et contours
hog_features, _ = hog(img, orientations=9, pixels_per_cell=(4, 4),
cells_per_block=(1, 1), visualize=True)
# Fusionner LBP et HOG
feature_vector = [Link]((lbp_hist, hog_features))
[Link](feature_vector)
return [Link](features)
# Extraction des caractéristiques sur les jeux de données
X_train_features = extract_features(X_train)
X_test_features = extract_features(X_test)
print(f"Nombre de caractéristiques extraites par image :
{X_train_features.shape[1]}")
# Vérifier si les caractéristiques ont bien été extraites
if len(X_train_features) > 0:
# Sélectionner une image pour affichage
img_index = 0,1,2
img = X_train[img_index]
# Extraction des descripteurs HOG
hog_features, _ = hog(img, orientations=9, pixels_per_cell=(4, 4),
cells_per_block=(1, 1), visualize=True)
# Affichage de l'image originale et des contours HOG
[Link](figsize=(12, 5))
[Link](1, 2, 1)
[Link](img, cmap='gray')
[Link]("Image originale")
[Link]("off")
[Link](1, 2, 2)
[Link](img, cmap='gray')
[Link]("HOG - Contours détectés")
[Link]("off")
[Link]()
else:
print("❌ Aucune caractéristique HOG à afficher.")
from [Link] import SVC
# Création et entraînement du modèle SVM
model = SVC(kernel='linear')
[Link](X_train_features, y_train)
print("Modèle entraîné avec succès !")
from [Link] import accuracy_score, classification_report
# Vérifier si le modèle a été entraîné
if not hasattr(model, "predict"):
print("❌ Erreur : Le modèle n'a pas été entraîné ! Exécutez
[Link](X_train_features, y_train) d'abord.")
else:
# Vérifier si X_test_features n'est pas vide
if X_test_features.shape[0] == 0:
print("❌ Erreur : X_test_features est vide ! Vérifiez l'extraction des
caractéristiques.")
else:
# Faire les prédictions
y_pred = [Link](X_test_features)
# Vérifier si les tailles correspondent
if y_test.shape != y_pred.shape:
print(f"❌ Erreur : y_test et y_pred n'ont pas la même taille !
({y_test.shape} ≠ {y_pred.shape})")
else:
# Évaluation des performances
accuracy = accuracy_score(y_test, y_pred)
print(f"✅ Précision du modèle : {accuracy:.2f}")
# Vérifier si les classes sont correctes
if len(set(y_test)) != len(class_names):
print(f"⚠️ Attention : Nombre de classes incorrect. Vérifiez
class_names = {class_names}")
# Rapport de classification
print("📊 Rapport de classification :")
print(classification_report(y_test, y_pred, target_names=class_names))