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.
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.
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.
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. À propos, puisque la valeur de retour de detectMultiScale () a été sortie, si vous regardez le résultat de sortie ... 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.
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.