ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

39
ウェアラブル端末のセンサ値から 動きをリアルタイムに識別する ABC2016Spring Student WiP発表資料 東海大学 理学部(進学予定) 日本Androidの会 学生部 古川

Transcript of ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

Page 1: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

ウェアラブル端末のセンサ値から動きをリアルタイムに識別する

ABC2016Spring Student WiP発表資料

東海大学 理学部(進学予定)日本Androidの会 学生部 

古川 新   

Page 2: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

コントローラとしてのウェアラブル端末

Page 3: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

表1 主要なコンシューマ機周辺端末の内蔵センサ

※ 各メーカの公式情報を独自にリストアップしたものです。※ 純正品の情報です。非純正品はこの通りでない可能性があります。

端末名 センサ(公式情報引用 )

PS4専用 ワイヤレスコントローラー(DUALSHOCK®4) 6軸検出システム(3軸ジャイロ、3軸加速度)

PS3専用 ワイヤレスコントローラ(DUALSHOCK®3) 6軸検出システム搭載

Wii リモコンプラス モーションセンサー:傾きや動きの変化を検出(3軸)

Wii U GamePad 加速度センサー、ジャイロセンサー、地磁気センサーの利用によるモーションコントロール

PlayStation®Vita(PCH-2000シリーズ) 6 軸検出システム(3 軸ジャイロ・3 軸加速度)、3 軸電�コンパス機能

Page 4: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

表2 主要なウェアラブル端末の内蔵センサ

端末名 センサー(公式情報引用 )

Apple Watch(各エディション共通) 心拍センサー、加速度センサー、ジャイロスコープ環境光センサー

moto 360 Accelerometer, Ambient Light Sensor, Gyroscope, Vibration/Haptics engine

LG G Watch Urbane 9軸センサー(ジャイロ/加速度/コンパス)気圧センサー、心拍センサー

WSD-F 圧力(気圧/高度)センサー、 加速度センサー、 ジャイロセンサー、 方位(磁気)センサー

SmartWatch3 加速度センサー、ジャイロセンサー、磁気センサー、GPS、光センサー

ASUS ZenWatch 2 6-Axis (A+G) with Sensor-hub

※ 各メーカの公式情報を独自にリストアップしたものです。

Page 5: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 6: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

正拳突きx5 チョップx4

Page 7: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

リアルタイム識別の注意

Page 8: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

つまり…

① ② ③

Page 9: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

つまり…

① ② ③

遅い

Page 10: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

その瞬間の特徴を識別する

Page 11: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

?センサ値x

動作y

Page 12: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

?センサ値

x動作(OHV)

yint[3]

[ a, b, c ]

double[6][ ax, ay, az, gx, gy, gz ]

a : 正拳突きとチョップ以外b : 正拳突きc : チョップ

Page 13: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

センサ値x

動作(OHV)y

int[3][ a, b, c ]

double[6][ ax, ay, az, gx, gy, gz ]

a : 正拳突きとチョップ以外b : 正拳突きc : チョップ

Page 14: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

h = φ( X * W + b )

Page 15: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

h = φ( X * W + b )

Neuron

Activatorニューラルネットワーク

Page 16: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

考案したニューラルネットワーク

x

na

nb

nc

y6 3

h

softmax

W6x3

b3

Page 17: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

簡単なので手動学習してみた

Page 18: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 19: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 20: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 21: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 22: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 23: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

正拳突き約80%

チョップ約100%

Page 24: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

constexpr std::array< double, 6 > weight_ = { 1, 80, -40, -20, 1, 50 };constexpr double bias_ = -1000;

constexpr std::array< double, 6 > weight_ = { 80, -30, 55, 0.1, 60, 30 };constexpr double bias_ = -1400;

hbの重みとバイアス

hcの重みとバイアス

手動学習 コード抜粋(C++)

Page 25: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

TensorFlow

Page 26: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 27: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

※正拳突き→10 チョップ→20 としてプロットしています

Page 28: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 29: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 30: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

考案したディープニューラルネットワーク(3層)

x h1 h2 h3 y6 6x24 24x96 96x3 3

LRelu LRelu Softmax

Page 31: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

つよさを実感するためグラフにしてみた

Page 32: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

W1 = tf.Variable(tf.truncated_normal([6, 24], stddev=0.1), name="weight1") b1 = tf.Variable(tf.constant(0.1, shape=[24]), name="bias1") h1 = leaky_relu(tf.matmul(x, W1) + b1) W2 = tf.Variable(tf.truncated_normal([24, 96], stddev=0.1), name="weight2") b2 = tf.Variable(tf.constant(0.1, shape=[96]), name="bias2") h2 = leaky_relu(tf.matmul(h1, W2) + b2) W3 = tf.Variable(tf.truncated_normal([96, 3], stddev=0.1), name="weight3") b3 = tf.Variable(tf.constant(0.1, shape=[3]), name="bias3") u = tf.nn.softmax(tf.matmul(h2, W3) + b3)

cross_entropy = -tf.reduce_sum(y * tf.log(u))

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

r = npr.randint(len(ix)) feed = {x: ix[r].reshape((1,6)), y: iy[r].reshape((1,3))} sess.run(train, feed_dict=feed)

Deep Learning コード抜粋(python)

Page 33: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)
Page 34: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

Deep Lerning 自己テスト結果

学習回数 実施回数 平均正答率

1000 10 92.0513%

10000 10 96.1538%

1000000 10 96.8947%

Page 35: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

WiP

Page 36: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

● 現在の単純なネットワークで分類クラスを増やしてどの程度まで精度を保てるのか○ 今回の発表には間に合わず○ 教師データの調達・ラベル付けが非常にしんどい (時間がかかる…)

○ 割と露骨な限界があると予測しているため精度を上げる案も同時に考えている

● 学習データを増やしネットワークを育てる○ 明らかにデータが少ないが、教師データの作成に時間が (ry

● 情報量を増やす○ 他のセンサの値○ 加速度から得られる特徴情報(エッジやコーナなど)を意図的に与えてみる

● 時系列データを学習(および予測)できるネットワークの形成○ 加速度などのセンサデータは時系列データ○ 人間の動作は時系列データに可変長のパターンとして出現する○ NN、DNNなどのFFNN(Feed forward neural network)は可変長データを解析しづらい○ 故に今回は、データのもつ時系列の因果関係は無視しその「瞬間」を固定長データとして扱った

■ 何かしらの方法で時系列学習を行えれば精度の向上が見込める

精度の調査と向上

Page 37: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

Recurrent Neural Network(再帰型ニューラルネット)

1. 内部状態を持たせる方法(オートマトン)

a. 時間方向のグラフを持ち重みとバイアスを共有するi. 同一データでも入力順によって反応が変わる

ii. BPTT(Back propagation through time)

1. 誤差を時系列と逆方向にも伝搬するiii. RTRL (Real Time Recurrent Learning)

1. 誤差を時系列方向にも伝搬する(オンライン処理向き )

iv. 重みの伝搬やノイズ、記憶の取捨選択など、問題が山積みb. ElmanN(中間層→中間層の結合を持つ )、LSTM(Long short-term memory)など

Page 38: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

Recurrent Neural Network(再帰型ニューラルネット)

2. LSM(Liquid state machine)

a. データ入力と重み計算を分離する方法b. 相互接続した中間層に時系列データを適用し、その後教師データに線形回帰する

3. 時間軸を持たせてFFNNに流し込んでしまう方法a. TDNN(Time delay neural network)

i. 時間軸を持たせる場合、長さの違いやずれを吸収する仕組みが必要ii. ディレイを中間層でスケールすることで差異を吸収する

Page 39: ウェアラブル端末のセンサ値から動きをリアルタイムに識別する(Wi p)

参考文献

TensorFlow 公式サイト

https://www.tensorflow.org/

Neural Network + Tensorflow 入門講座 / 丸山不二夫 先生

http://www.slideshare.net/maruyama097/neural-network-tensorflow

Recurrent Neural Networks / 得居 誠也 氏http://www.slideshare.net/beam2d/pfi-seminar-20141030rnn

リカレントニューラルネットワークの概要と動作原理 / 竹田 卓也 氏http://wbawakate.jp/wp-content/uploads/2015/03/RNN%E3%83%95%E3%82%9A%E3%83%AC%E3%82%BB%

E3%82%99%E3%83%B3.pdf