Bildklassifizierung mit TensorFlow Lite Model Maker

Auf TensorFlow.org ansehen Quelle auf GitHub anzeigen Notizbuch herunterladen Siehe TF Hub-Modell

Die TensorFlow Lite Modell Maker Bibliothek vereinfacht den Prozess der Anpassung und ein TensorFlow neural-Netzwerkmodell , um bestimmte Eingangsdaten umzuwandeln , wenn auf dem Gerät ML Anwendungen dieses Modells für die Bereitstellung von .

Dieses Notebook zeigt ein End-to-End-Beispiel, das diese Model Maker-Bibliothek verwendet, um die Anpassung und Konvertierung eines häufig verwendeten Bildklassifizierungsmodells zum Klassifizieren von Blumen auf einem mobilen Gerät zu veranschaulichen.

Voraussetzungen

Um dieses Beispiel auszuführen, wir müssen zunächst mehrere erforderlichen Pakete installieren, einschließlich Model Maker - Paket , dass in GitHub Repo .

pip install -q tflite-model-maker

Importieren Sie die erforderlichen Pakete.

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)

Einfaches End-to-End-Beispiel

Holen Sie sich den Datenpfad

Holen wir uns einige Bilder, um mit diesem einfachen End-to-End-Beispiel zu spielen. Hunderte von Bildern sind ein guter Anfang für Model Maker, während mehr Daten eine bessere Genauigkeit erreichen könnten.

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

Sie könnten ersetzen image_path mit Ihrem eigenen Bild Ordner. Zum Hochladen von Daten in Colab finden Sie die Schaltfläche zum Hochladen in der linken Seitenleiste, die im Bild unten mit dem roten Rechteck angezeigt wird. Versuchen Sie einfach, eine ZIP-Datei hochzuladen und zu entpacken. Der Root-Dateipfad ist der aktuelle Pfad.

Datei hochladen

Wenn Sie nicht vorziehen , Ihre Bilder in den Cloud zu laden, können Sie versuchen , die Bibliothek vor Ort nach der laufen Führung in GitHub.

Führen Sie das Beispiel aus

Das Beispiel besteht nur aus 4 Codezeilen, wie unten gezeigt, von denen jede einen Schritt des Gesamtprozesses darstellt.

Schritt 1. Laden Sie Eingabedaten, die für eine geräteinterne ML-App spezifisch sind. Teilen Sie es in Trainingsdaten und Testdaten auf.

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

Schritt 2. Passen Sie das TensorFlow-Modell an.

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

Schritt 3. Bewerten Sie das Modell.

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

Schritt 4. In das TensorFlow Lite-Modell exportieren.

Hier haben wir TensorFlow Lite - Modell mit Export von Metadaten , die für Modellbeschreibungen einen Standard zur Verfügung stellt. Die Etikettendatei ist in Metadaten eingebettet. Die standardmäßige Quantisierungstechnik nach dem Training ist die vollständige Ganzzahlquantisierung für die Bildklassifizierungsaufgabe.

Sie können es in der linken Seitenleiste genauso wie den Upload-Teil für Ihren eigenen Gebrauch herunterladen.

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

Nach diesen einfachen 4 Schritte, könnten wir weiter TensorFlow Lite Modelldatei in On-Device - Anwendungen wie in verwenden Bildklassifizierungs- Referenz App.

Detaillierter Prozess

Derzeit unterstützen wir mehrere Modelle wie EfficientNet-Lite*-Modelle, MobileNetV2, ResNet50 als vortrainierte Modelle für die Bildklassifizierung. Es ist jedoch sehr flexibel, dieser Bibliothek mit nur wenigen Codezeilen neue vortrainierte Modelle hinzuzufügen.

Im Folgenden wird dieses End-to-End-Beispiel Schritt für Schritt durchgegangen, um mehr Details zu zeigen.

Schritt 1: Eingabedaten laden, die für eine geräteinterne ML-App spezifisch sind

Der Blumendatensatz enthält 3670 Bilder aus 5 Klassen. Laden Sie die Archivversion des Datensatzes herunter und entpacken Sie ihn.

Der Datensatz hat die folgende Verzeichnisstruktur:

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')

Verwenden DataLoader - Klasse Lastdaten.

Wie bei from_folder() Methode könnte es Daten aus dem Ordner laden. Es wird davon ausgegangen, dass sich die Bilddaten derselben Klasse im selben Unterverzeichnis befinden und der Unterordnername der Klassenname ist. Derzeit werden JPEG-kodierte Bilder und PNG-kodierte Bilder unterstützt.

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.

Aufteilen in Trainingsdaten (80 %), Validierungsdaten (10 %, optional) und Testdaten (10 %).

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

Zeigen Sie 25 Bildbeispiele mit Beschriftungen an.

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

Schritt 2: Anpassen des TensorFlow-Modells

Erstellen Sie ein benutzerdefiniertes Bildklassifikatormodell basierend auf den geladenen Daten. Das Standardmodell ist 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

Sehen Sie sich die detaillierte Modellstruktur an.

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
_________________________________________________________________

Schritt 3: Bewerten Sie das benutzerdefinierte Modell

Bewerten Sie das Ergebnis des Modells, ermitteln Sie den Verlust und die Genauigkeit des Modells.

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

Wir konnten die vorhergesagten Ergebnisse in 100 Testbildern darstellen. Vorhergesagte Etiketten mit roter Farbe sind die falschen vorhergesagten Ergebnisse, während andere richtig sind.

# 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

Wenn die Genauigkeit der App Anforderung nicht erfüllt, könnte man beziehen Erweiterte Nutzung zu Alternativen zu erkunden, wie auf ein größeres Modell zu ändern, die Anpassung Umschulungs Parameter usw.

Schritt 4: Exportieren in das TensorFlow Lite-Modell

Konvertieren Sie das trainierte Modell TensorFlow Lite - Modell - Format mit Metadaten , damit Sie später in einer On-Gerät ML Anwendung verwenden können. Die Labeldatei und die Vokabeldatei sind in Metadaten eingebettet. Der Standarddateiname ist TFLite model.tflite .

In vielen geräteinternen ML-Anwendungen ist die Modellgröße ein wichtiger Faktor. Daher wird empfohlen, das Modell zu quantisieren, um es zu verkleinern und möglicherweise schneller auszuführen. Die standardmäßige Quantisierungstechnik nach dem Training ist die vollständige Ganzzahlquantisierung für die Bildklassifizierungsaufgabe.

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

Siehe Beispielanwendungen und Führungen von Bildklassifikation , um weitere Informationen darüber , wie das TensorFlow Lite - Modell in mobile Anwendungen zu integrieren.

Dieses Modell kann in einem Android- oder iOS - App integriert werden , um die Verwendung von ImageClassifier API der TensorFlow Lite Task - Bibliothek .

Die zulässigen Exportformate können eines oder eine Liste der folgenden sein:

Standardmäßig exportiert es nur das TensorFlow Lite-Modell mit Metadaten. Sie können auch selektiv verschiedene Dateien exportieren. Exportieren Sie beispielsweise nur die Etikettendatei wie folgt:

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

Sie können auch das tflite Modell mit der bewerten evaluate_tflite Methode.

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

Erweiterte Nutzung

Die create Funktion der kritische Teil dieser Bibliothek ist. Es nutzt Transfer Lernen mit einem vortrainierter Modell ähnlich dem Tutorial .

Die create Funktion die folgenden Schritte enthält:

  1. Teilen Sie die Daten in der Ausbildung, Validierung, Testdaten gemäß Parametern validation_ratio und test_ratio . Der Standardwert von validation_ratio und test_ratio sind 0.1 und 0.1 .
  2. Laden Sie ein Bild Merkmalsvektor als das Basismodell von TensorFlow Hub. Das vortrainierte Standardmodell ist EfficientNet-Lite0.
  3. Fügen Sie einen Klassifikator Kopf mit einer Dropout - Schicht mit dropout_rate zwischen Kopfschicht und vortrainiert Modell. Der Standard dropout_rate ist der Standard dropout_rate Wert von make_image_classifier_lib von TensorFlow Hub.
  4. Verarbeiten Sie die rohen Eingabedaten vor. Gegenwärtig umfassen die Vorverarbeitungsschritte das Normalisieren des Wertes jedes Bildpixels, um den Eingabemaßstab zu modellieren und dessen Größe auf die Modelleingabegröße zu ändern. EfficientNet-Lite0 hat die Eingabeskala [0, 1] , und die Eingangsbildgröße [224, 224, 3] .
  5. Geben Sie die Daten in das Klassifikatormodell ein. Standardmäßig werden die Trainingsparameter wie die Ausbildung Epochen, Chargengröße, Lernrate, Dynamik sind die Standardwerte von make_image_classifier_lib von TensorFlow Hub. Nur der Klassifikatorkopf wird trainiert.

In diesem Abschnitt beschreiben wir mehrere fortgeschrittene Themen, darunter den Wechsel zu einem anderen Bildklassifizierungsmodell, das Ändern der Trainingshyperparameter usw.

Passen Sie die Quantisierung nach dem Training am TensorFLow Lite-Modell an

Post-Training - Quantisierung ist eine Umwandlungstechnik , die Modellgröße und Inferenz Latenz zu reduzieren, während auch CPU und Hardware - Beschleuniger - Inferenz Geschwindigkeit verbessert wird , mit einer wenig Verschlechterung der Modellgenauigkeit. Daher wird es häufig verwendet, um das Modell zu optimieren.

Die Model Maker-Bibliothek wendet beim Exportieren des Modells eine standardmäßige Quantisierungsmethode nach dem Training an. Wenn Sie nach dem Training Quantisierung anpassen möchten, unterstützt Model Maker mehrere Optionen nach dem Training Quantisierung QuantizationConfig auch. Nehmen wir die float16-Quantisierung als Beispiel. Definieren Sie zunächst die Quantisierungskonfiguration.

config = QuantizationConfig.for_float16()

Dann exportieren wir das TensorFlow Lite-Modell mit einer solchen Konfiguration.

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, können Sie das Modell mit dem Namen herunterladen model_fp16.tflite von der linken Seitenleiste, gleich wie der Hochladen Teil oben erwähnt.

Ändern Sie das Modell

Wechseln Sie zu dem Modell, das in dieser Bibliothek unterstützt wird.

Diese Bibliothek unterstützt mittlerweile EfficientNet-Lite Modelle, MobileNetV2, ResNet50. EfficientNet-Lite ist eine Familie von Bildklassifizierung Modellen , die state-of-art Genauigkeit und geeignet für Edge - Geräte erreichen könnte. Das Standardmodell ist EfficientNet-Lite0.

Wir könnten Modell MobileNetV2 wechseln , indem Sie nur Parametereinstellung model_spec der Spezifikation MobileNetV2 Modell in create Methode.

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

Bewerten Sie das neu trainierte MobileNetV2-Modell, um die Genauigkeit und den Verlust von Testdaten zu ermitteln.

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

Wechseln Sie zum Modell in TensorFlow Hub

Darüber hinaus könnten wir auch auf andere neue Modelle umsteigen, die ein Bild eingeben und einen Merkmalsvektor im TensorFlow Hub-Format ausgeben.

Als Auflegungs V3 Modell als Beispiel könnten wir definieren inception_v3_spec , die ein Objekt von ist image_classifier.ModelSpec und enthält die Spezifikation des Modells Auflegungs V3.

Wir müssen die Modellnamen angeben , name , die URL der TensorFlow Hub Modell uri . Inzwischen ist der Standardwert von input_image_shape ist [224, 224] . Wir müssen es ändern zu [299, 299] für Inception V3 - Modell.

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

Dann wird durch Einstellparameter model_spec zu inception_v3_spec in create Methode, könnten wir die Inception V3 Modell umschulen.

Die restlichen Schritte sind genau gleich und wir könnten am Ende ein angepasstes InceptionV3 TensorFlow Lite-Modell erhalten.

Ändern Sie Ihr eigenes benutzerdefiniertes Modell

Wenn wir möchten , dass das benutzerdefinierte Modell verwenden , die nicht in TensorFlow Hub ist, sollten wir erstellen und exportieren ModelSpec in TensorFlow Hub.

Dann beginnen zu definieren ModelSpec Objekt wie das Verfahren , das oben.

Ändern Sie die Trainingshyperparameter

Wir könnten auch die Ausbildung verändern Hyper wie epochs , dropout_rate und batch_size , die die Modellgenauigkeit beeinträchtigen könnten. Die Modellparameter, die Sie anpassen können, sind:

  • epochs : mehr Epochen könnte eine bessere Genauigkeit zu erreichen , bis es konvergiert aber Training für zu viele Epochen führen zu Überanpassung.
  • dropout_rate : Die Rate für Aussteiger, vermeiden Überanpassung. Keine standardmäßig.
  • batch_size : Anzahl der Proben in einem Trainingsschritt zu verwenden. Standardmäßig keine.
  • validation_data : Validierungsdaten. Wenn Keine, überspringt den Validierungsprozess. Standardmäßig keine.
  • train_whole_model : Wenn dies zutrifft, wird der Hub - Modul mit der Klassifikationsschicht oben ausgebildeten zusammen. Andernfalls trainieren Sie nur die oberste Klassifizierungsschicht. Standardmäßig keine.
  • learning_rate : Basislernrate. Keine standardmäßig.
  • momentum : ein Schwimmer Python an den Optimierer weitergeleitet. Wird nur verwendet , wenn use_hub_library Wahr ist. Standardmäßig keine.
  • shuffle : Boolean, ob die Daten gemischt werden sollen. Standardmäßig falsch.
  • use_augmentation : Boolean, Nutzungsdaten Augmentation zur Vorverarbeitung. Standardmäßig falsch.
  • use_hub_library : Boolean, Verwendung make_image_classifier_lib von tensorflow Nabe um das Modell umschulen. Diese Trainingspipeline könnte für komplizierte Datensätze mit vielen Kategorien eine bessere Leistung erzielen. Standardmäßig wahr.
  • warmup_steps : Anzahl der Warm - up Schritte für Warm - up Zeitplan auf Rate zu lernen. Falls keine, werden die Standard warmup_steps verwendet, die die gesamten Trainingsschritte in zwei Epochen sind. Wird nur verwendet , wenn use_hub_library Falsch ist. Standardmäßig keine.
  • model_dir : Optional, die Lage der Modell Checkpoint - Dateien. Wird nur verwendet , wenn use_hub_library Falsch ist. Standardmäßig keine.

Parameter , die wie keine standardmäßig sind epochs werden die konkreten Standardparameter in erhalten make_image_classifier_lib von TensorFlow Hub Bibliothek oder train_image_classifier_lib .

Wir könnten zum Beispiel mit mehr Epochen trainieren.

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

Bewerten Sie das neu umtrainierte Modell mit 10 Trainingsepochen.

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

Weiterlesen

Sie können unsere lesen Bildklassifizierungs- Beispiel zu lernen , technische Details. Weitere Informationen finden Sie unter: