CoreML: Da modello Caffe ad iOS App — Parte 1

Neural Networks: CoreML e iOS11 + coremltools + Anaconda

Cosa facciamo oggi?

  • Oggi vediamo come convertire un modello Caffe in un modello CoreML utilizzando coremltools
  • Domani… vediamo come utilizzare un modello CoreML in iOS 11, per riconoscere il sesso (probabile :)) di una persona da una foto.

Di cosa abbiamo bisogno?

  • Un modello Caffe ☕️
  • Anaconda (Python)
  • XCode 9 💻 (per domani)
  • iPhone con iOS 11 📱 (per domani)

Installiamo Python

Come prima cosa, dobbiamo installare Python nel nostro Mac. A renderci la vita facile c’è Anaconda.

Scarichiamo Anaconda con Python 2.7 e facciamo partire l’installazione.

L’installazione di Anaconda andrà a modificare il file bash_profile nella vostra cartella utente. Possiamo vedere il file aggiornato, digitando cat ~/.bash_profile nel terminale.

Una volta installato Anaconda, procediamo con l’installazione di Python 2.7.13. Apriamo il terminale e digitiamo:

conda install python=2.7.13
conda update python

Perfetto! Visto che è possibile utilizzare più versioni di Python nello stesso Mac, quello che dobbiamo fare è definire un ambiente virtuale che utilizzeremo con Anaconda. Per fare questo, digitiamo:

coda create --name CoreMLEnvironment

dove CoreMLEnvironment è un nome a nostra scelta (ricordiamoci di rispondere “y” quando ci verrà chiesto se vogliamo procedere con la creazione dell’ambiente virtuale).

Se vogliamo optare per PyCharm per scrivere il nostro script Python di conversione (come vedremo in seguito), allora non è necessario creare un ambiente virtuale.

Installiamo CoreMLTools

A questo punto non ci rimane che installare CoreMLTools digitando, sempre dal terminale:

pip install -U coremltools

Caffe Model

E’ il momento di reperire un modello Caffe. Ci viene in aiuto una lista di modelli Caffe reperibile alla pagina Model Zoo di Caffe.

Per il nostro progetto scarichiamo il modello Age & Gender da qui o direttamente cliccando su cnn_age_gender_models_and_data.0.0.2.zip

Espandiamo il file .zip e controlliamo che il contenuto della cartella sia come quello in immagine:

Convertiamo il Caffe Model

Come si può vedere dalla immagine, nella cartella sono presenti due tipi di modelli: Gender e Age.

Ciò che dobbiamo fare ora è convertire i modelli per poterli utilizzare con CoreML.

A questo punto abbiamo due strade. Se siamo Nerd che amano il terminale, andiamo al punto successivo “Da Terminale”, altrimenti possiamo andare direttamente al paragrafo “Da PyCharm”.

Da Terminale

Attiviamo lo spazio virtuale che abbiamo creato in Anaconda

source activate CoreMLEnvironment

Entriamo nella cartella con i modelli Caffe appena scaricati

cd ~/Download/cnn_age_gender_models_and_data.0.0.2

digitiamo

python

e scriviamo il nostro script:

Una volta premuto invio, si avvierà la conversione dei modelli e vedremo apparire nella nostra cartella, i modelli convertiti in CoreML Gender.mlmodel e Age.mlmodel.

Da PyCharm

Se invece non vogliamo usare il terminale ma scegliamo la via dell’IDE Python, allora abbiamo bisogno di PyCharm. La versione CE è gratuita.

Installiamo PyCharm, apriamolo e creiamo un nuovo progetto da File/New Project e chiamiamolo Exporter.

Per semplificarci la vita, salviamo il nostro progetto nella stessa cartella dove abbiamo i nostri modelli (nel mio caso sempre ~/Download/cnn_age_gender_models_and_data.0.0.2)

Come interpreter è di vitale importanza 💪 scegliere dalla lista quello relativo ad Anaconda

Anaconda Python 2.7.13

Tasto destro su Exporter, New e scegliamo Python file. Chiamiamolo exporter.py e salviamolo all’interno della cartella Exporter appena creata.

Ora dobbiamo verificare che la nostra Python Console sia corretta. Apriamo le preferenze di PyCharm (PyCharm/Preferences) e assicuriamoci di avere il Python interpreter della Python console, come da immagine:

Per comodità (ci tornerà utile quando eseguiremo lo script), torniamo nel Finder e nella cartella Exporter appena creata muoviamo tutti i files che sono contenuti nella cartella ~/Download/cnn_age_gender_models_and_data.0.0.2

Perfetto, possiamo finalmente scrivere il nostro script. Apriamo il file exporter.py e scriviamo al suo interno:

Eseguiamo il nostro script. 🤞 Ci ritroveremo quindi i modelli Age.mlmodel e Gender.mlmodel convertiti in CoreML, all’interno della cartella del nostro script:

CoreMLTools

E’ importante capire che dalla conversione eseguita con coremltools, dipende la creazione del modello e soprattutto il tipo di parametri input ed output che questo restituirà.

Infatti se per esempio escludiamo l’argomento image_input_names dal nostro script, potremo notare, aprendo i files Age.mlmodel e Gender.mlmodel in XCode, che in input e in output avremo sempre un parametro di tipo MultiArray.

Mantenendo invece l’argomento image_input_names avremo come input dei nostri modelli, un parametro di tipo Image… ovvero una foto :)

Ad ogni modo, non c’è un solo modo per convertire un modello non CoreML in modello CoreML. Ci sono molteplici modi e dipendono da tantissime variabili.

Inoltre non tutti i modelli possono essere convertiti. Tantomeno tutti i tools come Caffe sono supportati.

Di seguito una lista riepilogativa da parte di Apple, dei modelli e tools supportati.

Next…

Nel prossimo post vedremo come utilizzare il Gender.mlmodel in iOS11 per poter riconoscere il sesso di una persona in primo piano in una foto.

Stay tuned :)