頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


Kerasでの学習結果をmlmodelにしてiOSで使う

タイトル通りKerasで学習させ、その結果をmlmodelファイルで得て、それをiOSで使いたい。その変換に恐ろしく苦労した。

Python version 3.7.4
TensorFlow version 2.0.0
tf.keras version 2.2.4-tf
macOS Catalina 10.15.1

↑という環境。
自作のデータセットでMNISTをやってみた。

学習結果を
model.save(H5FilePath)
てな感じで.h5ファイルとして保存。まあここまではOK。

次にこの.h5ファイルを変換する。

GitHub - apple/coremltools: Core ML Community Tools.
Python3+Keras2のモデルをCore ML形式に変換する(2018年5月) - Qiita
Core MLモデルの入力の型をMLMultiArrayから画像(CVPixelBuffer)に変更する - Qiita

↑この辺りを参考にcoremltoolsを使いやってみたものの、、、できない。
AttributeError: module 'coremltools.converters.keras' has no attribute 'convert'
とか。
公式通りvirtualenv使ったり、Kerasをインストール(tf.kerasじゃダメ!って見たので)したり、Pythonのバージョンを3.5にしてみたり。
まあいろいろやってみたんだけど俺にはできなかった。

TensorFlowのバージョンを1.xに下げるといいともあったが、これは最後の手段ということで模索し続けた。


結局のところ、使ったのはtfcoremlだ、、、何?この敗北感。
import tfcoreml # 1.1

model = tfcoreml.convert(H5FilePath,
input_name_shape_dict={'x_input': (1, 28, 28, 1)},
output_feature_names=['Identity'],
image_scale = 1.0/255.0,
minimum_ios_deployment_target='13'
#(※1)
)

model.save(MlmodelFilePath)
↑これでやっと.mlmodelが出力された!
と喜んだのも束の間、iOSで使おうとすると

let vnmodel = try VNCoreMLModel(for: weights().model)
↑ここで落ちる。modelを作成自体できなかった。

さらに調べると
coremltools 3.1の環境構築(2019年11月版) - Qiita
↑mlmodelを修正というかupdateするなんてできるそうだ。

試してみたところ、確かにmlmodelの入力の形式が

Xcodeでmlmodelを見た結果1
↑MultiArray (Double 1 x 28 x 28 x 1) だったのが、、、

Xcodeでmlmodelを見た結果2
↑Image (Grayscale 28 x 28)に変わった。

これをiOSで使うとなんとか予測の計算はできた。

ただ、mlmodelの出力形式がMultiArray (Double)なので(Kerasの出力がsoftmax関数なので)、自分でどのラベルに該当するか処理を記述必要がある。VNClassificationObservationは使えず、VNCoreMLFeatureValueObservationからMLMultiArrayの中身を調べて最大なのを探すとか。
出力形式もupdateしたかったがやり方がわからなかった。

※1のところで
image_input_names = ['x_input’],
class_labels = classLabels,
などが指定できたらいいのだけど、できなかった。
スポンサーサイト




<< coremltoolsでKerasでの学習結果をmlmodelにconvertしたい  TopPage  macOS CatalinaにPython/TensorFlowをインストール >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1324-ff0beb82




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