[Lobe] Lobeで作成したモデルをTensorflow Lite形式でエクスポートしてMacで使用してみました

2020.11.07

1 はじめに

CX事業本部の平内(SIN)です。

前回、Microsoftによって公開されている機械学習ツール(Lobe)を試してました。

今回は、上記で作成した、モデルをTensorflow Lite形式でエクスポートして、Mac上で簡単なプログラムを作成して見ました。

最初に、作成したプログラムを実行しているようすです。

2 エクスポート

LobeのメニューからExportが選択可能です。

Tensorflow Liteを選択しています。

最適化するかどうかの選択がありますが、ここは「有効」としました。

少し、待つと、最適化及び出力が終わります。

3 出力内容

出力されたファイルは以下のとおりです。

※ Lobeでのモデル作成は、Windowsで実行しましたが、エクスポートしたファイルをMacにコピーして確認しています。

  • saved_model.tflite TFLite形式のモデル

  • signature.json ラベル名、入力形式などモデルに関する情報

  • example/tflite_example.py モデルを利用するサンプル

  • example/requirements.txt サンプル実行に必要なPythonライブラリ

  • example/README.md ドキュメント

4 サンプル実行

(1) フォルダ構成

出力されたファイルから、モデル及び、サンプルスクリプト等を以下のように配置しました。TOMATO.png 及び、AHIRU.pngは、推論の確認のために用意した画像ファイルです。

AHIRU.png

TOMATO.png

(2) 環境作成

Anacondaで作業環境(tflite)を新規に作成しています。

% conda create --name tflite python=3.7
% conda activate tflite
(tflite) %

(3) 依存関係

エクスポート出力に含まれているrequirements.txtを使用して依存関係をインストールします。

(tflite) % python -m pip install --upgrade pip && pip install -r requirements.txt

(4) tflite_runtime

tflite_runtimeが、インストールされますので、確認しておきます。

(tflite) % python3
>>> import tflite_runtime
>>> print(tflite_runtime.__version__)
2.1.0.post1

(5) 推論

サンプルスクリプトを実行すると、ちゃんと分類出来ていることが確認できます。

(tflite)  % python3 tflite_example.py ./AHIRU.png
{'Prediction': 'AHIRU', 'Confidences': [1.0, 0.0]}
(tflite)  % python3 tflite_example.py ./TOMATO.png
{'Prediction': 'TOMATO', 'Confidences': [3.0978231048070515e-14, 1.0]}

5 プログラム作成

サンプルスクリプトを参考にさせて頂いて、簡単にWebカメラの入力を推論するプログラムを作成してみました。

入力形式は、[1, 244, 244, 3] とし、signature.jsonは使用していません。また、サンプルでは、短い方(縦)の長さで正方形に切り取り、224*224にリサイズしてましたが、下記では省略してそのままリサイズしてます。(ちょっと縦横比が歪んでますが、とりあえず精度が出たので良しとしました)

# -*- coding: utf-8 -*-
import cv2
import time
import numpy as np
import tflite_runtime.interpreter as tflite

# モデル
model_file = "./saved_model.tflite"
SHAPE = 224

# Webカメラ
DEVICE_ID = 0 
WIDTH = 800
HEIGHT = 600
FPS = 24

def main():

    cap = cv2.VideoCapture (DEVICE_ID)

    # フォーマット・解像度・FPSの設定
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
    cap.set(cv2.CAP_PROP_FPS, FPS)

    # モデル初期化
    interpreter = tflite.Interpreter(model_file)
    interpreter.allocate_tensors()

    while True:

        # カメラ画像取得
        _, frame = cap.read()
        if(frame is None):
            continue

        # 入力形式に変換する [600, 800, 3] => [1, 244, 244, 3]    
        image = cv2.resize(frame, (SHAPE, SHAPE)) # => [244, 244, 3]
        image = image[np.newaxis, :] # => [1, 244, 244, 3]
        image = np.asarray(image) / 255.0 # 0..255 => 0..1
        image = image.astype(np.float32) # float64 => float32

        # 推論
        start = time.time()
        interpreter.set_tensor(0, image)
        interpreter.invoke()
        elapsed_time = time.time() - start

        # 結果表示
        output_details = interpreter.get_output_details()
        prediction = interpreter.get_tensor(output_details[0]['index'])[0].decode()
        confidences = interpreter.get_tensor(output_details[1]['index'])[0][0]
        print("{} {} {:.2f} sec".format(prediction, confidences, elapsed_time))
        frame = cv2.putText(frame, prediction, (30, HEIGHT - 100),cv2.FONT_HERSHEY_PLAIN, 10, (255, 255, 255), 10, cv2.LINE_AA)

        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

6 最後に

超簡単にモデルが作成できるLobeですが、作成したモデルは、エクスポートできることで、各種のフレームワークで利用可能です。

Object Detectionに対応するのが、待ち遠しいです。