Rozpoznawanie twarzy jest jedną z dziedzin, która wykorzystuje uczenie maszynowe i jest szeroko stosowane w wielu obszarach, od tagowania zdjęć w mediach społecznościowych i dopasowywania ludzi o tych samych rysach twarzy na portalach randkowych, do tropienia przestępców i zabezpieczania granic, do trzymania na dystans graczy w kasynach.

I find it fascinating it that we can simulate the process of facial recognition with a significant degree of precision, while at the same time there are people who suffer from prosopagnosia, or „face blindness”, who are not as lucky. Autor artykułu w Cracked, na który natknąłem się jakiś czas temu, opisuje to doświadczenie jako widzenie stosu klocków LEGO, gdzie jak tylko odwrócisz wzrok, nie możesz już opisać w żadnym istotnym szczególe, jaki kolor i kształt miał każdy kawałek lub jak były ułożone. Zastanawiałem się, czy to zaburzenie poznawcze ma coś wspólnego z alokacją pamięci. Na szczęście pamięć jest czymś, czego komputery mają pod dostatkiem, a my nawet nie zaczęliśmy drapać powierzchni pełnego zestawu możliwości, jakie zaprezentują obliczenia kwantowe.

Ale wracając do powierzchni własnych.

Dane wizualne w obrazie można odwzorować na wektor, w którym każdy wpis reprezentuje jasność odpowiadającego mu piksela. Biorąc zestaw obrazów, można następnie skonstruować macierz, której każdy wiersz odpowiada konkretnemu wektorowi obrazu. Idealnie, obrazy są najpierw normalizowane w taki sposób, aby wyrównać podstawowe cechy, takie jak oczy, nos i usta, aby zwiększyć dokładność i zmniejszyć szum. Twarze własne są następnie wektorami własnymi, które są wyprowadzane z macierzy kowariancji tej macierzy sparsowanych danych twarzy.

Zbiór danych twarzy, którego użyliśmy, został uprzejmie dostarczony przez AT&T Laboratories w Cambridge i składał się z 40 indywidualnych twarzy, 10 obrazów każdej z nich z różnymi wyrazami twarzy i pozycjami głowy.

W tym ćwiczeniu wykorzystano następujące biblioteki i moduły Pythona:

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 funkcja skaluje każdy indywidualny wektor próbki, aby miał normę jednostkową.
  • PCA lub Principle Component Analysis, jest procesem liniowej redukcji wymiarowości przy użyciu Singular Value Decomposition danych w celu rzutowania ich do przestrzeni o niższym wymiarze. Innymi słowy, jest to proces znajdowania podstawowej struktury danych lub kierunków, w których występuje największa wariancja.
  • matplotlib.pyplot jest znaną funkcją wykreślania.
  • imread służy do wczytywania obrazu z pliku jako tablicy.
  • chain jest iteratorem, który przechodzi przez listę zwracając poszczególne elementy z każdej iterowalnej.
  • numpy jest podstawowym pakietem Pythona do obliczeń naukowych.
  • scipy jest kolejnym pakietem do obliczeń naukowych i technicznych, podobnym do numpy, ale zawierającym pełniej wyposażone wersje modułów algebry liniowej, a także wiele innych algorytmów numerycznych.
  • glob moduł znajduje wszystkie nazwy ścieżek pasujące do określonego wzorca.

Pierwszym krokiem jest wyodrębnienie wszystkich nazw plików z archiwum zip. Następnie tworzona jest macierz poprzez rozkładanie macierzy obrazów na wektory za pomocą polecenia chain i układanie ich w stos. W ten sposób powstaje macierz 400×10304, której każdy wiersz zawiera wszystkie informacje o konkretnym obrazie 112×92.

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

Następnie macierz jest normalizowana i stosowana jest PCA. Tutaj zredukowaliśmy naszą przestrzeń wektorową do zaledwie 40 z 10304 wymiarów:

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

Wreszcie, twarze własne, zawarte w model.components_, mogą zostać wyświetlone:

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

I oto mamy. Banda przerażających twarzy.

To, co zasadniczo zrobiliśmy, to stworzyliśmy ortogonalny zestaw bazowy, w którym każda powierzchnia własna podkreśla pewien typ cechy, i z którego twarze, których używaliśmy, mogą być zrekonstruowane poprzez różne kombinacje i proporcje wektorów własnych.

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")

Ponieważ tak bardzo skompresowaliśmy naszą przestrzeń wektorową (i nie wyrównaliśmy twarzy na początek), wiele szczegółów zostało utraconych, ale twarze nadal pozostały w pewnym stopniu rozpoznawalne.

I tak, celem dla problemu komputerowego widzenia ludzkiego rozpoznawania twarzy jest stworzenie minimalnej liczby twarzy własnych, które mogą odpowiednio reprezentować cały zestaw treningowy. Jeśli zbiór treningowy jest wystarczająco zróżnicowany, wynikowy zbiór twarzy własnych powinien być w stanie reprezentować wszystkie twarze. I chociaż w ostatnich latach poczyniono znaczne postępy w zakresie algorytmów rozpoznawania twarzy, to nadal pozostaje długa droga do przebycia i wiele ulepszeń do wprowadzenia.

Z drugiej strony, i jak zawsze, istnieją pewne niebezpieczeństwa związane z coraz większymi możliwościami oprogramowania, które jest w stanie rozpoznać, symulować, a więc potencjalnie oszukiwać i manipulować niczego nie podejrzewającą osobą, i musimy podjąć odpowiednie środki ostrożności, aby upewnić się, że jest ono odpowiednio używane.

I po prostu zostawię to tutaj jako przykład i dla waszej rozrywki.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.