Gesichtserkennung ist einer der Bereiche, in denen maschinelles Lernen zum Einsatz kommt, und wird in vielen Bereichen eingesetzt, von der Kennzeichnung von Fotos in sozialen Medien und dem Abgleich von Personen mit denselben Gesichtsmerkmalen auf Partnervermittlungsseiten über das Aufspüren von Kriminellen und die Sicherung von Grenzen bis hin zur Kontrolle von Spielern in Kasinos.

Ich finde es faszinierend, dass wir den Prozess der Gesichtserkennung mit einem beträchtlichen Maß an Präzision simulieren können, während es gleichzeitig Menschen gibt, die an Prosopagnosie oder „Gesichtsblindheit“ leiden und nicht so viel Glück haben. Ein Autor eines Cracked-Artikels, über den ich vor einiger Zeit gestolpert bin, beschreibt diese Erfahrung als den Anblick eines Stapels von Lego-Steinen, bei dem man, sobald man wegschaut, nicht mehr in der Lage ist, die Farbe und Form der einzelnen Teile oder ihre Positionierung in allen Einzelheiten zu beschreiben. Ich habe mich gefragt, ob diese kognitive Störung etwas mit der Speicherzuweisung zu tun hat. Glücklicherweise ist Speicher etwas, wovon Computer reichlich haben, und wir haben noch nicht einmal angefangen, an der Oberfläche der gesamten Möglichkeiten zu kratzen, die das Quantencomputing bieten wird.

Aber zurück zu den Eigenflächen.

Die visuellen Daten in einem Bild können auf einen Vektor abgebildet werden, bei dem jeder Eintrag die Helligkeit des entsprechenden Pixels darstellt. Aus einer Reihe von Bildern kann dann eine Matrix erstellt werden, bei der jede Zeile einem bestimmten Bildvektor entspricht. Idealerweise werden die Bilder zunächst so normalisiert, dass die grundlegenden Merkmale wie Augen, Nase und Mund ausgerichtet werden, um die Genauigkeit zu erhöhen und das Rauschen zu reduzieren. Eigengesichter sind dann die Eigenvektoren, die aus der Kovarianzmatrix dieser Matrix der analysierten Gesichtsdaten abgeleitet werden.

Der von uns verwendete Gesichtsdatensatz wurde freundlicherweise von den AT&T Laboratories in Cambridge zur Verfügung gestellt und bestand aus 40 einzelnen Gesichtern, jeweils 10 Bildern mit unterschiedlichen Gesichtsausdrücken und Kopfpositionen.

Die folgenden Python-Bibliotheken und -Module wurden in dieser Übung verwendet:

from sklearn.preprocessing import normalize
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from scipy.misc import imread
from itertools import chain
import numpy as np
import scipy as sp
import glob
  • normalize Die Funktion skaliert jeden einzelnen Probenvektor so, dass er eine Einheitsnorm hat.
  • PCA oder Principle Component Analysis ist ein Prozess der linearen Dimensionalitätsreduktion unter Verwendung der Singulärwertzerlegung der Daten, um sie auf einen niedrigeren dimensionalen Raum zu projizieren. Mit anderen Worten, es ist der Prozess der Suche nach der zugrundeliegenden Struktur der Daten oder den Richtungen, in denen es die größte Varianz gibt.
  • matplotlib.pyplot ist die bekannte Plotting-Funktion.
  • imread wird verwendet, um ein Bild aus einer Datei als Array einzulesen.
  • chain ist ein Iterator, der die Liste durchläuft und einzelne Elemente aus jeder Iterable zurückgibt.
  • numpy ist das grundlegende Python-Paket für wissenschaftliche Berechnungen.
  • scipy ist ein weiteres Paket für wissenschaftliches und technisches Rechnen, das numpy ähnelt, aber umfassendere Versionen der linearen Algebra-Module sowie viele andere numerische Algorithmen enthält.
  • glob Modul findet alle Pfadnamen, die mit einem bestimmten Muster übereinstimmen.

Im ersten Schritt werden alle Dateinamen aus dem gezippten Archiv extrahiert. Dann wird eine Matrix erstellt, indem die Bildmatrizen mit dem Befehl chain in Vektoren zerlegt und gestapelt werden. So entsteht eine 400×10304-Matrix, bei der jede Zeile alle Informationen über ein bestimmtes 112×92-Bild enthält.

filenames = m = for i in range(400)]for i in range(400):
m = list(chain.from_iterable(imread(filenames)))
m = np.matrix(m)

Anschließend wird die Matrix normalisiert und die PCA angewendet. Hier haben wir unseren Vektorraum auf nur 40 von 10304 Dimensionen reduziert:

model = PCA(n_components=40)
pts = normalize(m)
model.fit(pts)
pts2 = model.transform(pts)

Schließlich können die Eigengesichter, die in model.components_ enthalten sind, angezeigt werden:

fig, ax = plt.subplots(1,40)for i in range(40):
ord = model.components_
img = ord.reshape(112,92)
ax.imshow(img,cmap='gray')

Und da haben wir es. Ein Haufen gruseliger Gesichter.

Was wir im Wesentlichen getan haben, ist, eine orthogonale Basismenge zu schaffen, bei der jede Eigenfläche eine bestimmte Art von Merkmal hervorhebt, und aus der die von uns verwendeten Gesichter durch verschiedene Kombinationen und Proportionen von Eigenvektoren rekonstruiert werden können.

faces_pca = PCA(n_components=40)
faces_pca.fit(m)
components = faces_pca.transform(m)
projected = faces_pca.inverse_transform(components)fig, axes = plt.subplots(40,10,figsize=(20,80))
for i, ax in enumerate(axes.flat):
ax.imshow(projected.reshape(112,92),cmap="gray")

Da wir unseren Vektorraum so stark komprimiert haben (und die Gesichter zunächst nicht ausgerichtet haben), gingen viele Details verloren, aber die Gesichter blieben dennoch einigermaßen erkennbar.

Das Ziel für das Computer-Vision-Problem der menschlichen Gesichtserkennung besteht also darin, eine minimale Anzahl von Eigengesichtern zu erzeugen, die die gesamte Trainingsmenge adäquat repräsentieren können. Wenn die Trainingsmenge hinreichend vielfältig ist, sollte die resultierende Menge an Eigengesichtern in der Lage sein, alle Gesichter zu repräsentieren. Und obwohl in den letzten Jahren bedeutende Fortschritte bei den Algorithmen zur Gesichtserkennung gemacht wurden, gibt es noch viel zu tun und viele Verbesserungen zu erreichen.

Auf der anderen Seite, und wie immer, gibt es einige Gefahren, die mit den ständig wachsenden Fähigkeiten von Software verbunden sind, die in der Lage ist, eine ahnungslose Person zu erkennen, zu simulieren und somit potentiell zu täuschen und zu manipulieren, und wir müssen angemessene Vorsichtsmaßnahmen ergreifen, um sicherzustellen, dass sie angemessen verwendet wird.

Und ich werde dies hier nur als ein Beispiel und zu Ihrer Unterhaltung stehen lassen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.