Reconnaisance faciale python

CamilleL - 12 janv. 2024 à 15:21
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 - 15 janv. 2024 à 10:51

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

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()
0
Diablo76 Messages postés 204 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 octobre 2024 44 > CamilleL
Modifié le 13 janv. 2024 à 02:12

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
CamilleL > Diablo76 Messages postés 204 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 octobre 2024
Modifié le 13 janv. 2024 à 11:59

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
Diablo76 Messages postés 204 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 octobre 2024 44 > CamilleL
13 janv. 2024 à 16:50

Un autre problème, tu utilises :

time.sleep(10)

sans avoir importé le module.

0
CamilleL > Diablo76 Messages postés 204 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 octobre 2024
13 janv. 2024 à 16:56

Ca ne marche toujours pas :(

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 12 janv. 2024 à 16:53

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

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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 12 janv. 2024 à 17:43

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

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

0
Diablo76 Messages postés 204 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 octobre 2024 44
Modifié le 14 janv. 2024 à 12:40

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