Createを使ってアクティビティを判別するTweetPocketこんにちは。classificationを試してみます。抜粋ユーザーガイドにしたがって、iPhoneの加速度センサーとジャイロセンサーの値をもとに「歩いてる」とか「階段を上っている」などの動作を推定するプログラムを動かしてみます。Createの概要Turiはもともと機械学習のプロダクトを手がけるシアトルのスタートアップで、Appleにより2016年に買収されました。Createは彼らのプロダクトをベースにAppleがOSSとして公開したものです。apple/turicreatehttps://github.com/apple/turicreateWWDC2018にてデモンストレーションが実施されています。Createの特徴は、アルゴリズムよりもタスクベース(レコメンドや物体検出など)のモジュールを使って手短に学習モデルを作成できるというところにあります。MLフォーマットへのエクスポートを標準でサポートしており、iOS等で容易に利用することができます。11から導入されたものですね。Classificationはモーションセンサーで取得したデータをもとにあらかじめ定義されたアクティビティ(止まってる、動いてるまたはジェスチャーなど)に振り分ける分類器です。内部的にはLSTMネットワークを用いて時系列データの依存関係でアクティビティを判別しているようです。Networkshttp://colah.github.io/posts/2015-08-Understanding-LSTMs/LSTMネットワークの概要(↑の日本語訳)https://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca実装こちらのAppleのガイドをもとに進めていきます。GitBookhttps://apple.github.io/turicreate/docs/userguide/activity_classifier/APIの詳細が知りたい場合はこちらのドキュメントを参照ください。基本、ガイド通りですので詳細は記載しませんが、大まかな流れは下記の通りです。Createの表形式のデータフレームオブジェクトです。CSV、テキスト、JSONなどからデータを読み込むことができ、列指向のため列の追加削除が容易に行えます。今回扱うデータは30人の被験者、合計61の計測(セッション)データで、1セッションの中にいくつかのアクティビティ(歩く、座る、階段を登るなど)がラベリングされています。データのアクティビティは12種類ありますが、ガイドではそのうち6種類のみをフィルタリングして使用しています。計測データは1セッションあたり1,500〜2,000フレーム、50fpsのため30〜40秒の活動記録となります。本ガイドにおける最終的なSFrameの内容は次のようなものになります。fraction=0.8)exp_idは一連のActivityを識別するIDです。fraction=0.8により、SFrameのデータの80%をtrainデータ、残りをtestデータとして分割します。prediction_window=50)1秒間隔で予測するために、元データが50fpsなのでprediction_window=50を指定します。model.evaluate(test)print(metrics['accuracy'])精度は次の結果が得られました。MLフォーマットに書き出します。MLモデルになっているのがわかります。state(長期記憶領域)がモデルのインターフェースに含まれています。LSTMとはなんぞやくらいの知識は持っていたいですね。cellInに渡してあげるだけなんですけど。MLのモデルを使い、iOSアプリで利用してみます。ここからXcodeでの実装になります。ガイドの実装は解説を簡単にするために加速度センサーしか取得していませんが、それだとまともな結果が得られなかったので、モデルの入力値である加速度+ジャイロのデータが使えるように下記のように一部のコードを変更します。50fpsで加速度センサー、ジャイロセンサーの値を参照し、1秒(50フレーム)ごとに予測結果をデバッグコンソールに出力するだけのプログラムです。}結果iPhoneを一定のリズムで上下させてみた際のコンソール出力結果です。N/Alayinglayinglayinglayinglayinglayinglayinglayinglayinglayinglayingclimbing_upstairsclimbing_upstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_upstairsclimbing_upstairsclimbing_upstairsclimbing_upstairsclimbing_upstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_downstairsclimbing_upstairsclimbing_upstairslayinglayinglaying最初は動きがない状態(laying)から階段を登る動作に移っていると判別されています。意識的に上方向に向かうように上下させたときにupstairs、逆に下方向でdownstairsとなるところが、それらしさを感じました。MLモデルを実機で動かしてみました。Createの特徴を理解することができました。モデルの作成は簡潔に実現できましたが、データセットができるまでのデータ整形作業がコードの大部分を占めているというのは機械学習の宿命ですかね。次世代システム研究室では、アプリケーション開発や設計を行うリードエンジニアを募集しています。ご応募をお願いします。