2. Deep-Learning: classificare le immagini con una CNN

Organizzazione cartelle e dati per questa lezione

Ecco l’organizzazione delle cartelle di questo corso (che potete replicare clonando il mio archivio github)

CORSO
|
+ notebooks
    + data
- noruen-GNU-Linux.yml
- noruen-macosx.yml
- README.md

In data metterò i diversi dataset che spesso sono pesanti e non caricherò su git (ho inserito il path in gitignore), in notebooks i file relativi alle lezioni, mentre rimangono nella cartella principale i file di configurazione di anaconda e il README.

Dataset

Registriamoci su Kaggle

Per poter scaricare alcuni dataset è bene registrarsi su Kaggle: è una piattaforma online per competizioni di modelli predittivi e analitici. Noi “parteciperemo” a una competizione del 2013: l’obiettivo è classificarci entro i primi 30 al mondo - non male come primo risultato!

Scarichiamo il dataset

Una volta attivato l’account su Kaggle, possiamo scaricare qui:

e salviamo i file nella cartella:

corso-deep-learning-noruen/notebooks/data/catVSdogs

Organizziamo il dataset

Prima di arrivare al codice abbiamo bisogno di organizzare i dati in modo da poterli trattare facilmente con Keras.

Keras si aspetta ogni categoria di immagini in una directory: un approcci molto utile quando faremo un classificatore personale. Dobbiamo allorari-organizzeremo i file scaricati (che hanno tutti i file in una directory) in tal senso: metteremo i cani nella directory “dogs” e i gatti in “cats”

$ cd notebooks
$ cd data
$ cd catVSdogs
$ ls
sampleSubmission.csv	test1			train

Riorganizzazione della cartella train

Per prima cosa ci mettiamo nella cartella train e iniziamo a separare le immagini:

$ cd train
$ mkdir cats
$ mkdir dogs

Provare a spostare i file con il comando mv non porta a successo perché i file sono troppi e otteniamo l’errore “argument list too long”

Allora possiamo fare così:

$ find ./ -name 'dog*.jpg' -exec mv {} dogs \;
$ find ./ -name 'cat*.jpg' -exec mv {} cats \;

Il comando è molto lento ma funziona anche su macOS dove non è possibile specificare il target del comando mv.

Vediamo quanti file ci sono:

$ ls dogs/ | wc -l
   12500

Abbiamo 12500 esempi per tipo.

Riorganizzazione della cartella test

Non c’è bisogno di ri-organizzare la cartella test!

Perché?

Perché le immagini non sono classificate! Non dobbiamo assolutamente toccare questo set che servirà a capire se il nostro algoritmo o la nostra CNN fa un buon lavoro!

Creare una cartella validation

Una cosa che ha molto senso fare è creare un nuovo set che chiameremo validation e che ci servirà per validare le nostre prove, prima di applicare l’algorimo sul set di immagini della cartella test. Così facendo il risultato sulle immagini nella cartella “test” sarà predittivo del nostro risultato nella competizione.

Spostiamo un po’ di immagini di cani e gatti nella directory “valid” (per esempio 1000 per categoria)

$ mkdir valid
$ mkdir valid/cats
$ mkdir valid/dogs

$ mv train/dogs/dog.10???.jpg valid/dogs/
$ ls valid/dogs/ | wc -l
    1000

$ mv train/cats/cat.10???.jpg valid/cats/
$ ls valid/cats/ | wc -l
    1000

Creare una cartella sample per esperimenti veloci

Il consiglio, oltre a organizzare il dataset come sopra, è quello di copiare alcuni file in un altra directory, chiamata sample, con pochi esempi che ci servirà per fare le prove, per vedere come lavorare in piccolo e veloce, per poi provare gli algoritmi più promettenti su tutto il dataset.

Creiamo allora una cartella sample con dentro train e valid.

$ mkdir sample && mkdir sample/train && mkdir sample/train/cats && mkdir sample/train/dogs && mkdir sample/valid && mkdir sample/valid/cats && mkdir sample/valid/dogs

Poi copierò 9 immagini per categoria in train e 5 in valid.

Struttura finale dell’albero delle cartelle

Ora dovremmo avere questa struttura:

CORSO
|
+ notebooks
    + data
        +catVSdogs
            +train
                +cats
                +dogs
            +valid
                +cats
                +dogs
            +sample
                +cats
                +dogs
            test1
        sampleSubmission.csv
- noruen-GNU-Linux.yml
- noruen-macosx.yml
- README.md

Perché non ho preparato il dataset da scaricare?

Perché è importante riuscire a farlo da Kaggle in modo da poter rifare il procedimento su altri dataset ;)

CNN: usiamo il deep learning per classificare le immagini

Per fare le prove pratiche useremo un jupyter notebook che ho già preparato: si tratta di una tecnologia che permette di eseguire codice python in un browser e di poterci anche scrivere dentro.

Potete clonare il mio repository su github o scaricare e/o guardare solo il notebook

Una volta scaricato, ecco i comandi da digitare in un terminale:

$ source activate corsoDLnoruen
$ jupyter notebook lezione1_keras2.ipynb 

Poi seguiamo le istruzioni riportate sul foglio di lavoro della prima lezione, collegandoci con il browser all’indirizzo riportato: