Tensorflow ed Android come fare ?

AI, INTELLIGENZA ARTIFICIALE

In questa guida cercherò di illustrare come  importare un modello per il riconoscimento di immagini basato su Tensorflow in android.

I passi iniziali per la configuraione non sonon complessi.

Innanzitutto per poter utilizzare Tensorflow su Android, bisogna scaricare da GitHub il seguente repository in cui troverete il progetto ed alcuni esempi  per android:

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android

Ovviamente per poter compilare e modificare il codice con comodità servirà un IDE; nella fattispecie vi consiglio di installare  Android Studio, che potete scaricare da qui:

https://developer.android.com/studio/

Vediamo come fare per importare il progetto di esempio. Anche inquesto caso i passi sono molto semplici :

  1. Procedere con l’estrazione dell’archivio relativo a Tensorflow.
  2. Aprire Android Studio e importare il progetto.

Per l’importazione basterà cliccare su “import project” accedere nella cartella estratta fino al path con build.gradle file:

tensorflow-master/tensorflow/examples/android/build.gradle

ed a questo punto cliccando due volte su build.gradle partirà  la procedura di importazione del progetto  in Android Studio.

N.B.

Nel caso in cui l’import (ADT,Gradle etc etc ) non funzionasse, riprovare ad importare facendo una procedura diversa , ovvero aprire il progetto di esempio  come progetto già esistente  posizionandosi sulla directory  del progetto, nel nostro caso android. I risultato dovrebbe essere qualcosa di sinile a quanto mostratto nella figura segiente.

 

Compilazione del progetto

Terminata procedura di importazione troveremo  una serie di file e cartelle in Project.

La prima cosa da fare è quella di aprire il file build.gradle e modificare la seguente riga in questo modo:

def nativeBuildSystem = 'cmake'

Possiamo, quindi, compilare il codice attraverso il comando Build -> Make Project.

Un piccolo suggerimento da tener presente; poichè alcuni errori di compilazione restano all’interno della cache di Android Studio e pertanto non vengono risolti tra una build e l’altra, il cosiglio è per evitare problemi di  eseguire preliminarmente  il comando Build -> Rebuild Project, oppure cancellare la cache attraverso il comando File -> Invalidate Caches / Restart e procedere con la ricompilazione.

Nel caso in cui  la compilazione del progetto non andasse subito a buon fine a causa della mancanza di alcune librerie, sarà sufficiente seguire i messaggi di errore risultanti dalla fase di compilazione ed  installare le dipendenze mancanti.

A questo punto potrete già installare sul votro dispositivo l’app di esempio che in genere vi consentirà di testare la Detect e la Classificazione su un modello pre-addestrato generalemnte la ssd_mobilenet_v1 con il dataset COCO.

Per installare sul vostro dispositivo andorid potete utilizzare adb.

Compilato il progetto cercate la dierectory dove viene deployata l’app di esempio , solitamente android studio vi dare indicazione con una notifica del path e lanciate il comnado

adb install <nome-app.apk>

Importazione di un  modello personalizzato

Per il nostro obiettivo, dobbiamo capire come esportare un modello addestrato attraverso tensorflow per in nostri scopi, in un formato compatibile per android.  In merito al training di un modello custom, consiglio di leggere l’articolo : “Come addestrare una intelligenza …

Bene partiamo dal presupposto che avete eseguito correttamente il training su un vostro dataset; cosa ci serve per esportare in android? sarà sufficiente esportare il modello utilizzando il comando export_tflite_ssd_graph

La sintassi da eseguirre sarà qualcosa di simile, da modificare caso per caso con i paramentri corretti. Nel mio caso il file di configurazione del modello di partenza l’ho salvato in training (training/ssd_inception_v3_pets.config) così come i vari checkpoint della fase di training (training/model.ckpt-<ckpt> ) .

il ckpt da considerare è ovviamente l’ultimo e corrisponde  al valore  più alto; per mia comodità utilizzo questo comando per estrarre il valore del ckpt in automatico:

ckpt=$( ls -lrt ./training/model.ckpt-*.index| tail -1 | cut -d "." -f3 | cut -d"-" -f2)

e passarlo al comando di esportazione del modello in android:

python3.5 export_tflite_ssd_graph.py \
--pipeline_config_path training/ssd_inception_v3_pets.config \
--trained_checkpoint_prefix training/model.ckpt-$ckpt \
--output_directory=./inference_graph_lite/ \
--add_postprocessing_op=true

Una volta esportato il modello , si può procedere con l’importazione dello stesso. Pe rprima cosa bisogna copiare i file esportati in particolare il  modello la labelmap ad esso associata all’interno della cartella “assets”, posta nella directory principale del progetto. A questo punto sarà sufficente editare il file DetectorActivity.java e modificare le seguenti righe nel  modo indicato :

private static final String TF_OD_API_MODEL_FILE = "file:///android_asset/NOME_MODELLO_IMPORTATO.pb";
private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/NOME_LABELMAP_IMPORTATA.txt";

 

Completata la fase di editing sarà sufficiente ricompilare il progetto , ricreare la nuova apk e procedere con il deploy della stessa sul dispositivo android.

Ovviamente non tutto sarà così lineare, pertanto valutate la procedura e l’articolo come una base di partenza per iniziare a districarvi in questo  contesto.

 

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form

    Comments