Recunoașterea facială este unul dintre domeniile în care se utilizează învățarea automată și este folosită pe scară largă în multe domenii, de la etichetarea fotografiilor pe rețelele de socializare și potrivirea persoanelor cu aceleași trăsături faciale pe site-urile de întâlniri, la urmărirea infractorilor și securizarea frontierelor, până la ținerea la distanță a marilor jucători în cazinouri.
Mi se pare fascinant faptul că putem simula procesul de recunoaștere facială cu un grad semnificativ de precizie, în timp ce, în același timp, există persoane care suferă de prosopagnosie, sau „orbire facială”, care nu sunt la fel de norocoase. Un autor al unui articol din Cracked de care am dat peste un articol cu ceva timp în urmă descrie această experiență ca și cum ai vedea o grămadă de LEGO-uri în care, de îndată ce îți întorci privirea, nu mai poți descrie cu detalii substanțiale ce culoare și formă avea fiecare piesă sau cum erau poziționate. M-am întrebat dacă această tulburare cognitivă are ceva de-a face cu alocarea memoriei. Din fericire, memoria este ceva de care computerele dispun din belșug și nici măcar nu am început să zgârii suprafața întregului set de capacități pe care le va prezenta informatica cuantică.
Dar să revenim la fețele proprii.
Datele vizuale dintr-o imagine pot fi mapate pe un vector în care fiecare intrare reprezintă luminozitatea pixelului corespunzător. Luând un set de imagini, se poate construi apoi o matrice în care fiecare rând corespunde unui vector de imagine specific. În mod ideal, imaginile sunt mai întâi normalizate astfel încât să se alinieze caracteristicile de bază, cum ar fi ochii, nasul și gura, pentru a crește precizia și a reduce zgomotul. Fețele proprii sunt apoi vectorii proprii care sunt derivați din matricea de covarianță a acestei matrice de date analizate ale fețelor.
Setul de date de fețe pe care l-am folosit a fost pus la dispoziție cu amabilitate de către AT&T Laboratories din Cambridge și a constat din 40 de fețe individuale, câte 10 imagini din fiecare, cu diferite expresii faciale și poziții ale capului.
În acest exercițiu au fost utilizate următoarele biblioteci și module Python:
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
Funcțianormalize
scalează fiecare vector de eșantionare individual pentru a avea normă unitară. -
PCA
sau Principle Component Analysis (Analiza componentelor principale), este un proces de reducere a dimensionalității liniare care utilizează Descompunerea valorii singulare a datelor pentru a le proiecta într-un spațiu cu dimensiuni mai mici. Cu alte cuvinte, este procesul de găsire a structurii de bază a datelor sau a direcțiilor în care există cea mai mare variație. -
matplotlib.pyplot
este funcția cunoscută de trasare a graficelor. -
imread
este utilizată pentru a citi o imagine dintr-un fișier ca matrice. -
chain
este un iterator care parcurge lista returnând elemente individuale din fiecare iterabil. -
numpy
este pachetul Python fundamental pentru calculul științific. -
scipy
este un alt pachet pentru calculul științific și tehnic, similar cunumpy
, dar care conține versiuni mai complet echipate ale modulelor de algebră liniară, precum și mulți alți algoritmi numerici. -
glob
Modululglob
găsește toate numele căilor de acces care corespund unui model specificat.
Primul pas este extragerea tuturor numelor de fișiere din arhiva comprimată. Apoi se creează o matrice prin desfacerea matricelor de imagini în vectori cu ajutorul comenzii chain
și stivuirea lor. Astfel, se creează o matrice 400×10304, fiecare rând conținând toate informațiile despre o anumită imagine 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)
În continuare, matricea este normalizată și se aplică PCA. Aici am redus spațiul nostru vectorial la doar 40 de dimensiuni din 10304:
model = PCA(n_components=40)
pts = normalize(m)
model.fit(pts)
pts2 = model.transform(pts)
În cele din urmă, pot fi afișate fețele proprii, conținute în model.components_
:
fig, ax = plt.subplots(1,40)for i in range(40):
ord = model.components_
img = ord.reshape(112,92)
ax.imshow(img,cmap='gray')