In questa guida useremo un modello già istruito nel riconoscere oggetti, insegnandoli ad individuare uno specifico elemento scelto da noi. La tecnica è quella del Transfer Learning.
Il nuovo modello sarà in grado riconoscere solo i nuovi oggetti, e non più i precedenti.
Versione in KERAS.
Requisti
Prima di partire, accertati che tutto sia pronto e configurato. Avrai bisogno di molta potenza di calcolo, quindi un buon processore e una GPU con parecchia memoria dedicata.
Anche la RAM riveste un ruolo importante. 8 GB sono il minimo per ottenere risultati decenti.
Infine, ma non per questo meno importante, la suite di software. Se non lo hai ancora fatto installa, seguendo le guide precedenti, Tensorflow-gpu, CUDA Toolkit e cudnn. Assicurati di avere una versione di python compatibile (3.5 o 3.6) e rilassati. Ti servirà anche un buon editor di testo, io ti consiglio Atom.
Elegante, minimial ed estremamente versatile.
Download Repository [Suite]
Collegati al sito di GitHub e scarica la mia Repository, all’interno trovi tutti i file già configurati per eseguire il training.
Estrai la repository e crea al suo interno sei cartelle chiamate esattamente in questo modo:
-Csv
-Dataset
-New_model
-Pre_train_model
-Training
-Pre_trained
Downlaod Repository [model]
La mia repostiory ha una sola funzione: rendere la procedura di creazione di un nuovo modello ordinata e facilmente comprendibile. Tuttavia, lo script train.py richiede numerosi altri scripts, tutti contenuti nella repository Model da cui ho preso alcuni file.
Collegati GitHub e scarica:
Tensorflow Model Repository | Download
E’ necessario che tu scairichi anche questa repository, ovunque tu voglia.
Aggiungi variabili d’ambiente
Cerca “variabili d’ambiente” nella barra di ricerca di windows e apri il menu. Aggiungi la variabile:
PYTHONPATH: C:\[...]\models-master\research;C:\[..]\models-master\research\slim
Modificando la lettera del disco se serve e aggiugendo il percorso in cui hai estratto la repostiory.
Potrebbe essere inoltre necessario installare la seguente libreria:
pip install absl-py
Google Protub
Collegati al sito, e scarica il file:
Estrai il file protoc.exe all’interno della cartella:
models-master/research/
Quindi digita, in models-master/research:
protoc object_detection/protos/*.proto --python_out=.
Download Dataset
Scegli il tuo dataset, e scaricalo.
Attenzione: se vuoi limitarti a scaricare tutti i file e apportare il minimo cambiamento agli script, occore che il tuo dataset sia strutturato in questo modo:
- le immagini sono contenute in due cartelle, una denominata “train” l’altra “test”. Puoi anche avere un dataset con una sola cartella, e poi dividere succesivamente le immagini con un rapporto di 10:1, ogni dicei immagini di train usane una per il test.
- ogni immagine deve essere corredata del proprio file *.xml, cioè un documento contenente in PASCAL_VOC Format i limiti dell’oggetto su cui effettuare il training del modello. Per maggiori info, consulta questa guida.
Alcuni consigli:
- assicurati che il dataset sia composto da un numero sufficiente di elementi. Il minimo è intorno a 160.
- controlla che il peso delle immagini non sia eccessivo. Tutto dipende dalla memoria che hai a disposizione nella fase di training. Se le immagini fossero troppe o troppo pesanti, potresti riscontrare problemi come il ResourceExhaustedError o l’OOM.
Io userò come esempio il macncheese dataset di sentdex, che contiene 142 file di training e 12 di testing, corredati di xml già pronto all’uso.
Creation training files
Per poter inziziare il training, dobbiamo creare alcuni file. Inziamo generando i file CSV a partire dai *.xml.
Per prima cosa apri l’archivio contenente il dataset, ed estrai le cartelle ‘train‘ e ‘test‘ in ‘Dataset‘ (GitHub Repository), in modo che alla fine tu abbia una congiurazione identica a questa:
Transfer-learning-tensorflow
-Dataset
--train
---image1.jpg
---image1.xml
---image2.jpg
---image2.xml
---[...]
--test
---image4.jpg
---image4.xml
---image5.jpg
---image5.xml
---[...]
-Training
-Csv
-Pre_train_model
-[..]
Dato che l’accuratezza non è mai troppa, ti fornisco alcuni dettagli aggiuntivi che potrebbero farti risparmiare ore preziose.
E’ fondamentale che ad ogni immagine, sia in ‘train’ che in ‘test’, corrisponda un file *.xml con lo stesso nome. Per essere chiari:
Esempio:
image : 9ycfdbv.jpg
xml : 9ycfdbv.xml
CSV files
Fatto ciò, esegui lo script ‘xml_to_csv.py‘. All’interno della cartella ‘Csv’ si creano due file:
train_fornewmodel.scv
test_fornewmodel.csv
Ora che hai i file csv, crea quelli record.
Record files
Apri con Atom il file di script generate_tfrecord.py

Sostituisci in def class_text_to_int ‘new_label’ con la label che intendi identificare. Puoi anche aggiungerne di nuove, ma ovviamente è necessario che queste siano presenti nei file *.csv, e quindi ancora prima negli *.xml, che sai usando.
Io modifico come segue:

Ora, non ti resta che salvare il file (CTRL+S) ed eseguire lo script.
Nella cartella Training si creano due file:
test.record
train.record
pbtxt file
Apri il file config.pbtxt e modificalo in base alle tue impostazioni, aggiungendo eventualmente nuovi elementi. Nel mio caso, all’interno del file ho:
item {
id: 1
name: 'macncheese'
}
Pre-Train Model
E’ arrivato il momento di scegliere il modello di partenza. Ce ne sono molti, ognuno con le sue peculiarità. Io consiglio di partire dal ssd_mobilnet_v1, perché è leggero e ricco di dati.
ssd_mobilenet_v1_coco| Donwload Link
Scarica ed estrai il modello in Pre_train_model
Config file
Ora, il file per impostare i parametri di configurazione. Queste sono le modifiche che devi apportare usando il mobilenet v1, qualora il modello di patenza fosse diverso, potresti dover apportare modifiche drastiche al file.
Apri testing.config
Riga 3
num_classes: x
Sostituisci ‘x’ con il numero di classi che intendi usare
Riga 77
type: 'x'
Questa riga va modificata in base al modello usato. Avendo scelto il ssd_mobilenet_coco_v1:
type: 'ssd_mobilenet_v1'
Riga 152
fine_tune_checkpoint: "Pre_train_model/model.ckpt"
Questa riga NON va modificata se hai seguito tutti i passaggi alla lettera, ma la segnalo perché è quella da cambiare qualora la catella del modello estratto fosse diversa. Stessa cosa per le righe 166, 168, 177 e 179.
Riga 172
num_examples: x
Il numero di immagini di test, nel mio caso 12.
Salva il file.
Start training
Per avviare la procedura di trainig digita dal prompt:
python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training.config
e per tenere sotto controllo la procedura:
tensorboard --logdir=training/ --host localhost --port 8080
puoi consultare i dati da browser all’indirizzo Tensorboard
End training
Quando il loss raggiunge un valore inferiore a 1, ed è stabile, la procedura di training può dirsi completata. Passiamo ora a generare i file per analizzare i nuovi oggetti.
Generating Frozen Graph
Quello che andrai a fare sarà generare il frozen graph, ossia un’unico file contenente il modello e i weights così da poter essere facilmente implementato nei tuoi programmi di machine learning.
Digita quindi:
python export_inference_graph.py --input_type image_tensor --pipeline_config_path training.config --trained_checkpoint_prefix training/model.ckpt-???? --output_directory New_model
‘????’ dovranno essere sostituiti con il numero dell’ultimo model chekpoint, che dipende sostanzialemente dal tempo di training: più è lunga la fase, più alto sarà il valore.
Eseguito lo script, all’interno della cartella New_model otterrai il nuovo frozen_inference_graph.pb che puoi usare nei tuoi progetti.
Siamo arrivati al termine di questa procedura!
Alla prossima.
Un caldo abbraccio, Andrea.l
No Comment