app dojo-2014-03-27
DESCRIPTION
app道場で発表した資料です. UIHadoukenGestureRecognizerを作りました。 http://atnd.org/events/48642TRANSCRIPT
iPhoneでモーション認識 UIHadoukenGestureRecoginzer (あらびき)
@ginrou799
iPhoneでモーション認識
• iPhone片手にもって、何かジェスチャーしたら認識するっていうの、あまり実は見かけないかも?
!
• ちょっとやってみたくなったので、やってみました。
UIHadoukenGestureRecgnizer
• iPhoneを持って、波動拳のジェスチャーをしたら 「波動拳!!」っていう音声が流れるオモチャ作った
ジェスチャ認識のフロー
サポートベクターマシン
波動拳を認識波動拳のモーション
加速度センサの値を取得
libsvmを利用
サポートベクターマシン(SVM)の学習
• iPhoneの3軸加速度センサの値をテキストに出力
• センサの出力から「波動拳をしている領域」と「していない領域」に分ける
• SVMに学習させて分類器を作る
サポートベクターマシン(SVM)の学習
• iPhoneの3軸加速度センサの値をテキストに出力
• センサの出力から「波動拳をしている領域」と「していない領域」に分ける
• SVMに学習させて分類器を作る
加速度センサの値をテキストに出力1/30[秒]ごとのCMMotionManagerの出力
適当なtxtファイルとしてiPhone内に保存
テキストファイルをPCに持ってくる
加速度センサの値をテキストに出力
ファイルの取り出しはOrganizer経由で
サポートベクターマシン(SVM)の学習
• iPhoneの3軸加速度センサの値をテキストに出力
• センサの出力から「波動拳をしている領域」と「していない領域」に分ける
• SVMに学習させて分類器を作る
センサ出力のクラスタリング○ x軸 ○ y軸 ○ z軸
波動拳領域 非波動拳領域
センサ出力のクラスタリングラベル ベクトル
非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …
センサ出力のクラスタリングラベル ベクトル
非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…
センサ出力のクラスタリングラベル ベクトル
非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…非波動拳領域 1:-0.772018 2:0.077805 3:-1.037018 …
センサ出力のクラスタリングラベル ベクトル
非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…非波動拳領域 1:-0.772018 2:0.077805 3:-1.037018 … 波動拳領域 1:0.6259 2:-0.380203 3:0.346146 …
センサ出力のクラスタリングラベル ベクトル
非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…非波動拳領域 1:-0.772018 2:0.077805 3:-1.037018 … 波動拳領域 1:0.6259 2:-0.380203 3:0.346146 …非波動拳領域 1:0.914429 2:-0.373398 3:0.204132 …
センサ出力のクラスタリングラベル ベクトル
非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…非波動拳領域 1:-0.772018 2:0.077805 3:-1.037018 … 波動拳領域 1:0.6259 2:-0.380203 3:0.346146 …非波動拳領域 1:0.914429 2:-0.373398 3:0.204132 …
全部で95サンプルを抽出 して訓練用データを得る
…
サポートベクターマシン(SVM)の学習
• iPhoneの3軸加速度センサの値をテキストに出力
• センサの出力から「波動拳をしている領域」と「していない領域」に分ける
• SVMに学習させて分類器を作る
学習• 学習用データセットの準備ができたらlibsvmに学習させます
#!/usr/bin/env python #coding:utf-8 !from svm import * from svmutil import * !y, x = svm_read_problem( “train_data.txt” ) model = svm_train(y,x) svm_save_model( “hadouken_svm_model.txt”, model )
iPhoneにlibsvmを組み込む• libsvmをDLする
• http://www.csie.ntu.edu.tw/~cjlin/libsvm/
• https://github.com/cjlin1/libsvm
• libxxx ですが、ソースコードも実に少なく、メインのコードはC/C++なので直接Xcodeのプロジェクトに突っ込んでやるだけで動きます
iPhoneにlibsvmを組み込む
この2つをXcodeのプロジェクトに入れるだけ!
iPhoneからlibsvmを使う
- (BOOL)isHadouken:(NSArray *)vector { ! int size = (int)vector.count; struct svm_node *node = malloc(sizeof(struct svm_node) * (size+1)); for (int i = 0 ; i < size; ++i) { NSNumber *num = vector[i]; node[i].value = [num doubleValue]; node[i].index = i+1; } ! node[size].index = -1; ! double v = svm_predict(_model, node); ! free(node); ! return v > 0; }
• svm_node型の配列が識別で用いるベクトルとなる
ジェスチャ認識のフロー
サポートベクターマシン
波動拳を認識波動拳のモーション
加速度センサの値を取得
実演
• 実機で実演します
まとめ• iPhoneでモーション認識やってみたよ
• 3D加速度センサのシーケンスをSVMで分類
• libsvm使った
• 意外に動いたのでびっくりしています。
• もっとクールな認識方法とかあると思うので、アドバイスなどを頂けたら幸いです
• 近いうちに cocoapods にあげます。