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. Riconosceva l'immagine di un fiore in modo molto generico, che vedeva petali, fiori, piante e cielo.

Per aggiornare l'app affinché riconosca specifici fiori, margherite o rose, ad esempio, devi avere un modello personalizzato addestrato sulla base di molti esempi di ogni tipo di fiore che vuoi riconoscere.

Prerequisiti

  • Il codelab precedente in questo percorso di apprendimento.

Cosa creerai e apprenderai

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

Che cosa ti serve

  • Non è necessario alcun hardware specifico: è possibile completare tutto utilizzando Google Colab nel browser.

2. Inizia

Il codice da seguire è stato preparato per te e puoi eseguirlo utilizzando Google Colab qui. Se non hai accesso a Google Colab, puoi clonare il repository e utilizzare il blocco note chiamato CustomImageClassifierModel.ipynb, che puoi trovare 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, denti di leone, rose, girasoli e tulipani, puoi organizzarle in directory come la seguente:

4ee12554e75b103f.png

Comprimilo e ospitalo su un server per poter addestrare i modelli. Userai quello che è stato preparato per te nel resto di questo lab.

In questo lab si presume che tu stia utilizzando Google Colab per addestrare il modello. Puoi trovare Colab all'indirizzo colab.research.google.com. Se utilizzi un altro ambiente, potrebbe essere necessario installare molte dipendenze, non meno TensorFlow.

3. Installa e importa le dipendenze

  1. Installare Model Maker TensorFlow Lite. Puoi farlo con un'installazione pip. Il &> /dev/null alla fine sopprime semplicemente l'output. Model Maker restituisce molti elementi non immediatamente pertinenti. È stato eliminato in modo che tu possa concentrarti sull'attività in corso.
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. Successivamente, 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 tuoi dati

Se le immagini sono organizzate in cartelle e queste ultime sono compresse, se scarichi il file ZIP e lo decomprimi, le immagini verranno etichettate automaticamente in base alla cartella in cui si trovano. Verrà fatto riferimento a questa directory 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ò quindi essere caricato in un modello di rete neurale per l'addestramento con la classe ImageClassifierDataLoader di TensorFlow Lite Model Maker. Basta puntarlo sulla cartella e il gioco è fatto.

Un elemento importante nell'addestramento dei modelli con il machine learning è non utilizzare tutti i tuoi dati per l'addestramento. Attendi un po' per testare il modello con dati che non ha mai rilevato in precedenza. Ciò è facile da usare con il metodo di suddivisione del set di dati che proviene da ImageClassifierDataLoader. Passando un valore di 0, 9, ne ottieni il 90% come dati di addestramento e il 10% come 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 utilizzandoli.

5. Creazione del modello di classificazione delle immagini

Model Maker astrae molti aspetti specifici della progettazione della rete neurale in modo da non doverti occupare della progettazione della rete e aspetti 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 mediante l'addestramento di una rete neurale con i dati forniti:

model = image_classifier.create(train_data)

Quando lo esegui, 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 sta facendo dietro le quinte si chiama Transfer Learning, che utilizza un modello preaddestrato esistente come punto di partenza e si limita a prendere le cose che il modello ha imparato su come sono costruite le immagini e ad applicarle per comprendere questi cinque fiori. Lo puoi vedere nella prima riga:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

La chiave è la parola "Hub", che indica che questo modello proviene da TensorFlow Hub. Per impostazione predefinita, TensorFlow Lite Model Maker utilizza un modello chiamato "MobileNet" che è progettato per riconoscere 1000 tipi di immagini. La logica qui è che la metodologia che utilizza, imparando le "caratteristiche", per distinguere tra 1000 classi, possono essere riutilizzate. Le stesse "caratteristiche" possono essere mappate alle nostre 5 classi di fiori, in modo da non doverli apprendere partendo da zero.

Il modello ha attraversato 5 epoche, dove un'epoca è un ciclo completo di addestramento in cui la rete neurale prova ad abbinare le immagini alle relative etichette. Al momento in cui è passato attraverso 5 epoche, in circa 1 minuto, era preciso del 93,85% sui dati di addestramento. Dato che ci sono 5 classi, un'ipotesi casuale sarebbe accurata al 20%, quindi si tratta di un progresso! Viene indicato anche un numero di "perdita", ma per il momento lo ignori tranquillamente.

In precedenza hai suddiviso i dati in dati di addestramento e di test, in modo da poter ottenere un'indicazione delle prestazioni della rete su dati che non ha mai rilevato 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 visualizzato sarà simile al seguente:

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

Osserva la precisione qui. Poiché è pari all'88,01%, l'utilizzo del modello predefinito nel mondo reale dovrebbe prevedere un determinato livello di accuratezza. Questo non è un problema per il modello predefinito che hai addestrato in circa un minuto. Ovviamente potresti apportare molte modifiche per migliorare il modello, e questa è una vera e propria scienza.

6. Esporta il modello

Ora che il modello è stato addestrato, il passaggio successivo consiste nell'esportarlo nel formato .tflite utilizzabile da un'applicazione mobile. Model Maker fornisce un metodo di esportazione semplice che puoi utilizzare: è sufficiente specificare la directory in cui eseguire l'output.

Ecco il codice:

model.export(export_dir='/mm_flowers')

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

cc5b9988775633b4.png

Da qui, verrà visualizzato un elenco della directory corrente. Utilizza il pulsante indicato per spostarti "su" una directory:

51e6ac47c992142a.png

Nel codice che hai specificato per l'esportazione nella directory mm_flowers, Aprilo e vedrai un file chiamato "model.tflite". Questo è il modello addestrato.

57bad87f294fd189.png

Seleziona il file e vedrai apparire tre puntini sulla destra. Fai clic su questi pulsanti per ottenere un menu contestuale e scaricare il modello da lì.

aee14ad10c4a8a1a.png

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

7. Complimenti

Ora puoi integrarlo nella tua app mobile. Lo farai nel prossimo lab.