[PYTHON] Détection de visage à l'aide d'un classificateur en cascade

1. Origines

Actuellement, j'écris un programme de reconnaissance faciale utilisant le deep learning. Tout d'abord, un grand nombre d'images faciales ont été préparées comme données d'entraînement. À ce moment, le visage a été détecté à partir de l'image de la personne et seule la partie du visage a été découpée. Parmi ceux-ci, un classificateur en cascade a été utilisé comme méthode de détection des visages. Cet article décrit le classificateur en cascade.

2. Qu'est-ce qu'un classificateur en cascade?

Un classificateur en cascade est un classificateur composé de plusieurs classificateurs simples. Ces classificateurs simples sont appliqués en séquence à l'image cible. Il est détecté après avoir traversé tous les classificateurs. En revanche, s'il est rejeté une seule fois par un simple classificateur, il ne sera pas détecté à ce stade. Par conséquent, les images qui ne correspondent manifestement pas à la cible de détection sont rejetées au stade initial, ce qui est rapide. OpenCV fournit un classificateur en cascade qui utilise des fonctionnalités de type HAAR.

Fichier cascade OpenCV https://github.com/opencv/opencv/tree/master/data/haarcascades

La quantité de caractéristiques de type HAAR est la quantité de caractéristiques en fonction de la luminosité de l'image. Il est caractérisé par la différence entre la zone blanche et la zone noire dans la zone locale de l'image. Par conséquent, il est courant de convertir l'image en échelle de gris avant de l'utiliser.

3. Classificateur en cascade dans OpenCV

Dans OpenCV, après lecture du fichier cascade contenant le classificateur cascade, la détection est effectuée par detect.MultiScake (). La valeur de retour de detect.MultiScake () est une matrice N × 4, où N est le nombre détecté et 4 est les 4 éléments de [x, y, largeur, hauteur]. Ces quatre éléments sont la zone entourée d'un rectangle dans la zone détectée. x est la coordonnée x supérieure gauche du rectangle, y est la coordonnée y supérieure gauche du rectangle, la largeur est la largeur du rectangle et la hauteur est la hauteur du rectangle. Par conséquent, si vous souhaitez marquer la partie détectée, ouvrez la fonction de dessin openCV En utilisant rectangle (), écrivez un rectangle (image, (x, y), (x + largeur, y + hauteur), (255,0,0), 2) et ainsi de suite. Essayez-le sur l'image ci-dessous. PB1-3.jpg

Le code source est indiqué ci-dessous.

face_detect.py


import cv2

#Charger l'image
image = cv2.imread('sample.jpg')

#Convertir l'image en échelle de gris
image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

#Lire le classificateur à partir du fichier
cascade = cv2.CascadeClassifier("/opencv/data/haarcascades/haarcascade_frontalface_alt.xml")

#Détecter à l'aide d'un classificateur
faces = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

#detectMultiScale()Sortie de la valeur de retour de(Pour confirmation)
print(faces)

#Marquer la partie de l'image du visage détecté avec un rectangle
for (x,y,width,height) in faces:
    cv2.rectangle(image,(x,y),(x+width,y+height),(255,0,0),2)

#Afficher l'image
cv2.imshow('result',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Le résultat de l'exécution est le suivant. Il n'y a qu'une seule erreur de reconnaissance, mais tous les visages peuvent être détectés. nogizaka.jpg À propos, puisque la valeur de retour de detectMultiScale () a été sortie, si vous regardez le résultat de sortie ... image.png Comme indiqué ci-dessus, les informations des coordonnées supérieures gauche, de la largeur et de la hauteur dans la zone détectée (rectangulaire) sont renvoyées.

4. Mis à part

Dans l'article précédent, j'ai appris à ne découper qu'une partie d'une image en utilisant le tableau retourné par imread.

[OpenCV] À propos du tableau retourné par imread https://qiita.com/Castiel/items/53ecbee3c06b9d92759e

Et cette fois, j'ai appris à détecter un visage. Si vous les utilisez, vous devriez être en mesure de collecter des données d'apprentissage d'images faciales dans le cadre d'un apprentissage en profondeur. La prochaine fois, je travaillerai sur la création de données d'entraînement pour les images faciales.

Recommended Posts

Détection de visage à l'aide d'un classificateur en cascade
Créer un outil de reconnaissance de visage à l'aide de TensorFlow
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - (1) Introduction
J'ai créé un classificateur de visage Dir en gray en utilisant l'extraction de visage TensorFlow-④
Reconnaissance faciale à l'aide d'OpenCV (classificateur de caractéristiques de type Haar)
[Python] Détection de visage par OpenCV (Haar Cascade)
Créez un classificateur en cascade avec Google Colaboratory
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - Test de classification de visage
J'ai essayé de faire un classificateur de visage Dir en gris en utilisant TensorFlow --⑬ Jouer (final)
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑧ Exécution d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑫ Version Web
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑦ Modèle d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --② Construction de l'environnement
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - Préparation de la version Web
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
Détection de caractéristiques à l'aide d'opencv (détection de coin)
J'ai essayé la reconnaissance faciale avec Face ++
[Tutoriel PyTorch ④] FORMATION D'UN CLASSIFICATEUR
Détection de visage avec Python + dlib
Utiliser une imprimante avec Debian 10
Détection de visage avec Python + OpenCV
Résumé de la détection de visage en Python
Détection de visage avec Haar Cascades
Décrivez le visage avec Dlib (1)
Création d'un classificateur en cascade avec opencv
Un mémorandum d'utilisation de eigen3
Détection de visage d'anime avec OpenCV
J'ai essayé de marquer un concours de travesti en utilisant l'API Detect de Face ++