vault backup: 2024-12-26 04:24:44

This commit is contained in:
Marco Realacci 2024-12-26 04:24:44 +01:00
parent 7192d14da1
commit 34d8577615
15 changed files with 697 additions and 146 deletions

View file

@ -2,12 +2,13 @@
Nel riconoscimento facciale 2D abbiamo principalmente due problematiche da
risolvere:
- Costruzione di feature discriminative e rappresentative
- **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
- **Costruzione di un classificatore che possa generalizzare anche su oggetti mai visti nel training**
In questo caso quindi ci troviamo a rappresentare le facce allinterno di immagini digitali, che vengono rappresentate da matrici a due dimensioni (w × h) oppure vettori unidimensionali (d = w × h). Lalta 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.
**Le facce possono essere rappresentate nell'image space:**
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). Lalta 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]]
@ -15,7 +16,7 @@ come ad esempio i modelli di machine learning, diminuisce drasticamente la capac
>
> leggi le conseguenze
Un'alternativa è rappresentare un'immagine nel feature space:
**Un'alternativa è rappresentare un'immagine nel feature space:**
- Gabor filters
- discrete cosine transform (DCT)
- local binary pattern (LBP) operator
@ -23,6 +24,8 @@ Un'alternativa è rappresentare un'immagine nel feature space:
#### PCA
possibile soluzione al curse of dimensionality: PCA.
p.s. per una descrizione molto migliore di PCA guardate gli appunti di FDS. Poi tornate qui per Eigenfaces ;>
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*.
@ -67,7 +70,7 @@ Possibile soluzione: Fisherfaces, un'applicazione di FLD (Fisher's linear discri
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
Nell'immagine sotto 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.
@ -107,6 +110,8 @@ Dobbiamo massimizzare il rapporto tra la varianza tra classi e la varianza della
- 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]]
e poi si calcolano autovettori e autovalori sulla matrice $(S_{W})^{-1}S_{B}$, e si prosegue come PCA.
### 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
@ -133,33 +138,41 @@ provides a time-frequency representation of the signal. Fornisce tempo e frequen
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
- f: frequenza della sinusoide, controlla lo spessore delle strisce
- θ: orientamento, controlla la rotazione della striscia ed è espresso come un angolo
- γ: aspect ratio, controlla laltezza della striscia; più è grande più laltezza 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.
- $\sigma_{x}$ e $\sigma_{y}$: Varianza della gaussiana.
Questa procedura, su immagini molto grandi, porta ad unalta 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
Questa procedura, su immagini molto grandi, porta ad unalta dimensionalità ed è computazionalmente complessa; possibili soluzioni sono:
- Applicare il filtro su un subset di pixel, come ad esempio una griglia =⇒ dimensionalità ridotta, ma possibile perdita di informazioni salienti (dovuta a possibili rotazioni ad esempio)
Spiegato più semplicemente: faccio la convoluzione ma saltando un po' di pixel ogni volta (lo stride per chi conosce le CNN)
- Griglia fissa
- possiamo perdere punti importanti
- Griglia definita a mano in modo che i vertici sono vicini alle feature importanti, come gli occhi
- Applico il filtro su tutti i pixel, ma poi seleziono solo i punti con picchi di valori (con maggiore informazione) $\to$ problemi di allineamento.
#### 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
- gli archi (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
In questo modo considerando la posizione dei nodi e le label degli archi, il grafo modella la geometria del volto.
Face Bunch Graph: può rappresentare volti
label dei nodi: insiemi di jet (detti bunches) dei volti campione usati per costruire il FBG
label degli archi: distanze come detto prima
un volto è rappresentato come una combinazione di jet. Per ogni bunch si sceglie il jet più appropriato, una faccia nuova viene quindi rappresentata con i jet delle facce nel campione che più gli assomigliano, prendendo ad es. bocca da faccia 1, naso da faccia 2...
(un FBG fatto con 6 volti campione e 9 punti cardine può rappresentare fino a 6⁹ volti diversi :o)
![[Pasted image 20241031104206.png]]
![[Pasted image 20241031104526.png]]
oggi non lo usa nessuno.
#### LBP Local Binary Pattern
Lavora sempre su un kernel, ma il kernel è "trasparente". Lavora pixel epr pixel e ci aiuta ad estrarre informazioni riguardo le texture all'interno di un'immagine (utile anche per antispoofing). Nella sua prima versione va a considerare una griglia 3x3 dove a ognuno dei quali viene assegnato un valore binario: se il suo valore era maggiore del pixel centrale viene assegnato 1, altrimenti 0. Effettuando questa operazione con un ordine di processo dei vicini (parto dal vicino in alto a sinistra ad es.) si ottiene una stringa binaria, il cui valore convertito in decimale viene assegnato al pixel centrale. Sarà il valore del pixel nella nuova immagine.
Lavora sempre su un kernel, ma il kernel è "trasparente". Lavora pixel per pixel e ci aiuta ad estrarre informazioni riguardo le texture all'interno di un'immagine (utile anche per antispoofing). Nella sua prima versione va a considerare una griglia 3x3 dove a ognuno dei quali viene assegnato un valore binario: se il suo valore era maggiore del pixel centrale viene assegnato 1, altrimenti 0. Effettuando questa operazione con un ordine di processo dei vicini (parto dal vicino in alto a sinistra ad es.) si ottiene una stringa binaria, il cui valore convertito in decimale viene assegnato al pixel centrale. Sarà il valore del pixel nella nuova immagine.
È tipo una convoluzione ma molto più semplice.
![[Pasted image 20241106133301.png]]