Creare un modello personalizzato per il classificatore di immagini

1. Prima di iniziare

Nel codelab precedente hai creato un'app per Android e iOS che utilizzava un modello di etichettatura delle immagini di base che riconosce diverse centinaia di classi di immagini. Ha riconosciuto un'immagine di un fiore in modo molto generico, vedendo petali, fiori, piante e cielo.

Per aggiornare l'app in modo che riconosca fiori specifici, ad esempio margherite o rose, avrai bisogno di un modello personalizzato addestrato su molti esempi di ogni tipo di fiore che vuoi riconoscere.

Prerequisiti

  • Il codelab precedente in questo percorso di apprendimento.

Cosa creerai e imparerai

  • Come addestrare un modello personalizzato di classificazione delle immagini utilizzando TensorFlow Lite Model Maker.

Che cosa ti serve

  • Non è necessario hardware specifico: tutto può essere completato utilizzando Google Colab nel browser.

2. Inizia

Tutto il codice da seguire è stato preparato per te ed è disponibile per l'esecuzione utilizzando Google Colab qui. Se non hai accesso a Google Colab, puoi clonare il repository e utilizzare il notebook denominato CustomImageClassifierModel.ipynb che si trova nella directory ImageClassificationMobile->colab.

Se hai molti esempi di fiori particolari, è relativamente facile addestrare un modello con TensorFlow Lite Model Maker per riconoscerli.

Il modo più semplice per farlo è creare un file .zip o .tgz contenente le immagini, ordinate in directory. Ad esempio, se utilizzi immagini di margherite, tarassaco, rose, girasoli e tulipani, puoi organizzarle in directory come questa:

4ee12554e75b103f.png

Comprimi il file e ospitalo su un server per poter addestrare i modelli. Nel resto di questo lab ne utilizzerai uno che è stato preparato per te.

Questo lab presuppone che tu stia utilizzando Google Colab per addestrare il modello. Puoi trovare Colab all'indirizzo colab.research.google.com. Se utilizzi un altro ambiente, potresti dover installare molte dipendenze, non da ultimo TensorFlow.

3. Installa e importa le dipendenze

  1. Installa TensorFlow Lite Model Maker. Puoi farlo con un'installazione pip. Il simbolo &> /dev/null alla fine sopprime l'output. Model Maker genera molti contenuti che non sono immediatamente pertinenti. È stato soppresso in modo che tu possa concentrarti sull'attività in questione.
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. Poi dovrai importare le librerie che devi utilizzare e assicurarti di utilizzare TensorFlow 2.x:
# Imports and check that we are using TF2.x
import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

Ora che l'ambiente è pronto, è il momento di iniziare a creare il modello.

4. Scarica e prepara i dati

Se le immagini sono organizzate in cartelle e queste cartelle sono compresse, se scarichi il file zip e lo decomprimi, le immagini verranno etichettate automaticamente in base alla cartella in cui si trovano. Questa directory verrà indicata come data_path.

data_path = tf.keras.utils.get_file(
      'flower_photos',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      untar=True)

Questo percorso dei dati può essere caricato in un modello di rete neurale per l'addestramento con la classe ImageClassifierDataLoader di TensorFlow Lite Model Maker. Basta puntare alla cartella e il gioco è fatto.

Un elemento importante nell'addestramento dei modelli con il machine learning è non utilizzare tutti i dati per l'addestramento. Conserva un po' di dati per testare il modello con dati che non ha visto in precedenza. È facile farlo con il metodo split del set di dati restituito da ImageClassifierDataLoader. Se passi 0, 9, otterrai il 90% dei dati di addestramento e il 10% dei dati di test:

data = DataLoader.from_folder(data_path)
train_data, test_data = data.split(0.9)

Ora che i dati sono pronti, puoi creare un modello utilizzando questi dati.

5. Crea il modello di classificazione delle immagini

Model Maker astrae molte delle specifiche della progettazione della rete neurale, quindi non devi occuparti della progettazione della rete e di elementi come convoluzioni, dense, relu, flatten, funzioni di perdita e ottimizzatori. Per un modello predefinito, puoi semplicemente utilizzare una singola riga di codice per creare un modello addestrando una rete neurale con i dati forniti:

model = image_classifier.create(train_data)

Quando esegui questo comando, vedrai un output simile al seguente:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [===] - 15s 129ms/step - loss: 1.1169 - accuracy: 0.6181

Epoch 2/5
103/103 [===] - 13s 126ms/step - loss: 0.6595 - accuracy: 0.8911

Epoch 3/5
103/103 [===] - 13s 127ms/step - loss: 0.6239 - accuracy: 0.9133

Epoch 4/5
103/103 [===] - 13s 128ms/step - loss: 0.5994 - accuracy: 0.9287

Epoch 5/5
103/103 [===] - 13s 126ms/step - loss: 0.5836 - accuracy: 0.9385

La prima parte mostra l'architettura del modello. Ciò che Model Maker fa in background si chiama transfer learning, che utilizza un modello preaddestrato esistente come punto di partenza e prende solo le informazioni che il modello ha appreso su come sono costruite le immagini e le applica alla comprensione di questi 5 fiori. Puoi vederlo nella prima riga che dice:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

La parola chiave è "Hub", che indica che questo modello proviene da TensorFlow Hub. Per impostazione predefinita, TensorFlow Lite Model Maker utilizza un modello denominato "MobileNet" progettato per riconoscere 1000 tipi di immagini. La logica qui è che la metodologia utilizzata, imparando le "caratteristiche" per distinguere tra 1000 classi, può essere riutilizzata. Le stesse "caratteristiche" possono essere mappate alle nostre 5 classi di fiori, quindi non devono essere apprese da zero.

Il modello ha eseguito 5 epoche, dove un'epoca è un ciclo completo di addestramento in cui la rete neurale tenta di abbinare le immagini alle relative etichette. Dopo 5 epoche, in circa 1 minuto, l'accuratezza dei dati di addestramento era del 93,85%. Dato che ci sono 5 classi, un'ipotesi casuale avrebbe un'accuratezza del 20%, quindi è un progresso. (Viene anche segnalato un numero di "perdita", ma per ora puoi ignorarlo in sicurezza.)

In precedenza hai suddiviso i dati in dati di addestramento e di test, quindi puoi valutare le prestazioni della rete sui dati che non ha visto in precedenza, un indicatore migliore di come potrebbe funzionare nel mondo reale utilizzando model.evaluate sui dati di test:

loss, accuracy = model.evaluate(test_data)

L'output sarà simile al seguente:

12/12 [===] - 5s 115ms/step - loss: 0.6622 - accuracy: 0.8801

Prendi nota dell'accuratezza qui. È dell'88,01%, quindi utilizzando il modello predefinito nel mondo reale dovresti aspettarti questo livello di accuratezza. Non è male per il modello predefinito che hai addestrato in circa un minuto. Naturalmente, potresti apportare molte modifiche per migliorare il modello, ed è una scienza a sé stante.

6. Esporta il modello

Ora che il modello è addestrato, il passaggio successivo è esportarlo nel formato .tflite che un'applicazione mobile può utilizzare. Model Maker fornisce un metodo di esportazione semplice che puoi utilizzare: basta specificare la directory di output.

Ecco il codice:

model.export(export_dir='/mm_flowers')

Se esegui questa operazione in Google Colab, puoi visualizzare il modello facendo clic sull'icona della cartella a sinistra dello schermo:

cc5b9988775633b4.png

Da qui, vedrai un elenco della directory corrente. Utilizza il pulsante indicato per spostarti "verso l'alto" di una directory:

51e6ac47c992142a.png

Nel codice hai specificato di esportare nella directory mm_flowers. Apri la directory e vedrai un file denominato "model.tflite". Questo è il modello addestrato.

57bad87f294fd189.png

Seleziona il file e vedrai apparire 3 puntini a destra. Fai clic su questi puntini per visualizzare un menu contestuale e da lì puoi scaricare il modello.

aee14ad10c4a8a1a.png

Dopo qualche istante, il modello verrà scaricato nella cartella Download.

7. Complimenti

Ora è tutto pronto per integrarlo nella tua app mobile. Lo farai nel prossimo lab.