Classification d’Images

La classification d’images constitue l’un des champs d’application les plus emblématiques des réseaux de neurones convolutifs (Convolutional Neural Networks, CNN). Cette tâche consiste à attribuer à chaque image une catégorie prédéfinie en s’appuyant sur l’extraction automatique de caractéristiques visuelles pertinentes. Les CNN se distinguent des approches traditionnelles par leur capacité à hiérarchiser les représentations visuelles : des motifs simples tels que les bords ou les textures dans les premières couches, jusqu’à des structures complexes comme des objets ou des formes spécifiques dans les couches profondes. Dans cette section, nous proposons une mise en pratique de la classification d’images à travers l’entraînement d’un modèle CNN, en mettant en évidence les étapes clés du processus — préparation des données, conception de l’architecture, optimisation et évaluation — afin d’illustrer concrètement l’efficacité de cette approche dans un cas d’utilisation réel.

Fonctions :

  • Classification d’Images (exemple)

    La classification d’images est une tâche d’apprentissage supervisé où l’objectif est d’assigner une étiquette à une image parmi plusieurs classes. Elle repose généralement sur des réseaux de neurones convolutifs (CNN) qui extraient automatiquement les caractéristiques visuelles.

    Importation :

    import tensorflow as tf
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
    from tensorflow.keras.preprocessing.image import ImageDataGenerator

    Attributs :

    Paramètre Type Description Valeur par défaut
    batch_size int Nombre d’images utilisées pour chaque mise à jour du modèle. 32
    epochs int Nombre de fois que le modèle parcourt l’ensemble des données d’entraînement. 10
    steps_per_epoch int Nombre d’étapes (lots d’images) par époque. nb_samples // batch_size
    validation_split float Fraction des données utilisée pour la validation. 0.2

    Exemple de code :

    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 1. Charger le dataset Fashion MNIST
    (X_train, y_train), (X_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
    
    # 2. Normalisation et reshaping
    X_train = X_train / 255.0
    X_test = X_test / 255.0
    X_train = X_train[..., np.newaxis]  # (batch, 28, 28, 1)
    X_test = X_test[..., np.newaxis]
    
    # 3. Liste des classes
    class_names = ["T-shirt", "Pantalon", "Pull", "Robe", "Manteau",
                   "Sandale", "Chemise", "Basket", "Sac", "Botte"]
    
    # 4. Construction du modèle CNN
    model = tf.keras.Sequential([
        tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(10, activation='softmax')  # 10 classes
    ])
    
    # 5. Compilation et entraînement
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    model.fit(X_train, y_train, epochs=5, validation_split=0.1)
    
    # 6. Évaluation
    test_loss, test_acc = model.evaluate(X_test, y_test)
    print(f"\n✅ Accuracy sur les données de test : {test_acc:.4f}")
    
    # 7. Prédictions sur quelques images
    predictions = model.predict(X_test)
    
    plt.figure(figsize=(10, 5))
    for i in range(10):
        plt.subplot(2, 5, i + 1)
        plt.imshow(X_test[i].squeeze(), cmap='gray')
        pred_class = class_names[np.argmax(predictions[i])]
        true_class = class_names[y_test[i]]
        plt.title(f"Préd: {pred_class}\nVrai: {true_class}")
        plt.axis('off')
    plt.tight_layout()
    plt.show()

    Explication du code :

    1. Chargement du dataset Fashion MNIST
    - Dataset de 70 000 images (60 000 train / 10 000 test) en niveaux de gris (28x28 pixels). - Chaque image correspond à un vêtement appartenant à l'une des 10 classes.
    2. Prétraitement des données
    - **Normalisation** des valeurs des pixels : division par 255. - **Ajout d’une dimension** pour le canal (passage à la forme `(28, 28, 1)`).
    3. Définition des noms de classes
    - Liste descriptive des 10 catégories : `["T-shirt", "Pantalon", ..., "Botte"]`.
    4. Construction du modèle CNN
    - **Architecture** : - `Conv2D(32)` + `MaxPooling2D(2x2)` - `Conv2D(64)` + `MaxPooling2D(2x2)` - `Flatten` - `Dense(128, relu)` - `Dense(10, softmax)` - **Forme d’entrée** : `(28, 28, 1)` - **Nombre de classes en sortie** : 10 (activation softmax).
    5. Compilation et entraînement
    - **Optimiseur** : `Adam` - **Fonction de perte** : `sparse_categorical_crossentropy` (car `y_train` n’est pas encodé en one-hot). - **Métrique** : `accuracy` - Entraînement sur 5 époques avec 10% des données utilisées pour la validation.
    6. Évaluation
    - Évaluation sur les données de test. - Affichage de la précision obtenue (`test_acc`).
    7. Prédictions et visualisation
    - Prédiction sur 10 images de test. - Affichage de chaque image avec : - **Classe prédite** (`Préd:`) - **Classe réelle** (`Vrai:`)