J'ai essayé de détecter facilement les points de repère du visage avec python et dlib

introduction

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)".

Comment détecter les repères faciaux

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).

(1) Méthode utilisant un ensemble d'arbres de régression

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.

(2) Méthode utilisant le modèle d'apparence active

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.

(3) Méthode utilisant les fonctionnalités binaires locales

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.

J'ai essayé de détecter facilement les points de repère sur le visage

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.

Préparation préalable

Obtenez le module python

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

Obtention d'un modèle entraîné

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.

Obtenir l'image du visage

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.

Détection des points de repère du visage sur les images fixes

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.

face_landmark_result.png

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.

Numéro de repère de visage

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.

figure_68_markup.jpg

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.

face_landmark_result2.png

La raison pour cela est la suivante.

face_landmark_how.png

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.

Détection des points de repère du visage en temps réel

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()

Lien de référence

Papier lié à la détection des points de repère du visage

Codage lié

Recommended Posts

J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
Je veux gérer l'optimisation avec python et cplex
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de toucher Python (installation)
J'ai essayé webScraping avec python.
J'ai joué avec PyQt5 et Python3
Publiez facilement sur Twitter avec Python 3
Je veux déboguer avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de visualiser les signets volant vers Slack avec Doc2Vec et PCA