頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


tfcoremlを使ってTensorFlowの学習結果をiOS/macOSアプリで使う

機械学習の結果をiOS/macOSアプリで使おうとするといくつか方法はある。

CreateMLで学習させると結果をmlmodelファイルで得ることができ、これをiOS/macOSアプリではCoreML+Visionで簡単に使うことができる。
この方法が一番簡単だと思うが自分の場合ではCreateMLだと学習が進まなかったこともあり断念。

TensorFlow、もしくはKeras(バックエンドはTensorFlow)での学習結果を使う場合にはiOS/macOSアプリでweightやbiasのデータを読み込んでMetalPerformanceShadersを使ったことはあった。今回もそうしようと思ったのだが、、、MPSCNNConvolutionのイニシャライザ
init(device:convolutionDescriptor:kernelWeights:biasTerms:flags:)
が deprecated in iOS 11.0 と出てしまう。そらあかん。
ということで今回は、、、

TensorFlowで作ったモデルをCore MLで利用する - Qiita
↑こちらの記事を参考にTensorFlowで学習、pbファイルを出力し、それをtfcoremlを使ってmlmodelに変換してiOS/macOSアプリで使ってみることにした。その時に躓いたところをメモしておく。


1)tfcoremlのインストール
tfcoreml · PyPI
↑本家tfcoremlのサイト。現時点で0.3.0が最新か。betaもあるみたいだけどおっかないので
pip install -U tfcoreml
で0.3.0をインストール。ちなみにPythonは3.5.2、TensorFlowは1.7.0-rc1。


2)TensorFlowでのモデル作成
#    x = tf.placeholder(tf.float32, [None, HEIGHT*WIDTH], name = 'x')
x = tf.placeholder(tf.float32, [None, HEIGHT, WIDTH, 1], name = 'x')
↑入力がHEIGHT*WIDTHになっていた(MNISTの例題などではこうなってるのでその流れでこうなってた)ので区切って画像形式にしたここではカラーではなくグレースケールなので1にしてる。
pbファイルとして出力するところは略。


3)tfcoremlで変換
classLabels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

tf_converter.convert(tf_model_path = PbFilePath,
mlmodel_path = MlmodelFilePath,
output_feature_names = ['y_conv:0'],
input_name_shape_dict = {'x:0':[1, Height, Width, 1]},
image_input_names = ['x:0'], # — (1)
class_labels = classLabels, # —(2)
image_scale = 1.0/255.0 # —(3)
)
↑肝心の変換部分はこんな感じ。
(1)image_input_namesは上記参考記事の通り。画像形式にしておくとiOS/macOSアプリで使う時にもラク。
(2)softmaxを使う画像分類なのだがclass_labelsを設定しないと結果を見てもよくわかんない、となるのでラベルの設定が必要だった。
(3)自分のモデルには必要だった。0から1の値で学習させていたんだわ。

変換処理をすると
[espresso] [Espresso::handle_ex_] exception=Unsupported engine type
[espresso] [Espresso::handle_ex_] exception=Espresso exception: "Device not found": Can't find metal device

といった警告が表示される。

macOSアプリでもmlmodelロード時(?)にも同じものが表示されたが、意図通りに予測できていた。
Core ML+Visionを用いた物体認識の最小実装 - Qiita
↑iOS/macOSアプリでmlmodelを使うのはこのあたりを参考に。

予測の実行結果
↑macOSアプリでの予測結果。あってるよ〜!
助かった!ありがとう、tfcoreml!
スポンサーサイト




<< grayscaleのMTLTextureをCoreML/Visionの予測に渡す  TopPage  iPhone故障で確認コード受信できずApple IDでサインインできない! >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1318-1b2b28a3




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.