前回、サンプルの分類器を使用して画像認識を行いましたが、今回は前回のプログラムを利用して自作した分類器で画像認識してみたいと思います。
TensorFlow-Lite には model-maker という大変ありがたい機能があるので、これを利用して分類器を作成します。

参考(TensorFlowLiteモデルメーカーによる画像分類

画像データのダウンロード

自分でデータを作るのも面倒なので、すでにあるものを有難く頂戴いたします。
サンプル画像の圧縮ファイルをダウンロードして解凍します。

cd ~/tensorflow-lite-tutorial/
curl https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz  | tar xzv -C ./

以下のようなフォルダ構成となります。

各フォルダ名がラベルになってます。
flower_pothosフォルダを指定することで、その中のフォルダ名ごとのラベルで分類器を作成します。

Pythonライブラリインストール

前回、インストールしたpipenv上でライブラリをインストールします。

pipenv shell
pip install -q tflite-model-maker

分類器作成

Pythonを起動して、Pythonプロンプト上で実行します。
もちろん、pyファイルにして実行してもOKです。

python
import os
import numpy as np
import tensorflow as tf

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

# 画像データフォルダを指定
data = DataLoader.from_folder('./flower_photos')
# 画像データの中の90%をトレーニングデータとして設定
train_data, test_data = data.split(0.9)
model = image_classifier.create(train_data)
loss, accuracy = model.evaluate(test_data)
# 分類器を出力
model.export(export_dir='.', tflite_filename='flower_photos.tflite', label_filename='flower_photos_labels.txt', with_metadata=False)

3行目、13行目でエラーが出ますが、GPUが使えないために発生しているようです。
CPUを使う設定に切り替わるので、とりあえず、無視して実行します。

最後のexportで、「with_metadata=False」を指定しないとlabels.txtが出力されないようです。
正規サイトのAPIにも何も書いてないですが。

画像認識を実行

flower_photosの中から適当に画像を選んで認識させてみます。
とりあえず、以下のファイルをカレントフォルダにコピーしました。

flower_photos/sunflowers/164670455_29d8e02bbd_n.jpg

pythonプロンプトを終わります。

exit()

前回のlabel_image.pyを、引数で今回作成したモデルやラベルファイル、認識する画像を指定して実行します。

python label_image.py \
  --model_file ./flower_photos.tflite \
  --label_file ./flower_photos_labels.txt \
  --image ./164670455_29d8e02bbd_n.jpg

結果はこんな感じ。

0.913725: sunflowers
0.054902: daisy
0.019608: roses
0.007843: tulips
0.007843: dandelion
time: 852.644ms

ちゃんと「sunflowers」と認識されました。