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.

Introduction à l'utilisation d'OpenCV: Reconnaissance faciale, old school style!

Mis à jour le March 11, 2023, 1:19 p.m.

Niveau: Expert

 

Bienvenue dans cet article dédié aux à la détection faciale et à la reconnaissance faciale avec OpenCV. Dans cet article nous verrons les points suivants:


1- Detection des visages avec OpenCV HaarCascade
2-Detection des visages sur une image
3-Detection des visages en temps réel avec la webcam
4- Comment améliorer la reconnaissance faciale avec les reseau de neurones artificiels?


1 - Détection des visages avec OpenCV et HaarCascade

La 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). Cela est dû au fait que ces applications nécessitent en entrée la localisation et la taille des visages détectés. Par conséquent, la détection automatique de visage joue un rôle crucial et constitue l'un des sujets les plus étudiés dans la communauté de l'intelligence artificielle.
La détection de visage semble être une tâche facile pour un être humain, mais c'est une tâche très complexe pour les ordinateurs, car de nombreux problèmes sont généralement impliqués (notamment les variations d'apparence, d'échelle, de rotation, d'expressions faciales, d'occlusion ou enocre de conditions d'éclairage). La détection de visage a réalisé des progrès impressionnants après les travaux proposés par Viola et Jones, et c'est un indispensable à connaître.

OpenCV propose deux approches pour détecter les visages :
    - les détecteurs de visage basés sur les cascades de Haar (Haar Cascade)
    - les détecteurs de visage basés sur l'apprentissage en profondeur(deep learning).

Le framework développé par Viola et Jones (voir l'article Rapid Object Detection Using a Boosted Cascade of Simple Features (2001)) constitue une méthode efficace pour détecter les objets. Ce framework est très populaire, car OpenCV offre des algorithmes de détection de visage basés sur cette méthode. Il peut également être entrainé et utilisé pour détecter d'autres objets que des visages, comme des corps entiers, des plaques d'immatriculation, des parties supérieures du corps ou même des visages de chats. Dans cette section, nous allons voir comment détecter les visages en utilisant ce framework.
Nous allons réaliser la détection de visage en utilisant des classificateurs en cascade basés sur les caractéristiques de Haar.

À cet effet, OpenCV met à disposition quatre classificateurs en cascade pour la détection de visage (frontale):

  1. haarcascade_frontalface_alt.xml
  2. haarcascade_frontalface_alt2.xml
  3. haarcascade_frontalface_alt_tree.xml
  4. haarcascade_frontalface_default.xml

Vous pourrez télécharger ces modèles ici: https://github.com/opencv/opencv/tree/master/data/haarcascades

 

 

 

2 - Détection des visages sur une image

Pour commencer, détectons un visage sur une image. Je prends l'image suivante sur ce site web et je la sauvegarde sous le nom de girl.jpg.

 

pythoniaformation image reconnaissance faciale

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.

 

import cv2
import os

image = cv2.imread("girl.jpg")
print("Dimensions de l'image: ",image.shape)

# on convertit l'image en noir et blanc
# l'algorithme que nous allons utilisé a besoin de ce pretraitement
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)


# on a besoin de ce fichier on ne fait ici
# que la prédiction, pas le training 
#https://github.com/opencv/opencv/tree/master/data/haarcascades

# on charge notre modèle
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

# on verifie que le modèle a bien été chargée
if face_cascade.empty()==True:
	print("Le fichier n'est pas chargé: ", face_cascade.empty())
else:
	print("Le fichier est chargé.")

# On cherche tous les visages disponibles dans l'image
faces = face_cascade.detectMultiScale(image_gray, 1.1, 5)
# on écrit dans la console le nombre de visages que  l'algorithme a détecté
print(f"{len(faces)} visages detectés dans l'image.")

# on dessine un rectangle autour de chaque visage
for x, y, width, height in faces:
    cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)

print ("C'est tout bon!")

# on sauvegarde l'image
cv2.imwrite("new.jpg", image)

 

Vous avez remarqué que l'on prétraite l'image en la mettant en noir et blanc. Pourquoi?

Réduction de la complexité : La conversion de l'image en noir et blanc réduit la complexité de l'image en supprimant les informations de couleur. Cela permet de simplifier le traitement ultérieur de l'image et de réduire les calculs nécessaires pour détecter les caractéristiques du visage.

Amélioration du contraste : La conversion en noir et blanc peut améliorer le contraste de l'image, ce qui facilite la détection des contours et des caractéristiques du visage. Les variations de couleurs peuvent parfois rendre la détection des motifs plus difficile, tandis que le noir et blanc permet de mettre davantage l'accent sur les différences de luminosité.

Standardisation des données : les modèles Haarcascade sont généralement entraînés sur des images en noir et blanc, donc ils ne seront performants que sur des images similaires.

Petite note: La conversion en noir et blanc n'est pas une étape obligatoire dans tous les cas de reconnaissance faciale. Elle dépend du modèle utilisé et des spécificités de la tâche de reconnaissance. Dans certains cas, il peut être préférable de conserver les informations de couleur pour des analyses plus avancées ou des applications spécifiques. Mais dans ces cas là on utilisera généralement des réseaux de neurones (deep learning).

 

 

pythoniaformation image reconnaissance faciale reussie

 

 

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 os

# initialiser notre webcam
cap = cv2.VideoCapture(0)
# charger notre modele, mettez le bon chemin
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
#print(os.getcwd())
font = cv2.FONT_HERSHEY_SIMPLEX

while True:
    # lire notre frame (image)
    _, image = cap.read()
    # convertir l'image en noir et blanc
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # detecter tous les visages présents
    faces = face_cascade.detectMultiScale(image_gray, 1.1, 5)
    # tracer un rectangle pour chaque visage
    for x, y, width, height in faces:
        cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
    
    # ecrire sur l'image le nombre de visages detectes
    cv2.putText(frame,'Visage detectes : ' + str(len(faces)),(40, 40), font, 1,(255,0,0),2)
    cv2.imshow("image", image)
   # afficher le rendu de la webcam et appuyez sur 'q' pour quitter
    if cv2.waitKey(1) == ord("q"):
        break

# detruire toutes les fenetres après avoir quitté le programme
cap.release()
cv2.destroyAllWindows()

Essayez ce code avec les différents modèles, amusez vous avec les hyperparamètres et regarder ce qui fonctionne le mieux.

4-Comment améliorer la detection des visages avec les réseaux de neurones artificiels?

Nous avons vu les haarcascade, qui sont très bien et peu gourmand en ressources (contrairement aux reseaux de neurones). Ils sont par contre moins efficaces que les reseaux de neurones artificiels. Nous verrons ça dans le prochain tutoriel :). En attendant vous pouvez aller voir du coté du module dnn de cv2 ;)

 

 

 




Introduction à l'utilisation d'OpenCV: les fondamentaux


Introduction à l'utilisation d'OpenCV: Manipulations sur image


Introduction à l'utilisation d'OpenCV: Reconnaissance faciale, old school style!

Vous êtes sur ce tutoriel

Introduction à l'utilisation d'OpenCV: detection faciale avec le deep learning


Introduction à l'utilisation d'OpenCV: detection et reconnaissance d'objet avec YOLO


Reconnaissance faciale avec le deep learning


Commentaires

Aucun commentaire pour cet article.

Bienvenue sur Pythonia, pour ceux qui veulent réellement maîtriser la programmation et l'intelligence artificielle.

Rejoignez notre communauté de professionnels et de passionnés, pour rester à la pointe des dernières actualités.

Laissez un commentaire