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ția normalize 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 cu numpy, dar care conține versiuni mai complet echipate ale modulelor de algebră liniară, precum și mulți alți algoritmi numerici.
  • glob Modulul glob 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')

Și iată-ne ajunși aici. O grămadă de fețe înfiorătoare.

În esență, ceea ce am făcut a fost să creăm un set de baze ortogonale în care fiecare față proprie evidențiază un anumit tip de trăsătură și din care fețele pe care le-am folosit pot fi reconstruite prin diferite combinații și proporții de vectori proprii.

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

Pentru că am comprimat atât de mult spațiul vectorial (și nu am aliniat fețele pentru început), o mare parte din detalii s-au pierdut, dar fețele au rămas totuși oarecum recognoscibile.

Și astfel, obiectivul pentru problema de viziune pe calculator a recunoașterii fețelor umane este de a crea un număr minim de fețe proprii care pot reprezenta în mod adecvat întregul set de instruire. Dacă setul de antrenament este suficient de divers, setul de fețe proprii rezultat ar trebui să fie capabil să reprezinte toate fețele. Și, deși în ultimii ani s-au înregistrat progrese semnificative în ceea ce privește algoritmii de recunoaștere facială, mai este încă un drum lung de parcurs și mai sunt multe îmbunătățiri de făcut.

Pe de altă parte, și ca întotdeauna, există unele pericole asociate cu capacitățile în continuă expansiune ale unui software care este capabil să recunoască, să simuleze și, astfel, să înșele și să manipuleze potențial un individ care nu bănuiește nimic, și trebuie să luăm măsurile de precauție adecvate pentru a ne asigura că este folosit în mod corespunzător.

Și voi lăsa acest lucru aici ca un exemplu și pentru divertismentul vostru.

Lasă un răspuns

Adresa ta de email nu va fi publicată.