Hand detection con le OpenCV e classificatori di Haar

Stato
Discussione chiusa ad ulteriori risposte.

imported_BlackLight

Utente Silver
16 Agosto 2007
211
8
1
98
Avrete visto che ho pubblicato un sorgente che ha come obiettivo quello di fare object detection, in particolare face detection, e usare i movimenti dell'oggetto rilevato per muovere il cursore del mouse. Grazie all'uso delle OpenCV il programma è volutamente molto modulare. Quindi basta cambiare l'XML usato, contenente i descrittori di Haar, per riconoscere qualsiasi altro tipo di oggetto. Il problema è quello di creare un XML stabile e robusto tale da riconoscere l'oggetto desiderato. Il mio obiettivo ora è muovere il cursore del mouse attraverso la mano, ma non ho trovato in giro, a differenza del face detection, nessun XML stabile preconfezionato che mi permettesse di farlo. Quindi sto praticamente facendo da me. Tuttavia la cosa, pur essendo concettualmente semplice, richiede molto tempo, dato che bisogna raccogliere un campione di immagini positive (ovvero contenenti l'oggetto da riconoscere) relativamente ampio (meglio se nell'ordine del migliaio). Da queste ritagliare, uno ad uno, i rettangoli in cui è presente il campione da riconoscere, usando utility apposite per il crop. Bisogna poi creare anche un campione di immagini negative, in genere dello stesso numero di quelle positive, contenenti gli eventuali sfondi su cui si va a collocare l'oggetto da riconoscere, in modo che il software sappia cosa scartare.

Personalmente ho usato wxcam per fare gli snapshot delle immagini. wxcam però salva gli scatti in formato TIF, e altri software in formato BMP, entrambi non compatibili con le OpenCV. Quindi, una volta che avete terminato i vostri scatti potete convertirli in PNG, ad esempio, usando l'utility di ImageMagick 'convert':

Codice:
for i in *.tif
do
echo converting $i...
convert $i -format png $i.png
done

Una volta che avete scattato il vostro campione di immagini positive, ovvero contenenti l'oggetto da riconoscere (nel mio caso la mano), e piazzate tutti nella stessa directory (mettiamo /home/utente/cv/hand/positive), usate questo sorgente per selezionare dalle immagini positive solo il campione che vi interessa. Per compilarlo, una volta che avete le OpenCV installate:

Codice:
g++ -o ObjectMaker ObjectMaker.cpp `pkg-config --cflags --libs opencv`

A questo punto avviate l'eseguibile sulla directory contenente le immagini positive, in questo modo:

Codice:
./ObjectMaker positive.txt /home/utente/cv/hand/positive/

In questo modo verrà analizzata la directory contenente le immagini positive e le informazioni sui frame selezionati verranno piazzate nel file positive.txt.



Selezionate con il tasto sinistro, partendo dall'angolo in alto a sinistra, la regione da riconoscere, quindi premete SPAZIO per salvare la selezione e 'b' per proseguire con la prossima immagine. In origine bisogna premere ENTER, ma b è più vicino alla barra spaziatrice, quindi ho deciso di usare quello per avanzare per comodità.

Una volta terminato, create il file di samples comprensibile a OpenCV sulla base delle vostre selezioni usando opencv-createsamples:

Codice:
opencv-createsamples -info positive.txt -vec positive.vec

Ora create un file contenente invece l'elenco dei file negativi, ovvero immagini di sfondo ecc. che non contengono il vostro campione da analizzare. Supponendo che tali immagini siano nella directory negative e salvate come *.png:

Codice:
find negative/ -name *.png > negative.txt

Ora contate quante immagini positive e negative avete:

Codice:
numpos=`find positive/ -name *.png | wc -l`
numneg=`find negative/ -name *.png | wc -l`

e quindi, finalmente, usate le informazioni così raccolte per generare l'XML con i classificatori di Haar utile per le OpenCV e per il mio software:

Codice:
opencv-haartraining -data hand -vec positive.vec -bg negative.txt -npos $numpos -nneg $numneg -nstages 20

dove con -data si specifica il nome dell'XML in cui andranno salvate le informazioni, con -vec il file binario generato precedentemente con le informazioni sui positivi, con -bg l'elenco dei file negativi, poi il numero di immagini positive, il numero di quelle negative e il numero di passi che dovrà compiere il software per il training.

Al termine dell'elaborazione, avrete il vostro XML contenente i classificatori di Haar per riconoscere l'oggetto desiderato, che potete dare in pasto al mio software.
L'obiettivo dell'hand detection non è tanto banale però. Personalmente ho raccolto qualche centinaio di immagini campione positive e negative e generato l'XML, ma queste informazioni non sono ancora abbastanza per fare un hand detection davvero robusto in qualsiasi condizione di luminosità, a qualsiasi distanza e in qualsiasi ambiente. Quindi, tenendo conto che a livello software ora per fortuna c'è già quasi tutto, dato che le OpenCV e il mio software sono punti di riferimento già completi, vi chiedo, se avete tempo, di collaborare con me raccogliendo immagini campione di mani aperte in diverse condizioni di luminosità, distanza, sfondi ecc., e le relative immagini negative contenenti solo sfondi e contesti. Gli XML così generati poi potete inviarmeli, e io provvederò a fare il merge con quello che ho già. L'obiettivo è quello di generare un XML davvero robusto per l'hand detection, da proporre poi alle varie basi dati delle università o dei centri di ricerca per il riconoscimento degli oggetti, nonché fare un robusto cursor moving usando la mano. Grazie a tutti per la collaborazione.
 
Tu sei semplicemente un mostro! Complimentoni Black, sei riuscito a passare anche il problema dell'XML. Se avrò del tempo farò delle foto alla mia mano, dammi sono un esempio di come dovrebbero essere (mezzobusto, solo mano ecc...).
 
ti aiuterei volentieri ma non ho una webcam e nemmeno una fotocamera XD
fatto sta che il tuo lavoro è davvero notevole (come sempre d'altronde) e rimango sempre più sbalordito dalle tue discussioni.Se avrò la possibilità di aiutarti lo farò volentieri.
 
Meglio ancora se riusciste a fare più foto della mano (almeno qualche decina), e altrettante foto in cui c'è solo lo sfondo o il contesto in cui si trova la mano. Poi con le istruzioni date sopra potete generarvi l'XML con tutte le informazioni, che posso poi mettere in coda al mio.

p.s. Dimenticavo...il riconoscimento lo sto facendo con la mano sinistra. E ovviamente le foto, almeno quelle positive, andrebbero fatte non solo alla mano ma a tutto quello che c'è attorno, meglio ancora se sono abbastanza diverse fra loro in modo da irrobustire ancora di più i classificatori di Haar così creati. Poi da queste foto positive usando ObjectMaker selezionate voi i rettangoli contenenti solo la mano.
 
Ciao,
vorrei realizzare un progetto simile, per certi versi, al tuo (hand detection con OpenCV); dov'è che posso trovare il sorgente di cui parli? Non per fare copia&incolla, ma per vedere come hai risolto tu il problema e per, eventualmente, prendere ispirazione ;D
Ti ringrazio anticipatamente...
 
BlackLight ha detto:
Meglio ancora se riusciste a fare più foto della mano (almeno qualche decina), e altrettante foto in cui c'è solo lo sfondo o il contesto in cui si trova la mano. Poi con le istruzioni date sopra potete generarvi l'XML con tutte le informazioni, che posso poi mettere in coda al mio.

p.s. Dimenticavo...il riconoscimento lo sto facendo con la mano sinistra. E ovviamente le foto, almeno quelle positive, andrebbero fatte non solo alla mano ma a tutto quello che c'è attorno, meglio ancora se sono abbastanza diverse fra loro in modo da irrobustire ancora di più i classificatori di Haar così creati. Poi da queste foto positive usando ObjectMaker selezionate voi i rettangoli contenenti solo la mano.

Tu mi fai sempre più paura black... le mie conoscenze in confronto alle tue non sono nulla o_O
 
Il sorgente è sul mio sito, nonché postato anche qui in una discussione...
http://0x00.ath.cx/cgi-bin/nopaste.pl?mode=view&id=1233834338

Per ora usa un XML per il riconoscimento facciale (per fortuna quello era già incluso nel pacchetto delle OpenCV), ma in teoria basterebbe cambiare l'XML di appoggio con i classificatori di Haar per riconoscere qualche altra cosa.
 
ciao a tutti,
rispolvero un topic 1 pò vecchio visto che sono molto interessato al progetto di BlackLight.
Mi interesserebbe trovare il codice relativo alla Hand Detection, con i relativi classificatori.

Ho navigato per un pò, anche sul sito di BlackLight, ma di codice non ho visto niente.
Qualcuno può aiutarmi? Magari il diretto interessato? :)

A risentirci, e grazie...

Michele
 
ciao a tutti...
mi interessa molto questo lavoro e vorrei fare una cosa simile, però non riesco a trovare il sorgente necessario per selezionare solo la parte di interesse delle immagini positive...qualcuno può aiutarmi???
 
Stato
Discussione chiusa ad ulteriori risposte.