頭と尻尾はくれてやる!

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


iOSアプリ「個体値カメラ」をリリースしました(ポケモンGO用)

個体値カメラのアイコン
個体値カメラ
↑リリースしました。

このアプリを使うには
ポケモンGOアプリが入っているiOSデバイスと
このアプリを入れた別のiOSデバイス
の2台が必要です。



↑このようにポケモンGOアプリで個体値を表すグラフを表示させ、それをこのアプリのカメラを通して見るとARっぽく個体値(%)を表示します。
当アプリの画面をタップすると画像を保存します。



↑保存した画像はこのようにまとめて見ることができます。


※権利に配慮し動画内ではポケモンGOアプリの画面にはボカシを入れていますが、アプリではそのまま表示されます


coremltoolsでKerasでの学習結果をmlmodelにconvertしたい

Kerasでの学習結果をmlmodelにしてiOSで使う
↑これを書きながら、.h5ファイルの出力まではTensorFlow2.0でやって、.h5ファイルを読み込んでconvertするところは別にTensorflow 1.xでもいいのでは?と思ったので試してみた。

pyenv envTF1
として環境を作成しそこでTensorFlow 1.14などをインストールしてみた
(envTF1) pip install tensorflow==1.14.0 coremltools

coremltoolsは3.1
import coremltools
coreml_model = coremltools.converters.keras.convert(H5FilePath,
以下略
これを実行するも
AttributeError: module 'coremltools.converters.keras' has no attribute 'convert'
↑こういうエラーが出る。

AttributeError: module 'coremltools.converters.keras' has no attribute 'convert' · Issue #266 · apple/coremltools · GitHub
↑standalone Kerasが必要というのをみたので

(envTF1) pip install keras==2.2.4
でKerasをインストール。

先ほどのコードに
Import keras
を追加して実行すると、、、

ValueError: Unknown initializer: GlorotUniform
↑エラーメッセージが変わったのだが、、、

このエラーは消せなかった。挫折。

以上がPython 3.7.4の話。
試しに元々インストールしてたPython 3.5.2があったのでそれでも試してみたが同様にダメだった。

結局tfcoremlで頑張るわ、、、orz



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,
などが指定できたらいいのだけど、できなかった。


macOS CatalinaにPython/TensorFlowをインストール

Macのクリーンインストール顛末
↑意図せずMacをクリーンインストールする羽目になったので、PythonやTensorFlowをまた使えるようにすることになった。

まずはPythonの設定から。

HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ - Qiita
↑こちらの記事がとても参考になった。ありがとう!

Homebrewは公式サイトの通りでok(FFmpegをインストールするために入れてた)。

brew install pyenv
でpyenvをインストール。
Catalinaはbashじゃなくzshなので
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
とする。

pyenv install -l
で見ると

pyenv install -lの結果

↑ずらーっと表示されるのだが、anacondaが欲しかったので3で新しいのを、ってことで

pyenv install anaconda3-2019.10

でインストール。


ずっとPythonはXcodeで動かしてたのでその設定をする。

【開発環境】XcodeでPython【画面遷移あり】 - Qiita
頭と尻尾はくれてやる! Python3をXcodeで
などを見ながら設定。

次にTensorFlow。今は2.0が最新みたい。
インストールの方法を調べるもよくわからないから
TensorFlow
↑公式サイトにある通りに
pip install tensorflow
した。


XcodeでPythonを動かした結果

↑無事XcodeでPython3、TensorFlowが動いてるようだ。



参考ページ
pyenvを使ってMacにPythonの環境を構築する - Qiita
【Python入門】virtualenvで仮想環境を作ろう | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト


Macのクリーンインストール顛末

すでにCatalinaがリリースされてたけどまだ私のMac mini (Late 2014)はMojaveだった。

ある日のこと。
アプリ作成作業中にXcodeでビルドしたら処理が終わらない。Macが固まったのか?と思ってたらディスプレイに駐車禁止みたいなマークが表示された。

駐車禁止マーク?

↑なんだこれは?Appleのサポートページを調べると

駐車禁止マークの説明

macOSを再インストールする必要があるだと?面倒だな、、、
サポートページの通りに⌘+rで最後にインストールされてたバージョンのmacOS (Mojaveだ)がインストールされるようにしようとしたが、、、

EL Capitanインストール画面

なぜ、EL Capitan?
仮にEL Capitanをインストールしたとしてもすぐに最新のにアップデートする必要があるから、どうせならと(まだためらっていた)Catalinaをインストールしようと腹をくくった。
サポートページによると⌘+option+r。

macOS Catalinaインストール中

待つこと数時間、、、
また駐車禁止マークがでた。やばい、、、

3回ほど繰り返すもやはり駐車禁止マーク、、、


翌日になりAppleのサポートに電話。
データを消してクリーンインストールせよ!データ救出は外付けHDDにmacOSをインストールしそこから起動すればデータを取り出せるかも、とのこと。

外付けHDDを持っていなかったので近所の電気屋で1TのHDDを購入。税別7,000円しなかった。Amazonだと1Tで税込7,000円しないくらいか→ Amazonで"外付けHDD 1T"でみる

ディスクユーティリティ(もちろん⌘+option+rで見えるやつ)で消去してもフォーマットが適合しなくてできない。もしかして買ってはいけないHDDを買ってしまったの?
とか思ったが実はディスクユーティリティの左上にある表示ってとこで「すべてのデバイスを表示」として出てくる一番上のからやると消去&フォーマットができた(デフォはボリュームのみを表示になってた)。

でィスクユーティリティの画面

フォーマット後にそのHDDにCatalinaをインストール。

Catalina起動直後の画面

↑外部ディスクから起動成功。右上のが外付けHDDの起動ディスク。

この外付けHDDをTime machineの保存先にはできそうにない(ボリューム追加もしてみたが)のであきらめて普通にドラッグ、ドロップで外付けハードディスクに必要そうなデータを保存した。そういえばAppleのサポートさんもドラッグ&ドロップで、と言ってたしな。

後は元のを消去(さらっと書いてるけど心臓に悪い作業だよ)。
そしてCatalinaをインストール。

これでなんとかMacは復活した!


復活したMacに外付けHDDにある救出したデータをコピー。
その後外付けHDDは消去しTime Machineの保存先にした。
実はTime MachineってのはAppleが売り出してるバックアップ用のハードのことだと思ってた。他メーカーの外付けHDDでできるなんて知らなかった。
この程度の金額でTime Machineっていけたのか、さっさとやっておけばよかったと今更言っても仕方ない。それにしても、Time Machineのなんたる安心感。




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