ウェアラブル端末のセンサ値から動きをリアルタイムに識別する
ABC2016Spring Student WiP発表資料
東海大学 理学部(進学予定)日本Androidの会 学生部
古川 新
コントローラとしてのウェアラブル端末
表1 主要なコンシューマ機周辺端末の内蔵センサ
※ 各メーカの公式情報を独自にリストアップしたものです。※ 純正品の情報です。非純正品はこの通りでない可能性があります。
端末名 センサ(公式情報引用 )
PS4専用 ワイヤレスコントローラー(DUALSHOCK®4) 6軸検出システム(3軸ジャイロ、3軸加速度)
PS3専用 ワイヤレスコントローラ(DUALSHOCK®3) 6軸検出システム搭載
Wii リモコンプラス モーションセンサー:傾きや動きの変化を検出(3軸)
Wii U GamePad 加速度センサー、ジャイロセンサー、地磁気センサーの利用によるモーションコントロール
PlayStation®Vita(PCH-2000シリーズ) 6 軸検出システム(3 軸ジャイロ・3 軸加速度)、3 軸電�コンパス機能
表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
※ 各メーカの公式情報を独自にリストアップしたものです。
正拳突きx5 チョップx4
リアルタイム識別の注意
つまり…
① ② ③
つまり…
① ② ③
遅い
その瞬間の特徴を識別する
?センサ値x
動作y
?センサ値
x動作(OHV)
yint[3]
[ a, b, c ]
double[6][ ax, ay, az, gx, gy, gz ]
a : 正拳突きとチョップ以外b : 正拳突きc : チョップ
センサ値x
動作(OHV)y
int[3][ a, b, c ]
double[6][ ax, ay, az, gx, gy, gz ]
a : 正拳突きとチョップ以外b : 正拳突きc : チョップ
h = φ( X * W + b )
h = φ( X * W + b )
Neuron
Activatorニューラルネットワーク
考案したニューラルネットワーク
x
na
nb
nc
y6 3
h
softmax
W6x3
b3
簡単なので手動学習してみた
正拳突き約80%
チョップ約100%
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++)
TensorFlow
※正拳突き→10 チョップ→20 としてプロットしています
考案したディープニューラルネットワーク(3層)
x h1 h2 h3 y6 6x24 24x96 96x3 3
LRelu LRelu Softmax
つよさを実感するためグラフにしてみた
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)
Deep Lerning 自己テスト結果
学習回数 実施回数 平均正答率
1000 10 92.0513%
10000 10 96.1538%
1000000 10 96.8947%
WiP
● 現在の単純なネットワークで分類クラスを増やしてどの程度まで精度を保てるのか○ 今回の発表には間に合わず○ 教師データの調達・ラベル付けが非常にしんどい (時間がかかる…)
○ 割と露骨な限界があると予測しているため精度を上げる案も同時に考えている
● 学習データを増やしネットワークを育てる○ 明らかにデータが少ないが、教師データの作成に時間が (ry
● 情報量を増やす○ 他のセンサの値○ 加速度から得られる特徴情報(エッジやコーナなど)を意図的に与えてみる
● 時系列データを学習(および予測)できるネットワークの形成○ 加速度などのセンサデータは時系列データ○ 人間の動作は時系列データに可変長のパターンとして出現する○ NN、DNNなどのFFNN(Feed forward neural network)は可変長データを解析しづらい○ 故に今回は、データのもつ時系列の因果関係は無視しその「瞬間」を固定長データとして扱った
■ 何かしらの方法で時系列学習を行えれば精度の向上が見込める
精度の調査と向上
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)など
Recurrent Neural Network(再帰型ニューラルネット)
2. LSM(Liquid state machine)
a. データ入力と重み計算を分離する方法b. 相互接続した中間層に時系列データを適用し、その後教師データに線形回帰する
3. 時間軸を持たせてFFNNに流し込んでしまう方法a. TDNN(Time delay neural network)
i. 時間軸を持たせる場合、長さの違いやずれを吸収する仕組みが必要ii. ディレイを中間層でスケールすることで差異を吸収する
参考文献
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
Top Related