159 lines
12 KiB
Markdown
159 lines
12 KiB
Markdown
![[Pasted image 20241030133828.png]]
|
||
|
||
Nel riconoscimento facciale 2D abbiamo principalmente due problematiche da
|
||
risolvere:
|
||
- Costruzione di feature discriminative e rappresentative
|
||
- difficile avere una separazione lineare tra classi
|
||
- in certi casi dobbiamo combinare classificatori lineari (AdaBoost) o usare classificatori non lineari (molto più complesso)
|
||
- Costruzione di un classificatore che possa generalizzare anche su oggetti mai visti nel training
|
||
|
||
In questo caso quindi ci troviamo a rappresentare le facce all’interno di immagini digitali, che vengono rappresentate da matrici a due dimensioni (w × h) oppure vettori unidimensionali (d = w × h). L’alta dimensionalità dei dati (es.: immagine 100 × 100 ha dimensione 10000) ci porta subito a un primo problema, ovvero il “Curse of dimensionality”: quando la dimensionalità aumenta, il volume dello spazio aumenta cosı̀ velocemente che i dati diventano sparsi/radi, rendendo difficile la classificazione.
|
||
La sparsità dei dati, nel momento in cui vengono utilizzati strumenti statistici
|
||
come ad esempio i modelli di machine learning, diminuisce drasticamente la capacità predittiva di questi in quanto si hanno bisogno di tanti più esempi per generalizzarne le regole predittive.
|
||
> [!PDF|yellow] [[LEZIONE6_Face recognition2D.pdf#page=7&selection=6,0,6,17&color=yellow|LEZIONE6_Face recognition2D, p.7]]
|
||
> > Some consequences
|
||
>
|
||
> leggi le conseguenze
|
||
|
||
Un'alternativa è rappresentare un'immagine nel feature space:
|
||
- Gabor filters
|
||
- discrete cosine transform (DCT)
|
||
- local binary pattern (LBP) operator
|
||
- fractal encoding
|
||
|
||
#### PCA
|
||
possibile soluzione al curse of dimensionality: PCA.
|
||
Metodo statistico che consente di ridurre l'alta dimensionalità di uno spazio mappando i dati in un altro spazio con dimensionalità decisamente più piccola minimizzando la perdita di informazioni.
|
||
Vengono individuati dei nuovi assi, ortogonali tra loro, su cui proiettare i dati che però ne **massimizzano la varianza**. L'ortogonalità di questi ci permette di escludere componenti correlate tra loro che risultano quindi ridondanti.
|
||
Nello spazio delle immagini, i principali componenti sono ortogonali quando sono gli *autovettori della matrice di covarianza*.
|
||
|
||
L'obiettivo è di eliminare features con varianza molto bassa, che quindi sono comuni tra tutti i sample e poco utili a discriminare classi.
|
||
|
||
Calcoliamo l'optimal k
|
||
Dato un training set TS di m sample di n dimensioni, calcoliamo
|
||
- il vettore medio $\hat{x}$ del training set $$\hat{x}=\frac{1}{m}\sum_{i=1}^{m}x_{i}$$
|
||
- matrice di covarianza C $$C=\frac{1}{m}\sum_{i=1}^m(x_{i}-\hat{x})(x_{i}-\hat{x})^T$$
|
||
- la dimensione di C è (n x n)
|
||
- il nuovo spazio k-dimensionale è dato dalla matrice di proiezione dove le colonne sono i k autovettori di C, corrispondenti ai k autovalori di C. Plottando gli autovalori possiamo ottenere la varianza lungo gli autovettori.
|
||
|
||
> [!PDF|red] [[LEZIONE6_Face recognition2D.pdf#page=14&selection=0,0,2,10&color=red|LEZIONE6_Face recognition2D, p.14]]
|
||
> > PCA and Eigenfaces
|
||
>
|
||
> esempio
|
||
|
||
![[Pasted image 20241030142613.png]]
|
||
da questo otteniamo l'elemento medio:
|
||
![[Pasted image 20241030142635.png]]
|
||
|
||
problema: bisogna avere tutte le facce ben centrate!!
|
||
|
||
![[Pasted image 20241030142717.png]]
|
||
autovettori (completamente diverse da quelle di partenza se ci facciamo caso)
|
||
dobbiamo estrarre quelle
|
||
|
||
Proiezione: eseguita moltiplicando la matrice di proiezione trasposta $𝜑_{k}^T$ per il vettore originale.
|
||
![[Pasted image 20241030142934.png]]
|
||
![[Pasted image 20241030143149.png]]
|
||
|
||
##### Problemi di PCA
|
||
- mancanza di potere discriminativo
|
||
- la separazione degli autovettori dipende anche dalle differenze intra-classe
|
||
- ma il sistema è unsupervised learning
|
||
- in in presenza di variazioni PIE, il modello potrebbe usare quelle come componenti facciali e non essere quindi in grado di separare correttamente le classi
|
||
|
||
Possibile soluzione: Fisherfaces, un'applicazione di FLD (Fisher's linear discriminant), spesso menzionato nel contesto del Linear Discriminant Analysis (LDA).
|
||
|
||
### LDA
|
||
Alcuni dei problemi di PCA possono essere dati dal fatto che lavoriamo su dati in una maniera unsupervised (non supervisionata), ovvero senza tenere in considerazione le classi dei vari sample.
|
||
Una soluzione supervised è proposta da LDA, ovvero un metodo simile a PCA ma che minimizza la distanza intra-classe e cerca di massimizzare invece la distanza tra classi.
|
||
|
||
Nell'immagine la riduzione è da 2 a 1 dimensioni. In alcuni casi tipo questo non basta ridurre da due a un asse, gli assi sono ruotati per massimizzare la separazione tra classi. L'importante è che le coordinate rimangano ortogonali tra loro
|
||
![[Pasted image 20241030144246.png]]
|
||
the best subspace is better cause we are able to separate class among the 1D axis. As we can see, in the worst one, we are definitely not able to.
|
||
|
||
##### Possibile approccio
|
||
- partiamo, come nel PCA, da un set di m sample di n dimensioni.
|
||
- a differenza del PCA, splittiamo il set in base ai label che rappresentano le classi $PTS=\{P_{1},P_{2},{_{3},\dots,P_{s}}\}$, dove $P_{i}$ è una classe di cardinalità $m_{i}$
|
||
- cerchiamo di ottenere uno scalare $y$ proiettando il sample $x$ su una linea, in modo che $y=w^Tx$
|
||
- chiaramente x è un punto nell'immagine 2D
|
||
- y è il punto proiettato invece nel nuovo spazio 1D
|
||
|
||
Consideriamo due classi $P_1$ e $P_{2}$, rispettivamente con $m_{1}$ e $m_{2}$ vettori ciascuna
|
||
- consideriamo i vettori medi di ogni classe nei due spazi: $$\mu_{i}=\frac{1}{m_{i}}\sum_{j=1}^{m_{i}}x_{j}$$
|
||
- nel nuovo spazio si avrà (la tilde indica che è nel nuovo spazio) $$\tilde{}\mu_{i}=\frac{1}{m_{i}}\sum_{j=1}^{m_{i}}y_{j}=\frac{1}{m_{i}}\sum_{j=1}^{m_{i}}w^Tx_{j}=w^T\mu_{i}$$
|
||
- possiamo scegliere la distanza dai vettori medi proiettati (quindi nel nuovo spazio) come una funzione che chiaramente vogliamo cercare di massimizzare $$J(w)=|\tilde{\mu_{1}}-\tilde{\mu_{2}}|=|w^T(\mu_{1}-\mu_{2})|$$
|
||
![[Pasted image 20241031085606.png]]
|
||
in questo caso però notiamo come in un asse abbiamo un'ottima separabilità tra classi, nell'altro abbiamo una distanza maggiore tra i due vettori medi.
|
||
E mo come cazzo famo? Proviamo a cercare un metodo migliore
|
||
|
||
##### Scattering matrices
|
||
Dobbiamo prendere in considerazione lo spread tra le classi.
|
||
Dobbiamo massimizzare il rapporto tra la varianza tra classi e la varianza della singola classe
|
||
- **varianza della singola classe**
|
||
- indica come i vettori sono distribuiti/dispersi rispetto al centro della stessa classe
|
||
- **varianza tra classi**
|
||
- indica come i centri sono distribuiti rispetto al centro di tutto (ok si potrebbe spiegare meglio ma so le 9:00
|
||
|
||
##### Approccio
|
||
- partiamo, come nel PCA, da un set di m sample di n dimensioni.
|
||
- a differenza del PCA, splittiamo il set in base ai label che rappresentano le classi $PTS=\{P_{1},P_{2},{_{3},\dots,P_{s}}\}$, dove $P_{i}$ è una classe di cardinalità $m_{i}$
|
||
- per ogni classe $P_{i}$ calcoliamo il vettore medio e la "media dei medi"$$\mu_{i}=\frac{1}{m_{i}}\sum_{j=1}^{m_{i}}x_{j}$$$$\mu_{TS}=\frac{1}{m}\sum_{i=1}^{S}m_{i}\mu_{i}$$
|
||
- calcoliamo la matrice di covarianza per la classe ${P_{i}}$ $$C_{i}=\frac{1}{m_{i}}\sum_{j=1}^{m_{i}}(x_{j}-\mu_{i})(x_{j}-\mu_{i})^T$$
|
||
- ora possiamo calcolare scatter matrix whithin-class (della stessa classe) $$S_{W}=\sum_{i=1}^Sm_{i}C_{i}$$
|
||
- scatter matrix tra classi $$S_{B}=\sum_{i=1}^Sm_{i}(\mu_{i}-\mu_{TS})(\mu_{i}-\mu_{TS})^T$$per due classi è anche definita come $$(\mu_{1}-\mu_{2})(\mu_{1}-\mu_{2})^T$$
|
||
- le stesse definizioni sono valide anche nel nuovo spazio con $\tilde{S_{W}}$ e $\tilde{S_{B}}$ con $y=w^Tx$ e la dispersione (scatter) della classe proiettata $P_{i}$ è definito come $$\tilde{s_{i}}^2=\sum_{y \in P_{i}}(y-\tilde{\mu_{i}})^2$$ la somma di tutti gli $\tilde{s_{i}}^2$ (di tutte le classi) è la within-class scatter (dispersione tra classi)
|
||
|
||
- adesso vogliamo massimizzare la differenza tra i vettori medi, normalizzati secondo una misura della dispersione della singola classe (within-class scatter)
|
||
- con due classi, è definita come la funzione lineare $w^Tx$ che massimizza la funzione $$J(w)=\frac{{|\tilde{\mu_{1}}-\tilde{\mu_{2}}|^2}}{\tilde{s_{1}}²+\tilde{s_{2}}^2}$$
|
||
- cerchiamo una proiezione dove sample della stessa classe sono proiettati molto vicini tra loro, ma con i valori medi delle classi il più possibile lontani tra loro![[Pasted image 20241031091853.png]]
|
||
|
||
### Feature spaces
|
||
- possiamo estrarre feature applicando filtri o trasformazioni alle immagini
|
||
- possiamo usare uno dei metodi appena descritti se le feature estratte hanno una dimensionalità alta
|
||
Quali sono le migliori feature da estrarre? Vediamo alcuni operatori
|
||
|
||
##### Bubbles
|
||
- un osservatore umano può subito ipotizzare il genere, l'identità, l'età e l'espressione guardando una faccia
|
||
- l'esperimento consiste nel mostrare l'immagine con sopra un pattern a bolle e vedere se l'osservatore umano e un sistema biometrico riescono a classificarlo bene![[Pasted image 20241031100207.png]]
|
||
- alla fine dell'esperimento riusciamo a capire quali sono gli elementi (le features quindi) della faccia che vengono prese in considerazione da un essere umano o che un sistema biometrico utilizza per classificare
|
||
|
||
#### Wavelet
|
||
provides a time-frequency representation of the signal. Fornisce tempo e frequenza contemporaneamente.
|
||
![[Pasted image 20241031102321.png]]
|
||
|
||
#### Gabor filters
|
||
È un filtro lineare utilizzato in applicazioni di edge detection, analisi di texture e estrazione di feature, e si pensa che sia simile al sistema percettivo visivo di noi umani. Un Gabor filter 2D non è altro che un kernel Gaussiano modulato da un’onda piana sinusoidale.
|
||
> [!PDF|yellow] [[LEZIONE6_Face recognition2D.pdf#page=43&selection=0,2,11,7&color=yellow|LEZIONE6_Face recognition2D, p.43]]
|
||
> > An example of filters: Gabor filters
|
||
>
|
||
> guarda dalle slide
|
||
|
||
![[Pasted image 20241031102640.png]]
|
||
|
||
Un feature vector viene ricavato eseguendo varie convoluzioni con un insieme Gabor filter (Gabor filter bank) con diversi orientamenti e scale (nell'immagine sull'asse x troviamo gli orientamenti e su y le scale)
|
||
|
||
Otteniamo quindi diversi filtri andando a cambiare i parametri:
|
||
- λ: frequenza, controlla lo spessore della striscia; più è grande più sarà spessa
|
||
- θ: orientamento, controlla la rotazione della striscia ed è espresso come un angolo
|
||
- γ: aspect ratio, controlla l’altezza della striscia; più è grande più l’altezza diminuirà
|
||
- σ: larghezza di banda, controlla la scala generale determinando anche il numero di strisce; aumentando questo valore avremo più strisce con meno distanza tra loro.
|
||
|
||
Questa procedura, su immagini molto grandi, porta ad un’alta dimension-
|
||
alità; possibili soluzioni sono:
|
||
- Applicare il filtro su un subset di pixel, come ad esempio una griglia =⇒ dimensionalità ridotta, ma possibile perdità di informazioni salienti (dovuta a possibili rotazioni ad esempio)
|
||
- Applico il filtro su tutti i pixel, ma poi seleziono solo i punti con picchi di valori =⇒ problemi di allineamento
|
||
|
||
###### Ma come facciamo la convoluzione?
|
||
- Griglia fissa
|
||
- possiamo perdere punti importanti
|
||
- Griglia definita a mano in modo che i vertici sono vicini alle feature importanti, come gli occhi
|
||
|
||
|
||
#### EBGM Elastic Bunch Graph Matching
|
||
Questo metodo fa uso di grafi, nello specifico abbiamo per ogni soggetto una collezione di grafi (per questo il nome “bunch”), uno per ogni posa, dove:
|
||
- i vertici (edges) sono labellati (pesati) con la distanza tra i nodi
|
||
- i nodi contengono un insieme di risultati di diversi gabor filter (in genere 5 differenti frequenze e 8 diversi orientamenti), conservati in questa struttura chiamata “Jet”, e sono posizionati in punti importanti come ad esempio naso, occhi e bocca
|
||
![[Pasted image 20241031104206.png]]
|
||
![[Pasted image 20241031104526.png]]
|
||
|
||
oggi non lo usa nessuno.
|