2011-10-04 5 views
6

C'è qualche documentazione utile per l'utilizzo della funzionalità HOGDescriptor in Python OpenCV? Ho letto la documentazione di C++, ma la versione di Python funziona in modo diverso e non riesco a capirlo solo armeggiando.OpenCV Python e Istogramma di Oriented Gradient

In particolare, sto cercando un comando OpenCV in Python che prende un'immagine e una posizione di pixel come input (e probabilmente anche alcuni parametri relativi alla dimensione di una finestra di rilevamento) e quindi restituisce semplicemente un array Python che contiene il HOG feature vector (cioè un elenco o un array NumPy, ecc., in cui l'elemento jth dell'elenco è il componente istogramma jth da un istogramma di gradienti orientati).

Il mio obiettivo è quello di alimentare questi istogrammi nelle pipeline SVM di scikits.learn (così posso evitare l'addestramento OpenCV SVM), ma per farlo ho bisogno dei vettori effettivi di funzionalità e non del tipo di condotte per la catena di elaborazione HOG. che OpenCV sembra utilizzare.

Eventuali altre implementazioni di Python di codice HOG avrebbe funzionato troppo. Ho bisogno di qualcosa di abbastanza efficiente da confrontare con un'altra base di codice che sto scrivendo io stesso.

+0

Nota: una ragionevole C eseguibile ++ che è facile da usare argomenti della riga di comando avrebbe funzionato troppo e ho potuto solo avvolgerlo nella mia roba Python. Se conosci progetti con codice HOG efficiente, potrebbe essere utile. – ely

risposta

0

Che ne dite di un po' di Matlab come ispirazione, appartenenti a questo article

+0

Grazie! Probabilmente posso tradurre questo in Python me stesso. Potrebbe essere più difficile portarlo in altre lingue, però. – ely

0

dai uno sguardo a http://sourceforge.net/projects/hogtrainingtuto/?_test=beta per un po 'di codice Python HOG e un sacco di implementazioni di C, cpp, java. Per quanto riguarda le documentazioni reali di python e opencv, anch'io sono in perdita. Ma questo dovrebbe aiutare un po '

+0

Non vedo alcun codice Python nel file di archivio che ho scaricato da quel collegamento. L'unica cosa correlata a HOG è un eseguibile chiamato 'cvHogFeatureCal' ma non ha documentazione che io possa trovare. L'altra cosa è che OpenCV implementa generalmente i classificatori come cascate, in cui l'utente inserisce immagini fortemente negative e quindi veri positivi per la formazione, e OpenCV automaticamente arriva fino alla produzione dei classificatori. In particolare, ho bisogno di evitarlo e solo di dirottare i vettori di funzionalità HOG, quindi fare un allenamento con i classificatori con software diversi (scikits.learn). – ely

0

L'applicazione 'Poselets' here dispone di un'implementazione C di descrittori HOG, che, anche se scritto con Matlab in mente, può essere adattato per funzionare con Python usando ctypes e numpy.

È possibile rimuovere tutte le routine mex e dichiarare gli array di input e output come float * nella funzione C.

Si ha bisogno di fare in modo che gli array NumPy sono contigui Fortran. Questo può essere ottenuto:

image = image.copy(order='F', dtype = float32)

+0

Io uso roba Poselet abbastanza regolarmente. Sulla base di quanto non documentato e imperscrutabile il loro codice Java era per il loro strumento di annotazione del browser, sono propenso a usare semplicemente il codice Matlab nel post principale. L'idea di Poselet è grandiosa, ma il fatto che (a) sia in Matlab e (b) non vogliano aiutare i colleghi scienziati fornendo alcun supporto per il loro codice, mi rende molto meno incline a usare le loro cose. Probabilmente sarebbe altrettanto lavoro tradurre la migliore routine di Matlab da Maurits. – ely

+0

Abbastanza buono, non ho sperimentato molto la loro implementazione, credo in gran parte a causa della mancanza di documentazione! Ma ho costruito qualcosa di simile usando la loro routine HOG come ho delineato sopra, e funziona bene. Se la velocità è una priorità, l'utilizzo della routine C potrebbe essere una soluzione migliore rispetto ai cicli nidificati in python. – Martin

5

Questo è un po 'tardi, ma, per riferimento futuro, scikit-image ha un'implementazione di HOG. Questa è una singola funzione che potrebbe estrarre l'istogramma di gradienti orientati per una determinata immagine.

+2

Sì, ne avevo ricevuto una copia avanzata prima che venisse accettato in scikits.image. Ho scoperto che non è abbastanza buono o abbastanza veloce. L'altra cosa è che l'interfaccia è troppo difficile da usare. Ad esempio, il codice HoG di Dalal e Triggs accetta elenchi di punti chiave in un'immagine, mentre la versione scikits.image può fare solo patch. Ho finito per scrivere solo il mio codice. Ho scritto un semplice HoG "vanilla" per Python e anche la mia versione di HoG piramidale. Infine, ho implementato due versioni di GPU in PyCUDA. Puoi trovare il codice collegato [qui] (http://people.seas.harvard.edu/~ely/faceparts/software.html) – ely