Beim letzten Mal habe ich den Gesichtsbereich mit dem Haar-ähnlichen Feature-Klassifikator (Gesichtserkennung mit OpenCV (Haar-ähnlicher Feature-Klassifikator) extrahiert. ). Dieses Mal wurde als Anwendung das vom Haar-ähnlichen Merkmalsklassifikator extrahierte Gesichtsbild vom OpenCV-Gesichtsschätzer (Eigenface, Fisherface, LBPH) trainiert, und es gab Unterschiede in Mimik, Verkleidung und Lichtverhältnissen. Lassen Sie uns raten, wer das verlernte Gesicht ist.
Der in OpenCV installierte Gesichtsschätzungsalgorithmus lautet wie folgt. (Klicken Sie hier für Details)
Bereiten Sie ein Bild für das Training vor (gleiche Lichtverhältnisse, Skalierung an Augen- und Nasenpositionen, gleiche Auflösung).
Berechnen Sie den Durchschnitt der Trainingsbilder und subtrahieren Sie das Durchschnittsbild von jedem Bild.
Berechnen Sie die Kovarianzmatrix des subtrahierten Bildes.
Berechnen Sie den Eigenvektor und den Eigenwert aus der Kovarianzmatrix.
Wählen Sie die Hauptkomponente aus.
Fisherface
Eine verbesserte Version von Eigenface. Im Vergleich zu Eigenface ist es weniger anfällig für Unterschiede in Beleuchtung und Winkel.
Local Binary Patterns Histogram(LBPH)
Teilen Sie das Gesicht in kleinere Zellen und vergleichen Sie die Histogramme für jeden Bereich. Im Vergleich zu Eigenface und Fisherface verfügt dieser Algorithmus über die Funktion, die er auch dann erkennen kann, wenn Größe und Form der Probenfläche unterschiedlich sind.
Dieses Mal werden wir das Gesicht erkennen, aber diese Algorithmen werden auch auf die Handschriftenbewertung, die medizinische Bildverarbeitung und das Lippenlesen angewendet. An einem interessanten Ort ist es möglich, die verkleidete Person zu identifizieren.
OpenCV OpenCV (Open Source Computer Vision Library) ist eine Sammlung von BSD-lizenzierten Video- / Bildverarbeitungsbibliotheken. Es gibt viele Algorithmen wie Bildfilterung, Vorlagenabgleich, Objekterkennung, Videoanalyse und maschinelles Lernen.
■ Beispiel für Bewegungsverfolgung mit OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s
■ Klicken Sie hier für die Installation und einfache Verwendung Installieren Sie OpenCV 3 (Core + Contrib) in der Python 3-Umgebung und unterscheiden Sie zwischen OpenCV 2 und OpenCV 3 und überprüfen Sie die einfache Bedienung ★ Die Predict () -Methode funktionierte im Gesichtsmodul von opencv_contrib in OpenCV 3.1 nicht wie beabsichtigt. Dieses Mal ist OpenCV 2 auf Anaconda 2 installiert und das folgende Programm wird ausgeführt.
■ Klicken Sie hier für die Standbildverarbeitung Versuchen Sie die Kantenerkennung mit OpenCV Führen Sie verschiedene Filter mit OpenCV durch (Gradient, Highpass, Laplacian, Gaussian) Extrahieren Sie Feature-Punkte mit OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob) Gesichtserkennung mit OpenCV (Haar-like Feature Classifier)
■ Klicken Sie hier für die Videoverarbeitung Versuchen Sie, Videos in Echtzeit mit OpenCV zu konvertieren Versuchen Sie, Webkamera- / Videokamera-Videos in Echtzeit mit OpenCV zu konvertieren Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode) Objektverfolgung mit OpenCV (Verfolgen von Funktionspunkten, die von der Maus mit der Lucas-Kanade-Methode festgelegt wurden Bewegungsvorlagenanalyse mit OpenCV (Erkennen von Objekten und deren Bewegungsrichtungen in Echtzeit)
Einführung in die Gesichtsdatenbank, die häufig in der Bildverarbeitung verwendet wird.
Dieses Mal verwenden wir die Yale-Gesichtsdatenbank (Yale-Gesichter).
Yalefaces enthält 15 verschiedene Gesichtsgesichter. Jede Person hat ein normales Gesicht, ein Gesicht mit Brille, ein glückliches Gesicht, ein zwinkerndes Gesicht, ein trauriges Gesicht, ein trauriges Gesicht, ein überraschtes Gesicht und ein Licht von rechts / links. Ich habe ein Gesicht. Extrahieren Sie gegebenenfalls ein beliebiges Gesichtsbild aus dem Gesichtsbild jeder Person zum Testen (fügen Sie das Testbild nicht in das Trainingsbild ein). Dieses Mal habe ich die Trainingsbilder im Verzeichnis "yalefaces" und die Testbilder im Verzeichnis "test" gespeichert.
Gesichter mit verschiedenen Ausdrücken
Der Programmablauf ist wie folgt.
Es gibt einige Punkte im Programm.
face_predict.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2, os
import numpy as np
from PIL import Image
#Trainingsbild
train_path = './yalefaces'
#Testbild
test_path = './test'
# Haar-wie Feature-Klassifikator
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)
#Erstellen eines Gesichtserkenners für OpenCV 2
#* In OpenCV3 ist FaceRecognizer cv2.Es wird ein Gesichtsmodul sein
# EigenFace
#recognizer = cv2.createEigenFaceRecognizer()
# FisherFace
#recognizer = cv2.createFisherFaceRecognizer()
# LBPH
recognizer = cv2.createLBPHFaceRecognizer()
#Holen Sie sich das Bild in den angegebenen Pfad
def get_images_and_labels(path):
#Array zum Speichern von Bildern
images = []
#Array zum Speichern von Beschriftungen
labels = []
#Array zum Speichern von Dateinamen
files = []
for f in os.listdir(path):
#Bildpfad
image_path = os.path.join(path, f)
#Laden Sie das Bild in Graustufen
image_pil = Image.open(image_path).convert('L')
#In einem Array von NumPy gespeichert
image = np.array(image_pil, 'uint8')
# Haar-wie Gesicht mit Feature-Klassifikator erkennen
faces = faceCascade.detectMultiScale(image)
#Verarbeitung des erkannten Gesichtsbildes
for (x, y, w, h) in faces:
#Ändern Sie die Größe des Gesichts auf 200 x 200
roi = cv2.resize(image[y: y + h, x: x + w], (200, 200), interpolation=cv2.INTER_LINEAR)
#Speichern Sie Bilder in einem Array
images.append(roi)
#Beschriftung vom Dateinamen abrufen
labels.append(int(f[7:9]))
#Speichern Sie Dateinamen in einem Array
files.append(f)
return images, labels, files
#Holen Sie sich ein Trainingsbild
images, labels, files = get_images_and_labels(train_path)
#Durchführung der Schulung
recognizer.train(images, np.array(labels))
#Holen Sie sich das Testbild
test_images, test_labels, test_files = get_images_and_labels(test_path)
i = 0
while i < len(test_labels):
#Vorhersageimplementierung für Testbilder
label, confidence = recognizer.predict(test_images[i])
#Ausgabe des Vorhersageergebnisses an die Konsole
print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], label, confidence))
#Testbild anzeigen
cv2.imshow("test image", test_images[i])
cv2.waitKey(300)
i += 1
#Verarbeitung beenden
cv2.destroyAllWindows()
Dieses Programm lief unter Python 2.7.12 und OpenCV 2.4.13. Wenn Sie mit Python 3 und OpenCV 3 arbeiten, ändern Sie den FaceRecognizer-Teil im Programm von "cv2" in "cv2.face". In OpenCV 3.1 funktioniert die Predict () -Methode von FaceRecognizer nicht wie beabsichtigt. Weitere Informationen finden Sie unter Unterschiede zwischen OpenCV2 und OpenCV3 usw. ⇒ Einige Methoden funktionieren aufgrund von Fehlern nicht.
Das Training wird ausgeführt, indem der Teil "XX" von subjectXX als numerischer Wert auf dem Etikett festgelegt wird. Das richtige Etikett (Predicted Label) kann für das Testbild (Image) geschätzt werden.
Bei der Schätzung mit Eigenface schlug die Schätzung der lichtbezogenen Markierung = 5, 6, 8, 9 fehl, und andere Schätzungen waren erfolgreich.
Test Image: subject01.happy, Predicted Label: 1, Confidence: 4383.25505059
Test Image: subject02.wink, Predicted Label: 2, Confidence: 6947.75053221
Test Image: subject03.happy, Predicted Label: 3, Confidence: 4145.80848328
Test Image: subject04.glasses, Predicted Label: 4, Confidence: 5420.9213318
Test Image: subject05.leftlight, Predicted Label: 12, Confidence: 7722.72936213
Test Image: subject06.leftlight, Predicted Label: 1, Confidence: 10086.4101755
Test Image: subject07.glasses, Predicted Label: 7, Confidence: 7043.70495967
Test Image: subject08.leftlight, Predicted Label: 2, Confidence: 10275.9545456
Test Image: subject09.rightlight, Predicted Label: 15, Confidence: 7481.31094502
Test Image: subject10.sleepy, Predicted Label: 10, Confidence: 2317.22633915
Test Image: subject11.centerlight, Predicted Label: 11, Confidence: 8077.42380817
Test Image: subject12.glasses, Predicted Label: 12, Confidence: 5233.03342586
Test Image: subject13.surprised, Predicted Label: 13, Confidence: 6516.98395617
Test Image: subject14.normal, Predicted Label: 14, Confidence: 0.0
Test Image: subject15.surprised, Predicted Label: 15, Confidence: 7165.71597327
Als ich es mit Fisherface schätzte, waren alle Schätzungen erfolgreich.
Test Image: subject01.happy, Predicted Label: 1, Confidence: 801.784987691
Test Image: subject02.wink, Predicted Label: 2, Confidence: 2368.90429845
Test Image: subject03.happy, Predicted Label: 3, Confidence: 826.018934498
Test Image: subject04.glasses, Predicted Label: 4, Confidence: 1080.94198758
Test Image: subject05.leftlight, Predicted Label: 5, Confidence: 2137.42013849
Test Image: subject06.leftlight, Predicted Label: 6, Confidence: 2092.53092982
Test Image: subject07.glasses, Predicted Label: 7, Confidence: 2042.67529443
Test Image: subject08.leftlight, Predicted Label: 8, Confidence: 2239.45348941
Test Image: subject09.rightlight, Predicted Label: 9, Confidence: 2875.2788263
Test Image: subject10.sleepy, Predicted Label: 10, Confidence: 662.762591569
Test Image: subject11.centerlight, Predicted Label: 11, Confidence: 1703.80515728
Test Image: subject12.glasses, Predicted Label: 12, Confidence: 1480.18770297
Test Image: subject13.surprised, Predicted Label: 13, Confidence: 1690.12255703
Test Image: subject14.normal, Predicted Label: 14, Confidence: 0.0
Test Image: subject15.surprised, Predicted Label: 15, Confidence: 1887.42538269
Bei der Schätzung durch LBPH schlug die Schätzung der lichtbezogenen Markierung = 6, 9 fehl. Andere waren erfolgreich.
Test Image: subject01.happy, Predicted Label: 1, Confidence: 34.9751422497
Test Image: subject02.wink, Predicted Label: 2, Confidence: 37.8730262399
Test Image: subject03.happy, Predicted Label: 3, Confidence: 35.1183059319
Test Image: subject04.glasses, Predicted Label: 4, Confidence: 37.5886492389
Test Image: subject05.leftlight, Predicted Label: 5, Confidence: 48.2634869014
Test Image: subject06.leftlight, Predicted Label: 14, Confidence: 64.5502245279
Test Image: subject07.glasses, Predicted Label: 7, Confidence: 54.5043891288
Test Image: subject08.leftlight, Predicted Label: 8, Confidence: 84.4281976817
Test Image: subject09.rightlight, Predicted Label: 12, Confidence: 75.3254674542
Test Image: subject10.sleepy, Predicted Label: 10, Confidence: 17.8806440153
Test Image: subject11.centerlight, Predicted Label: 11, Confidence: 74.8238311755
Test Image: subject12.glasses, Predicted Label: 12, Confidence: 31.8721301084
Test Image: subject13.surprised, Predicted Label: 13, Confidence: 40.3420527188
Test Image: subject14.normal, Predicted Label: 14, Confidence: 0.0
Test Image: subject15.surprised, Predicted Label: 15, Confidence: 33.2920487407
Das Vergleichsergebnis der drei Algorithmen zeigt, dass das Fisherface, wie bereits gesagt, weniger lichtempfindlich ist. Da der Erfolg und Misserfolg der Schätzung in gewissem Maße dem Wert des Vertrauens entsprach, schien es auch gut, einen Schwellenwert für das Vertrauen festzulegen und unzuverlässige Schätzergebnisse in unschätzbare Elemente zu klassifizieren.
OpenCV unterstützt keine GIF-Bilder, um Patentprobleme zu vermeiden. Das Lesen eines GIF-Bildes mit cv2.imread () liest nichts. Wenn Sie Yalefaces, eine Gesichtsbilddatenbank im GIF-Format, mit OpenCV verwenden möchten, können Sie diese im Voraus mit dem folgenden Skript in ein Gesichtsbild im PNG-Format konvertieren. Das folgende Skript konvertiert das GIF-Bild im Verzeichnis "yalefaces" in ein PNG-Bild und speichert es im Verzeichnis "png". Wenn Sie es brauchen, verwenden Sie bitte das folgende Skript.
gif2png.py
# -*- coding: utf-8 -*-
import os
from PIL import Image
import shutil
#Verzeichnis mit den zu konvertierenden Dateien
org_dir = 'yalefaces'
#Erweiterung der zu konvertierenden Datei
org_ext = 'gif'
#Verzeichnis zum Speichern der konvertierten Datei
conv_dir = 'png'
#Konvertierte Dateierweiterung
conv_ext = 'png'
#Löschen Sie vorhandene Verzeichnisse einschließlich Dateien
if os.path.exists(conv_dir):
shutil.rmtree(conv_dir)
#Erstellen Sie ein Verzeichnis
os.mkdir(conv_dir)
# 「.Zeichenkettenlänge einschließlich der Erweiterung
org_ext_len = len(org_ext) + 1
for dirname, dirnames, filenames in os.walk(org_dir):
for filename in filenames:
#Pfad der zu konvertierenden Datei
org_path = org_dir + '/' + filename
#Dateipfad nach der Rückkehr
if len(filename) > org_ext_len and \
filename[-org_ext_len:] == '.' + org_ext:
filename = filename[0:-org_ext_len]
conv_path = conv_dir + '/' + filename + '.' + conv_ext
try:
#Ausführung konvertieren
Image.open(org_path).save(conv_path)
except IOError:
print('cannot convert :', org_path)
Wenn Sie die Python-Bildverarbeitungsbibliothek und das PIL-Modul nicht installiert haben, installieren Sie bitte pillow. Beispiel)
$ conda install pillow