Reconnaissance et Identification Faciales en Vision par Ordinateur

Le développement rapide dans les technologies d’apprentissage machine et d’intelligence artificielle a fait des progrès significatifs dans la vision par ordinateur pour la détection et la reconnaissance d’objets. Cependant, créer un système capable de reconnaître l’humour et le plaisir chez les personnes reste un problème difficile pour les programmeurs, car la comédie et le divertissement sont subjectifs et basés sur les goûts personnels et le contexte culturel. Ainsi, il est délicat de créer un système capable de déterminer avec précision ce que les individus trouvent amusant ou agréable.

Néanmoins, la vision par ordinateur dans la reconnaissance faciale et l’identification a fait des progrès significatifs, largement utilisée dans diverses applications telles que la sécurité, la surveillance et la biométrie. La technologie de reconnaissance faciale identifie principalement les individus en analysant et en comparant leurs caractéristiques faciales à une base de données de visages connus. L’identification faciale consiste à associer un visage à l’identité de la personne. Elle utilise des algorithmes pour extraire des caractéristiques faciales comme la distance entre les yeux, les courbes du nez et l’angle de la mâchoire pour générer une signature faciale distinctive.

Techniques de reconnaissance et d’identification faciales

Il existe diverses méthodes pour reconnaître et identifier les visages, mais ce tutoriel se concentrera sur trois techniques et détaillera leurs avantages et inconvénients.

1. Approche basée sur un modèle

Premièrement, l’approche basée sur des modèles compare les caractéristiques faciales d’un visage cible avec celles figurant dans une image modèle ou de référence. L’image modèle comprend plusieurs caractéristiques faciales, telles que la position des yeux, du nez, de la bouche, et les distances entre eux. La technique compare ensuite le visage cible avec l’image modèle pour déterminer s’il y a un match. Les eigenfaces sont l’une des méthodes les plus courantes basées sur des modèles qui utilisent l’analyse en composantes principales (PCA) pour réduire la dimensionnalité des images faciales et extraire les caractéristiques les plus pertinentes.

Avantages

  • Ils sont très précis avec des modèles de haute qualité
  • Gère les variations d’éclairage et les expressions faciales

Inconvénients

  • Nécessite des modèles de haute qualité pour des résultats précis
  • Peut être coûteux en termes de calcul

2. Approche basée sur les caractéristiques

Deuxièmement, la technique basée sur les caractéristiques extrait des caractéristiques du visage, telles que la forme des yeux, la distance entre les sourcils, et la courbure des lèvres. L’approche compare ensuite ces caractéristiques avec celles d’une base de données de visages connus pour identifier le visage cible. Des exemples de techniques typiques basées sur les caractéristiques incluent le Local Binary Pattern (LBP) et la Transformée de Hough à Discrimination de Forme (SIFT).

Avantages

  • Relativement rapide et efficace
  • Fonctionne avec des images de faible résolution

Inconvénients

  • Peut ne pas fonctionner bien avec des conditions d’éclairage variables
  • Peut ne pas être robuste aux changements d’expressions faciales ou de poses

3. Approche basée sur l’apprentissage profond

Enfin, une approche basée sur l’apprentissage profond utilise des réseaux neuronaux profonds pour apprendre directement des caractéristiques à partir d’images faciales. Les réseaux sont formés sur de grandes bases de données d’images faciales pour identifier des motifs et des caractéristiques pertinentes pour la reconnaissance faciale. Des exemples de méthodes basées sur l’apprentissage profond typiques incluent les Convolutional Neural Networks (CNN) et les Siamese Networks.

Avantages

  • Atteint une grande précision avec de grandes bases de données
  • Traite les variations dans les expressions faciales et les poses

Inconvénients

  • Nécessite une grande quantité de données d’entraînement
  • Coûteux en termes de calcul

NOTE : Il existe plusieurs techniques pour la reconnaissance et l’identification faciales.

Reconnaissance et Identification Faciales à l’aide de Python et OpenCV

Avec la disponibilité de bibliothèques puissantes comme OpenCV et les avancées des algorithmes d’apprentissage automatique, il est devenu plus facile que jamais de développer des systèmes de reconnaissance et d’identification faciales à l’aide de Python. OpenCV fournit un riche ensemble de fonctions et d’outils pour le traitement des images, particulièrement utiles dans les tâches de reconnaissance faciale comme la détection des visages, l’extraction des caractéristiques et la correspondance. Elle dispose également de modèles pré-construits tels que la classifieuse Haar Cascades pour la détection des visages et VGG ou ResNet pour étiqueter les visages détectés.

OpenCV fournit divers modèles pour les étiquetages du visage, tels que les Eigenfaces, les Fisherfaces et les Histogrammes de Patrons de Paires Binaires Locales (LBPH). Nous entraînons ces modèles pour identifier des individus spécifiques en leur présentant des images des personnes que nous voulons reconnaître. Les Eigenfaces utilisent l’Analyse en Composantes Principales (PCA) pour construire une image de visage à partir de parties plus petites, tandis que les Fisherfaces utilisent l’Analyse Discriminante Linéaire (LDA) pour distinguer les visages. LBPH compare la texture des visages aux visages connus.

Identification Faciale

Importer les Dépendances

Importer les bibliothèques nécessaires.

Python

 

import numpy as np
import cv2
import matplotlib.pyplot as plt
from IPython.display import Image

from google.colab import drive
drive.mount('/content/drive')

Charger les Modèles Pré-entraînés et l’Image

OpenCV fournit un ensemble de classifieurs pré-entraînés `Haar Cascade` pour détecter divers objets, y compris les visages. `cv2.CascadeClassifier` est une classe qui représente le classifieur Haar Cascade. Le chemin `cv2.data.haarcascades` est un répertoire contenant les modèles pré-entraînés. `haarcascade_frontalface_default.xml` est le fichier contenant le modèle pré-entraîné de détection de visage. Le modèle est disponible pour téléchargement gratuit sur GitHub.

Python

 

# Charger le modèle pré-entraîné de détection de visage
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

Charger l’image d’entrée `image1.jpg` qui peut être une image de votre choix en utilisant la fonction `imread()` d’OpenCV. Elle convertit ensuite l’image en niveaux de gris à l’aide de la fonction `cvtColor()` d’OpenCV. L’image en niveaux de gris est requise pour l’algorithme de détection de visage.

Python

 

# Charger l'image et la convertir en niveaux de gris
img = cv2.imread('/content/drive/MyDrive/Face Detection/image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Afficher l'image 
plt.imshow(gray)

La ligne ci-dessous détecte les visages dans l’image en niveaux de gris en utilisant la méthode detectMultiScale() de la classe CascadeClassifier. La méthode detectMultiScale() prend les arguments suivants:

`gray` : l’image en niveaux de gris

`scaleFactor` : paramètre spécifiant de combien la taille de l’image est réduite à chaque échelle d’image. Une valeur de 1.3 signifie que l’image est réduite de 30% à chaque échelle.

`minNeighbors` : paramètre spécifiant combien de voisins chaque rectangle candidat doit avoir pour être conservé, une valeur plus élevée entraîne moins de détections mais avec plus de confiance.

La méthode `detectMultiScale()` renvoie une liste de rectangles où les visages sont détectés. Chaque rectangle représente un tuple de quatre entiers `(x,y,w,h)` représentant les coordonnées du coin supérieur gauche `(x,y)` du rectangle et sa largeur `w` et sa hauteur `h`.

Python

 

# Détecter les visages dans l'image en niveaux de gris
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

Tracer un rectangle autour de la région du visage

Créons une boucle qui dessine des rectangles autour des visages détectés dans l’image originale. La fonction cv2.rectangle() prend les arguments suivants:

`img` : l’image originale.    

`(x,y)` : les coordonnées du coin supérieur gauche du rectangle.    

`(x+w,y+h)` : les coordonnées du coin inférieur droit du rectangle.    

`(255,0,0)` : représente la couleur binaire du rectangle tracé en format RGB. (255,0,0) représente le bleu.

`5` : l’épaisseur du bord du rectangle en pixels.

Python

 

# Dessiner des rectangles autour des visages détectés
for (x,y,w,h) in faces:

    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)

#Afficher l'image après avoir construit le rectangle.


# Afficher l'image avec les visages détectés

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

plt.show()

# Enregistrer l'image détectée par nom
cv2.imwrite('detected_image.jpg', img)

#Confirmer si l'image enregistrée existe.
detected_image=cv2.imread("detected_image.jpg", 1)
gray_channels_reversed = detected_image[:, :, ::-1]
plt.imshow(gray_channels_reversed)

Reconnaissance faciale

Nous n’entrerons pas dans une explication comme celle ci-dessus mais utiliserons l’image détectée enregistrée pour confirmer si le modèle fonctionne pour l’identification en donnant différentes images pour la détection.

Importer les dépendances

Python

 

import numpy as np
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity

Charger le modèle de détection faciale et le détecteur de points de repère faciaux

La fonction `dlib.get_frontal_face_detector()` renvoie un modèle de détection faciale pré-entraîné capable de détecter des visages humains dans les images. Pour plus d’informations, consultez les fonctions dlib.net. Téléchargez également le détecteur de points de repère.

Python

 

# Charger le modèle de détection faciale et le détecteur de points de repère faciaux
face_detector = dlib.get_frontal_face_detector()
landmark_detector = dlib.shape_predictor('/content/drive/MyDrive/Face Detection/shape_predictor_68_face_landmarks_GTX.dat')

# Charger l'image détectée de 

img1 = cv2.imread('/content/drive/MyDrive/Face Detection/detected_image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)


# Détecter le visage et les points de repère faciaux de l'image
rects1 = face_detector(gray1, 1)
landmarks1 = landmark_detector(gray1, rects1[0])
landmarks1 = face_utils.shape_to_np(landmarks1)

# Charger une autre image pour comparer avec l'image chargée précédemment
img2 = cv2.imread('/content/drive/MyDrive/Face Detection/001_d3323f3c.jpg')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

 

### Définir les paramètres du modèle

# Détecter le visage et les caractéristiques faciales de la deuxième image

rects2 = face_detector(gray2, 1)

landmarks2 = landmark_detector(gray2, rects2[0])

landmarks2 = face_utils.shape_to_np(landmarks2)

# Extraire les caractéristiques des deux images en calculant les distances euclidiennes entre les caractéristiques faciales

features1 = np.zeros(68)

features2 = np.zeros(68)

for i in range(68):

    features1[i] = np.linalg.norm(landmarks1[i] - landmarks1[0])

    features2[i] = np.linalg.norm(landmarks2[i] - landmarks2[0])

#### Entraîner sur les similitudes

# Calculer la similarité cosinus entre les deux vecteurs de caractéristiques

score = cosine(features1, features2)

# Vérifier si le score est en dessous d'un certain seuil (par exemple, 0.5) pour déterminer si les deux visages correspondent

if score < 0.5:

    print("The model did not recognize Joseph in one or both of the images..")

else:

    print("The model recognized Joseph in both images.")

Conclusion

Dans ce tutoriel, vous avez appris la reconnaissance et l’identification faciales à l’aide de Python OpenCV, comment cela fonctionne, ses utilisations et comment cela peut être mis en œuvre. Le code de ce projet peut être consulté sur le dépôt GitHub.

Source:
https://dzone.com/articles/facial-recognition-and-identification-in-computer