Sei sulla pagina 1di 3

GUIDA HAARTRAINING

Le librerie OpenCV mettono a disposizione programmi e funzioni che sono usati per eseguire l'addestramento dei classificatori (ci deve essere tutta la storia dei classificatori dietro) per creare un sistema di riconoscimento oggetti chiamato Haartraining. Grazie a questo sistema possiamo addestrare il nostro programma a riconoscere oggetti a nostro piacimento. Il mio ambiente di sviluppo stato Code::Blocks su Ubuntu 10.04 ma stata necessaria anche la creazione di script bash per la shell di Linux.

Preparazione dei dati


Come prima cosa dobbiamo ricercare immagini dette positive cio contenenti l'oggetto che vogliamo riconoscere nel nostro caso una targa. Possiamo scegliere due diverse strade sul formato di queste immagini: o l'oggetto in questione l'unica cosa che appare nell'immagine oppure l'oggetto contenuto nell'intera immagine. Se prendiamo come esempio una targa o prendiamo un'immagine contenente solo quest'ultima o con l'intera macchina e il paesaggio dietro. Per eseguire un buon training servono alcune migliaia di immagini positive (5000 7000). Dopo questo dobbiamo avere anche alcune migliaia di immagini negative cio non contenenti l'oggetto. Trovare queste meno laborioso: ci sono database di immagini pubblici sul web fatti apposta, per il mio progetto ho utilizzato questo http://pascallin.ecs.soton.ac.uk/challenges/VOC/voc2008/VOCtrainval_14-Jul-2008.tar Successivamente dovremo creare un file di raccolta che essenzialmente un file di testo che servir alle funzioni che useremo contenente il percorso di ogni immagine. Questo file deve avere un formato specifico che cambia a seconda di come abbiamo scelto le immagini positive: 1)Se abbiamo immagini contenenti solo la targa deve avere questo formato:
[filename] [filename] [filename] ...

che si ottiene facilmente se abbiamo riposto tutte le immagini dentro la stessa cartella col comando di shell
find [image dir] -name '*.[image ext]' > [description file]

Come vantaggio questo procedimento ha la velocit con cui si crea il file di raccolta ma bisogna tagliare a mano tutte le immagini una ad una. 2)Nel secondo caso abbiamo immagini con anche lo sfondo quindi il formato del file di raccolta cambia:

[filename] [# of objects] [[x y width height] [... 2nd object [filename] [# of objects] [[x y width height] [... 2nd object [filename] [# of objects] [[x y width height] [... 2nd object

...] ...] ...]

Stavolta pi facile ottenere immagini positive per non c' un modo per ottenere il file di raccolta velocemente anzi si deve specificare per ogni immagine quante targhe ci sono, le coordinate del loro punto in alto a sinistra, la loro larghezza e la loro altezza. Molto laborioso anche questo procedimento insomma. Per iniziare il processo di training bisogna uniformare le varie immagini positive ad una stessa larghezza e lunghezza e memorizzarle in unico file come anteprime. OpenCV mette a disposizione un programma chiamato createsamples che svolge funzioni differenti utili per il training a seconda dei parametri con cui viene invocato. Sostanzialmente questo programma viene usato per creare i campioni con cui verr effettuato il processo di training ma pu essere utile anche per visualizzare tali campioni o creare immagini di test. Vediamo ora tutti i parametri che pu avere il programma createsamples:
Usage: ./createsamples [-info <description_file_name>] [-img <image_file_name>] [-vec <vec_file_name>] [-bg <background_file_name>] [-num <number_of_samples = 1000>] [-bgcolor <background_color = 0>] [-inv] [-randinv] [-bgthresh <background_color_threshold = 80>] [-maxidev <max_intensity_deviation = 40>] [-maxxangle <max_x_rotation_angle = 1.100000>] [-maxyangle <max_y_rotation_angle = 1.100000>] [-maxzangle <max_z_rotation_angle = 0.500000>] [-show [<scale = 4.000000>]] [-w <sample_width = 24>] [-h <sample_height = 24>]

Tutti i campioni positivi costruiti verranno salvati in file con estensione .vec dopo essere stati ridimensionati a seconda dei parametri w e h. Questo file formato da un header contenente il numero di immagini positive, larghezza e lunghezza dei campioni mentre contiene tutte le anteprime di seguito. Visto che la targa per sua natura ha una forma rettangolare ho scelto w=35 e h=15. Funzione 1: Creazione di campioni da una sola immagine Come da titolo questa prima funzione permette di creare campioni da una singola immagine applicando distorsioni. Questa funzione lanciata quando i parametri img, bg e vec sono specificati. -img l'immagine scelta come positiva -bg il file di raccolta delle immagini negative -vec e il nome del file (con estensione vec) che verr creato contenente i campioni generati
$ createsamples -img face.png -num 10 -bg negatives.dat -vec samples.vec -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20

Per il mio progetto questa funzione si dimostrata molto comoda in quanto da una sola immagine

applicando distorsioni geometriche e di luminosit si possono creare pi campioni. Ho ritagliato a mano circa 140 targhe dai frame dei video e attraverso questa applicazione ho generato 50 campioni diversi per ogni immagine in modo da avere circa 7000 campioni positivi, numero richiesto per un buon training. Per rendere il procedimento ancora pi veloce ho creato questo semplice script che fa quest'ultima cosa in automatico: #!/bin/sh for i in *.png; do
echo "processo $i" opencv_createsamples -img $i -num 50 -bg /home/andrea/Scrivania/haartraining/negativi.dat -vec $i.vec -maxxangle 0.2 -maxyangle 0.2 -maxzangle 0.2 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 35 -h 15; done

Ora per ho un file vec per ogni immagine positiva quindi bisogna lanciare l'utility mergevec che prende come input un file di raccolta vec (che si ottiene facilmente visto che l'estensione sempre vec) e in output ci restituisce il file vec totale.
$ mergevec <collection_file_of_vecs> <output_vec_file_name>