Tutoriels de Pythonia
Guides, IA, tutos et newsletter pour devenir une bête en programmation
🔔 Ne manquez pas la suite de cette série !
Inscrivez-vous pour être informé des prochains tutoriels.
Inscrivez-vous pour être informé des prochains tutoriels.
Mis à jour le March 5, 2024, 10:52 a.m.
Bienvenue dans cet article dédié aux à la détection faciale et à la reconnaissance faciale avec OpenCV et son module de deep learning. Dans cet article nous verrons les points suivants:
1-Detection des visages avec le module dnn d'OpenCV
2-Detection des visages sur une image
3-Detection des visages en temps réel avec la webcam
4- Finis la détection, place à la reconnaissance faciale
Conclusion
Comme nous l'avons vu dans l'épisode détection de visage peut être définie comme la capacité à déterminer la position et la taille des visages dans des images numériques, est généralement la première étape clé lors de la création d'applications de traitement de visage (par exemple, la reconnaissance des expressions faciales, la détection de somnolence, la classification de genre, la reconnaissance faciale, l'estimation de la pose de la tête ou l'interaction homme-machine).
Il nous faut cette fois les modèles de deep learning (qui comme les haarcascades ne sont rien d'autres qu'un fichier qui contient les poids de nos réseaux de neurones)
L'architecture de réseaux de neurones typiquement utiliser pour l'analyse d'image sont les CNNs (Convolutionnal neural network). L'architecture en questions sera ici un SSD.
Dans cet article, vous avez plus d'informations sur la classification en computer vision et le fonctionnement des CNNs.
2 - Détection des visages sur une image avec le deep learning
Comme précedemment détectons un visage sur une image pour commencer. Je prends l'image suivante sur ce site web et je la sauvegarde sous le nom de girl.jpg.
Maintenant, voici le code pour détecter le visage sur cette image. Nous allons utilisé les fichiers de modèles téléchargé auparavant. Ces fichiers sont des modèles pré-entrainé, ce qui signifie qu'il ne servent qu'à faire une inférence. C'est le but du code ci-dessous. Entrainer un modèle de zéro est un processus complètement différent. On apprendra cela un peu plus tard.
import cv2
import numpy as np
# Chemins vers les fichiers du modèle pré-entraîné
modelFile = "res10_300x300_ssd_iter_140000_fp16.caffemodel"
configFile = "deploy.prototxt"
net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
# Charger une image
image = cv2.imread('girl.jpg')
# Préparer l'image : convertir en blob pour le passer au modèle de détection
(h, w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
# Passer le blob au réseau de neurones et obtenir les détections
net.setInput(blob)
detections = net.forward()
# Boucle sur les détections
for i in range(0, detections.shape[2]):
# Extraire la confiance (c'est-à-dire la probabilité) associée à la prédiction
confidence = detections[0, 0, i, 2]
# Filtrer les détections faibles en s'assurant que la confiance est supérieure à un seuil
if confidence > 0.5:
# Calculer les coordonnées (x, y) de la boîte englobante pour l'objet
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# Dessiner la boîte englobante autour du visage avec la probabilité
text = "{:.2f}%".format(confidence * 100)
y = startY - 10 if startY - 10 > 10 else startY + 10
cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)
cv2.putText(image, text, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
# Afficher l'image de sortie
cv2.imshow("Detecte moi un visage", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ce code est un exemple de détection de visages à l'aide de la bibliothèque OpenCV et d'un modèle pré-entraîné de deep learning. Il utilise spécifiquement un modèle basé sur le réseau SSD (Single Shot Multibox Detector) avec une architecture de réseau de neurones convolutifs (CNN).
Contrairement au modèle de Haar Cascade, la conversion en noir et blanc n'est pas une étape obligatoire. Ici, on convertit l'image en un "blob" qui est un format requis par le réseau pour les prédictions. On redimensionne simplement l'image à 300x300 pixels, on normalise les couleurs (avec des valeurs moyennes spécifiques pour chaque canal de couleur) et le changement de l'ordre des canaux si nécessaire. Les valeurs moyennes sont calculées sur le jeux de données qui a été utilisé pour entrainer le modele que l'on utilise.
Les modèles de deep learning comme celui utilisé ici sont entraînés sur des images en couleur et apprennent à utiliser les informations de couleur pour améliorer leur précision. La couleur peut apporter des informations supplémentaires qui aident à distinguer des objets dans des situations complexes. Ainsi, au lieu de simplifier l'image en niveaux de gris, on effectue une normalisation qui ajuste les valeurs des pixels tout en conservant les informations de couleur, ce qui est préférable pour ces types de modèles.
3 - Détection des visages avec la webcam
Bon, puisque vous savez à présent faire de la reconnaissance faciale sur une image, je ne vois pas pourquoi ça ne fonctionnerait pas sur une video. Après tout, une video n'est qu'une suite d'images.
Voici le code pour la détection de visage sur votre webcam.
import cv2
import numpy as np
# Chemins vers les fichiers du modèle pré-entraîné
modelFile = "res10_300x300_ssd_iter_140000_fp16.caffemodel"
configFile = "deploy.prototxt"
net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
# Démarrer le flux vidéo de la caméra
cap = cv2.VideoCapture(0)
while True:
# Lire une frame de la vidéo
ret, frame = cap.read()
# S'assurer que la frame a été lue correctement
if not ret:
break
# Convertir la frame en blob pour le passer au modèle de détection
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
# Passer le blob au réseau et obtenir les détections
net.setInput(blob)
detections = net.forward()
# Boucle sur les détections
for i in range(0, detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# Dessiner la boîte englobante avec la probabilité
text = "{:.2f}%".format(confidence * 100)
y = startY - 10 if startY - 10 > 10 else startY + 10
cv2.rectangle(frame, (startX, startY), (endX, endY),
(0, 255, 0), 2)
cv2.putText(frame, text, (startX, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)
# Afficher la frame avec les détections
cv2.imshow("Frame", frame)
# Sortir de la boucle si on appuie sur 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Libérer le flux vidéo et fermer les fenêtres
cap.release()
cv2.destroyAllWindows()
Super, maintenant vous avez un modele de detection faciale boosté au deep learning. mais ce serait dommage de s'arreter là. Comment faire pour une reconnaissance faciale ?
La reconnaissance faciale, contrairement à la détection faciale, implique non seulement de trouver des visages dans une image, mais aussi d'identifier à qui ces visages appartiennent. Pour adapter le code précédent pour la reconnaissance faciale, on utilisera la bibliothèque face_recognition, qui est construite sur Dlib et offre une interface simple pour la reconnaissance faciale. Ce processus comprend généralement deux étapes : d'abord, détecter les visages dans l'image ou le flux vidéo, puis comparer ces visages détectés à une 'base de données' connue pour trouver des correspondances. Elle se base sur une comparaison de vecteurs. L'avantage de cette technique est que l'on a besoin de très peu d'images pour que ça fonctionne et ça ne nécessite pas de réentrainement supplémentaire de l'algorithme.
Cependant, cette librairie ne fonctionne pas avec opencv. En fait, on pourrait faire un systeme un peu plus compliqué avec opencv + l'entrainement d'un modèle de classifciation (en pytorch, keras ou tensorflow), mais face_recognition est assez fiable et est suffisante pour notre projet.
Commençons par installer le nécessaire:
pip install face_recognition
Nous allons voir comment faire de la reconnaissance faciale sur une image puis sur une video dans le prochain tutoriel.
Nous avons exploré dans cet article les fondamentaux et les techniques avancées pour la détection faciale en utilisant OpenCV et des réseaux de neurones profonds.
https://github.com/ageitgey/face_recognition
Drumi - 24 Oct 2024 12:59
Il y a une coquille à la fin "l'entrainement d'un modèle de classifciation"