Détection de visage OpenCV à l'aide du classificateur Haar Cascade

Salman Mehmood 13 juin 2022
Détection de visage OpenCV à l'aide du classificateur Haar Cascade

Dans cette démonstration, nous apprendrons les bases de la détection de visage à l’aide de classificateurs Cascade basés sur des fonctionnalités haar et apprendrons à détecter les visages à partir d’une image et d’une vidéo dans OpenCV.

Créer un projet de détection de visage avec le classificateur Haar Cascade dans OpenCV

La détection d’objets à l’aide des classificateurs en cascade basés sur les fonctionnalités de Haar est une méthode de détection d’objets efficace proposée par Paul Viola et Michael Jones dans leur peuple. Le classificateur de cascades basé sur les fonctionnalités de Haar est une approche basée sur l’apprentissage automatique dans laquelle une fonction en cascade est formée pour de nombreuses images positives et négatives.

Quelles sont donc ces images positives et négatives ? Un classificateur est formé avec quelques centaines de vues d’échantillon d’un objet particulier, qui peut être un visage ou une voiture ou tout autre objet appelé positif.

Par exemple, si vous allez détecter un visage, vous devez entraîner votre classifieur avec le nombre d’images contenant des visages. Ensuite, on parle d’images positives.

Dans un autre cas, si vous voulez détecter le visage et que l’image ne contient pas le visage, alors on l’appelle l’image négative.

Une fois qu’un classificateur est formé, il peut être appliqué à une région d’intérêt dans une image d’entrée. La sortie du classificateur est un 1 si la région est susceptible d’afficher l’objet ; sinon, c’est 0.

Voyons comment nous pouvons utiliser la détection Haar Cascade dans OpenCV.

OpenCV est livré avec un entraîneur ainsi qu’un détecteur. Si vous souhaitez entraîner votre classificateur pour n’importe quel objet comme une montre, une voiture ou quoi que ce soit, vous pouvez utiliser ce classificateur.

Nous pouvons trouver des fichiers XML de classificateur formés sur la page OpenCV GitHub. De nombreux classificateurs entraînés sont disponibles dans ce référentiel.

Fichiers XML de classificateur formés OpenCV GitHub

Il vous suffit d’ouvrir ce fichier en surbrillance, puis de le télécharger en cliquant sur le bouton de l’icône brute. Lorsqu’il s’ouvre, vous pouvez cliquer avec le bouton droit de la souris et l’enregistrer sur votre ordinateur.

Ouvrons l’éditeur de code et définissons nos classificateurs.

Il existe une méthode appelée CascadeClassifier() où nous pouvons fournir notre chemin de classificateur. Une fois que nous avons défini le classificateur, nous lisons l’image.

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

Étant donné que ce classificateur fonctionnera avec les images en niveaux de gris, nous devons convertir notre image en une image en niveaux de gris. Il sera vraiment facile de mettre en œuvre la conversion d’image.

IMG = cv2.imread("inp.png")
G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)

L’étape suivante consiste à détecter les visages à l’intérieur de cette image ; pour cela, nous allons déclarer une variable appelée Faces. Nous appellerons la méthode detectMultiScale(), qui prend trois paramètres.

Le premier est l’image en niveaux de gris, et le deuxième argument que nous allons utiliser est le facteur d’échelle, qui est utilisé pour spécifier de combien la taille de l’image est réduite à chaque échelle d’image. Le suivant est le paramètre min neighbors, qui spécifie combien de voisins à chaque rectangle candidat doivent avoir pour le conserver.

Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

La dernière étape consistera à itérer sur tous les visages que nous avons détectés, puis à dessiner un rectangle. Cette variable Faces sera le vecteur du rectangle où chaque rectangle contient un objet détecté, et dans notre cas, ce sera le visage détecté.

Nous obtiendrons le paramètre (x,y,w,h) de l’objet Faces. Ce sont les valeurs du rectangle de l’objet.

Lors de l’obtention des coordonnées, nous allons dessiner le rectangle en utilisant la méthode rectangle().

Il faut quelques paramètres. Le premier est une image, le second est les points (x,y), que nous avons obtenus à l’aide du vecteur Faces, et le paramètre suivant est le deuxième point du rectangle.

Les deux paramètres suivants sont la couleur et l’épaisseur.

import cv2

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

IMG = cv2.imread("inp.png")
G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)
Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

for (x, y, w, h) in Faces:
    cv2.rectangle(IMG, (x, y), (x + w, y + h), (255, 0, 0), 3)

cv2.imshow("IMG", IMG)

cv2.waitKey()

Maintenant, nous pouvons voir que le visage est détecté à l’intérieur d’une image.

Sortie de détection de visage d’image en cascade OpenCV Haar

Essayons de détecter le visage dans une vidéo, donc ce ne sera pas une approche différente. Nous n’aurons qu’à appliquer cette approche à chaque image, donc au lieu de l’image de lecture, nous utiliserons la méthode VideoCapture() pour capturer la vidéo.

Pour capturer les images, nous devons définir une variable Video et la rendre égale à VideoCapture() et fournir un fichier mp4. Si vous avez l’appareil photo, vous pouvez le fournir 0.

Maintenant, nous allons enfermer tout le code ci-dessus dans une boucle while, et à la boucle while, nous définissons la méthode isOpened(). Si cette méthode renvoie une valeur vraie, le programme procédera à la lecture de la trame ; nous devons appeler Video.read(), ce qui signifie que nous lisons chaque image.

Nous définirons une condition lorsque quelqu’un appuie sur la touche q, puis le programme sortira de la boucle while. Enfin, en dehors de notre boucle while, nous sortirons notre vidéo.

import cv2

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

Video = cv2.VideoCapture("inp.mp4")

while Video.isOpened():
    _, IMG = Video.read()

    G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)
    Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

    for (x, y, w, h) in Faces:
        cv2.rectangle(IMG, (x, y), (x + w, y + h), (255, 0, 0), 3)

    cv2.imshow("Window", IMG)
    K = cv2.waitKey(1)
    if K & 0xFF == ord("q"):
        break

Video.release()

Dans cette vidéo, on peut voir les visages détectés en vidéo en temps réel.

Sortie de détection de visage vidéo OpenCV Haar Cascade

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Article connexe - Python OpenCV