画像分類器のカスタムモデルを作成する

1. 始める前に

前回の Codelab では、数百種類の画像を認識する基本的な画像ラベリング モデルを使用する Android アプリと iOS アプリを作成しました。花の写真に対しては、花びら、花、植物、空といった一般的な認識しかできませんでした。

アプリを更新して、特定の花(たとえば、ヒナギクやバラ)を認識できるようにするには、認識する花の種類ごとに多くのサンプルでトレーニングされたカスタムモデルが必要です。

前提条件

  • この学習プログラムの前の Codelab。

学習内容と作成するもの

  • TensorFlow Lite Model Maker を使用して画像分類のカスタムモデルをトレーニングする方法。

必要なもの

  • 特別なハードウェアは必要ありません。すべてブラウザで Google Colab を使用して完了できます。

2. 作成を開始する

以降のコードはすべて用意されています。こちらで Google Colab を使用して実行できます こちら。Google Colab にアクセスできない場合は、リポジトリのクローンを作成し、CustomImageClassifierModel.ipynb というノートブックを ImageClassificationMobile->colab ディレクトリで使用してください。

特定の花のサンプルが多数ある場合は、TensorFlow Lite Model Maker を使用してモデルをトレーニングし、それらを認識するのは比較的簡単です。

これを行う最も簡単な方法は、画像をディレクトリに分類して含む .zip ファイルまたは .tgz ファイルを作成することです。たとえば、ヒナギク、タンポポ、バラ、ヒマワリ、チューリップの画像を使用する場合は、次のようにディレクトリに整理できます。

4ee12554e75b103f.png

これを圧縮してサーバーでホストすると、モデルをトレーニングできます。このラボでは、用意されているものを使用します。

このラボでは、Google Colab を使用してモデルをトレーニングすることを前提としています。Colab は colab.research.google.com にあります。別の環境を使用している場合は、TensorFlow を含む多くの依存関係をインストールする必要があります。

3. 依存関係をインストールしてインポートする

  1. TensorFlow Lite Model Maker をインストールします。pip install でインストールできます。末尾の &> /dev/null は出力を抑制するだけです。Model Maker は、すぐには関連しない多くの情報を出力します。抑制されているため、目の前のタスクに集中できます。
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. 次に、使用するライブラリをインポートし、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')

環境が整ったので、モデルの作成を開始しましょう。

4. データをダウンロードして準備する

画像がフォルダに整理され、それらのフォルダが圧縮されている場合は、zip ファイルをダウンロードして解凍すると、画像が自動的にフォルダに基づいてラベル付けされます。このディレクトリは 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)

このデータパスは、TensorFlow Lite Model Maker の ImageClassifierDataLoader クラスを使用して、トレーニング用のニューラル ネットワーク モデルに読み込むことができます。フォルダを指定するだけで準備は完了です。

機械学習でモデルをトレーニングする際の重要な要素の 1 つは、トレーニングにデータのすべてを使用しないことです。 以前に見たことのないデータでモデルをテストするために、少しだけ残しておきます。これは、ImageClassifierDataLoader から返されるデータセットの split メソッドで簡単に行えます。0.9 を渡すと、90% がトレーニング データ、10% がテストデータになります。

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

これでデータの準備ができたので、これを使用してモデルを作成できます。

5. 画像分類モデルを作成する

Model Maker は、ニューラル ネットワークの設計の詳細の多くを抽象化するため、ネットワーク設計や、畳み込み、密結合、relu、平坦化、損失関数、オプティマイザなどを処理する必要はありません。デフォルト モデルの場合は、1 行のコードで、提供されたデータを使用してニューラル ネットワークをトレーニングすることでモデルを作成できます。

model = image_classifier.create(train_data)

これを実行すると、次のような出力が表示されます。

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

最初の部分はモデル アーキテクチャを示しています。Model Maker が舞台裏で行っているのは転移学習です。転移学習では、既存の事前トレーニング済みモデルを開始点として使用し、そのモデルが学習した画像の構成方法に関する情報を取得して、これらの 5 つの花の理解に適用します。 これは、次のように表示される最初の行で確認できます。

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

重要なのは「Hub」という単語で、このモデルが TensorFlow Hub から取得されたことを示しています。デフォルトでは、TensorFlow Lite Model Maker は、1, 000 種類の画像を認識するように設計された「MobileNet」というモデルを使用します。ここで重要なのは、1,000 個のクラスを区別するための「特徴」を学習することで、その方法論を再利用できることです。同じ「特徴」を 5 つの花のクラスにマッピングできるため、最初から学習する必要はありません。

モデルは 5 エポックでトレーニングされました。エポックとは、ニューラル ネットワークが画像とそのラベルを照合しようとするトレーニングの完全なサイクルです。5 エポックを完了するまでに(約 1 分)、トレーニング データで 93.85% の精度を達成しました。5 つのクラスがあることを考えると、ランダムな推測では 20% の精度になるため、進歩しています。(「損失」の数値も報告されますが、今のところは無視してかまいません)。

先ほどデータをトレーニング データとテストデータに分割したので、以前に見たことのないデータに対するネットワークのパフォーマンスを測定できます。テストデータで model.evaluate を使用すると、実際のパフォーマンスをより正確に把握できます。

loss, accuracy = model.evaluate(test_data)

次のような出力が表示されます。

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

ここで精度に注目してください。88.01% なので、実際の環境でデフォルト モデルを使用する場合は、このレベルの精度が期待できます。約 1 分でトレーニングしたデフォルト モデルとしては悪くありません。もちろん、モデルを改善するために多くの調整を行うこともできます。これはそれ自体が科学です。

6. モデルをエクスポートする

モデルのトレーニングが完了したら、モバイル アプリケーションで使用できる .tflite 形式でエクスポートします。Model Maker には、出力先のディレクトリを指定するだけで使用できる簡単なエクスポート メソッドが用意されています。

以下にコードを示します。

model.export(export_dir='/mm_flowers')

Google Colab で実行している場合は、画面左側のフォルダ アイコンをクリックしてモデルを表示できます。

cc5b9988775633b4.png

ここから、現在のディレクトリの一覧が表示されます。示されているボタンを使用して、1 つ上のディレクトリに移動します。

51e6ac47c992142a.png

コードでは、mm_flowers ディレクトリにエクスポートするように指定しました。このディレクトリを開くと、「model.tflite」というファイルが表示されます。これがトレーニング済みのモデルです。

57bad87f294fd189.png

ファイルを選択すると、右側に 3 つのドットが表示されます。これらをクリックしてコンテキスト メニューを表示し、そこからモデルをダウンロードできます。

aee14ad10c4a8a1a.png

しばらくすると、モデルがダウンロード フォルダにダウンロードされます。

7. 完了

これで、モバイルアプリに統合する準備ができました。次のラボで統合を行います。