• Non ci sono risultati.

Creazione file specifici per training e validation setset

Il framework Caffe

4.3.2 Creazione file specifici per training e validation setset

Una volta creato il file synsetwords.txt, bisognerà creare i file di testo che verranno dati in input al data layer (come visto in figura 4.8, col percorso specificato dalla keyword source), dove in ogni riga vi sarà una stringa di questo genere: “nome_immagine label_classe_di_appartenenza”. Anche in questo caso il formato va rispettato. Si parla di file in plurale, perchè è ne-cessario creare due file di questo tipo, uno per il training set ed uno per il test set, in questo caso chiamato anche validation set, dato che le label corrette sono comunque note e servono appunto per convalidare se il classificatore ha classificato correttamente una determinato gruppo di immagini. Nell’esem-pio di figura 4.14 viene mostrato una parte di uno di questi file relativo ad un training set.

Caffe non mette questa volta a disposizione un tool per creare i suddetti file. Il file synsetwords.txt è facilmente realizzabile, almeno per dataset con un numero piuttosto limitato di classi ed anche se non si fosse in questo ca-so converrebbe comunque specificarlo a mano, mentre gli altri due posca-sono essere molto lunghi e pesanti da realizzare. Per questo motivo si è deciso di

Figura 4.14: Parte del file per i path di un training set

creare un semplice programma in C++ (imageName.cpp), tramite cui l’uten-te, specificando il numero di classi del suo dataset e quante relative immagini vi sono per ciascuna classe, ottiene uno di questi file in maniera automatica. L’operazione va ripetuta una volta per il training set ed una seconda volta per il validation set, quindi è necessario avere due cartelle, chiamate train e val in questo caso, con tutte le rispettive immagini all’interno. In figura 4.14 è stato utilizzato proprio questo programma.

In tutte le figure mostrate finora i nomi delle varie immagini sono stati modificati in base alla loro classe di appartenenza per rendere più facile il controllo della correttezza dei file creati (guardando il nome del file e label rispettiva si riesce facilmente a capire se la loro relazione è corretta) ed an-che per il corretto funzionamento del piccolo programma creato. Infatti il programma legge all’interno di una cartella specificata tutti i file presenti, assegnando ai primi N0 file l’etichetta 0, ai successivi N1 la label 1 e così via. Perchè tutto questo abbia senso è necessario che ci sia un ordine fra i file letti e le label assegnate, cioè i file devono essere tutti raggruppati in base alla loro classe e tutti i raggruppamenti devono rispettare l’ordine spe-cificato nel file synsetwords.txt. Per fare questo è necessario rinominare tutti i file, scegliendo un nome molto simile fra due immagini della stessa classe (ad esempio modulo_1 e modulo_2 ) e rispettando con i nominativi scelti per ciascuna classe l’ordine del synset file (è sufficiente scegliere nominativi che in ordine alfabetico abbiano lo stesso ordine del synset file). Rinominare grandi quantità di file può essere noioso ed anche un grosso spreco di tem-po. Per questo, prima di creare tutti i file finora incontrati, è stato creato

Figura 4.15: Parte script per rinominazione file

un altro piccolo script per questa funzione, di cui una parte è mostrata in figura 4.15. La parte di script mostrata permette di rinominare i file di una singola classe, ma per effettuare la stessa operazione sulle altre classi il resto del codice è molto simile: basta cambiare il nome della cartella e dei file. In quest’ultimo trovare un’ordine alfabetico che rispetti l’ordine del synset file. Fare attenzione al fatto che, nel caso lo si volesse utilizzare, questo script funziona solo se si hanno tutte immagini .jpg nel proprio dataset. Nel caso si possedesse qualche immagine con un qualche formato diverso, è comun-que sufficiente rimuovere provvisoriamente tali immagini dal dataset (basta fare una veloce ricerca con .png ad esempio) ed organizzarle in altre cartelle raggruppandole per estensione, applicare lo script al dataset con le immagini tolte per ottenere il solito risultato, modificare lo script mettendo l’estensio-ne di immagini voluta ed applicarlo al raggruppamento di immagini con la stessa estensione e così via.

Come si può notare, il programma procede ordinatamente, ovvero scri-vendo prima tutte le righe delle immagini della prima classe, poi quelle della seconda e così via fino all’ultima, sempre seguendo l’ordine del synset file. Di norma è meglio “randomizzare un po’ i dati”; per fare questo è stato crea-to un semplice script che effettua l’operazione di mescolamencrea-to dei dati su entrambi i file creati (per il training ed il validation set), mostrato in figura 4.16.

Figura 4.16: Script per mescolare i dati

Nel caso si volesse utilizzare ad esempio un image data layer, il processo di costruzione fin qui è esattamente lo stesso, l’unica differenza è che questo tipo di layer è che in ciascuna riga dei file di testo per il training ed il validation set, ci sia il path assoluto di ciascuna immagine. Per ottenere questo è sufficiente modificare il programma imageName in modo che per ogni immagine non salvi solo il suo nome, ma l’intero suo path (nome compreso). Fatto questo il processo di creazione di un dataset per questo tipo di layer termina qui; non è così invece per un dataset in formato LMDB, come si vedrà fra poco.