app dojo-2014-03-27

24
iPhone でモーション認識 UIHadoukenGestureRecoginzer ( あらびき ) @ginrou799

Upload: yuichi-takeda

Post on 03-Jul-2015

741 views

Category:

Technology


0 download

DESCRIPTION

app道場で発表した資料です. UIHadoukenGestureRecognizerを作りました。 http://atnd.org/events/48642

TRANSCRIPT

Page 1: App dojo-2014-03-27

iPhoneでモーション認識 UIHadoukenGestureRecoginzer (あらびき)

@ginrou799

Page 2: App dojo-2014-03-27

iPhoneでモーション認識

• iPhone片手にもって、何かジェスチャーしたら認識するっていうの、あまり実は見かけないかも?

!

• ちょっとやってみたくなったので、やってみました。

Page 3: App dojo-2014-03-27

UIHadoukenGestureRecgnizer

• iPhoneを持って、波動拳のジェスチャーをしたら 「波動拳!!」っていう音声が流れるオモチャ作った

Page 4: App dojo-2014-03-27

ジェスチャ認識のフロー

サポートベクターマシン

波動拳を認識波動拳のモーション

加速度センサの値を取得

libsvmを利用

Page 5: App dojo-2014-03-27

サポートベクターマシン(SVM)の学習

• iPhoneの3軸加速度センサの値をテキストに出力

• センサの出力から「波動拳をしている領域」と「していない領域」に分ける

• SVMに学習させて分類器を作る

Page 6: App dojo-2014-03-27

サポートベクターマシン(SVM)の学習

• iPhoneの3軸加速度センサの値をテキストに出力

• センサの出力から「波動拳をしている領域」と「していない領域」に分ける

• SVMに学習させて分類器を作る

Page 7: App dojo-2014-03-27

加速度センサの値をテキストに出力1/30[秒]ごとのCMMotionManagerの出力

適当なtxtファイルとしてiPhone内に保存

テキストファイルをPCに持ってくる

Page 8: App dojo-2014-03-27

加速度センサの値をテキストに出力

ファイルの取り出しはOrganizer経由で

Page 9: App dojo-2014-03-27

サポートベクターマシン(SVM)の学習

• iPhoneの3軸加速度センサの値をテキストに出力

• センサの出力から「波動拳をしている領域」と「していない領域」に分ける

• SVMに学習させて分類器を作る

Page 10: App dojo-2014-03-27

センサ出力のクラスタリング○ x軸 ○ y軸 ○ z軸

波動拳領域 非波動拳領域

Page 11: App dojo-2014-03-27

センサ出力のクラスタリングラベル ベクトル

非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …

Page 12: App dojo-2014-03-27

センサ出力のクラスタリングラベル ベクトル

非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…

Page 13: App dojo-2014-03-27

センサ出力のクラスタリングラベル ベクトル

非波動拳領域 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 …

Page 14: App dojo-2014-03-27

センサ出力のクラスタリングラベル ベクトル

非波動拳領域 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 …

Page 15: App dojo-2014-03-27

センサ出力のクラスタリングラベル ベクトル

非波動拳領域 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 …

Page 16: App dojo-2014-03-27

センサ出力のクラスタリングラベル ベクトル

非波動拳領域 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サンプルを抽出 して訓練用データを得る

Page 17: App dojo-2014-03-27

サポートベクターマシン(SVM)の学習

• iPhoneの3軸加速度センサの値をテキストに出力

• センサの出力から「波動拳をしている領域」と「していない領域」に分ける

• SVMに学習させて分類器を作る

Page 18: App dojo-2014-03-27

学習• 学習用データセットの準備ができたら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 )

Page 19: App dojo-2014-03-27

iPhoneにlibsvmを組み込む• libsvmをDLする

• http://www.csie.ntu.edu.tw/~cjlin/libsvm/

• https://github.com/cjlin1/libsvm

• libxxx ですが、ソースコードも実に少なく、メインのコードはC/C++なので直接Xcodeのプロジェクトに突っ込んでやるだけで動きます

Page 20: App dojo-2014-03-27

iPhoneにlibsvmを組み込む

この2つをXcodeのプロジェクトに入れるだけ!

Page 21: App dojo-2014-03-27

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型の配列が識別で用いるベクトルとなる

Page 22: App dojo-2014-03-27

ジェスチャ認識のフロー

サポートベクターマシン

波動拳を認識波動拳のモーション

加速度センサの値を取得

Page 23: App dojo-2014-03-27

実演

• 実機で実演します

Page 24: App dojo-2014-03-27

まとめ• iPhoneでモーション認識やってみたよ

• 3D加速度センサのシーケンスをSVMで分類

• libsvm使った

• 意外に動いたのでびっくりしています。

• もっとクールな認識方法とかあると思うので、アドバイスなどを頂けたら幸いです

• 近いうちに cocoapods にあげます。