5

La codifica su cui mi sto concentrando è la codifica del pescatore, poiché ho dimostrato di avere i migliori risultati con il mio lavoro. Quindi voglio testare la codifica della pesca sulle mie funzionalità estratte (SIFT) e testare le prestazioni del sistema con o senza codifica.Comprensione della codifica delle funzioni estratte

Piuttosto che iniziare fresco ho scoperto che vl_feat è dotato di un libreria per la codifica di pescatori e hanno un tutorial per quello pure collegata here

Ora ho già fatto la maggior parte di ciò che è necessario, ma ciò che realmente ottenere codificata mi confonde, per esempio il tutorial chiarisce che codifica fisher viene eseguita utilizzando i parametri ottenuti da GMM come [means, covariances, priors] e le caratteristiche SIFT estratti devono essere utilizzati qui in GMM secondo il tutorial:

l' La codifica di Fisher utilizza GMM per costruire un vocabolario visivo. Per esemplificare la costruzione di un GMM, si consideri un numero di dati bidimensionali punti. In pratica, questi punti sarebbero una raccolta di SIFT o altre caratteristiche dell'immagine locale.

numFeatures = 5000 ; 
dimension = 2 ; 
data = rand(dimension,numFeatures) ; 

numClusters = 30 ; 
[means, covariances, priors] = vl_gmm(data, numClusters); 

Poi una volta ho eseguito questo passaggio sono per codificare un altro set di dati? Questo è ciò che mi confonde. Ho già usato le mie funzionalità SIFT estratte per generare i parametri per GMM.

Successivamente, creare un altro insieme casuale di vettori, che dovrebbe essere codificato utilizzando la rappresentazione Fisher Vector e la GMM appena ottenuto:

encoding = vl_fisher(datatoBeEncoded, means, covariances, priors); 

Così qui encoded è il risultato finale, ma COSA ce l'ha codificato? Voglio che le mie caratteristiche SIFT che ho estratto dalle mie immagini siano codificate, ma se seguo il tutorial utilizzato in GMM. Se questo è il caso, allora cos'è datatoBeEncoded? Devo usare le abilità SIFT qui di nuovo?

Grazie

Aggiornamento:

@Shai

Grazie, ma credo che devo fare qualcosa di sbagliato. Non capisco cosa intendi per "confrontare le immagini con se stessi". Ho 4 classi, da ogni classe 1000 immagini. Così ho usato i primi 600 immagini dalla classe 1 per imparare i parametri GMM e quindi utilizzare questi parametri per codificare il pescatore vettori

numClusters = 128 ; 
[means, covariances, priors] = vl_gmm(data, numClusters); 

Così ogni means, covariances sono di dimensioni 128 x 128 e priori della dimensione 1 x 128

ora, quando io uso questi per codificare il vettore pescatore sulle 400 immagini utilizzando la funzione di

encoding = vl_fisher(datatoBeEncoded, means, covariances, priors); 

la dimensione della codifica è molto diverso, qualcosa lungo la dimensione della 12000 x 1. Questi non possono essere confrontati con i modelli generati.

Avevo già un sistema che stava lavorando alla versione non codificata del set di dati e funzionava bene, ma volevo vedere come la codifica farà la differenza, in teoria i risultati dovrebbero essere migliorati.

Posso aggiungere il codice qui se necessario, ma è per UBM-GMM e la ragione per cui sono confuso è perché il metodo di allenamento che hai menzionato è quello che sto usando per UBM.

Se ho appena codificato le immagini di prova, non posso usarle nel classificatore a causa della mancata corrispondenza delle dimensioni.

Forse non sto raccogliendo questo correttamente o facendo un errore stupido, sarebbe possibile ottenere un semplice esempio attraverso il quale posso capire il funzionamento.

Grazie mille

risposta

3

Hai due fasi del processo:
(1) formazione in cui si utilizza imparare alcune proprietà statistiche del proprio dominio, e
(2) test in cui si usa la rappresentazione/i modelli appresi e applicarli a nuovi campioni.

Di conseguenza, si dovrebbe dividere il set di dati di funzioni in due "spaccature" uno per l'apprendimento della MGM per la codifica Fisher (un formazione set), e un altro spaccato di applicare la codifica (un prova set) .

Solitamente si campiona una quantità significativa di immagini che rappresentano bene il proprio dominio di interesse (ad esempio, se si è interessati a persone si dovrebbero considerare molte immagini di persone al chiuso e all'aperto, primi piani e foto di gruppo ecc.) Si estrae come molti descrittori di SIFT, come si può da queste immagini di formazione e li usa per imparare il modello:

numClusters = 30 ; 
[means, covariances, priors] = vl_gmm(TrainingData, numClusters); 

Una volta che hai questo modello salvarlo, quindi è possibile applicarlo a nuove foto per codificare i loro

encoding = vl_fisher(TestData, means, covariances, priors); 

Nota che mentre TrainingData è in generale molto grande e possono essere raccolte da decine (o centinaia) di immagini, TestData possono essere significativamente più piccolo, e anche essere descrittori raccolti da un'immagine di singolo.

+0

Grazie per la risposta. Quindi se ho 1000 immagini e uso 600 per la formazione e il resto per i test, come faccio a confrontare i due? Voglio dire, in questo caso, l'allenamento sarà in termini di parametri '' gmm'' mentre il test sarà in termini di '' vettori pescatori'', usando un classificatore come si confronteranno? Non sarà come confrontare un tipo di funzione (allenamento) con un altro tipo di funzione (test)? Scusa forse non sto capendo correttamente la tua spiegazione, se possibile puoi fornire un esempio di come funzionerebbe? Mille grazie – StuckInPhD

+0

@FarazKhan non si suppone che si possa confrontare il set di allenamento con quello che sarebbe "barare". Puoi utilizzare 600 foto per apprendere il modello e confrontare a loro volta i vettori di pesca delle 400 immagini: trovare immagini simili, ecc. Ad esempio, puoi scegliere un'immagine (tra le 400) e cercare le 10 immagini con il più vicino vettore - che sta trovando le 10 immagini più simili. – Shai

+0

c'era troppo da scrivere qui, quindi ho aggiornato la mia domanda originale, puoi darci un'occhiata. Molte grazie – StuckInPhD

Problemi correlati