Quand j'étais étudiant, je faisais des recherches sur la détection des points de repère du visage. J'ai été surpris que ce soit maintenant incroyablement facile.
Alors j'aimerais vraiment l'essayer. Si vous souhaitez l'implémenter pour le moment, veuillez lire "[J'ai essayé de détecter facilement les repères faciaux](# J'ai essayé de détecter facilement les repères sur le visage)".
Il existe trois méthodes principales pour détecter les repères faciaux. Pour plus de détails sur chacun d'eux, veuillez vous reporter aux articles dans [Liens de référence](#A propos de la détection de repère de visage).
Une détection très précise des points de repère est réalisée en temps réel à l'aide d'une analyse d'arbre de régression. Les deux dlib et OpenCV (Facemark Kazemi) sont implémentés. Cependant, seul dlib a un modèle d'entraînement par défaut.
La détection d'objet est effectuée sur la base d'un modèle statistique appris à partir de la forme et de l'apparence de l'objet. Cette méthode a longtemps été utilisée pour le suivi avancé des objets, pas seulement pour les visages. (C'était cet AAM que j'étudiais quand j'étais étudiant) Il est implémenté dans OpenCV (Facemark AAM), mais vous devez créer votre propre modèle d'apprentissage. Cependant, je pense que le seuil est bas car vous pouvez trouver des outils pour générer des modèles d'apprentissage et des modèles d'apprentissage créés par quelqu'un.
L'apprentissage régressif permet une détection très rapide des points de repère. Cela semble être une méthode similaire à "Ensemble d'arbres de régression", mais je ne comprends pas les petites différences. Il est implémenté en OpenCV (Facemark LBF), et un modèle d'apprentissage est également disponible.
Cette fois, je veux l'implémenter facilement avec python, donc j'utiliserai "[(1) Méthode utilisant un ensemble d'arbres de régression](méthode # 1 utilisant un ensemble d'arbres de régression)" dans dlib.
Ajoutez dlib et imutils pour la détection de repère de visage en tant que modules et OpenCV pour l'image liée. Notez que vous devez être python dans l'environnement Anaconda pour ajouter dlib.
Installer le module python
pip install dlib
pip install imutils
pip install opencv
pip install libopencv
pip install py-opencv
Le modèle formé peut être obtenu sur le site officiel de dlib ci-dessous.
En passant, le modèle formé ci-dessus est généré sur la base des données des sites suivants.
Pour l'image du visage, j'ai obtenu "Girl.bmp" de ce qui suit et l'ai utilisé.
N'est-ce pas la "Lenna" classique pour le traitement d'image? Vous pouvez penser cela. Cependant, j'ai supprimé "Lenna" parce que je ne pouvais pas obtenir de meilleurs résultats que prévu, probablement parce que je me suis retourné. Si vous êtes intéressé, essayez-le.
Il s'agit d'un échantillon qui détecte les repères du visage à partir d'une image fixe. Le modèle entraîné (shape_predictor_68_face_landmarks.dat) et l'image du visage (Girl.bmp) sont gênants, ils sont donc placés dans la même hiérarchie.
face_landmark_sample.py
# coding:utf-8
import dlib
from imutils import face_utils
import cv2
# --------------------------------
# 1.Préparation à la détection des points de repère du visage
# --------------------------------
#Outil de détection de visage d'appel
face_detector = dlib.get_frontal_face_detector()
#Appeler un outil de détection de repère de visage
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)
#Appel de l'image à détecter
img = cv2.imread('Girl.bmp')
#Échelle de gris pour un traitement plus rapide(Tout)
img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# --------------------------------
# 2.Détection des points de repère faciaux
# --------------------------------
#Détection facial
#* Le deuxième argument est le nombre de suréchantillons. En gros, une seule fois suffit.
faces = face_detector(img_gry, 1)
#Processus pour tous les visages détectés
for face in faces:
#Détection des points de repère faciaux
landmark = face_predictor(img_gry, face)
#Convertissez les points de repère en tableau NumPy pour un traitement plus rapide(Obligatoire)
landmark = face_utils.shape_to_np(landmark)
#Dessin de repère
for (i, (x, y)) in enumerate(landmark):
cv2.circle(img, (x, y), 1, (255, 0, 0), -1)
# --------------------------------
# 3.Affichage des résultats
# --------------------------------
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Le résultat est le suivant.
Comme le montre la figure ci-dessus, les repères faciaux ont été magnifiquement détectés. Expliquons ce que fait chaque code avant de détecter un repère.
Après avoir détecté les points de repère sur le visage, j'aimerais bien sûr effectuer divers traitements. À ce moment-là, je suis curieux de savoir comment appeler chaque point de repère.
Les repères des visages sont tirés des données des [Sites mentionnés ci-dessus](modèle #Obtenir formé). Par conséquent, les numéros de repère sont également les mêmes que les numéros sur le site d'apprentissage.
Numéro de repère: https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/
Comme vous pouvez le voir sur la figure ci-dessus, les numéros sont attribués de 1 à 68. Cependant, lors du référencement, le tableau commence à 0, donc il sera de 0 à 67 et les nombres seront décalés de un.
C'est difficile à comprendre, donc je vais en couper une partie avec un diagramme et un code.
face_landmark_sample2.py
# coding:utf-8
import dlib
from imutils import face_utils
import cv2
# --------------------------------
# 1.Préparation à la détection des points de repère du visage
# --------------------------------
#Outil de détection de visage d'appel
face_detector = dlib.get_frontal_face_detector()
#Appeler un outil de détection de repère de visage
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)
#Appel de l'image à détecter
img = cv2.imread('Girl.bmp')
#Échelle de gris pour un traitement plus rapide(Tout)
img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# --------------------------------
# 2.Détection des points de repère faciaux
# --------------------------------
#Détection facial
#* Le deuxième argument est le nombre de suréchantillons
faces = face_detector(img_gry, 1)
#Processus pour tous les visages détectés
for face in faces:
#Détection des points de repère faciaux
landmark = face_predictor(img_gry, face)
#Convertissez les points de repère en tableau NumPy pour un traitement plus rapide(Obligatoire)
landmark = face_utils.shape_to_np(landmark)
# --------------------------------
# 3.Couper l'image du repère
# --------------------------------
#Obtenez la coordonnée X du repère numéro 1
landmark_n1_x = landmark[0][0]
#Obtenez la coordonnée X du repère numéro 17
landmark_n17_x = landmark[16][0]
#Obtenir la coordonnée Y du repère numéro 9
landmark_n9_y = landmark[8][1]
#Obtenir la coordonnée Y du repère numéro 28
landmark_n28_y = landmark[27][1]
#Découpez l'image
img2 = img[landmark_n28_y:landmark_n9_y, landmark_n1_x:landmark_n17_x]
#Affichage des résultats
cv2.imshow('sample', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Le résultat est le suivant.
La raison pour cela est la suivante.
Les repères commencent au numéro 1, mais le tableau qui les stocke commence au numéro 0. Par conséquent, une telle déviation se produit.
De plus, je mettrai un échantillon pour détecter le repère du visage à partir de l'image de la caméra. Il n'y a pas de résultat d'exécution car je n'ai pas le courage d'exposer mon visage sur le net.
face_landmark_sample.py
# coding:utf-8
import dlib
from imutils import face_utils
import cv2
# --------------------------------
# 1.Préparation à la détection des points de repère du visage
# --------------------------------
#Appel de l'outil de détection de repère de visage
face_detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)
# --------------------------------
# 2.Fonction pour détecter les repères faciaux à partir d'images
# --------------------------------
def face_landmark_find(img):
#Détection facial
img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector(img_gry, 1)
#Processus pour tous les visages détectés
for face in faces:
#Détection des points de repère faciaux
landmark = face_predictor(img_gry, face)
#Convertissez les points de repère en tableau NumPy pour un traitement plus rapide(Obligatoire)
landmark = face_utils.shape_to_np(landmark)
#Dessin de repère
for (x, y) in landmark:
cv2.circle(img, (x, y), 1, (0, 0, 255), -1)
return img
# --------------------------------
# 3.Obtenir l'image de la caméra
# --------------------------------
#Désignation de la caméra(Passez les arguments appropriés)
cap = cv2.VideoCapture(0)
#Affichage de l'image de la caméra('q'Terminer avec l'entrée)
while(True):
ret, img = cap.read()
#Détection des points de repère faciaux(2.Appel de fonction)
img = face_landmark_find(img)
#Voir les résultats
cv2.imshow('img', img)
# 'q'Boucle jusqu'à ce que soit entré
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#Post-traitement
cap.release()
cv2.destroyAllWindows()
Facemark : Facial Landmark Detection using OpenCV https://www.learnopencv.com/facemark-facial-landmark-detection-using-opencv/ Il explique à partir de quel papier l'algorithme de détection des points de repère sur chaque visage est implémenté. Il existe également un exemple de détection de repère facial à l'aide de Facemaker LBF par C ++.
One Millisecond Face Alignment with an Ensemble of Regression Trees http://www.csc.kth.se/~vahidk/face_ert.html Il s'agit d'un article publié par V. Kazemi et J. Sullivan. L'algorithme de détection de repère facial implémenté dans dlib utilisé cette fois est basé sur cet article.
Optimization problems for fast AAM fitting in-the-wild https://ibug.doc.ic.ac.uk/media/uploads/documents/tzimiro_pantic_iccv2013.pdf Il s'agit d'un article publié par G. Tzimiropoulos et M. Pantic. Facemaker AAM d'OpenCV est implémenté sur la base de cet article.
One Millisecond Face Alignment with an Ensemble of Regression Trees http://www.csc.kth.se/~vahidk/face_ert.html Il s'agit d'un article publié par S. Ren. Facemaker LBF d'OpenCV est implémenté sur la base de cet article.
dlib C++ Library ~Face Landmark Detection~ http://dlib.net/face_landmark_detection.py.html Ceci est un exemple de détection de repère facial par python présenté sur le site officiel de dlib.
** Détecter les repères faciaux Utilisez Python + OpenCV + dlib ** https://tech-blog.s-yoshiki.com/2018/10/702/ Le code source pour la détection des repères de visage par Python + OpenCV + dlib est fourni en japonais. Je l'ai utilisé comme référence lors du codage.
PyImageSearch Facial landmarks with dlib, OpenCV, and Python https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/ (Faster) Facial landmark detector with dlib https://www.pyimagesearch.com/2018/04/02/faster-facial-landmark-detector-with-dlib/ Le code source pour la détection des repères de visage par Python + OpenCV + dlib est fourni en anglais. Comme il a été expliqué en détail, il a permis de comprendre chaque processus et a été très utile.
Recommended Posts