今回の記事はTensorflowのエッジデバイス用のtflite形式の学習モデルをPythonで利用して、任意の画像を識別させる方法について記載いたします。
基本的にswiftやjava/kotlinなどのスマホ端末に組み込まれることになると思われますが、モデルの作成に関しては基本的にPythonでの作成になるのでPythonでその場で精度を確認できれば最も楽だと思われます。
では早速メインの記事に進んでいきます。
Pythonでtfliteモデルを使う流れ
まずは識別のざっくりとした流れですが、全体的な流れはモデルの読み込み、画像のインプット、識別結果の出力といった流れです。
その際に使用するのがinterpreterというものです。
こちらがKerasのh5モデルやTensorflowのpbモデルにはない考え方なので初めはよくわかっておりませんでした。
使い方としてはインプットアウトプットの出力やインプット画像の配列情報を全てinterpreterに入れ、その後にメソッドのinvoke()というものを使って、識別させて出力結果を出しているという流れです。
では実際のコードを見つつ解説をこなっていきます。
Pythonでtfliteモデルを使うコード
import numpy as np
import tensorflow as tf
from PIL import Image
import numpy as np
# Load the TFLite model and allocate tensors.
interpreter = tf.lite.Interpreter(model_path="[モデルパス].tflite")
interpreter.allocate_tensors()
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Test the model on random input data.
input_shape = input_details[0]['shape']
image_size = 50
file = "[識別画像パス].JPG"
image = Image.open(file)
image = image.convert("RGB")
image = image.resize((image_size, image_size))
data = np.asarray(image)
data = data[ np.newaxis,:, :, :]
input_data = np.array(data, dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
# The function `get_tensor()` returns a copy of the tensor data.
# Use `tensor()` in order to get a pointer to the tensor.
output_data = interpreter.get_tensor(output_details[0]['index'])
print(output_data)
まず初めに、interpreterに入力出力を指定しています。
その後にモデル読み込みを行います。
そしてdumpy、Imageを用いて画像をnumpyの配列として読み込みます。
その際に次元がtfliteの形式と違うので揃える必要があります。
そのために「newaxis」で次元の拡張を行っております。
それらの準備が終わればinvokeで識別させて、出力をoutput_tensorで取得しております。
コメント