Classificazione delle immagini con TensorFlow Lite Model Maker

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza la fonte su GitHub Scarica il taccuino Vedi il modello del mozzo TF

La biblioteca Maker tensorflow Lite Modello semplifica il processo di adattamento e la conversione di un modello di rete neurale tensorflow a particolari dati di input durante la distribuzione di questo modello per le applicazioni on-dispositivo ML.

Questo taccuino mostra un esempio end-to-end che utilizza questa libreria Model Maker per illustrare l'adattamento e la conversione di un modello di classificazione delle immagini comunemente usato per classificare i fiori su un dispositivo mobile.

Prerequisiti

Per eseguire questo esempio, abbiamo prima bisogno di installare più pacchetti necessari, tra cui modello pacchetto di caffè che in GitHub Repo .

pip install -q tflite-model-maker

Importa i pacchetti richiesti.

import os

import numpy as np

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

from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.config import QuantizationConfig
from tflite_model_maker.image_classifier import DataLoader

import matplotlib.pyplot as plt
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_addons/utils/ensure_tf_install.py:67: UserWarning: Tensorflow Addons supports using Python ops for all Tensorflow versions above or equal to 2.3.0 and strictly below 2.6.0 (nightly versions are not supported). 
 The versions of TensorFlow you are currently using is 2.6.0 and is not supported. 
Some things might work, some things might not.
If you were to encounter a bug, do not file an issue.
If you want to make sure you're using a tested and supported configuration, either change the TensorFlow version or the TensorFlow Addons's version. 
You can find the compatibility matrix in TensorFlow Addon's readme:
https://github.com/tensorflow/addons
  UserWarning,
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:154: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

Semplice esempio end-to-end

Ottieni il percorso dei dati

Prendiamo alcune immagini per giocare con questo semplice esempio end-to-end. Centinaia di immagini sono un buon inizio per Model Maker, mentre più dati potrebbero raggiungere una migliore precisione.

Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 3s 0us/step
228827136/228813984 [==============================] - 3s 0us/step

È possibile sostituire image_path con le proprie cartelle di immagini. Per quanto riguarda il caricamento dei dati su colab, potresti trovare il pulsante di caricamento nella barra laterale sinistra mostrato nell'immagine qui sotto con il rettangolo rosso. Prova a caricare un file zip e decomprimilo. Il percorso del file root è il percorso corrente.

Caricare un file

Se si preferisce non caricare le immagini nel cloud, si potrebbe provare a eseguire la biblioteca locale a seguito della guida in GitHub.

Esegui l'esempio

L'esempio consiste solo di 4 righe di codice come mostrato di seguito, ognuna delle quali rappresenta un passaggio del processo complessivo.

Passaggio 1. Caricare i dati di input specifici per un'app ML su dispositivo. Dividilo in dati di addestramento e dati di test.

data = DataLoader.from_folder(image_path)
train_data, test_data = data.split(0.9)
2021-08-12 11:22:56.386698: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.
2021-08-12 11:22:56.395523: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.396549: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.398220: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-08-12 11:22:56.398875: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.400004: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.400967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.007249: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.008317: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.009214: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.010137: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0

Passaggio 2. Personalizza il modello TensorFlow.

model = image_classifier.create(train_data)
INFO:tensorflow:Retraining the models...
2021-08-12 11:23:00.961952: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2 (HubKer (None, 1280)              3413024   
_________________________________________________________________
dropout (Dropout)            (None, 1280)              0         
_________________________________________________________________
dense (Dense)                (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/optimizer_v2.py:356: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
2021-08-12 11:23:04.815901: I tensorflow/stream_executor/cuda/cuda_dnn.cc:369] Loaded cuDNN version 8100
2021-08-12 11:23:05.396630: I tensorflow/core/platform/default/subprocess.cc:304] Start cannot spawn child process: No such file or directory
103/103 [==============================] - 7s 38ms/step - loss: 0.8676 - accuracy: 0.7618
Epoch 2/5
103/103 [==============================] - 4s 41ms/step - loss: 0.6568 - accuracy: 0.8880
Epoch 3/5
103/103 [==============================] - 4s 37ms/step - loss: 0.6238 - accuracy: 0.9111
Epoch 4/5
103/103 [==============================] - 4s 37ms/step - loss: 0.6009 - accuracy: 0.9245
Epoch 5/5
103/103 [==============================] - 4s 37ms/step - loss: 0.5872 - accuracy: 0.9287

Passaggio 3. Valutare il modello.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 2s 45ms/step - loss: 0.5993 - accuracy: 0.9292

Passaggio 4. Esporta nel modello TensorFlow Lite.

Qui, esportiamo il modello tensorflow Lite con i metadati che fornisce uno standard per la descrizione del modello. Il file di etichetta è incorporato nei metadati. La tecnica di quantizzazione post-addestramento predefinita è la quantizzazione interger completa per l'attività di classificazione delle immagini.

Puoi scaricarlo nella barra laterale sinistra come la parte di caricamento per uso personale.

model.export(export_dir='.')
2021-08-12 11:23:29.239205: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpg7d7peiv/assets
INFO:tensorflow:Assets written to: /tmp/tmpg7d7peiv/assets
2021-08-12 11:23:32.415310: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.415723: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1
2021-08-12 11:23:32.415840: I tensorflow/core/grappler/clusters/single_machine.cc:357] Starting new session
2021-08-12 11:23:32.416303: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.416699: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.417007: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.417414: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.417738: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.418047: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0
2021-08-12 11:23:32.451651: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:1137] Optimization results for grappler item: graph_to_optimize
  function_optimizer: Graph size after: 913 nodes (656), 923 edges (664), time = 17.945ms.
  function_optimizer: function_optimizer did nothing. time = 0.391ms.

2021-08-12 11:23:33.380451: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-08-12 11:23:33.380503: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-08-12 11:23:33.426653: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:210] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.
fully_quantize: 0, inference_type: 6, input_inference_type: 3, output_inference_type: 3
WARNING:absl:For model inputs containing unsupported operations which cannot be quantized, the `inference_input_type` attribute will default to the original type.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpny214hzn/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmpny214hzn/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

Dopo questi semplici 4 passi, potremmo utilizzare ulteriori file di modello tensorflow Lite in applicazioni on-device come nella immagine di classificazione app di riferimento.

Processo dettagliato

Attualmente, supportiamo diversi modelli come i modelli EfficientNet-Lite*, MobileNetV2, ResNet50 come modelli pre-addestrati per la classificazione delle immagini. Ma è molto flessibile aggiungere nuovi modelli pre-addestrati a questa libreria con poche righe di codice.

Di seguito viene illustrato passo passo questo esempio end-to-end per mostrare maggiori dettagli.

Passaggio 1: caricare i dati di input specifici per un'app ML su dispositivo

Il dataset dei fiori contiene 3670 immagini appartenenti a 5 classi. Scarica la versione di archivio del set di dati e decomprimilo.

Il set di dati ha la seguente struttura di directory:

flower_photos
|__ daisy
    |______ 100080576_f52e8ee070_n.jpg
    |______ 14167534527_781ceb1b7a_n.jpg
    |______ ...
|__ dandelion
    |______ 10043234166_e6dd915111_n.jpg
    |______ 1426682852_e62169221f_m.jpg
    |______ ...
|__ roses
    |______ 102501987_3cdb8e5394_n.jpg
    |______ 14982802401_a3dfb22afb.jpg
    |______ ...
|__ sunflowers
    |______ 12471791574_bb1be83df4.jpg
    |______ 15122112402_cafa41934f.jpg
    |______ ...
|__ tulips
    |______ 13976522214_ccec508fe7.jpg
    |______ 14487943607_651e8062a1_m.jpg
    |______ ...
image_path = tf.keras.utils.get_file(
      'flower_photos.tgz',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      extract=True)
image_path = os.path.join(os.path.dirname(image_path), 'flower_photos')

Utilizzare DataLoader classe per caricare i dati.

Per quanto riguarda from_folder() metodo, è riuscito a caricare i dati dalla cartella. Presuppone che i dati immagine della stessa classe siano nella stessa sottodirectory e che il nome della sottocartella sia il nome della classe. Attualmente sono supportate immagini con codifica JPEG e immagini con codifica PNG.

data = DataLoader.from_folder(image_path)
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.

Dividilo in dati di addestramento (80%), dati di convalida (10%, facoltativo) e dati di test (10%).

train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)

Mostra 25 esempi di immagini con etichette.

plt.figure(figsize=(10,10))
for i, (image, label) in enumerate(data.gen_dataset().unbatch().take(25)):
  plt.subplot(5,5,i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)
  plt.xlabel(data.index_to_label[label.numpy()])
plt.show()

png

Passaggio 2: personalizza il modello TensorFlow

Crea un modello di classificatore di immagini personalizzato basato sui dati caricati. Il modello predefinito è EfficientNet-Lite0.

model = image_classifier.create(train_data, validation_data=validation_data)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_1 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_1 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/optimizer_v2.py:356: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
91/91 [==============================] - 7s 59ms/step - loss: 0.8929 - accuracy: 0.7572 - val_loss: 0.6367 - val_accuracy: 0.9091
Epoch 2/5
91/91 [==============================] - 5s 55ms/step - loss: 0.6598 - accuracy: 0.8905 - val_loss: 0.6097 - val_accuracy: 0.9119
Epoch 3/5
91/91 [==============================] - 5s 54ms/step - loss: 0.6221 - accuracy: 0.9141 - val_loss: 0.6016 - val_accuracy: 0.9347
Epoch 4/5
91/91 [==============================] - 5s 59ms/step - loss: 0.6032 - accuracy: 0.9241 - val_loss: 0.5978 - val_accuracy: 0.9318
Epoch 5/5
91/91 [==============================] - 6s 63ms/step - loss: 0.5890 - accuracy: 0.9344 - val_loss: 0.5954 - val_accuracy: 0.9347

Dai un'occhiata alla struttura dettagliata del modello.

model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_1 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_1 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________

Passaggio 3: valutare il modello personalizzato

Valutare il risultato del modello, ottenere la perdita e l'accuratezza del modello.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 2s 37ms/step - loss: 0.6337 - accuracy: 0.9019

Potremmo tracciare i risultati previsti in 100 immagini di prova. Le etichette previste con il colore rosso sono i risultati previsti errati mentre altre sono corrette.

# A helper function that returns 'red'/'black' depending on if its two input
# parameter matches or not.
def get_label_color(val1, val2):
  if val1 == val2:
    return 'black'
  else:
    return 'red'

# Then plot 100 test images and their predicted labels.
# If a prediction result is different from the label provided label in "test"
# dataset, we will highlight it in red color.
plt.figure(figsize=(20, 20))
predicts = model.predict_top_k(test_data)
for i, (image, label) in enumerate(test_data.gen_dataset().unbatch().take(100)):
  ax = plt.subplot(10, 10, i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)

  predict_label = predicts[i][0][0]
  color = get_label_color(predict_label,
                          test_data.index_to_label[label.numpy()])
  ax.xaxis.label.set_color(color)
  plt.xlabel('Predicted: %s' % predict_label)
plt.show()

png

Se la precisione non soddisfa il requisito di applicazione, si potrebbe fare riferimento a Uso avanzato di esplorare alternative come la modifica di un modello più grande, la regolazione dei parametri ri-formazione, ecc

Passaggio 4: esporta nel modello TensorFlow Lite

Convertire il modello addestrato per la Modello di formato tensorflow Lite con i metadati in modo che in seguito sarà possibile utilizzare in un'applicazione sul dispositivo ML. Il file etichetta e il file vocab sono incorporati nei metadati. Il nome file predefinito è TFLite model.tflite .

In molte applicazioni ML su dispositivo, la dimensione del modello è un fattore importante. Pertanto, si consiglia di applicare la quantizzazione del modello per renderlo più piccolo e potenzialmente eseguirlo più velocemente. La tecnica di quantizzazione post-addestramento predefinita è la quantizzazione interger completa per l'attività di classificazione delle immagini.

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmpefawktva/assets
INFO:tensorflow:Assets written to: /tmp/tmpefawktva/assets
2021-08-12 11:25:07.871201: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.871638: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1
2021-08-12 11:25:07.871768: I tensorflow/core/grappler/clusters/single_machine.cc:357] Starting new session
2021-08-12 11:25:07.872277: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.872639: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.872945: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.873316: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.873619: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.873884: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0
2021-08-12 11:25:07.906980: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:1137] Optimization results for grappler item: graph_to_optimize
  function_optimizer: Graph size after: 913 nodes (656), 923 edges (664), time = 17.977ms.
  function_optimizer: function_optimizer did nothing. time = 0.434ms.

2021-08-12 11:25:08.746578: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-08-12 11:25:08.746627: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 3, output_inference_type: 3
WARNING:absl:For model inputs containing unsupported operations which cannot be quantized, the `inference_input_type` attribute will default to the original type.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmp9dnrtkd6/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmp9dnrtkd6/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

Vedere esempi di applicazioni e guide di classificazione di immagini per maggiori dettagli su come integrare il modello tensorflow Lite in applicazioni mobili.

Questo modello può essere integrato in un Android o un app iOS utilizzando l' API ImageClassifier del tensorflow Lite Task Biblioteca .

I formati di esportazione consentiti possono essere uno o un elenco dei seguenti:

Per impostazione predefinita, esporta semplicemente il modello TensorFlow Lite con i metadati. Puoi anche esportare selettivamente diversi file. Ad esempio, esportando solo il file di etichetta come segue:

model.export(export_dir='.', export_format=ExportFormat.LABEL)
INFO:tensorflow:Saving labels in ./labels.txt
INFO:tensorflow:Saving labels in ./labels.txt

È inoltre possibile valutare il modello tflite con evaluate_tflite metodo.

model.evaluate_tflite('model.tflite', test_data)
{'accuracy': 0.9019073569482289}

Utilizzo avanzato

Il create funzione è la parte fondamentale di questa libreria. Esso utilizza l'apprendimento di trasferimento con un modello simile a quello preaddestrato esercitazione .

Il create funzione contiene le seguenti operazioni:

  1. Suddividere i dati in formazione, la convalida, il test dei dati in base al parametro validation_ratio e test_ratio . Il valore predefinito di validation_ratio e test_ratio sono 0.1 e 0.1 .
  2. Scaricare un'immagine vettoriale feature come il modello base da tensorflow Hub. Il modello preaddestrato predefinito è EfficientNet-Lite0.
  3. Aggiungere una testa classificatore con uno strato di interruzione procedura con dropout_rate tra strato di testa e il modello pre-addestrato. L'impostazione predefinita dropout_rate è l'impostazione predefinita dropout_rate valore da make_image_classifier_lib da tensorflow Hub.
  4. Preelabora i dati di input grezzi. Attualmente, i passaggi di pre-elaborazione includono la normalizzazione del valore di ciascun pixel dell'immagine per modellare la scala di input e il ridimensionamento per la dimensione di input del modello. EfficientNet-Lite0 ha scala di ingresso [0, 1] e la dimensione dell'immagine in ingresso [224, 224, 3] .
  5. Inserisci i dati nel modello classificatore. Per impostazione predefinita, i parametri di formazione come epoche di formazione, dimensione del lotto, tasso di apprendimento, di moto sono i valori di default da make_image_classifier_lib di tensorflow Hub. Viene addestrato solo il capo classificatore.

In questa sezione, descriviamo diversi argomenti avanzati, incluso il passaggio a un diverso modello di classificazione delle immagini, la modifica degli iperparametri di addestramento, ecc.

Personalizza la quantizzazione post-allenamento sul modello TensorFlow Lite

Post-formazione quantizzazione è una tecnica di conversione in grado di ridurre le dimensioni del modello e la latenza di inferenza, ma anche di migliorare la velocità della CPU e acceleratore hardware inferenza, con un po 'di degrado nella precisione del modello. Pertanto, è ampiamente utilizzato per ottimizzare il modello.

La libreria Model Maker applica una tecnica di quantizzazione post-addestramento predefinita durante l'esportazione del modello. Se si desidera personalizzare la quantizzazione post-allenamento, Modello Maker supporta molteplici opzioni di post-formazione di quantizzazione che utilizzano QuantizationConfig pure. Prendiamo come esempio la quantizzazione float16. Innanzitutto, definisci la configurazione di quantizzazione.

config = QuantizationConfig.for_float16()

Quindi esportiamo il modello TensorFlow Lite con tale configurazione.

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)
INFO:tensorflow:Assets written to: /tmp/tmp3tagi8ov/assets
INFO:tensorflow:Assets written to: /tmp/tmp3tagi8ov/assets
2021-08-12 11:33:18.486299: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.486660: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1
2021-08-12 11:33:18.486769: I tensorflow/core/grappler/clusters/single_machine.cc:357] Starting new session
2021-08-12 11:33:18.487314: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.487754: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.488070: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.488480: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.488804: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.489094: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0
2021-08-12 11:33:18.525503: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:1137] Optimization results for grappler item: graph_to_optimize
  function_optimizer: Graph size after: 913 nodes (656), 923 edges (664), time = 19.663ms.
  function_optimizer: function_optimizer did nothing. time = 0.423ms.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
2021-08-12 11:33:19.358426: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-08-12 11:33:19.358474: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpyiyio9gh/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmpyiyio9gh/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model_fp16.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model_fp16.tflite

In Colab, è possibile scaricare il modello di nome model_fp16.tflite dalla barra laterale di sinistra, proprio come la parte upload di cui sopra.

Cambia il modello

Passa al modello supportato in questa libreria.

Questa libreria supporta ormai i modelli EfficientNet-Lite, MobileNetV2, ResNet50. EfficientNet-Lite sono una famiglia di modelli di classificazione di immagini che permettono di ottenere lo stato-of-art precisione e adatto per i dispositivi di bordo. Il modello predefinito è EfficientNet-Lite0.

Potremmo cambiare modello per MobileNetV2 semplicemente impostando il parametro model_spec alle specifiche del modello MobileNetV2 a create metodo.

model = image_classifier.create(train_data, model_spec=model_spec.get('mobilenet_v2'), validation_data=validation_data)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              2257984   
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 2,264,389
Trainable params: 6,405
Non-trainable params: 2,257,984
_________________________________________________________________
None
Epoch 1/5
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/optimizer_v2.py:356: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
91/91 [==============================] - 8s 57ms/step - loss: 0.9474 - accuracy: 0.7486 - val_loss: 0.6713 - val_accuracy: 0.8807
Epoch 2/5
91/91 [==============================] - 5s 54ms/step - loss: 0.7013 - accuracy: 0.8764 - val_loss: 0.6342 - val_accuracy: 0.9119
Epoch 3/5
91/91 [==============================] - 5s 54ms/step - loss: 0.6577 - accuracy: 0.8963 - val_loss: 0.6328 - val_accuracy: 0.9119
Epoch 4/5
91/91 [==============================] - 5s 54ms/step - loss: 0.6245 - accuracy: 0.9176 - val_loss: 0.6445 - val_accuracy: 0.9006
Epoch 5/5
91/91 [==============================] - 5s 55ms/step - loss: 0.6034 - accuracy: 0.9303 - val_loss: 0.6290 - val_accuracy: 0.9091

Valuta il modello MobileNetV2 appena riqualificato per vedere l'accuratezza e la perdita dei dati di test.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 38ms/step - loss: 0.6723 - accuracy: 0.8883

Modifica al modello in TensorFlow Hub

Inoltre, potremmo anche passare ad altri nuovi modelli che immettono un'immagine e emettono un vettore di funzionalità con il formato TensorFlow Hub.

Come Inception V3 modello come esempio, potremmo definire inception_v3_spec che è un oggetto di image_classifier.ModelSpec e contiene la specifica del modello Inception V3.

Abbiamo bisogno di specificare il nome del modello name , l'URL del modello tensorflow Hub uri . Nel frattempo, il valore predefinito di input_image_shape è [224, 224] . Abbiamo bisogno di cambiare a [299, 299] per il modello V3 Inception.

inception_v3_spec = image_classifier.ModelSpec(
    uri='https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1')
inception_v3_spec.input_image_shape = [299, 299]

Quindi, mediante configurazione model_spec per inception_v3_spec a create metodo, potremmo reimpostare il modello Inception V3.

I passaggi rimanenti sono esattamente gli stessi e alla fine potremmo ottenere un modello TensorFlow Lite personalizzato di InceptionV3.

Cambia il tuo modello personalizzato

Se vorremmo utilizzare il modello personalizzato che non è in tensorflow Hub, dobbiamo creare ed esportare ModelSpec in tensorflow Hub.

Quindi iniziare a definire ModelSpec oggetto come il processo di cui sopra.

Modificare gli iperparametri di allenamento

Potremmo anche modificare le iperparametri di formazione come epochs , dropout_rate e batch_size che potrebbero influenzare l'accuratezza del modello. I parametri del modello che puoi regolare sono:

  • epochs : più epoche potrebbe raggiungere una migliore precisione fino a quando non converge ma di formazione per i troppi epoche può portare a sovradattamento.
  • dropout_rate : La tariffa per abbandono, evitare di overfitting. Nessuno per impostazione predefinita.
  • batch_size : numero di campioni da utilizzare in un solo passo di formazione. Nessuno per impostazione predefinita.
  • validation_data dati di convalida:. Se Nessuno, salta il processo di convalida. Nessuno per impostazione predefinita.
  • train_whole_model : Se fosse vero, il modulo Hub è allenato insieme con lo strato di classificazione sulla parte superiore. Altrimenti, addestra solo il livello di classificazione superiore. Nessuno per impostazione predefinita.
  • learning_rate : tasso di apprendimento di base. Nessuno per impostazione predefinita.
  • momentum : un galleggiante Python trasmessa al ottimizzatore. Usato solo quando use_hub_library è vero. Nessuno per impostazione predefinita.
  • shuffle : booleano, se i dati devono essere mescolate. Falso per impostazione predefinita.
  • use_augmentation : booleano, l'aumento l'uso dei dati per la pre-elaborazione. Falso per impostazione predefinita.
  • use_hub_library : booleano, uso make_image_classifier_lib dal mozzo tensorflow di riqualificare il modello. Questa pipeline di training potrebbe ottenere prestazioni migliori per set di dati complessi con molte categorie. Vero per impostazione predefinita.
  • warmup_steps : Numero di passi di riscaldamento e per la pianificazione riscaldamento sul tasso di apprendimento. Se Nessuno, viene utilizzato il warmup_steps predefinito che è il totale dei passaggi di addestramento in due epoche. Usato solo quando use_hub_library è falsa. Nessuno per impostazione predefinita.
  • model_dir : Opzionale, la posizione dei file modello di checkpoint. Usato solo quando use_hub_library è falsa. Nessuno per impostazione predefinita.

I parametri che sono nessuno per default come epochs otterranno i parametri di default concreti in make_image_classifier_lib dalla libreria tensorflow Hub o train_image_classifier_lib .

Ad esempio, potremmo allenarci con più epoche.

model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_3 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_3 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/10
91/91 [==============================] - 7s 57ms/step - loss: 0.8869 - accuracy: 0.7644 - val_loss: 0.6398 - val_accuracy: 0.9006
Epoch 2/10
91/91 [==============================] - 5s 53ms/step - loss: 0.6601 - accuracy: 0.8929 - val_loss: 0.6134 - val_accuracy: 0.9176
Epoch 3/10
91/91 [==============================] - 5s 53ms/step - loss: 0.6273 - accuracy: 0.9121 - val_loss: 0.6068 - val_accuracy: 0.9148
Epoch 4/10
91/91 [==============================] - 5s 53ms/step - loss: 0.6104 - accuracy: 0.9214 - val_loss: 0.6007 - val_accuracy: 0.9205
Epoch 5/10
91/91 [==============================] - 5s 55ms/step - loss: 0.5921 - accuracy: 0.9286 - val_loss: 0.5976 - val_accuracy: 0.9176
Epoch 6/10
91/91 [==============================] - 5s 51ms/step - loss: 0.5745 - accuracy: 0.9409 - val_loss: 0.5940 - val_accuracy: 0.9148
Epoch 7/10
91/91 [==============================] - 4s 49ms/step - loss: 0.5686 - accuracy: 0.9454 - val_loss: 0.5923 - val_accuracy: 0.9148
Epoch 8/10
91/91 [==============================] - 4s 48ms/step - loss: 0.5629 - accuracy: 0.9492 - val_loss: 0.5914 - val_accuracy: 0.9062
Epoch 9/10
91/91 [==============================] - 4s 48ms/step - loss: 0.5592 - accuracy: 0.9485 - val_loss: 0.5892 - val_accuracy: 0.9091
Epoch 10/10
91/91 [==============================] - 4s 48ms/step - loss: 0.5503 - accuracy: 0.9584 - val_loss: 0.5890 - val_accuracy: 0.9176

Valuta il modello appena riaddestrato con 10 epoche di addestramento.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 32ms/step - loss: 0.6294 - accuracy: 0.9019

Leggi di più

Potete leggere la nostra immagine di classificazione esempio per imparare i dettagli tecnici. Per ulteriori informazioni, fare riferimento a: