この記事はドコモ先進技術研究所アドベントカレンダー18日目の記事です。NTTドコモ 先進技術研究所 2年目社員の石岡です。この記事では、AI・機械学習初心者の私が、趣味で作成したセンサデータから人の動作を予測モデルについて説明します。
要約
- 加速度・ジャイロセンサから取得したデータと、ニューラルネットワーク(CNN)を使って人の動きを検知してみます。
- 近年、スポーツセンシングが流行っているようなので、ハーキステップの動きを検知してみます。
ハーキステップとは?
スポーツにおけるトレーニング方法の1つです。体育の授業などで1度はやったことがあるかもしれません。立った状態で、重心を落とし、足で細かくステップします(これがハーキステップ)。この状態で、指示者(体育の先生や部活のコーチ)が上右左下のアナウンスをします。学生時代は毎日のようにやっていたトレーニングですがイマイチ何に効いているのかはわかりません。調べてみると、アジリティ(?)やクイックネス(?)が鍛えられるようです。
使うもの
- 加速度・ジャイロセンサ(今回はMPU6050を使用、2019年現在Amazonで1つ300円くらいです。安くてびっくりです)
- PC (データ取得も学習も、Raspberry piを使用)
センサデータの取得
私が購入したセンサの写真は下のようなものです。安い分、自分ではんだ付けを行う必要があります。ピンとピンの間隔が十分広いので、私のような半田付けが苦手な人でもかんたんにできます。またピンヘッダが2種類入っているのが地味にうれしいです。
MPU6050からのセンサデータの取得方法は、様々な記事で紹介されているので、今回は省略します。ただ注意点2点あります。1つ目が、MPU6050がI2C通信でセンサ値を取得することです。センサから出力された電圧値をアナログ信号として直接読み込むわけではないので、最初は何が何だかわからないかもしれません。ざっくり説明すると、受け手側 (Raspberry piやArduino等)が、センサ側 (MPU6050等)の中の指定したブロック(アドレス指定)とのみ通信をするよ、ということです。データバスとクロックバスしかないですが、加速度センサ3軸やジャイロセンサ3軸からデータを読取ることが可能となります。
2つ目が、MPU6050の入出力電圧です。MPU6050は、データシート上最大入出力電圧が3.46Vとなっています。一方で、Arduinoは入出力が5Vとなっているので、Arduinoの入出力ピンとMPU6050を直接つなぐと正しく動作しません。Raspberry piは、入出力ピンが3.3VなのでMPU6050と直接つなげてしまって問題ありません。
※ MPU6050はRaspberrypiの仕様寄りですが、別のセンサを使う場合は逆のケースもありますので使用する前にかならずデータシートを確認してください。
データの可視化
データの作成にあたり、先進技術研究所の3名の方にハーキを行っていただき、300個のデータ(1秒分の加速度・ジャイロ3軸の値)を作成しました。センサを腰の位置に固定して、ハーキステップの各動作を行った結果が下の図です。なんとなく、動きを表していそうな感じがしますが、正直私の目には、どれもただのノイズデータにしか見えません…
今回は、このセンサデータをニューラルネットワークに入力して、人体の動作を予測をしてみたいと思います。
モデルの作成
今回はCNN (Convolutional Neural Network)を使いました。
理由としては以下の2点です。
- 動作の一瞬一瞬を切り取っても何が何だかわからないので、時間的な塊にして学習させたいから
- 行列をそのままいれようと思ったら、CNNのコードがそのまま流用できそうだと思ったから
MPU6050から取得した加速度データ$a=[a_x,a_y,a_z ]$と、ジャイロデータ$g=[g_x,g_y,g_z ]$を、サンプリングレート40 Hzでサンプリングします。これを6×40の入力データとして使用します。
ハーキステップでは、基本的には4つの動作に分類しますが、今回は「ステップのみ」も考慮し、5つの動作(上下右左無の5つ)に分類します。
プログラム全体の概要図とネットワークの構成図は下図の通りです。一般的に、CNNのチュートリアル等で用いられる、画像の分類モデルと同じネットワーク構成です。入力データとして、6×40の加速度・ジャイロセンサーデータを、画像データのように、CNNへ入力し、5つの動作それぞれに対して0~1の値を出力します。1に近いほど、その動作である確率が高く、0に近いほどその動作である確率が低くなります。5つの値の最大値から、人体の動作を推定します。
学習結果
3名分の300個の動作データに対して、2:1にバリデーションして学習させた結果が下図です。異常に精度が高くなっています。おそらく、同じ人が同じ動作をした時の結果が、学習にもテストデータにも含まれてしまったため、リークしたようになったのではないかと考えられます?訓練データとテストデータに分ける際に、ランダムにわけるのではなく、人ごとにわける等の工夫が必要だったのかもしれません(匿名化させるために、人を記録していなかったので、追々検証してみます)。
まとめ
Amazon等で買える、ワンコイン・センサを使って、人間の動作予測モデルを作成しました。「CNN=画像認識」という固定観念がありましたが、センサデータでも使用できました。一方で、学習に使ったデータが少人数であり、見かけ上精度が高くなっている可能性が高いです。今回のモデルはRaspberry piにセンサを接続して使いましたが、スマートフォンから取得した加速度・ジャイロからも予測が可能なので、この動作予測モデルを使ったアプリなども開発していきたいです。