App dojo-2014-03-27

1,452 views

Published on

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

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,452
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
5
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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 にあげます。

×