Prepoznavanje lica pomoću tenzorske dekompozicije singularnih vrijednosti
Moderna tehnologija i stalan porast broja stanovnika na Zemlji razlog su velike produkcije podataka. Svaki dan se proizvede ogromna količina novih podataka koje je potrebno spremati, obraditi, a često i slati. Zbog toga je bilo potrebno osmisliti načine za efikasno spremanje podataka kako bi oni zauzimali što je manje moguće prostora, a da glavna informacija bude očuvana. Lijep primjer toga je kompresija digitalne slike. Uzmimo za primjer sliku dimenzije 3000 \times 2000 piksela. Kako bismo takvu sliku spremili u memoriju potrebno nam je 3000 \cdot 2000 \cdot 24 = 144000000 bitova memorije (za pamćenje jednog piksela koristimo 24 bita) što iznosi 18 megabajta.
U ovom članku bavit ćemo se matričnom (tenzorskom) dekompozicijom koja nam omogućava da iz nekog skupa podataka, prikazanog pomoću matrice (tenzora), izdvojimo "najvažniji" dio, a ostatak izostavimo. Koristeći tu tehniku možemo komprimirati slike, razviti algoritme koji: klasificiraju rukom pisane znamenke, prepoznaju ljudska lica i još mnogo toga. Zamislite sada da ste zaposleni u pošti i da je vaša zadaća sortirati pristigla pisma prema poštanskom broju kako bi ona stigla na pravu adresu. Možda biste radije bili prometni policajac na autocesti koji je zadužen za praćenje brzine automobila koje ulaze u tunel. Vaš posao je snimiti tablice automobila koji ne poštuju ograničenje brzine, a zatim u bazi podataka registracija vozila pronaći tu tablicu te na priloženu adresu vlasnika poslati kaznu za prebrzu vožnju. Biste li svaki dan isti posao radili ručno ili biste radije pokušali taj postupak automatizirati? Srećom, ljudi su se već susreli s ovim problemom i smislili mnogo načina kako taj posao ubrzati i uštediti dragocjeno vrijeme. Svi navedeni problemi mogu se riješiti upotrebom jednog moćnog alata numeričke matematike koji ćemo vam pokušati približiti u ostatku ovog članka.
Jedna od najkorisnijih dekompozicija i s teorijske strane (za dokazivanje) i s praktične strane, je dekompozicija singularnih vrijednosti (engl. singular value decomposition) ili, skraćeno, SVD. Sljedeći teorem pokazuje da za svaku matricu postoji takva dekompozicija.
Ilustrirajmo SVD:
Ako U zapišemo kao U=(U_{m}\,U_{m}^{\perp}), gdje je U_{m} \in \mathbb{R}^{n \times m}, a \Sigma zapišemo kao \begin{pmatrix} \Sigma_{m} \\ 0 \end{pmatrix} gdje je \Sigma_{m} \in \mathbb{R}^{m\times m}, tada dobijemo tanki SVD.
Ilustirajmo sada tanki SVD:
Jako važnu primjenu SVD-a daje sljedeći teorem.
Matricu A_{k}, istog tipa kao i A, ranga rang(A_{k}) \leq k \lt m, koja je po 2-normi najbliža matrici A, možemo zapisati kao
Jedna od primjena prethodnog teorema je kompresija slika. Neka je dana n \times m matrica A s elementima a_{i,j} \in [0,1]. Zamislimo da A predstavlja n \times m grayscale (crno-bijelu) sliku, gdje broj na (i,j) mjestu u matrici predstavlja intenzitet svjetlosti piksela na mjestu (i,j) na slici. Ako uzmemo da vrijednost nula predstavlja crno, a jedan bijelo, zanimljivo je pitanje što će se dogoditi kad napravimo A = U \Sigma V^{T}, a onda u matrici \Sigma posljednjih nekoliko ne-nul elemenata stavimo na nulu te promotrimo dobivenu sliku A_{k}, gdje je A_{k} = U \Sigma _{k} V^{T} = \sum_{i=1}^{k} \sigma_{i} u_{i} v_{i}^{T}, a \Sigma_{k} = diag(\sigma_{1}, \cdots, \sigma_{k}, 0, \cdots, 0).
Preciznije, neka je A = U \Sigma V^{T}, SVD matrice A. Prema teoremu
Do sada smo razmatrali linearnu algebru, gdje su glavni objekti vektori i matrice. Njih možemo smatrati kao jednodimenzionalna i dvodimenzionalna polja podataka. Tenzor je višedimenzionalni ekvivalent vektora i matrice i možemo ga predstaviti višedimenzionalnim poljem brojeva. Red tenzora jednak je broju indeksa potrebnih za indeksiranje njegovih elemenata. Primjerice, skalar možemo smatrati tenzorom reda 0, vektor tenzorom reda 1, a matricu tenzorom reda 2. Tenzori reda većeg ili jednakog 3 nazivaju se tenzorima višeg reda. Preciznije, tenzor reda N je element tenzorskog produkta N vektorskih prostora.
Red tenzora \mathcal{A} \in \mathbb{R}^{I_{1} \times I_{2} \times \dots \times I_{N}} je N. Elemente od \mathcal{A} označavamo s \mathcal{A}_{i_{1} i_{2} \dots i_{n}}, gdje su 1 \leq i_{n} \leq I_{n}, n = 1,2, \dots N.
Svaki indeks u tenzoru nazivamo mod, a dimenzija pripadnog moda je broj različitih vrijednosti koje taj indeks može poprimiti. Unutar tenzora možemo indeksirati podtenzore ograničavanjem pojedinih indeksa. Primjerice, za tenzor \mathcal{A} = (a_{i_{1} i_{2} i_{3}}) \in \mathbb{R}^{I_{1} \times I_{2} \times I_{3}} reda 3 možemo fiksiranjem indeksa u modu 1,2 ili 3 definirati podtenzore kao \mathcal{A}_{i_{1} = n} = \mathcal{A}_{n::},\mathcal{A}_{i_{2} = n} = \mathcal{A}_{:n:} ili \mathcal{A}_{i_{3} = n} = \mathcal{A}_{::n}.
Primjetimo da su u tom slučaju dva indeksa slobodna pa su podtenzori zapravo novi tenzori reda 2, odnosno matrice. Posebno za slučaj tenzora reda 3 te podtenzore nazivamo horizontalnim, lateralnim i frontalnim odsječcima. Također možemo definirati i vektore po modu n na način da fiksiramo sve indekse osim jednoga, npr. vektor u modu 1 se dobije kao \mathcal{A}_{:i_{2} i_{3}}. Analogno za tenzor reda N možemo definirati podtenzore reda manjeg ili jednakog N. Na sljedećoj slici su prikazani primjeri podtenzora za tenzor reda 3.
MATLAB kod |
function Av=vekt_tenz_mod(A,tmod,j,k) % Av=vekt_tenz_mod(A,mod,i1,i2) vraca vektor tenzora A reda % 3 u modu tmod, sa preostalim indeksima fiksiranim na j i % k. tdim=size(A); ind=1:3; ip=ind(ind=tmod); Ap=permute(A,[tmod,ip]); Av=reshape(Ap(:,j,k),tdim(tmod),1); end |
MATLAB kod |
function Ao=odsj_tenz_mod(A,tmod,i) % Ao=odsj_tenz_mod(A,tmod,j,k) vraca odsjecak tenzora A % reda 3 u modu tmod, za i_tmod=i. tdim=size(A); ind=1:3; ip=ind(ind=tmod); Ap=permute(A,[ip,tmod]); Ao=reshape(Ap(:,:,i),tdim(ip)); end |
često je korisno prikazati tenzor u obliku matrice. Stoga definiramo matricu tenzora po modu n kao matricu A_{(n)} koja se dobije tako da vektore iz moda n složimo kao stupce u matricu A_{(n)}. Poredak kojim se vektori iz moda n preslikavaju u stupce nije bitan, dok god se isti poredak koristi u svim izračunima.
Matricizacija tenzora (eng. unfold) u modu n od \mathcal{A} označava se s
Tenzorski produkt u modu n tenzora \mathcal{A} \in \mathbb{R}^{I_{1} \times I_{2} \times \dots \times I_{N}} s matricom U \in \mathbb{R}^{J_{n} \times I_{n}}, označen s \mathcal{A} \times_{n}U, je
tenzor čiji elementi su zadani s
Zbog jednostavnosti ograničavamo se na tenzore reda 3, \mathcal{A} = (a_{ijk}) \in \mathbb{R}^{I_{1} \times I_{2} \times I_{3}}. Takav tenzor možemo vizualizirati na sljedeći način:
Uvedimo sada osnovne pojmove za tenzor reda 3, \mathcal{A} \in \mathbb{R}^{I_{1} \times I_{2} \times I_{3}}. Dimenzije tenzora \mathcal{A} \in \mathbb{R}^{I_{1} \times I_{2} \times I_{3} } su: I_{1}, I_{2} i I_{3}.
Prvo definiramo skalarni produkt dvaju tenzora istog reda i jednakih dimenzija:
Pripadna norma je
Ako gledamo gornje definicije na matricama (dvodimenzionalnim tenzorima) vidimo da je to Frobeniusova norma.
Sljedeće što definiramo je množenje u modu 1 matrice s tenzorom.
Uspredbe radi, uočimo da za množenje matrica vrijedi
Znamo da je množenje matrica ekvivalentno množenju svakog stupca iz \mathcal{A} matricom U. Isto vrijedi i za množenje tenzora matricom u modu 1. Svi stupčani vektori iz tenzora \mathcal{A} se množe matricom U.
Slično množenje u modu 2 tenzora s matricom V
znači da su svi retci tenzora pomnoženi s matricom V. Opet uočavamo da je množenje u modu 2 matrice s V ekvivalentno matričnom množenju s V^{T} zdesna,
Množenje u modu 3 se dobije analogno.
Ponekad je zgodno matricizirati tenzor u matricu.
Matricizacija tenzora \mathcal{A} je definirana kroz tri moda (koristeći MATLAB-ovu notaciju):
Vrijedi i sljedeće:
(1) | {Stupčani vektori od \mathcal{A} su stupčani vektori od A_{(1)}}. |
(2) | {Retci od \mathcal{A} su stupčani vektori od A_{(2)}}. |
(3) | {Prostorni vektori od \mathcal{A} su stupčani vektori od A_{(3)}}. |
\text{Unfold}_{1} od \mathcal{A} je ekvivalentan dijeljenju tenzora na odsječke \mathcal{A}(:,i,:) (koji su matrice) i slaže ih u dugu matricu A_{(1)}.
MATLAB kod |
function Au=tenz_unfold(A,tmod) % Au=tenz_unfold(A,tmod) vraca matricizaciju tenzora A reda % 3 po modu tmod. tdim=size(A); Au=[]; io=mod(tmod,3)+1; for i=1:tdim(io) if (tmod==1) Au=[Au,odsj_tenz_mod(A,2,i)]; else Au=[Au,odsj_tenz_mod(A,io,i)']; end end end |
Kao što nam je korisno prikazati tenzor u obliku matrice tako nam je ponekad korisno tenzorificirati matricu odnosno matricu pretvoriti u tenzor. Tenzorifikacija je inverz matricizacije odnosno operator fold je inverz operatora unfold pa vrijedi
MATLAB kod |
function A=tenz_fold(Au,tmod,tdim) % A=tenz_fold(Au,tmod,tdim) tenzorificira matricu Au koja % je matricizirana pomocu Au=tenz_unfold(A,tmod), natrag u % polazni tenzor dimenzija tdim(1) x tdim(2) x tdim(3). A=[]; [dim1,dim2]=size(Au); if (dim1=tdim(tmod) && dim2=prod(tdim(tdim=tmod))) fprintf(1,'Krive dimenzije!\n'); return; end io=mod(tmod,3)+1; ib=mod(tmod-2,3)+1; bdim=tdim; bdim(io)=1; for i=1:tdim(io) switch(tmod) case 1 A(:,i,:)=reshape(Au(:,(i-1)*tdim(ib)+1: i*tdim(ib)),bdim); case 2 A(:,:,i)=reshape(Au(:,(i-1)*tdim(ib)+1: i*tdim(ib))',bdim); case 3 A(i,:,:)=reshape(Au(:,(i-1)*tdim(ib)+1: i*tdim(ib))',bdim); end end end |
Korištenjem unfold-fold operacija, možemo formulirati matrično množenje ekvivalentno u modu i tenzorskom množenju:
MATLAB kod |
function B = tenz_mult(A, U, tmod) % B = tenz_mult(A, U, mod) vraca tenzorski produkt u modu % tmod tenzora A reda 3 sa matricom U. B=[]; Au=tenz_unfold(A,tmod); udim=size(U); audim=size(Au); if (udim(2)=audim(1)) fprintf(1,'Krive dimenzije!\n'); return; end tdim = size(A); switch(tmod) case 1 B=tenz_fold(U*Au,tmod,[udim(1),tdim(2:3)]); case 2 B=tenz_fold(U*Au,tmod,[tdim(1),udim(1),tdim(3)]); case 3 B=tenz_fold(U*Au,tmod,[tdim(1:2),udim(1)]); end end |
Matrični SVD može se generalizirati na više načina kako bi dobili tenzorski. Mi promatramo jedan koji se često naziva "Higher order SVD" (HOSVD).
Vidjeli smo da matrice možemo promatrati kao tenzore reda 2. Koristeći tenzorsku notaciju, jednadžbu (
isto vrijedi i za tenzore višeg reda. O tome nam više govori sljedeći teorem.
gdje su U^{(1)} \in \mathbb{R}^{l \times l},U^{(2)} \in \mathbb{R}^{m \times m} i U^{(3)} \in \mathbb{R}^{n \times n} ortogonalne matrice. \mathcal{S} je tenzor istih dimenzija kao \mathcal{A}. Svaka dva odsječka tenzora \mathcal{S} su ortogonalna u smislu skalarnog produkta:
Ortogonalni tenzor \mathcal{S} nazivamo jezgreni tenzor tenzora \mathcal{A}. HOSVD je vizualiziran na Slici
Koristeći tenzorsku dekompoziciju, svaki tenzor reda N možemo prikazati kao produkt
gdje nam je \mathcal{S} jezgreni tenzor, a U_{n},\ n=1,2, \dots ,N ortogonalne matrice.
Iz dokaza prethodnog teorema može se zapravo vidjeti kako se računa HOSVD određenog tenzora \mathcal{A}:
(1) | Matrica U^{(i)} u modu i može se direktno naći kao lijeva singularna matrica od matricizacije tenzora \mathcal{A} u modu i: A_{(i)} = U^{(i)}\Sigma^{(i)} V^{(i)^{T}}. |
(2) |
Nakon toga, jezgreni tenzor \mathcal{S} može se izračunati prebacivanjem matrica singularnih vekotora na lijevu stranu u jednadžbi (
\mathcal{S} = \mathcal{A}\times_{1} U^{(1)^{T}} \times_{2} U^{(2)^{T}} \times_{3} \dots \times_{N} U^{(N)^{T}}.
|
Zbog toga se računanje HOSVD-a tenzora reda N svodi na računanje N različitih matričnih SVD-a matrica formata (I_{n} \times I_{1} I_{2} \cdots I_{n-1} I_{n+1} \cdots I_{N}).
Ponekad se događa da je dimenzija od jednog moda veća od produkta dimenzija drugih modova. Pretpostavimo, npr. da je \mathcal{A} \in \mathbb{R}^{l \times m \times n} gdje je l \gt mn. Može se pokazati da tada za tenzor \mathcal{S} vrijedi
i možemo odbiti dio s nulama tenzora \mathcal{S} te (
gdje je \widehat{\mathcal{S}} \in \mathbb{R}^{mn \times m \times n } i \widehat{U}^{(1)} \in \mathbb{R}^{l \times mn}.
MATLAB kod |
function [S,U1,U2,U3]=tenz_hosvd(A) % [S,U1,U2,U3]=tenz_hosvd(A) racuna HOSVD tenzora A reda 3. [U1,S1,V1]=svd(tenz_unfold(A,1)); [U2,S2,V2]=svd(tenz_unfold(A,2)); [U3,S3,V3]=svd(tenz_unfold(A,3)); S=tenz_mult(tenz_mult(tenz_mult(A,U1',1),U2',2),U3',3); sdim=size(S); %Slucaj tankog HOSVD-a psd12=sdim(1)*sdim(2); psd13=sdim(1)*sdim(3); psd23=sdim(2)*sdim(3); if (sdim(1)>psd23) S=S(1:psd23,1:sdim(2),1:sdim(3)); U1=U1(1:sdim(1),1:psd23); return; end if (sdim(2)>psd13) S=S(1:sdim(1),1:psd13,1:sdim(3)); U2=U2(1:sdim(2),1:psd13); return; end if (sdim(3)>psd12) S=S(1:sdim(1),1:sdim(2),1:psd12); U3=U3(1:sdim(3),1:psd12); return; end |
I HOSVD se može koristiti za kompresiju tenzora. Budući da je masa jezgrenog tenzora \mathcal{S} koncentirana za male vrijednosti od sva tri indeksa, moguće je "stisnuti" podatke u sva tri moda HOSVD-om. Pretpostavimo sada da smo podatke stisnuli u manji tenzor gdje ćemo imati k_{i} stupaca u modu i. Neka je U_{k_{i}}^{(i)} = U^{(i)}(:,1:k_{i}) i \hat{\mathcal{S}} = \mathcal{S}(1:k_{1},1:k_{2},1:k_{3}). Zatim razmotrimo aproksimaciju
Ilustrirajmo to na sljedećoj slici:
Na ovaj način smo uz minimalne gubitke uštedjeli memoriju. Tenzor \mathcal{A}\in \mathbb{R}^{l\times m \times n} ima ukupno l \cdot m \cdot n elemenata, dok za njegovu aproksimaciju \widehat{\mathcal{A}} moramo pamtiti ukupno k_{1} \cdot k_{2} \cdot k_{3} + l\cdot k_{1} + m\cdot k_{2} + n \cdot k_{3} elemenata.
Ako je tenzor \mathcal{A}\in \mathbb{R}^{1000\times 1000 \times 1000} onda on ima 1000 \cdot 1000 \cdot 1000 = 10^{9} elemenata, dok njegova aproksimacija \widehat{\mathcal{A}} za k_{1}=k_{2}=k_{3}=100 ima 10^{6} elemenata u \widehat{\mathcal{S}}, 1000 \cdot 100 = 10^{5} elemenata u U_{k_{1}}^{(1)},U_{k_{2}}^{(2)} i U_{k_{3}}^{(3)}, ukupno 1.3\cdot 10^{6} elemenata. što znaći da umjesto da koristimo 1 000 000 000 elemenata mi korisitmo samo 1 300 000 elemenata, a to je ušteda od 997 000 000 elemenata, odnosno umjesto da zauzmemo 3GB memorije zauzimamo samo 3.9MB.
Ljudska bića su vrlo vješta pri prepoznavanju lica čak i kada izraz lica, osvjetljenje, kut gledanja itd. variraju. Razviti automatske postupke za prepoznavanje lica koji su robusni s obzirom na različite uvjete, izazovan je istraživački problem koji je istražen pomoću nekoliko različitih pristupa. Analiza glavnih komponenti (eng. principal component analysis, PCA), temeljena na SVD-u, popularna je tehnika koja često ide pod imenom "eigenfaces". Međutim, ova metoda je najbolja kada su sve fotografije nastale pod sličnim uvjetima, i ne radi dobro kad se mijenjaju neki faktori okoline.
Nedavno su istraživane metode za multilinearnu analizu skupa fotografija. Konkretno, problem prepoznavanja lica razmatran je korištenjem tenzorskog modela, TensorFaces pristupa. I to tako da modovi tenzora predstavljaju drukčiji način gledanja, npr. osvjetljenje ili izraz lica, postalo je moguće poboljšati preciznost algoritma prepoznavanja u usporedbi s PCA metodom.
U ovom ćemo odsječku opisati metodu tenzorskog prepoznavanja lica, koja se odnosi na TensorFaces. Budući da se radi o fotografijama, koje se često pohranjuju kao matrice m \times n, s m i n reda 100-500, izračuni za svako lice koje treba identificirati su prilično teški. Razmotrit ćemo kako se tenzorski SVD (HOSVD) također može koristiti za smanjenje dimenzije u svrhu smanjenja broja operacija.
Pretpostavimo da imamo kolekciju fotografija od n_{p} osoba, gdje je svaka fotografija m_{i_{1}} \times m_{i_{2}} matrica s m_{i_{1}} m_{i_{2}} = n_{i} elemenata. Pretpostavljamo da su stupci fotografija složeni tako da svaka fotografija predstavlja vektor u \mathbb{R}^{n_{i}}. Nadalje pretpostavljamo da je svaka osoba fotografirana u n_{e} različitih izraza lica. često je n_{i} \geq 5000, i obično je n_{i} znatno veći od n_{e} i n_{p}. Takva kolekcija fotografija je spremljena u tenzor:
Pozivamo se na različite modove kao što su mod fotografije (eng. the image mode), mod izraza lica (eng. the expression mod) i mod osobe (eng. the person mode), zbog toga korisitmo indekse i,e,p u (
Ako, primjerice, također imamo fotografije svake osobe s različitim osvjetljenjem, kutem gledanja, itd., onda bi mogli predstavljati kolekciju fotografija tenzorom višeg reda. Radi jednostavnosti ovdje promatramo samo tenzore reda 3. Generalizacija tenzorima višeg reda je jasna.
Svaka osoba je fotografirana u ukupno 11 različitih izraza lica.
Redosljed modova je naravno proizvoljan; u svrhu ilustriranja pretpostavljat ćemo redosljed iz (
gdje je \mathcal{S} \in \mathbb{R}^{n_{e}n_{p} \times n_{e} \times n_{p}} jezgra tenzora \mathcal{A}, F\in \mathbb{R}^{n_{i} \times n_{e}n_{p}} ima ortogonalne stupce, i G \in \mathbb{R}^{n_{e} \times n_{e}} i H \in \mathbb{R}^{n_{p} \times n_{p}} su ortogonalne matrice.
Sada ćemo razmatrati problem klasifikacije kako slijedi:
Za danu fotografiju nepoznate osobe, koju predstavlja vektor u \mathbb{R}^{n_{i}} odredit ćemo koju od n_{p} osoba predstavlja ili odlučiti da nepoznata osoba nije u bazi podataka.
Za klasifikaciju pišemo HOSVD (
Za određeni izraz lica e imamo
Očito tenzore \mathcal{A}(:,e,:) i \mathcal{C}(:,e,:) možemo promatrati kao matrice, koje označavamo s A_{e} i C_{e}. Stoga, za sve izraze imamo linearne relacije
Imajmo na umu da se ista (ortogonalna) matrica H pojavljuje u svih n_{e} relacija. S H^{T} = (h_{1} \cdots h_{n_{p}}), stupac p iz (
Možemo interpretirati (
Stupac p od matrice A_{e} sadrži sliku osobe p u izrazu e. Stupci matrice C_{e} su bazni vektori za izraz e, i red p matrice H, tj, h_{p}, sadrži koordinate fotografija osobe p u toj bazi. Nadalje isti h_{p} sadrži koordinate fotografija osobe p u svim izraznim bazama.
Zatim pretpostavimo da je z \in \mathbb{R}^{n_{i}} slika nepoznate osobe u nepoznatom izrazu (iz n_{e}) i da ju želimo klasificirati. Taj z ćemo zvati testna slika. Očito, ako je slika osobe p u izrazu e, onda su koordinate vektora z u toj bazi jednake koordinatama vektora h_{p}. Dakle, možemo klasificirati z računanjem njegovih koordinata u svim bazama ekspresije i provjeravajući, za svaki izraz, podudaraju li se koordinate od z (ili se gotovo podudaraju) s elementima bilo kojeg reda matrice H.
Koordinate od z u izraznoj bazi e mogu se naći rješavanjem problema najmanjeg kvadrata
Klasifikacijski algoritam
for e = 1,2, \cdots, n_{e}
Količina posla u ovom algoritmu je velika: za svaku test sliku z moramo riješiti n_{e} problema najmanjih kvadrata (
Program smo testirali na 10 osoba fotografiranih u 10 različitih ekspresija(izraza) lica. Fotografije su spremljene u matricu tako da svaki stupac predstavlja jednu fotografiju i to na način da prvih 10 stupaca predstavlja prvu osobu u svih 10 ekspresija, drugih 10 stupaca predstavlja drugu osobu itd. Svaka fotografija je dimenzije 64 \times 64 što znači da je matrica dimenzije 4096\times 100. Pogledajmo sada fotografije tih osoba u prvom izrazu lica:
Svaka od tih osoba je fotografirana u 10 različitih izraza lica, pa pogledajmo na prvoj osobi koji su to sve izrazi: \nopagebreak[4]
Za potrebe prepoznavanja lica uzeli smo prvih 5 osoba u prve 3 ekspresije lica (15 fotografija) i stavili ih u bazu, te na njima "trenirali" program. Nakon toga smo izbacili te fotografije i na preostalim fotografijama testirali program. Preostalo je po 7 fotografija za svaku osobu koja je u bazi, a po 10 od osoba koje nisu u bazi (ukupno 35 fotografija osoba koje su u bazi i 50 fotografija osoba koje nisu u bazi). Naš cilj je da danu testnu fotografiju program klasificira kao jednu od tih 5 osoba ili da vrati: "Tražena osoba nije u bazi!". Odnosno, ukoliko je testna fotografija jedna od tih 7 fotografija da program prepozna tu osobu kao odgovarajuću osobu iz baze, a ako je jedna od 10 fotografija osoba koje nisu u bazi da vrati: "Tražena osoba nije u bazi!". Tolerancija u ovom radu iznosi 0.475, a do nje dolazimo eksperimentima.
Uzmimo sada za testnu fotografiju proizvoljnu fotografiju iz skupa od 35 fotografija osoba koje su u bazi i na njoj testirajmo program. Pogledajmo rezultate na sljedećim slikama: (Lijeva fotografija predstavlja osobu koju želimo klasificirati, a desna klasificiranu osobu.)
Vidimo da je program dobro prepoznao lica. Za sljedeće fotografije je program vratio: "Tražena osoba nije u bazi!".
što također vidimo da je dobro jer niti jedna od tih osoba nije u prvih 5 osoba na kojima smo trenirali naš program.
Napomenimo na kraju da program nije savršen i da se može dogoditi da krivo klasificira osobu. Primjer krive klasifikacije: Uzeli smo novu 11. osobu i pokušali je klasificirati.
Klasifikacija očito nije dobra jer to nisu iste osobe!
Da bismo to spriječili možemo smanjiti toleranciju, ali u tom slučaju se može dogoditi da osoba koja je u bazi ne bude prepoznata, odnosno da program vrati: "Tražena osoba nije u bazi!".
Pogledajmo i takav primjer: (Tolerancija u ovom primjeru iznosi 0.35).
Za gornju fotografiju je program vratio: "Tražena osoba nije u bazi!", a trebao ju je klasificirati kao:
Unatoč tome smatramo da je "manja" pogreška ako program ne prepozna osobu koju bi trebao, nego da osoba koja nije u bazi bude prepoznata kao neka osoba koja je u bazi. Iz tih razloga ipak uzimamo manju toleranciju do koje dolazimo eksperimentima.