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

App dojo-2014-03-27