1. 始める前に
前の Codelab では、数百種類の画像を認識する基本的な画像ラベル付けモデルを使用した Android および iOS 向けのアプリを作成しました。花びら、花、植物、空を見ているような、花の画像をごく一般的なものとして認識しました。
たとえば、特定の花、ヒナギク、バラを認識するようにアプリを更新するには、認識したいそれぞれの種類の花の多くのサンプルでトレーニングされたカスタムモデルが必要です。
前提条件
- この学習プログラムの前の Codelab
作成する内容と学習内容
- TensorFlow Lite Model Maker を使用して画像分類器のカスタムモデルをトレーニングする方法。
必要なもの
- 特別なハードウェアは必要ありません。ブラウザで Google Colab を使用してすべてを完了できます。
2. 作成を開始する
これから紹介するコードはすべてあらかじめ用意されており、こちらの Google Colab を使用して実行できます。Google Colab にアクセスできない場合は、リポジトリのクローンを作成して、ImageClassificationMobile->colab
ディレクトリにある CustomImageClassifierModel.ipynb
というノートブックを使用できます。
特定の花のサンプルが多数ある場合は、TensorFlow Lite Model Maker を使用してモデルをトレーニングし、比較的簡単に花を認識できます。
最も簡単な方法は、画像を含む .zip ファイルまたは .tgz ファイルを作成し、ディレクトリに分類することです。たとえば、ヒナギク、タンポポ、バラ、ヒマワリ、チューリップの画像を使用する場合は、次のようにディレクトリにまとめることができます。
圧縮してサーバーでホストすれば、そのデータを使ってモデルをトレーニングできます。このラボの以降の部分では、あらかじめ用意されているものを使用します。
このラボでは、Google Colab を使用してモデルをトレーニングしていることを前提としています。colab は colab.research.google.com にあります別の環境を使用している場合は、多くの依存関係をインストールしなければならないかもしれません。特に TensorFlow はこれに当てはまります。
3. 依存関係をインストールしてインポートする
- TensorFlow Lite Model Maker をインストールします。これは pip のインストールで実行できます。&>/dev/null at the end just suppresses the output.Model Maker は、すぐには関連性のない多くの内容を出力します。目の前のタスクに集中できるように、非表示になっています。
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
- 次に、必要なライブラリをインポートして、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 形式で圧縮されている場合、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
クラスでトレーニングできます。フォルダを指すだけで OK
ML でモデルをトレーニングする際の重要な要素の一つは、データのすべてをトレーニングに使用しないことです。まだ見たことのないデータでモデルをテストするため、少しお待ちください。これは、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 は「MobileNet」というモデルを使用します。これは 1,000 種類の画像を認識するように設計されています。ここでのロジックは、使用する手法が「特徴」を学習して1, 000 個のクラスを区別するために再利用できます。同じ「機能」は花の 5 つのクラスにマッピングできるため、ゼロから学ぶ必要はありません。
モデルは 5 エポックを完了しました。エポックとは、ニューラル ネットワークが画像をラベルと照合する 1 回のトレーニング サイクルのことです。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 で実行している場合は、画面の左側にあるフォルダ アイコンをクリックするとモデルを表示できます。
現在のディレクトリのリストが表示されます。指定されたボタンを使用して「上」に移動しますディレクトリを作成します。
コードで、mm_flowers ディレクトリにエクスポートするように指定した場合。開くと、「model.tflite
」というファイルが表示されます。これがトレーニング済みモデルです。
ファイルを選択すると、右側に 3 つのドットが表示されます。これらをクリックしてコンテキスト メニューを表示し、そこからモデルをダウンロードできます。
しばらくすると、モデルがダウンロード フォルダにダウンロードされます。
7. 完了
これでモバイルアプリに統合する準備が整いました。これは次のラボで行います。