Reconnaissance Faciale

Fonctions :

  • Reconnaissance Faciale (exemple)

    La reconnaissance faciale permet de localiser et/ou identifier un ou plusieurs visages dans une image ou une vidéo. Elle peut s'appuyer sur des méthodes simples comme les classifieurs Haar (OpenCV) ou sur des réseaux de neurones convolutifs (CNN) pour des résultats plus précis.

    Exemple de code :

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.datasets import fetch_lfw_people
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import LabelBinarizer
    import tensorflow as tf
    from tensorflow.keras import layers, models
    
    # 1. Charger le dataset LFW
    lfw = fetch_lfw_people(min_faces_per_person=50, resize=0.5)
    X = lfw.images  # (n_samples, height, width)
    y = lfw.target
    target_names = lfw.target_names
    print("Classes:", target_names)
    
    # 2. Normalisation et format pour CNN
    X = X / 255.0
    X = X[..., np.newaxis]  # (n_samples, height, width, 1)
    
    # 3. Encodage one-hot des labels
    lb = LabelBinarizer()
    y_encoded = lb.fit_transform(y)
    
    # 4. Séparation en train/test
    X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)
    
    # 5. Construction du CNN
    model = models.Sequential([
        layers.Conv2D(32, (3,3), activation='relu', input_shape=X.shape[1:]),
        layers.MaxPooling2D(2,2),
        layers.Conv2D(64, (3,3), activation='relu'),
        layers.MaxPooling2D(2,2),
        layers.Flatten(),
        layers.Dense(128, activation='relu'),
        layers.Dense(len(target_names), activation='softmax')
    ])
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.summary()
    
    # 6. Entraînement
    history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.1)
    
    # 7. Évaluation
    loss, acc = model.evaluate(X_test, y_test)
    print(f"\n✅ Test Accuracy: {acc:.4f}")
    
    # 8. Affichage de quelques prédictions
    y_pred = model.predict(X_test)
    y_pred_classes = np.argmax(y_pred, axis=1)
    y_true = np.argmax(y_test, axis=1)
    
    plt.figure(figsize=(12,6))
    for i in range(10):
        plt.subplot(2,5,i+1)
        plt.imshow(X_test[i].squeeze(), cmap='gray')
        plt.title(f"Préd: {target_names[y_pred_classes[i]]}\nVrai: {target_names[y_true[i]]}")
        plt.axis('off')
    plt.tight_layout()
    plt.show()

    Explication du code :

    1. Chargement des données LFW (Labeled Faces in the Wild)
    - Dataset : visages de personnes célèbres avec `min_faces_per_person=50` (filtre les classes rares). - `X` contient les images (dimensions : n_samples × height × width). - `y` contient les indices des classes. - `target_names` contient les noms correspondants aux classes.
    2. Prétraitement des données
    - **Normalisation** : les valeurs des pixels sont divisées par 255. - **Redimensionnement pour CNN** : ajout d’une dimension pour les canaux (grayscale → `(H, W, 1)`).
    3. Encodage des labels
    - Utilisation de `LabelBinarizer` pour encoder les labels en one-hot.
    4. Séparation des données
    - `train_test_split` : 80% pour l'entraînement, 20% pour le test.
    5. Construction du modèle CNN
    - **Architecture** : - `Conv2D(32)` + `MaxPooling2D(2x2)` - `Conv2D(64)` + `MaxPooling2D(2x2)` - `Flatten` - `Dense(128, relu)` - `Dense(len(target_names), softmax)` - **Compilation** : - Optimiseur : `Adam` - Perte : `categorical_crossentropy` - Métrique : `accuracy`
    6. Entraînement du modèle
    - Entraînement sur 10 époques, batch de 32. - 10% des données d'entraînement utilisées pour la validation.
    7. Évaluation du modèle
    - Évaluation sur l’ensemble de test. - Affichage de la précision finale (`acc`).
    8. Prédictions et visualisation
    - Prédiction sur les images de test. - Extraction des classes prédites et réelles avec `argmax`. - Affichage de 10 images testées avec leur prédiction et leur étiquette réelle.