Reconnaisance faciale python

CamilleL -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

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. oblixx
     

    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
    1. CamilleL
       

      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()
      
      0
    2. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140 > 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:
      0
    3. CamilleL > Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention  
       

      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()
      
      0
    4. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140 > CamilleL
       

      Un autre problème, tu utilises :

      time.sleep(10)

      sans avoir importé le module.

      0
    5. CamilleL > Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention  
       

      Ca ne marche toujours pas :(

      0
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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 ?

    0
    1. CamilleL
       

      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)

      0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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

    0
    1. CamilleL
       

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

      0
  4. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140
     

    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é.

    0