6:26 del mattino.
Se vuoi quello che in molti sognano devi essere disposto a realizzare quello che in pochi farebbero.
Bella frase, forse i verbi scelti male… ma sono sveglio da 20 minuti… quindi…
Andiamo al sodo. L’obiettivo di oggi è quello di realizzare un’AI che riconosca oggetti, basandoci su tensorflow.
Questa è la nostra linea di partenza.
Il nostro obiettivo è capire come creare un modello su tensorflow, in che modo allenarlo e usare i file prodotti per creare predizioni. Perché ti dico questo? Per farti capire che l’idea di allenare una AI per riconoscere le ruote di un’auto non è poi così schifosa. Specie se maturata alle 6:30 del mattino.
Vediamo se esiste un dataset.
Sicuramente non siamo i primi a pensare ad una muschiata del genere, ma non riesco a trovare validi dataset… o meglio. Dopo aver cercato una sola volta su google, non ho trovato nulla. Di questi tempi la voglia è altissima. Mi soffio il naso.
Naso soffiato. Andiamo avanti
Faccio un’altra rapida ricerca, e trovo questa risorsa.
Una grande guida che spiega, passo a passo come usare Tensorflow Object Detection API che, costruita su Tensorflow, consente una facile costruzione, allenamento e rilascio di modelli per il riconoscimento di oggetti.
Installazione
Scarichiamo le dipendenze assenti, e procediamo con l’installazione.
La guida indica di compilare dei file .proto presenti nella cartella
object_detection/protos.
Errore… Perché? Perché su windows devono essere compilati uno alla volta, non tutti assieme…
Ok abbiamo risolto. Su GitHub hanno trovato una soluzione poco invasiva. Scaricata la v3.4 ed estratto il file protoc.exe nella cartella research. Dato il comando:
protoc object_detection/protos/*.proto --python_out=.
E dovrebber aver funzionato.
Aggiunto alle variabili d’ambiente la cartella reserach e sottocartella slim, se ci dovessero essere problemi, sappiamo dove cercare.
Momento della verità. Eseguo il comando per verificare l’installazione.
python object_detection/builders/model_builder_test.py
Quando mai le cose funzionano al primo avvio. Sono le variabili d’ambiente. Che avevo settato correttamente, ma non avevo riavviato la shell.
ANDREA RICORDATI DI RIAVVIARE LA SHELL QUANDO AGGIORNI LE VARIABILI D’AMBIENTE
Problema risolto, andiamo avanti.
Object Detection Demo
Cosa abbiamo davanti a noi. Sembra un jupiter’s book, in pratica un libro elettronico che consente l’esecuzione in blocchi di codice, in cui puoi scrivere testi, caricare immagini o fare presentazioni.

Ma non funziona…
Ho copiato le righe di codice, per capire cosa facessero. La documentazione pare scarsa…
Andiamo avanti, magari capiamo in seguito.
Ok le cose si fanno serie
Abbiamo una bella GPU, ma in effetti la potenza totale di calcolo è abbastanza limitata. Ecco che Google ci viene in contro, con il suo ambiente Cloud.
Non capisco davvero per quale ragione tutti gli esempi sono o su cani e gatti o su petali di fiore… che due palle. Se cambiassimo dataset voglio proprio vedere quanti errori saltano fuori.

Ma cosa… dai seriamente… è a pagamento? Che due…
Sì devo dire che oggi il morale non è alle stelle.
Un nuovo mindset: nulla è impossibile, quindi datti da fare

Ho fatto un “aggiornamento“. Riavviato qualche programma e ora siamo pronti per ripartire, con un nuovo sistema installato in testa. Mettiamo la quinta, e non guardiamo più indietro.
Creato account su Google Cloud Platform.
Nel mentre, ho scoperto che abbiamo installato anche jupyter notebook.
# From tensorflow/models/research/object_detection
jupyter notebook

Tatan, ecco quello che dicevo avremmo capito più tardi. Questo è il codice che abbiamo copiato prima e che non dava risultati, ora invece potrebbe funzionare.
Non sappiamo ancora come si usa, smanettiamoci. Anzi no, pausa. Andiamo avanti.
Ho chiuso jupyter ed è partito un processo che non comprendo, sembra stia facendo qualcosa di impegnativo. Arresto il processo.
In pratica anche noi abbiamo questo problema. Il modello che usiamo contiene errori.
E’ incredibile quante cose non funzionino. Questo dà un’idea di quanto questi codici siano progettati come test. Non sono in fase beta, sono in pre-alpha. Una roba allucinante.
Risolto
Zio impanato. In questo video, sentdex, spiega come avviare correttamente il notebook in questione.
Ho dovuto cambiare il modello, perché effettivamente non funzionava. Usando:
ssd_mobilenet_v1_coco_2017_11_17
ottengo questo risultato sulla foto di un’aquila.

Capiamo l’errore. Io ho cancellato le due foto della cartella “test_images” sostituendole con quella dell’aquila, ma il programma era stato scritto per caricare due foto, quindi ha prodotto l’errore. Inoltre, pare che anche il nome dei file sia vincolato.
Errata corrige, il codice lavora su tutte le foto della cartella purché abbiano un nome tale che il programma possa leggerle in successione.
Modifica per analisi su video
Seguiamo il video per modificare il codice e farlo funzionare su… un video. In realtà sentdex intende usare la webcam, in assenza di questa noi faremo fare l’analisi su un video. E magari confrontiamo con yolo.
Download jupiter notebook, e modifica del codice.
Ti ragguaglio. Ho modificato il programma, e una volta eseguito non partiva. Errori. Temevo fosse per la troppa memoria allocata e avevo ragione.
In pratica ad ogni sessione tesnsorflow alloca una certa quantità di memoria grafica. Ora abbiamo 8GB, ma per qulache ragione, che attualmente ignoro, abbiamo un limite a 6.1GB (circa 75%). Quindi se vogliamo usare senza problemi la GPU dobbiamo fissare questo limite. Io ho usato le righe:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.744)
tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
In questo modo ho allocato circa 6094 MB. Però l’analisi video in tempo reale pare non funzionare ancora. E’ troppo lenta. Perché?
Provo a seguire questa guida.

mmmm… e ora come uso questa splendida risorsa per i miei fini…
fuori di testa. Non credo ai miei occhi… ho dato il comando:
python fps.py --display 1
Il videofile.mp4 caricato e visualizzato per intero a velocità lampo… wtf.
Quindi, ora devo capire come unire e se è possibile farlo, i due codici così da veloccizzare il processo di analisi sul video di boh.py. Il boh.py è il file in cui ho scopiazzato tutti i codici che ho trovato in rete.
Wait a second
Credo di aver capito per quale motivo è così lento. Ad ogni nuovo frame è come se il programma caricasse di nuovo tensorflow, allocasse nuova memoria e così via. Non ci siamo. E’ il codice ad essere sbagliato.
Ho implementato questo codice, ma ancora non ci siamo in termini di velocità.
Ho usato fin troppo tempo per cercare di capire il motivo per cui il Frame Rate è così basso. Dopo un pranzo leggero a base di pennette al ragù di carne, direi di tornare al lavoro.
Train a net: TFRecord
Usiamo il tutorial di sentdex e lavoriamo alla creazione dei file per fare il train su un nuovo modello, mettendo da parte ma non abbandonando il precedente lavoro.
Partiamo avvantaggiati perché useremo il Market_ml dataset, da noi creato. Così vediamo se è un progetto che ha senso portare avanti.
Torniamo in una cartella a noi nota, e scarichiamo il file:
xml_to_csv.py
Zio impananto avevo 106 foto e 104 file *.xml. Vai a capire perché. Comunque, andiamo oltre.
Zio impanato fritto. Abbiamo lavorato 30 minuti sua qualcosa che se avessimo saputo come farlo ci avremmo messo appena 60 secondi, ma è cosi che funziona.
Siamo pronti con i csv, dobbiamo convertirli usando questo script in TFRecord.
Ho dovuto cercare la priama versione dello script.
Abbiamo i record, procediamo.
Tralasciamo il fatto che ho ricaricato la versione del 22 agosto 2017 dello script e creato nuovamente i TFRecord, e andiamo oltre.
Train a net: configurazione
Invece di fare un train da zero, useremo un modello pre-esistente il:
ssd_mobilenet_v1_coco_2017_11_17
Perché è già nella cartella e sappiamo che funziona.
Faremo una procedura denominata di “transfer learning” cioè “trasferiremo” la capacità di riconoscimento popria della “vecchia intelligenza” su nuovi oggetti, nel nostro caso gli “empty spaces”.
Ecco la parte bella. Tutto da configurare. Facciamo dopo cena va che siamo più tranquilli e rilassati.
Ottimo. Iniziamo
Train a net: Inizio training
L’indomani, ore 9:57.
Sono successe molte cose, che includono anche scleri nervosi. Purtroppo il dataset che volevamo impiegare, il Market_ML dataset, conteneva immagini troppo grandi e quindi causava parecchi errori al momento del caricamento in memoria.
Perlomeno, questo è quello che abbiamo capito dopo svariate ore di ricerca e tentativi di modifica.
Quindi, abbiamo scaricato il dataset di sentdex per l’indetificazione di maccheroni al formaggio, modificato i parametri di configurazioni, creato nuovi *.csv e *.record e abbiamo iniziato il training. Siamo ormai al 2218 step, e prevediamo di arrivare almeno a 10.000.
Speriamo così di ottenere un loss inferiore al 1.0. Per iniziare il training ho dato il comando:
python train.py --logtostderr --train_dir=training/ --pipeline_config_path=ssd_mobilenet_v1_pets.config

mentre con il comando:
tensorboard --logdir=training/ --host localhost --port 8080
ho attivato una dahsboard accessibile via browser.

Non ci resta che attenedere e commentare i risultati
Risultati
Usiamo il seguente comando:
python export_inference_graph.py --input_type image_tensor --pipeline_config_path ssd_mobilenet_v1_pets.config --trained_checkpoint_prefix training/model.ckpt-9630 --output_directory data
e otteniamo il file:
frozen_inference_graph.pb
Molto familiare. Ora apriamo il notebook, e scarichiamo alcune immagini da internet per vedere se vengono riconosciute. 4 andranno bene.
Abbiamo cambiato dettagli, ed ecco il risultato:
Alla prossima!
Un caldo abbraccio, Andrea.