vault backup: 2024-12-26 04:24:44
This commit is contained in:
parent
7192d14da1
commit
34d8577615
15 changed files with 697 additions and 146 deletions
|
@ -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 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.
|
||||
**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). 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]]
|
||||
|
@ -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 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.
|
||||
- $\sigma_{x}$ e $\sigma_{y}$: Varianza della gaussiana.
|
||||
|
||||
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
|
||||
Questa procedura, su immagini molto grandi, porta ad un’alta 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]]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue