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)".
Es gibt drei Hauptmethoden zum Erkennen von Gesichtspunkten. Einzelheiten hierzu finden Sie in den Artikeln unter [Referenzlinks](#About Face Landmark Detection).
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
Der Grund dafür ist wie folgt.
Orientierungspunkte beginnen bei Nummer 1, aber das Array, in dem sie gespeichert sind, beginnt bei Nummer 0. Daher tritt eine solche Abweichung auf.
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()
Facemark : Facial Landmark Detection using OpenCV https://www.learnopencv.com/facemark-facial-landmark-detection-using-opencv/ Es wird erklärt, ab welchem Papier der Algorithmus zum Erkennen von Orientierungspunkten auf jeder Fläche implementiert ist. Es gibt auch ein Beispiel für die Erkennung von Gesichtsmarkierungen mit Facemaker LBF von C ++.
One Millisecond Face Alignment with an Ensemble of Regression Trees http://www.csc.kth.se/~vahidk/face_ert.html Dies ist ein Artikel von V. Kazemi und J. Sullivan. Der in dlib implementierte Algorithmus zur Erkennung von Gesichtsmarkierungen, der dieses Mal verwendet wird, basiert auf diesem Dokument.
Optimization problems for fast AAM fitting in-the-wild https://ibug.doc.ic.ac.uk/media/uploads/documents/tzimiro_pantic_iccv2013.pdf Dies ist ein Artikel von G. Tzimiropoulos und M. Pantic. Facemaker AAM von OpenCV wird basierend auf diesem Dokument implementiert.
One Millisecond Face Alignment with an Ensemble of Regression Trees http://www.csc.kth.se/~vahidk/face_ert.html Dies ist ein Artikel von S. Ren. Der Facemaker LBF von OpenCV wird basierend auf diesem Dokument implementiert.
dlib C++ Library ~Face Landmark Detection~ http://dlib.net/face_landmark_detection.py.html Dies ist ein Beispiel für die Erkennung von Gesichtsmarkierungen durch Python, das auf der offiziellen Website von dlib vorgestellt wurde.
** Wahrzeichen im Gesicht erkennen Verwenden Sie Python + OpenCV + dlib ** https://tech-blog.s-yoshiki.com/2018/10/702/ Der Quellcode für die Erkennung von Gesichtsmarkierungen durch Python + OpenCV + dlib wird auf Japanisch bereitgestellt. Ich habe es als Referenz beim Codieren verwendet.
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/ Der Quellcode für die Erkennung von Gesichtsmarkierungen durch Python + OpenCV + dlib wird in englischer Sprache bereitgestellt. Da es ausführlich erklärt wurde, führte es zu einem Verständnis jedes Prozesses und war sehr hilfreich.