Blog.

Tensorflow Transfer Learning | Log 7 da 0 a 0,001


Autore
Andrea Provino
Data
Tempo di lettura
9 minuti
Categoria
Logs

log_come_nasce_guida_esplorare_trovare_find_way_explore

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.

Taggedlogsmachine learningtensorflow


Ultimi post

Patricia Merkle Trie

Il Practical Algorithm To Retrieve Information Coded In Alphanumeric Merkle Trie, o Patricia Merkle Trie è una struttura dati chiave-valore usatada Ethereum e particolarmente efficiente per il salvataggio e la verifica dell’integrità dell’informazione. In questo post ne studieremo le caratteristiche. Prima di procedere, ci conviene ripassare l’introduzione al Merkle Tree nella quale abbiamo chiarito il […]

Andrea Provino
ethereum-patricia-merkle-tree
Tree Data Structure: cos’è un Merkle Tree

Un Merkle Tree è una struttura dati efficiente per verificare che un dato appartenga a un insieme esteso di elementi. È comunemente impiegato nelle Peer to Peer network in cui la generazione efficiente di prove (proof) contribuisce alla scalabilità della rete. Capire i vantaggi di questa struttura ci tornerà utile nel nostro percorso di esplorazione […]

Andrea Provino
merkle-tree-cover
UTXO: come funziona il modello Unspent Transaction Outputs

Per tenere traccia dei bilanci utente, la blockchain di Bitcoin sfrutta un modello di contabilità definito UTXO o Unspent Transaction Outputs. In questo articolo ne esaminiamo le caratteristiche. Ogni blockchain è dotata di un sistema di contabilità, un meccanismo attraverso cui tenere traccia dei bilanci di ciascun utente. I due grandi modelli di riferimento nel […]

Andrea Provino
bitcoin-utxo
Cos’è Ethereum

Possiamo definire Ethereum come una macchina a stati distribuita che traccia le transizioni di un archivio dati general-purpose (i.e. una memoria in grado di registrare qualsiasi dato esprimibile come coppia di chiave e valore o key-value) all’interno della Ethereum Blockchain. È arrivato il momento di esplorare uno dei progetti tecnologici più innovativi e interessanti degli […]

Andrea Provino
ethereum