8
10

More than 3 years have passed since last update.

【AI】LobeからExportしたモデルの使い方

Last updated at Posted at 2020-11-25

➊はじめに

前回は『【AI】LobeでMNISTをやってみた』にて、AI側については一切プログラミングすることなく、推論エンジンをローカルPCにデプロイしました。また、Local APIを介してアプリと推論エンジンの通信を行いました。
system

➋今回やること

LobeからTensorFlow(saved_model)形式でエクスポートし、そのモデルを利用できるか確認してみたいと思います。今回はLobeが用意した➎Lobe-APIを使用する方法と、➏tensorflowライブラリを使用する方法の2種類を検証したいと思います。
system

➌Lobeからエクスポート

■エクスポート形式

Lobeからのエクスポート形式は、以下4つに対応しています。
今回は「TensorFlow 1.15 SavedModel」を検証します。

Export 説明
TensorFlow 1.15 SavedModel TensorFlowのSavedModelは、TensorFlow 1.xを実行するPythonアプリケーションで使用される標準形式であり、TensorFlow Webサービスにデプロイして、APIとしてクラウド上で推論を実行できます。
AndroidまたはRaspberryPi モデルをTensorFlowLiteとしてエクスポートして、モバイルおよびIoTアプリケーションで使用します。
Apple iOS モデルをCoreMLとしてエクスポートして、iOS、iPad、およびMacアプリを開発します。
ローカルAPI LobeはローカルAPIをホストして、RESTエンドポイントを介してモデルを呼び出します。このオプションを使用して、アプリの開発中に予測を実行するサービスをモックします。

■エクスポート実施

■Lobeから対象PJを開いて、[Export]を押下します。
Export001.PNG

■[TensorFlow]を押下します。
Export002.PNG

■書き出しフォルダを選択するとExportが始まります。
Export003.PNG

■エクスポート結果

SavedModel形式については、TensorFlow:「SavedModel形式の使用」等をご参考ください。

export model
    │
    ├─example
    │     │
    │     ├─README.md
    │     ├─requirements.txt
    │     └─tf_example.py
    │
    ├─variables
    │     │
    │     ├─variables.data-00000-of-00001
    │     └─variables.index
    │
    ├─saved_model.pb
    └─signature.json

➍Lobe-APIとは

Lobeは、Exportしたモデルを簡単に読み込むためのライブラリLobe-APIを用意しています。このLobe-APIを使うと以下の通りイメージファイル、URL、画像データから直接推論が可能となります。ただし、Lobe-APIをインストールするとtensorflowのバージョンが1.15にデグレードされてしまうので注意が必要です。

詳細はここ → Lobe-API:https://github.com/lobe/lobe-python

OPTION 1:イメージファイルから推論する場合

from lobe import ImageModel

model = ImageModel.load('path/to/ExportFolder')
result = model.predict_from_file('path/to/file.png')

OPTION 2:URLから推論する場合

from lobe import ImageModel

model = ImageModel.load('path/to/ExportFolder')
result = model.predict_from_url('http://path/to/file.png')

OPTION 3:Pillow imageから推論する場合

from lobe import ImageModel
from PIL import Image

model = ImageModel.load('path/to/ExportFolder')
img = Image.open('path/to/file.png')
result = model.predict(img)

➎【使い方1】Lobe-APIを使用

では、早速Lobe-APIを使って推論を実施させたいと思います。

■python仮想環境構築

まず、anacondaのcondaコマンドを使用して、python仮想環境[lober1]を作ります。
Lobe-APIはpython=3.7以上でないと動かないため以下のように設定します。

2020/11現在、Google ColabのPythonバージョンは3.6.9なので、Google ColabではLobe-APIは使えませんでした。

仮想環境[lober1]構築
C:\Lobe test>conda create -n lober1 python=3.7
C:\Lobe test>conda activate lober1

■Lobe-APIのインストール

依存関係にあるライブラリも合わせて自動でインストールされます。

Lobe-APIインストール
(lober1) C:\Lobe test>pip install git+https://github.com/lobe/lobe-python

■Lobe-APIが返却する推論結果数を変更

Lobe-APIのデフォルトでは、推論結果を「認識率ベスト5までのクラスをソート」して返却してきます。
推論結果をどの様に使うかによりますが、今回は全クラス返却するように変更します。
仮想環境[lober1]下にインストールされたライブラリを修正します。

C:\Users\[username]\anaconda3\envs\lober1\Lib\site-packages\lobe_results.py
「_results.py」のLine20を以下の様に修正します。

_results.py
 20:        top_predictions = confidences.argsort()[-5:][::-1] ← ベスト5のみに絞っている
                            ↓↓↓↓
 20:        top_predictions = confidences.argsort()[:][::-1]  ← 全クラスに変更

■サンプルプログラム

src01.py
############################################################
# Lobeで作ったモデルを使う方法 1
############################################################
import tensorflow as tf
from lobe import ImageModel


print("tensorflow : ", tf.__version__)


############################################################
# Export Model読込
############################################################
model = ImageModel.load('export model')


#-----------------------------------------------------
# OPTION 1: イメージファイルから推論する場合
#-----------------------------------------------------
print('■OPTION 1: Predict from an image file')
result = model.predict_from_file('sample.png')
pred = result.prediction
sorted_labels = sorted(result.labels)
conf = sorted_labels[int(result.prediction)][1]
print('predict   :', pred)
print('confidence: {:1.010f}'.format(conf))

for label, conf in (sorted(result.labels)):
    print(label, '{:1.030f}'.format(conf))
print()


#-----------------------------------------------------
# OPTION 2: URLから推論する場合
#-----------------------------------------------------
print('■OPTION 2: Predict from an image url')
result = model.predict_from_url('https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/4f9c554d-f3f5-fc8d-2e08-30e8eb6079a4.png')

pred = result.prediction
sorted_labels = sorted(result.labels)
conf = sorted_labels[int(result.prediction)][1]
print('predict   :', pred)
print('confidence: {:1.010f}'.format(conf))

for label, conf in (sorted(result.labels)):
    print(label, '{:1.030f}'.format(conf))
print()


#-----------------------------------------------------
# OPTION 3: Pillow imageから推論する場合
#-----------------------------------------------------
print('■OPTION 3: Predict from Pillow image')
from PIL import Image
img = Image.open('sample.png')
result = model.predict(img)

pred = result.prediction
sorted_labels = sorted(result.labels)
conf = sorted_labels[int(result.prediction)][1]
print('predict   :', pred)
print('confidence: {:1.010f}'.format(conf))

for label, conf in (sorted(result.labels)):
    print(label, '{:1.030f}'.format(conf))
print()

■サンプルデータ

以下のサンプルデータを「sample.png」として「src01.py」と同じフォルダに保存してください。

サンプルデータ:sample.png
サンプル画像URL:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/4f9c554d-f3f5-fc8d-2e08-30e8eb6079a4.png

■プログラミング実行結果

src01.py実行結果
(lober1) C:\Lobe test>python src01.py
tensorflow :  1.15.4
■OPTION 1: Predict from an image file
predict   : 9
confidence: 0.9999991655
0 0.000000000000000000004691450972
1 0.000000000000000000000000000000
2 0.000000000000000000204086976737
3 0.000000000000000000000101685206
4 0.000000000000000012389047993676
5 0.000000000000000000010694401651
6 0.000000000000000000000000045193
7 0.000000881124378793174400925636
8 0.000000000000000404111716429163
9 0.999999165534973144531250000000

■OPTION 2: Predict from an image url
predict   : 9
confidence: 0.9999991655
0 0.000000000000000000004691450972
1 0.000000000000000000000000000000
2 0.000000000000000000204086976737
3 0.000000000000000000000101685206
4 0.000000000000000012389047993676
5 0.000000000000000000010694401651
6 0.000000000000000000000000045193
7 0.000000881124378793174400925636
8 0.000000000000000404111716429163
9 0.999999165534973144531250000000

■OPTION 3: Predict from Pillow image
predict   : 9
confidence: 0.9999991655
0 0.000000000000000000004691450972
1 0.000000000000000000000000000000
2 0.000000000000000000204086976737
3 0.000000000000000000000101685206
4 0.000000000000000012389047993676
5 0.000000000000000000010694401651
6 0.000000000000000000000000045193
7 0.000000881124378793174400925636
8 0.000000000000000404111716429163
9 0.999999165534973144531250000000

➏【使い方2】TensorFlowライブラリを使用

Lobe-APIを使用せずに、tensorflowライブラリを使って推論する方法です。

■python仮想環境構築

anacondaを利用してpython仮想環境[lober2]を作ります。

仮想環境[lober2]構築
(lober1) C:\Lobe test>conda deactivate
C:\Lobe test>conda create -n lober2 python=3.7
C:\Lobe test>conda activate lober2
(lober2) C:\Lobe test>conda install tensorflow pillow

■サンプルプログラム

src02.py
############################################################
# Lobeで作ったモデルを使う方法 2
############################################################
import json
import numpy as np
import tensorflow as tf
from PIL import Image
from tensorflow.keras.preprocessing.image import img_to_array


print("tensorflow : ", tf.__version__)
export_holder = 'export model/'


############################################################
# Export Model読込
############################################################
# https://www.tensorflow.org/guide/saved_model
# signature読込
sig_holder = export_holder + 'signature.json'
with open(sig_holder, 'r') as f:
    signature = json.load(f)

inputs = signature.get('inputs')
outputs = signature.get('outputs')

# モデルの学習画像サイズを取得
input_width, input_height = inputs['Image']['shape'][1:3]

# model読込
model = tf.saved_model.load(export_holder)
infer = model.signatures['serving_default']


############################################################
# 画像データ読込
############################################################
imgPIL = Image.open('sample.png')
imgPIL = imgPIL.convert('RGB')
imgPIL = imgPIL.resize((input_width, input_height))

x = img_to_array(imgPIL) / 255
x = x[None, ...]

############################################################
# 推論
############################################################
predict = infer(tf.constant(x))

# 推論結果
predict = infer(tf.constant(x))['Prediction'][0]
print('predict   :', predict.numpy().decode())

# 確率
confidence = infer(tf.constant(x))['Confidences'][0]
confidence = confidence.numpy()
print('confidence: {:1.010f}'.format(confidence[int(predict)]))
print()

for i, conf in enumerate(confidence):
    print(i, '{:1.030f}'.format(conf))
print()

■サンプルデータ

以下のサンプルデータを「sample.png」として「src02.py」と同じフォルダに保存してください。

サンプルデータ:sample.png

■プログラミング実行結果

src02.py実行結果
(lober1) C:\Lobe test>python src02.py
tensorflow :  2.1.0
predict   : 9
confidence: 0.9999991655

0 0.000000000000000000004691540637
1 0.000000000000000000000000000000
2 0.000000000000000000204095532887
3 0.000000000000000000000101689472
4 0.000000000000000012389331716626
5 0.000000000000000000010694728000
6 0.000000000000000000000000045193
7 0.000000881154619492008350789547
8 0.000000000000000404117883887810
9 0.999999165534973144531250000000

➐手書きアプリケーション

せっかくなので、いつもの手書きwebツールのmnisterをTensorflowモデルを読み込めるように改造してみました。こちらは【使い方2】のTensorFlowライブラリを使用する方法でモデルを利用しています。ダウンロードは以下から取得可能となっていますので、ぜひご参考ください。

※「mnister_for_tensorflow」アプリケーションを動作させる場合は、LobeのTensorFlow Exportモデルを各自用意する必要があります。モデルの作り方は『【AI】LobeでMNISTをやってみた』と『本項➌』を参考にすれば簡単に実行できます。

■システム図

system

■ダウンロード

mnister_for_Tensorflowを格納するディレクトリに移動後、以下のgit cloneコマンドを打ち込んでmnister_for_TensorflowツールをGETしてください。実行方法などはREADME.mdをご参照ください。

command
git clone https://github.com/PoodleMaster/mnister_for_tensorflow


Github : https://github.com/PoodleMaster/mnister_for_tensorflow

➑以上

LobeからエクスポートしたTensorFlowモデルは、APIなども用意されており、問題なく簡単に利用することができました。

microsoftの『Lobe』やGoogleの『Teachable Machine』など、AIプログラミングすることなく、誰でも簡単にモデルを構築できたり、推論結果からモデルの更新ができるようになってきました。これからは、益々AIでどんなサービスができるかが重要視される時代になっていくんでしょうね…

お疲れ様でした。

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10