Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

App dojo-2014-03-27

1,822 views

Published on

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

Published in: Technology
  • Be the first to comment

App dojo-2014-03-27

  1. 1. iPhoneでモーション認識 UIHadoukenGestureRecoginzer (あらびき) @ginrou799
  2. 2. iPhoneでモーション認識 • iPhone片手にもって、何かジェスチャーしたら認識
 するっていうの、あまり実は見かけないかも? ! • ちょっとやってみたくなったので、やってみました。
  3. 3. UIHadoukenGestureRecgnizer • iPhoneを持って、波動拳のジェスチャーをしたら
 「波動拳!!」っていう音声が流れるオモチャ作った
  4. 4. ジェスチャ認識のフロー サポート ベクター マシン 波動拳を認識 波動拳の
 モーション 加速度センサの
 値を取得 libsvmを利用
  5. 5. サポートベクターマシン(SVM)の学習 • iPhoneの3軸加速度センサの値をテキストに出力 • センサの出力から「波動拳をしている領域」と「してい ない領域」に分ける • SVMに学習させて分類器を作る
  6. 6. サポートベクターマシン(SVM)の学習 • iPhoneの3軸加速度センサの値をテキストに出力 • センサの出力から「波動拳をしている領域」と「してい ない領域」に分ける • SVMに学習させて分類器を作る
  7. 7. 加速度センサの値をテキストに出力 1/30[秒]ごとのCMMotionManagerの出力 適当なtxtファイルとしてiPhone内に保存 テキストファイルをPCに持ってくる
  8. 8. 加速度センサの値をテキストに出力 ファイルの取り出しは
 Organizer経由で
  9. 9. サポートベクターマシン(SVM)の学習 • iPhoneの3軸加速度センサの値をテキストに出力 • センサの出力から「波動拳をしている領域」と「してい ない領域」に分ける • SVMに学習させて分類器を作る
  10. 10. センサ出力のクラスタリング ○ x軸 ○ y軸 ○ z軸 波動拳領域 非波動拳領域
  11. 11. センサ出力のクラスタリング ラベル ベクトル 非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 …
  12. 12. センサ出力のクラスタリング ラベル ベクトル 非波動拳領域 1:-0.606384 2:0.008987 3:-0.586578 … 非波動拳領域 1:-0.867035 2:-0.063141 3:-0.871124…
  13. 13. センサ出力のクラスタリング ラベル ベクトル 非波動拳領域 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 …
  14. 14. センサ出力のクラスタリング ラベル ベクトル 非波動拳領域 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 …
  15. 15. センサ出力のクラスタリング ラベル ベクトル 非波動拳領域 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 …
  16. 16. センサ出力のクラスタリング ラベル ベクトル 非波動拳領域 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サンプルを抽出 して訓練用データを得る …
  17. 17. サポートベクターマシン(SVM)の学習 • iPhoneの3軸加速度センサの値をテキストに出力 • センサの出力から「波動拳をしている領域」と「してい ない領域」に分ける • SVMに学習させて分類器を作る
  18. 18. 学習 • 学習用データセットの準備ができたら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 )
  19. 19. iPhoneにlibsvmを組み込む • libsvmをDLする • http://www.csie.ntu.edu.tw/~cjlin/libsvm/ • https://github.com/cjlin1/libsvm • libxxx ですが、ソースコードも実に少なく、メインの コードはC/C++なので直接Xcodeのプロジェクトに突っ 込んでやるだけで動きます
  20. 20. iPhoneにlibsvmを組み込む この2つをXcode のプロジェクトに 入れるだけ!
  21. 21. 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型の配列が識別で用いるベクトルとなる
  22. 22. ジェスチャ認識のフロー サポート ベクター マシン 波動拳を認識 波動拳の
 モーション 加速度センサの
 値を取得
  23. 23. 実演 • 実機で実演します
  24. 24. まとめ • iPhoneでモーション認識やってみたよ • 3D加速度センサのシーケンスをSVMで分類 • libsvm使った • 意外に動いたのでびっくりしています。 • もっとクールな認識方法とかあると思うので、
 アドバイスなどを頂けたら幸いです • 近いうちに cocoapods にあげます。

×