Reconnaisance faciale python

Bonjour. Je cherche a développer un petit logiciel de reconnaisance faciale avec python qui serait capable de repérer des visages sur un flux vidéo en direct, d'ouvrir une fenétre avec le retour vidéo et les visages encadrés, et enfin de comparer les visages avec une banque de photos pour identifier des personnes.

Mon code ne marche pas et je ne comprend pas pourquoi

Pourriez vous m'aider?

PS: existe il un moyen de mettre le code dans une fenétre dédiée pour ne pas encombrer la page CCM?

Merci d'avance

4 réponses

  1. Salut,

    En fait, je n'avais pas regardé le contenu de :

    matches = face_recognition.compare_faces(known_faces, face_encoding)

    et matches est une liste donc c'était bon avec :

     if True in matches:

    ou

     if matches[0]:

    la seul erreur c'etait d'utiliser time sans l'avoir importé.

    1. Dans ce cas, pour que la console ne se ferme pas, tu ouvres d'abord la

      console, puis tu glisse/dépose ton fichier dedans depuis l'explorateur

      et tu envoies

      La console ne se fermera pas

      1. Ca ne marche toujours pas la fenétre de texte s'ouvre et se ferme comme avant et pas de message d'erreur

    2. Bonjour,

      "Mon code ne marche pas et je ne comprend pas pourquoi"

      Qu'est ce qui ne marche pas ?

      Il y a des messages d'erreurs ?

      1. Je code directement via un fichier en .py et avec la console du pc donc je ne peux pas voir de messages d'erreurs (dés qu'il y a une erreur la console python se ferme)

    3. Bonjour,

      Il y a l'option d'insérer un bout de code dans les options vers le haut de la boite de dialogue.

      Il serait aussi utile de donner le(s) code(s) d'erreur.

      Le code pour écrire un vrai programme de reconnaissance faciale me semble énorme, pas sûr de pouvoir aider si le code contient 3000 lignes...

      CDLT.

      1. Le code contient moins de 70 lignes, et il marchait avant que j'ajoute le programme pour comparer les visages détéctés a un dossier de visages

        PS: Tout est commenté car c'etait un projet de cours

        import cv2
        import face_recognition
        import os
        import keyboard
        
        # Charger le classificateur de visage pré-entrainé
        face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
        
        # Charger les images de visages du dossier
        folder_path = "C:\Users\camil\OneDrive\Documents\travail\TSIN 2023-2024\SIN\reco faciale\images"
        known_faces = []
        known_names = []
        
        for filename in os.listdir(folder_path):
            image = face_recognition.load_image_file(os.path.join(folder_path, filename))
            encoding = face_recognition.face_encodings(image)[0]
            known_faces.append(encoding)
            known_names.append(os.path.splitext(filename)[0])
        
        # Utiliser la webcam (0 indique la première webcam, vous pouvez ajuster cela si vous avez plusieurs webcams)
        cap = cv2.VideoCapture(0)
        
        # Créer une fenêtre pour l'affichage du flux vidéo
        cv2.namedWindow('Reconnaissance faciale en temps réel', cv2.WINDOW_NORMAL)
        time.sleep(10)
        while True:
            # Capturer une trame vidéo
            ret, frame = cap.read()
        
            # Convertir la trame en niveaux de gris
            gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
            # Détecter les visages dans la trame
            faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
        
            # Boucle sur les visages détectés
            for (x, y, w, h) in faces:
                # Extraire l'encodage du visage
                face_encoding = face_recognition.face_encodings(frame, [(y, x + w, y + h, x)])[0]
        
                # Comparer le visage avec les visages connus
                matches = face_recognition.compare_faces(known_faces, face_encoding)
        
                name = "Inconnu"
        
                # Si une correspondance est trouvée, utiliser le nom correspondant
                if True in matches:
                    first_match_index = matches.index(True)
                    name = known_names[first_match_index]
        
                # Dessiner un rectangle autour du visage
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        
                # Afficher le nom au-dessus du rectangle
                cv2.putText(frame, name, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
        
            # Afficher la trame résultante
            cv2.imshow('Reconnaissance faciale en temps réel', frame)
        
            # S'arrêter si la touche 'q' est enfoncée
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        
        # Libérer la capture vidéo et fermer la fenêtre
        cap.release()
        cv2.destroyAllWindows()
        
      2. @CamilleL

        Salut,

        # Comparer le visage avec les visages connus
                matches = face_recognition.compare_faces(known_faces, face_encoding)

        Ta variable matches est un booléen, donc la syntaxe de ta condition if n'est pas bonne et tu devrais avoir un message d'erreur du genre :

        TypeError: argument of type 'bool' is not iterable

        Donc remplacer :

        if True in matches:

        par :

        if matches:
      3. @Diablo76

        Je l'ai fait mais toujours rien pourtant l'ancienne version qui ne faisait que chercher les images sur le flux vidéo marchait bien. Je la met ci-dessous:

        import cv2
        
        # Charger le classificateur de visage pré-entrainé
        face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
        
        # Utiliser la webcam (0 indique la première webcam, vous pouvez ajuster cela si vous avez plusieurs webcams)
        cap = cv2.VideoCapture(0)
        
        # Créer une fenêtre pour l'affichage du flux vidéo
        cv2.namedWindow('Reconnaissance faciale en temps réel', cv2.WINDOW_NORMAL)
        
        while True:
            # Capturer une trame vidéo
            ret, frame = cap.read()
        
            # Convertir la trame en niveaux de gris
            gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
            # Détecter les visages dans la trame
            faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
        
            # Dessiner des rectangles autour des visages détectés
            for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        
            # Afficher la trame résultante
            cv2.imshow('Reconnaissance faciale en temps réel', frame)
        
            # S'arrêter si la touche 'q' est enfoncée
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        
        # Libérer la capture vidéo et fermer la fenêtre
        cap.release()
        cv2.destroyAllWindows()
        
      4. @CamilleL

        Un autre problème, tu utilises :

        time.sleep(10)

        sans avoir importé le module.