Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen

Einführung

Als ich Student war, forschte ich über die Erkennung von Landmarken im Gesicht. Ich war überrascht, dass es jetzt unglaublich einfach ist.

Also würde ich es gerne mal ausprobieren. Wenn Sie es vorerst implementieren möchten, lesen Sie bitte aus "[Ich habe versucht, Gesichtsmarkierungen leicht zu erkennen](# Ich habe versucht, Landmarken auf dem Gesicht leicht zu erkennen)".

So erkennen Sie Gesichtspunkte

Es gibt drei Hauptmethoden zum Erkennen von Gesichtspunkten. Einzelheiten hierzu finden Sie in den Artikeln unter [Referenzlinks](#About Face Landmark Detection).

(1) Methode unter Verwendung eines Ensembles von Regressionsbäumen

Sowohl dlib als auch OpenCV (Facemark Kazemi) sind implementiert. Standardmäßig verfügt jedoch nur dlib über ein Trainingsmodell. (2) Verfahren unter Verwendung des aktiven Erscheinungsmodells Die Objekterkennung wird basierend auf dem statistischen Modell durchgeführt, das aus der Form und dem Aussehen des Objekts gelernt wurde. Diese Methode wird seit langem für die erweiterte Objektverfolgung verwendet, nicht nur für Gesichter. (Es war diese AAM, die ich studierte, als ich Student war) Es ist in OpenCV (Facemark AAM) implementiert, Sie müssen jedoch Ihr eigenes Lernmodell erstellen. Ich denke jedoch, dass der Schwellenwert niedrig ist, da Sie Tools zum Generieren von Lernmodellen und Lernmodellen finden können, die von jemandem erstellt wurden.

(3) Methode unter Verwendung lokaler binärer Merkmale

Regressives Lernen ermöglicht eine sehr schnelle Erkennung von Orientierungspunkten. Es scheint eine ähnliche Methode zu sein wie "Ensemble of Regression Tree", aber ich verstehe die kleinen Unterschiede nicht. Es ist in OpenCV (Facemark LBF) implementiert und ein Lernmodell ist ebenfalls verfügbar.

Ich habe versucht, leicht Orientierungspunkte im Gesicht zu erkennen

Dieses Mal möchte ich es einfach mit Python implementieren, daher werde ich "[(1) Methode mit Ensemble von Regressionsbäumen](# 1 Methode mit Ensemble von Regressionsbäumen)" in dlib verwenden.

Vorbereitungen

Holen Sie sich das Python-Modul

Fügen Sie dlib und imutils für die Erkennung von Gesichtsmarkierungen als Module und OpenCV für bildbezogene hinzu. Beachten Sie, dass Sie in der Anaconda-Umgebung Python sein müssen, um dlib hinzuzufügen.

Python-Modul installieren


pip install dlib
pip install imutils
pip install opencv
pip install libopencv
pip install py-opencv

Ein geschultes Modell erhalten

Das trainierte Modell kann von der offiziellen dlib-Website unten bezogen werden.

Abgesehen davon wird das oben trainierte Modell basierend auf den Daten der folgenden Standorte generiert.

Holen Sie sich Gesichtsbild

Für das Gesichtsbild habe ich "Girl.bmp" aus dem Folgenden erhalten und verwendet.

Ist es nicht die klassische "Lenna" für die Bildverarbeitung? Sie können das denken. Ich habe jedoch "Lenna" entfernt, weil ich keine besseren Ergebnisse erzielen konnte als erwartet, wahrscheinlich weil ich mich umgedreht habe. Wenn Sie interessiert sind, versuchen Sie es bitte.

Erkennung von Gesichtspunkten in Standbildern

Dies ist ein Beispiel, das Gesichtspunkte aus einem Standbild erkennt. Das trainierte Modell (shape_predictor_68_face_landmarks.dat) und das Gesichtsbild (Girl.bmp) sind problematisch, sodass sie in derselben Hierarchie angeordnet sind.

face_landmark_sample.py


# coding:utf-8

import dlib
from imutils import face_utils
import cv2

# --------------------------------
# 1.Vorbereitung für die Erkennung von Gesichtsmarkierungen
# --------------------------------
#Gesichtserkennungstool aufrufen
face_detector = dlib.get_frontal_face_detector()

#Aufrufen eines Tools zur Erkennung von Gesichtsmarkierungen
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)

#Aufruf des zu erkennenden Bildes
img = cv2.imread('Girl.bmp')
#Graustufen für schnellere Verarbeitung(Irgendein)
img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# --------------------------------
# 2.Gesichtsmarkierungserkennung
# --------------------------------
#Gesichtserkennung
#* Das zweite Argument ist die Anzahl der Upsamples. Grundsätzlich reicht eine Zeit aus.
faces = face_detector(img_gry, 1)

#Prozess für alle erkannten Gesichter
for face in faces:
    #Gesichtsmarkierungserkennung
    landmark = face_predictor(img_gry, face)
    #Konvertieren Sie Orientierungspunkte in ein NumPy-Array, um die Verarbeitung zu beschleunigen(Verpflichtend)
    landmark = face_utils.shape_to_np(landmark)

    #Landmark Zeichnung
    for (i, (x, y)) in enumerate(landmark):
        cv2.circle(img, (x, y), 1, (255, 0, 0), -1)

# --------------------------------
# 3.Ergebnisanzeige
# --------------------------------
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Das Ergebnis ist wie folgt.

face_landmark_result.png

Wie in der obigen Abbildung gezeigt, wurden Gesichtspunkte im Gesicht wunderschön erkannt. Lassen Sie uns erklären, was jeder Code tut, bevor Sie einen Orientierungspunkt erkennen.

Gesicht Orientierungspunktnummer

Nachdem ich die Landmarken im Gesicht erkannt habe, möchte ich natürlich verschiedene Verarbeitungen durchführen. Zu dieser Zeit bin ich neugierig, wie man jedes Wahrzeichen nennt.

Gesichtsmarkierungen werden aus den Daten in [oben genannten Sites](# Get trained model) gelernt. Daher stimmen die Orientierungspunktnummern auch mit den Nummern auf der Lernseite überein.

figure_68_markup.jpg

Orientierungspunktnummer: https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/

Wie Sie der obigen Abbildung entnehmen können, werden die Nummern von 1 bis 68 zugewiesen. Bei der tatsächlichen Referenzierung beginnt das Array jedoch bei 0, sodass es zwischen 0 und 67 liegt und die Zahlen um eins verschoben werden.

Es ist schwer zu verstehen, deshalb schneide ich einen Teil davon mit einem Diagramm und Code aus.

face_landmark_sample2.py


# coding:utf-8

import dlib
from imutils import face_utils
import cv2

# --------------------------------
# 1.Vorbereitung für die Erkennung von Gesichtsmarkierungen
# --------------------------------
#Gesichtserkennungstool aufrufen
face_detector = dlib.get_frontal_face_detector()
#Aufrufen eines Tools zur Erkennung von Gesichtsmarkierungen
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)

#Aufruf des zu erkennenden Bildes
img = cv2.imread('Girl.bmp')
#Graustufen für schnellere Verarbeitung(Irgendein)
img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# --------------------------------
# 2.Gesichtsmarkierungserkennung
# --------------------------------
#Gesichtserkennung
#* Das zweite Argument ist die Anzahl der Upsamples
faces = face_detector(img_gry, 1)

#Prozess für alle erkannten Gesichter
for face in faces:
    #Gesichtsmarkierungserkennung
    landmark = face_predictor(img_gry, face)
    #Konvertieren Sie Orientierungspunkte in ein NumPy-Array, um die Verarbeitung zu beschleunigen(Verpflichtend)
    landmark = face_utils.shape_to_np(landmark)

    # --------------------------------
    # 3.Schneiden Sie das Bild vom Orientierungspunkt aus
    # --------------------------------
    #Holen Sie sich die X-Koordinate des Orientierungspunkts Nummer 1
    landmark_n1_x = landmark[0][0]

    #Ermitteln Sie die X-Koordinate des Orientierungspunkts mit der Nummer 17
    landmark_n17_x = landmark[16][0]

    #Holen Sie sich die Y-Koordinate von Landmark Nummer 9
    landmark_n9_y = landmark[8][1]

    #Holen Sie sich die Y-Koordinate der Landmarknummer 28
    landmark_n28_y = landmark[27][1]

    #Schneiden Sie das Bild aus
    img2 = img[landmark_n28_y:landmark_n9_y, landmark_n1_x:landmark_n17_x]

    #Ergebnisanzeige
    cv2.imshow('sample', img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Das Ergebnis ist wie folgt.

face_landmark_result2.png

Der Grund dafür ist wie folgt.

face_landmark_how.png

Orientierungspunkte beginnen bei Nummer 1, aber das Array, in dem sie gespeichert sind, beginnt bei Nummer 0. Daher tritt eine solche Abweichung auf.

Echtzeit-Erkennung von Gesichtsmarkierungen

Zusätzlich werde ich ein Beispiel einfügen, um die Landmarke des Gesichts aus dem Kamerabild zu erkennen. Es gibt kein Ausführungsergebnis, weil ich nicht den Mut habe, mein Gesicht im Netz freizulegen.

face_landmark_sample.py


# coding:utf-8

import dlib
from imutils import face_utils
import cv2

# --------------------------------
# 1.Vorbereitung für die Erkennung von Gesichtsmarkierungen
# --------------------------------
#Aufrufen des Tools zur Erkennung von Gesichtsmarkierungen
face_detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)


# --------------------------------
# 2.Funktion zum Erkennen von Gesichtspunkten anhand von Bildern
# --------------------------------
def face_landmark_find(img):
    #Gesichtserkennung
    img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_detector(img_gry, 1)

    #Prozess für alle erkannten Gesichter
    for face in faces:
        #Gesichtsmarkierungserkennung
        landmark = face_predictor(img_gry, face)
        #Konvertieren Sie Orientierungspunkte in ein NumPy-Array, um die Verarbeitung zu beschleunigen(Verpflichtend)
        landmark = face_utils.shape_to_np(landmark)

        #Landmark Zeichnung
        for (x, y) in landmark:
            cv2.circle(img, (x, y), 1, (0, 0, 255), -1)

    return img


# --------------------------------
# 3.Kamerabild abrufen
# --------------------------------
#Kamerabezeichnung(Übergeben Sie die entsprechenden Argumente)
cap = cv2.VideoCapture(0)

#Anzeige des Kamerabildes('q'Mit Eingabe beenden)
while(True):
    ret, img = cap.read()

    #Gesichtsmarkierungserkennung(2.Funktionsaufruf)
    img = face_landmark_find(img)

    #Ergebnisse anzeigen
    cv2.imshow('img', img)

    # 'q'Schleife bis eingegeben wird
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#Nachbearbeitung
cap.release()
cv2.destroyAllWindows()

Referenzlink

Papier zur Erkennung von Gesichtspunkten

Codierung im Zusammenhang

Recommended Posts

Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, mit Selenium + Python einfach ein vollautomatisches Anwesenheitssystem zu erstellen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, Überlebende der Titanic mit Kaggle vorherzusagen und einzureichen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, WebScraping mit Python.
Ich habe mit PyQt5 und Python3 gespielt
Mit Python 3 einfach auf Twitter posten
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Lesezeichen zu visualisieren, die mit Doc2Vec und PCA nach Slack fliegen