2013-04-08 16 views
6

Così ho scritto i miei codici per HoG e la sua variante per lavorare con immagini di profondità. Tuttavia, sono bloccato a testare il mio SVM addestrato nella parte della finestra di rilevamento.Come implementare un algoritmo della finestra scorrevole migliore?

Tutto quello che ho fatto adesso è quello di creare prima le piramidi dell'immagine dall'immagine originale, ed eseguire una finestra scorrevole di dimensioni 64x128 dall'angolo in alto a sinistra in basso a destra.

Ecco una cattura video di esso: http://youtu.be/3cNFOd7Aigc

Ora il problema è che sto diventando più falsi positivi di quanto mi aspettassi.

C'è un modo per rimuovere tutti questi falsi positivi (oltre all'allenamento con più immagini)? Finora posso ottenere il 'punteggio' da SVM, che è la distanza dal margine stesso. Come posso usarlo per sfruttare i miei risultati?

Qualcuno ha qualche idea sull'implementazione di un buon algoritmo per finestre scorrevoli?

risposta

7

Quello che potresti fare è aggiungere una fase di elaborazione per trovare la risposta più forte localmente da SVM. Lasciatemi spiegare.

Quello che sembra essere facendo adesso:

per ogni finestra scorrevole W, registrare category[W] = SVM.hardDecision(W)

decisione difficile significa che restituire un valore booleano o un numero intero, e per 2-categoria classificazione potrebbe essere scritto in questo modo:

hardDecision(W) = bool(softDecision(W) > 0) 

Dal momento che lei ha citato OpenCV, in CvSVM::predict è necessario impostare returnDFVal su true:

returnDFVal - Specifica un tipo di valore di ritorno. Se true e il problema è una classificazione a 2 classi, il metodo restituisce il valore della funzione decisionale che è la distanza firmata dal margine, altrimenti la funzione restituisce un'etichetta di classe (classificazione) o un valore di funzione stimato (regressione).

da the documentation.

Che cosa si potrebbe fare è:

  1. per ogni finestra scorrevole W, registrare score[W] = SVM.softDecision(W)
  2. per ogni W, calcolare e registrare:
    • neighbors = max(score[W_left], score[W_right], score[W_up], score[W_bottom])
    • local[W] = score[W] > neighbors
    • powerful[W] = score[W] > threshold.
  3. per ogni W, voi hanno un positivo se local[W] && powerful[W]

Dal momento che il classificatore avrà una risposta positiva per il panno finestre (nello spazio e/o aspetto) al tuo vero positivo, l'idea è quello di registrare i punteggi per ogni finestra, e poi tenere unici elementi positivi che

  • sono un punteggio a livello locale massima (più grande che i suoi vicini) ->local
  • sono abbastanza forte ->powerful

È possibile impostare la soglia a 0 e regolarla fino ad ottenere risultati soddisfacenti. Oppure puoi calibrarlo automaticamente usando il tuo set di allenamento.

+0

Ottima risposta, ma ho poche altre domande se tu o qualcun altro non ti dispiace. Come lo uso insieme allo spazio della bilancia? Tratto la finestra rilevata in un'altra scala come solo un altro vicino? E come entra in gioco la soppressione non massimale? Comunque, ancora, grazie mille per la tua risposta chiara. –

+2

Buona domanda sulle bilance! Potresti in effetti includere la scala nel quartiere (sinistra/destra/su/giù/più piccolo/più grande), ma dipende molto dai tuoi dati e dall'obiettivo finale: ottieni molti falsi positivi su più scale? Sfortunatamente il trial-and-error è la migliore metodologia pratica nella visione artificiale. Riguardo alla soppressione non massimale, beh, quello che ho descritto è una forma di soppressione non massimale (si mantengono solo i massimi locali). – Antoine

Problemi correlati