Die rasche Entwicklung in den Bereichen Maschinellem Lernen und Künstlicher Intelligenz hat bedeutende Fortschritte in der Computervisualisierung für die Objekterkennung und -erkennung gemacht. Dennoch stellt die Schaffung eines Systems dar, das Humor und Vergnügen bei Menschen erkennen kann, immer noch ein herausforderndes Problem für Programmierer dar, da Komödie und Unterhaltung subjektiv sind und auf persönlichen Vorlieben und kulturellem Kontext basieren. Daher ist es schwierig, ein System zu entwickeln, das genau bestimmen kann, was Individuen amüsant oder erfreulich finden.
Jedoch hat die Computervisualisierung in der Gesichtserkennung und -identifikation signifikante Fortschritte gemacht, die in verschiedenen Anwendungen wie Sicherheit, Überwachung und Biometrie weit verbreitet sind. Die Gesichtserkennungstechnologie identifiziert Personen hauptsächlich durch Analyse und Vergleich ihrer Gesichtszüge mit einer Datenbank bekannter Gesichter. Gesichtsidentifikation beinhaltet das Abgleichen eines Personengesichts mit ihrer Identität. Sie verwendet Algorithmen, um Gesichtsmerkmale wie den Abstand zwischen den Augen, Nasenkurven und den Winkel des Kieferknochens zu extrahieren, um ein einzigartiges Gesichtssignatur zu erzeugen.
Techniken für die Gesichtserkennung und -identifikation
Es gibt verschiedene Methoden zur Erkennung und Identifizierung von Gesichtern, aber dieses Tutorial konzentriert sich auf drei Techniken und gibt einen Überblick über ihre Vor- und Nachteile.
1. Vorlagenbasiertes Verfahren
Zunächst vergleicht der auf Vorlagen basierende Ansatz die Gesichtszüge eines Zielgesichts mit denen in einer Vorlage oder Referenzbild. Das Vorlagenbild umfasst mehrere Gesichtszüge, wie die Position der Augen, Nase, Mund und die Abstände zwischen ihnen. Die Technik vergleicht dann das Zielgesicht mit dem Vorlagenbild, um zu bestimmen, ob es ein Treffer gibt. Eigenfaces ist eine der gebräuchlichsten auf Vorlagen basierenden Methoden, die die Hauptkomponentenanalyse (PCA) verwendet, um die Dimensionalität von Gesichtsbildern zu reduzieren und die wichtigsten Merkmale zu extrahieren.
Vorteile
- Sie sind sehr genau mit hochwertigen Vorlagen
- Kann mit Variationen in der Beleuchtung und Gesichtsausdrücken umgehen
Nachteile
- Benötigt hochwertige Vorlagen für genaue Ergebnisse
- Kann rechenintensiv sein
2. Merkmalbasierter Ansatz
Zweitens extrahiert die merkmalbasierte Technik Merkmale vom Gesicht, wie die Form der Augen, den Abstand zwischen den Augenbrauen und die Krümmung der Lippen. Der Ansatz vergleicht diese Merkmale dann mit denen in einer Datenbank bekannter Gesichter, um das Zielgesicht zu identifizieren. Beispiele für typische merkmalbasierte Techniken sind der lokale Binärcode (LBP) und die skalenskalierbare Merkmalstransformation (SIFT).
Vorteile
- Relativ schnell und effizient
- Funktioniert mit niedolösigen Bildern
Nachteile
- Kann möglicherweise nicht gut mit wechselnden Beleuchtungsbedingungen umgehen
- Kann möglicherweise nicht robust gegen Veränderungen in Gesichtsausdrücken oder Posen sein
3. Tiefenlernbasierte Methode
Zuletzt nutzt eine tiefenlernbasierte Methode tiefe neuronale Netzwerke, um Merkmale direkt aus Gesichtsbildern zu lernen. Die Netzwerke werden an großen Datensätzen von Gesichtsbildern trainiert, um Muster und Merkmale, die für die Gesichtserkennung relevant sind, zu identifizieren. Beispiele für typische tiefenlernbasierte Methoden sind Convolutional Neural Networks (CNN) und Siamese-Netzwerke.
Vorteile
- Erreicht hohe Genauigkeit mit großen Datensätzen
- Kann mit Variationen in Gesichtsausdrücken und Posen umgehen
Nachteile
- Benötigt eine große Menge an Trainingsdaten
- Rechenintensiv
Hinweis: Es gibt verschiedene Techniken für die Gesichtserkennung und -identifikation.
Gesichtserkennung und -identifikation mit Python und OpenCV
Dank der Verfügbarkeit leistungsstarker Bibliotheken wie OpenCV und den Fortschritten in den maschinellen Lernalgorithmen ist es heute leichter denn je, mit Python Gesichtserkennungs- und Identifikationssysteme zu entwickeln. OpenCV bietet eine reiche Auswahl an Funktionen und Werkzeugen für die Bildverarbeitung, insbesondere nützlich bei Aufgaben der Gesichtserkennung wie Gesichtserkennung, Merkmalsextraktion und -abgleich. Es verfügt auch über vorgefertigte Modelle wie den Haar-Cascades-Klassifikator für die Gesichtserkennung und VGG oder ResNet zur Kennzeichnung der erkannten Gesichter.
OpenCV bietet verschiedene Modelle für Gesichtsbeschriftungen, wie Eigenfaces, Fisherfaces und Local Binary Patterns Histograms (LBPH). Wir trainieren diese Modelle, um bestimmte Personen zu identifizieren, indem wir ihnen Bilder der Personen zeigen, die wir erkennen möchten. Eigenfaces verwendet die Hauptkomponentenanalyse (PCA), um ein Gesichtsbild aus kleineren Teilen zu konstruieren, während Fisherfaces die lineare Diskriminanzanalyse (LDA) nutzt, um Gesichter voneinander zu unterscheiden. LBPH vergleicht die Textur von Gesichtern mit bekannten Gesichtern.
Gesichtsidentifikation
Abhängigkeiten importieren
Importieren Sie die notwendigen Bibliotheken.
import numpy as np
import cv2
import matplotlib.pyplot as plt
from IPython.display import Image
from google.colab import drive
drive.mount('/content/drive')
Vorab trainierte Modelle und Bild laden
OpenCV bietet eine Reihe vorab trainierter `Haar-Kaskaden-Klassifikatoren` zum Erkennen verschiedener Objekte, einschließlich Gesichter. `cv2.CascadeClassifier` ist eine Klasse, die den Haar-Kaskaden-Klassifikator darstellt. Der Pfad zu dem Verzeichnis, das die vorab trainierten Modelle enthält, ist cv2.data.haarcascades. `haarcascade_frontalface_default.xml` ist der Dateiname, der das vorab trainierte Modell zur Gesichtserkennung enthält. Das Modell steht zum kostenlosen Download auf GitHub zur Verfügung.
# Laden Sie das vorab trainierte Modell zur Gesichtserkennung
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
Laden Sie das Eingabebild `image1.jpg`, das ein Bild Ihrer Wahl sein kann, mithilfe der `imread()`-Funktion von OpenCV. Es konvertiert das Bild anschließend mithilfe der `cvtColor()`-Funktion von OpenCV in Graustufen. Das Graustufenbild wird für den Gesichtserkennungsalgorithmus benötigt.
# Bilde laden und in Graustufen umwandeln
img = cv2.imread('/content/drive/MyDrive/Face Detection/image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Bild anzeigen
plt.imshow(gray)
Die folgende Zeile erkennt Gesichter in dem Graustufenbild mithilfe der detectMultiScale()-Methode der CascadeClassifier-Klasse. Die detectMultiScale()-Methode nimmt die folgenden Argumente entgegen:
`gray`: das Graustufenbild
`scaleFactor`: ist ein Parameter, der angibt, wie sehr die Bildgröße bei jeder Bildskalierung verkleinert wird. Ein Wert von 1,3 bedeutet, dass das Bild bei jeder Skalierung um 30 % reduziert wird.
`minNeighbors`: ist ein Parameter, der angibt, wie viele Nachbarn jedes Kandidatenrechtecks haben sollte, um es beizubehalten. Ein höherer Wert führt zu weniger Erkennungen, aber mit höherer Zuverlässigkeit.
Die detectMultiScale()-Methode gibt eine Liste von Rechtecken zurück, in denen Gesichter erkannt wurden. Jedes Rechteck stellt ein Tupel von vier Ganzzahlen `(x,y,w,h)` dar, das die Koordinaten des oberen linken Eckpunkts `(x,y)` des Rechtecks und dessen Breite `w` und Höhe `h` repräsentiert.
# Gesichter im Graustufenbild erkennen
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
Rechteck um Gesichtsbereich zeichnen
Wir erstellen eine Schleife, die Rechtecke um die erkannten Gesichter im ursprünglichen Bild zeichnet. Die cv2.rectangle()-Funktion nimmt die folgenden Argumente entgegen:
`img`: das ursprüngliche Bild.
`(x,y)`: die Koordinaten des oberen linken Eckpunkts des Rechtecks.
`(x+w,y+h)`: die Koordinaten des unteren rechten Eckpunkts des Rechtecks.
`(255,0,0)`: repräsentiert die binäre Farbe des in RGB-Format gezeichneten Rechtecks. (255,0,0) steht für Blau.
`5`: die Dicke des Rechteckrahmens in Pixel.
# Zeichne Rechtecke um die erkannten Gesichter
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)
#Zeige das Bild nach dem Erstellen des Rechtecks.
# Zeige das Bild mit den erkannten Gesichtern
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
# Speichere das erkannte Bild mit Namen
cv2.imwrite('detected_image.jpg', img)
#Bestätige, ob das gespeicherte Bild existiert.
detected_image=cv2.imread("detected_image.jpg", 1)
gray_channels_reversed = detected_image[:, :, ::-1]
plt.imshow(gray_channels_reversed)
Gesichtserkennung
Wir werden nicht eine Erklärung wie oben einführen, sondern das oben gespeicherte erkannte Bild verwenden, um zu bestätigen, ob das Modell für die Identifizierung bei der Verwendung verschiedener Bilder für die Erkennung funktioniert.
Importiere Abhängigkeiten
import numpy as np
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity
Lade das Gesichtserkennungsmodell und den Gesichtsmerkmalsdetektor
Die Funktion `dlib.get_frontal_face_detector()` gibt ein vorkonfiguriertes Gesichtserkennungsmodell zurück, das in der Lage ist, menschliche Gesichter in Bildern zu erkennen. Weitere Informationen finden Sie unter dlib.net Funktionen. Laden Sie auch den Merkmalsdetektor herunter.
#Lade das Gesichtserkennungsmodell und den Gesichtsmerkmalsdetektor
face_detector = dlib.get_frontal_face_detector()
landmark_detector = dlib.shape_predictor('/content/drive/MyDrive/Face Detection/shape_predictor_68_face_landmarks_GTX.dat')
#Lade das erkannte Bild von
img1 = cv2.imread('/content/drive/MyDrive/Face Detection/detected_image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
#Erkannt das Gesicht und die Gesichtsmerkmale des Bildes
rects1 = face_detector(gray1, 1)
landmarks1 = landmark_detector(gray1, rects1[0])
landmarks1 = face_utils.shape_to_np(landmarks1)
#Lade ein weiteres Bild zum Vergleich mit dem zuvor geladenen Bild
img2 = cv2.imread('/content/drive/MyDrive/Face Detection/001_d3323f3c.jpg')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
### Einstellung des Modellparameters
# Erkennung des Gesichts und der Gesichtsmerkmale des zweiten Bildes
rects2 = face_detector(gray2, 1)
landmarks2 = landmark_detector(gray2, rects2[0])
landmarks2 = face_utils.shape_to_np(landmarks2)
# Extrahieren der Merkmale der beiden Bilder durch Berechnung der euklidischen Abstände zwischen den Gesichtsmerkmalen
features1 = np.zeros(68)
features2 = np.zeros(68)
for i in range(68):
features1[i] = np.linalg.norm(landmarks1[i] - landmarks1[0])
features2[i] = np.linalg.norm(landmarks2[i] - landmarks2[0])
#### Training auf Ähnlichkeiten
# Berechnung der Kosinus-Ähnlichkeit zwischen den beiden Merkmalsvektoren
score = cosine(features1, features2)
# Überprüfen, ob der Score unter einem bestimmten Schwellenwert (z.B. 0.5) liegt, um zu bestimmen, ob die beiden Gesichter übereinstimmen
if score < 0.5:
print("The model did not recognize Joseph in one or both of the images..")
else:
print("The model recognized Joseph in both images.")
Schlussfolgerung
In diesem Tutorial haben Sie die Gesichtserkennung und -identifikation mit Python OpenCV gelernt, wie sie funktioniert, ihre Anwendungen und wie sie implementiert werden kann. Der Code für dieses Projekt kann von der GitHub-Repo abgerufen werden.
Source:
https://dzone.com/articles/facial-recognition-and-identification-in-computer