小型IoT端末開発キット「SensorTile.box」 を使って機械学習を体験②


STマイクロエレクトロニクスの小型IoT端末開発キット「SensorTile.box」を使用してさまざまな機能を試してみるシリーズ、機械学習編の第2回です。

前回は、サイコロのような静的な“姿勢”データに基づくサンプルを試しました。今回は、別のサンプルである「ジム･アクティビティ検出」を使って、動きのあるものでテストしてみます。ジムなどで行うトレーニング時のフォームを検出できるサンプルです。


機械学習データのセットアップ概要については、こちらの記事を参照してください。
[小型IoT端末開発キット「SensorTile.box」 を使って機械学習を体験①](https://qiita.com/ykawano/private/9a78b5e6781e81e75ed2)

SensorTile.boxのセットアップ方法や基本情報については、こちらの記事を参照してください。
[小型IoT端末開発キット「SensorTile.box」 をセンサ・アプリで使ってみた①　セットアップと使い方](https://qiita.com/ykawano/items/9aed0be1ca919ad4551d)

## 1．準備

### サンプル･データのダウンロード

「機械学習を体験①」記事と同様に、学習済みデータのucfファイルをGitHubからダウンロードします。
すでに全ファイルをPC経由でまとめてダウンロード & スマートフォンへファイルをコピー済みの場合（→「機械学習を体験①」の”補足2”を参照）、ここは読み飛ばして「2．ジム・アクティビティ検知: Gym Activity Recognition」へ進んでください。

スマートフォンからGitHubにアクセスし、STMicroelectornics/STMems_Machine_Learning_Coreのページを開きます（google等で“github st mlc”などと検索してください）。**View code**クリック後、対象ファイルの場所までフォルダを下っていきます。

ファイルの場所: STMems_Machine_Learning_Core/application_examples/lsm6dsox/Gym activity recognition/


![100_Github_smartphone_1_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/53c32259-5c57-ac4e-8e28-b1a0abd6cc9c.png)


対象ファイルは**lsm6dsox_gym_activity_recognition_left.ucf**です。右腕用と左腕用の2種類が用意されており、私は右利きなので、左腕取り付け用のxxxx_left.ucfを選択しました。ファイルを開いたら、以下手順でダウンロードします。ファイル名が長いので、スマートフォンの画面ではファイル名全体が表示されない可能性があります。ファイルクリック時に一応確認してください。

![101_Github_smartphone_2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/2c0e4c92-47b1-fd49-b9b2-d3999b98fd9f.png)


ダウンロードの際に“.txt”拡張子が追加されてしまうため、これを削除しておきます。Filesアプリなどで該当ファイルを確認後、**Rename**してください

![102_Github_smartphone_3_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f2a65aa9-46d1-fcfb-df69-22a2e343355c.png)


以上で準備完了です。





## 2．ジム・アクティビティ検知: Gym Activity Recognition

それでは、早速スマートフォンでアプリを設定して動かしていきましょう。スマートウォッチやリストバンドのように手首に取り付けて使います。

[GitHub_GymActivity](https://github.com/STMicroelectronics/STMems_Machine_Learning_Core/tree/master/application_examples/lsm6dsox/Gym%20activity%20recognition)ページの情報によると、設置方向が決まっているようです。デバイスの各軸（加速度）が以下方向になるようにセットします。
X軸: 腕方向と平行（手の方向が＋）
Y軸: 腕方向に対して直角（自分に対して外向きが＋方向）
Z軸: 手の垂直上方向（甲側が＋）


![200_gym_overview__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b3f893e8-d632-1be8-b03a-ab90ea6dedc8.png)


### 2-1．セットアップ

以下手順でカスタムアプリをセットアップします。ここでは念のため新規アプリ作成手順として解説します（手順**A**）。なお、「機械学習を体験①」の際に作成したポジション検知アプリを再利用してもOKです。その場合、手順**B**の解説を参照ください。

#### A．新規アプリとして作成

##### 作成開始

Expert modeから新規アプリ作成へ進みます。


![210_gym_setup1_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/1dc6daf2-be2d-9cc2-4a3f-7cb75623d8d3.png)


##### 入力センサ選択 & ucfファイル設定

機械学習コア（MLC）使用時は、仮想センサとしてMLC Virtual sensorを選択後（= LSM6DSOX）、MLC用のコンフィグレーションファイル（.ucf）を設定します。さきほどGitHubからダウンロードしてスマートフォンのストレージに保存したので（Defaultでは“Download”フォルダに入ってます）、そこから探します。ファイル / フォルダ表示はスマートフォンによって異なります。

**lsm6dsox_gym_activity_recognition_left.ucf**

![211_gym_setup2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/26f1d901-91b6-aa32-ad3f-54250d57da86.png)


##### ucfファイル設定完了、出力先設定

こちらのサンプルは、すでにラベリングされていました。“squats（スクワット）”などの表記が確認できます。
出力先としてBluetoothを選択します。

![212_gym_setup3_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/ea6f8795-1163-a72c-af02-7d048a045336.png)


##### アプリ全体セーブ後、SensorTile.boxへ設定データ送信


![213_gym_setup4_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/ef120e44-6057-d1e7-5133-435929acfe25.png)


以上でセットアップ完了です。動作確認に進んでください。

#### B．前回アプリの再利用

次に別の方法として、「機械学習を体験①」で作成したポジション検知アプリを再利用する手順を解説します。
アプリの編集画面に入り、既に設定されているコンフィギュレーション･ファイルを入れ替えます。

##### 再利用アプリの編集

![214_gym_setup_B1_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f1a276b9-23fe-da3e-4e45-25dfcb853965.png)


##### アプリ全体セーブ後、SensorTile.boxへ設定データ送信

アプリ全体を別名で保存すれば完了です。最後に同じようにSensorTile.boxへアップロードします。

![215_gym_setup_B2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/52acc7a0-795a-f41f-22bb-f6af0b8855e1.png)


以上でセットアップ完了です。動作確認に進んでください。


##### カスタム･アプリ設定まとめ

|           |選択アイテム        | 設定内容  |
|:------------:|:---------:|:--------:|
|Input  | MLC Virtual Sensor（LSM6DSOX）|ucf: lsm6dsox_gym_activity_recognition_left.ucf|
|Function  |無し||
|Output  |Stream to Bluetooth|Bluetooth経由でスマートフォンへ演算結果送信|


### 2-2．動作確認

3種のトレーニング･フォーム（3クラス）検知が用意されています。“Decision Tree 0: DT1”の値が変化します（4 / 8 / 12の数字で出力。ただし16進数なので12は**C**と表示）。

- MLC0_SRC (70h) register values
  - 0 = No activity
  - 4 = Bicep curls（プリーチャーカール。上腕カール）
  - 8 = Lateral raises（サイドレイズ）
  - 12 = Squats（スクワット）



![220_gym_result_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/9c99c112-8741-9b3b-3874-33588c997ed5.png)



プリーチャーカール（4）とサイドレイズ（8）は一応認識できましたが、姿勢やフォームが正しくないと判定されないようで、なかなか難しいと感じました。また、動作を3秒以上は継続させないと判定に至りません。
スクワットは、最初、腕を腰に置いて単に屈伸運動をしてみたところ、まったく認識されませんでした。前方に腕を伸ばした状態でひざを屈伸すると認識できました。腕を前に伸ばしたまま行うのが正しいフォームのようです。


![221_gym_result2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/df96ac98-8d1a-b3e1-4911-4dd3d1743d88.png)


実際にアプリケーションにおいてマイコンなどで使う場合、値が変化するとINT1 pinにパルス信号が出力されます。この後LSM6DSOXのレジスタ70hを読むと、値を確認できます。





### 2-3．ディシジョン･ツリー

GitHubのファイルおよびLSM6DSOXのアプリケーションノート（AN5259）を調べましたが、該当するディシジョン･ツリー情報は見つけられませんでした。一応AN5259では、EXAMPLEの説明箇所にgym activity recognitionの項目があり、ディシジョン･ツリー図も載っていました。ところがよく見ると、使用センサやFeaturesなどの設定情報がGitHubに記載されている内容と異なります（AN5259内の情報ではジャイロが使用されており、クラスの内容も異なる）。つまり、AN5259内のディシジョン･ツリー情報はGitHubのものと異なるので、参考程度にしてください。

GitHubからの設定情報

|           |設定内容      |Note   |
|:------------:|:---------:|:--------:|
|Sensors  |ACC (Accelerometer)|±8 g full scale, 26Hz ODR, ultra-low power mode|
|Feature  |mean, peak-to-peak, min, max||
|Filter  |Low pass filter（IIR1）||
|MLC rate, Window  |MLC run at 26Hz, windows=78samples|Window / MLC ODR = 78 / 26 = 約3秒|
|Node  |30||
|A meta-classifier |No use||


## 3．コンフィギュレーション･データの書き込みについて

最後に、前回の「機械学習を体験①」記事や今回の記事で使った「コンフィギュレーション･データ（xxxx.ucf）」についてもう少し見てみます（例 : lsm6dsox_six_d_position.ucf）
テキスト･エディタで開くと、294個のデータ配列らしきものが並んでいます（データ個数はサンプルによって異なる）


![300_ucf_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/8f2139a0-50a5-cc21-4c10-adc251423252.png)



同じフォルダにヘッダファイルもあったのでチェックしたところ、アドレスとデータのペアだとわかりました。
ところで、LSM6DSOXのデータシートを見ても、MLC用設定データの具体的な書き込み方法・アドレス情報は見つけられませんでした。ではいったいどうやって書き込めばいいのかと悩むところですが、このヘッダファイルを利用すればOKです。Unico-GUI>optionsタグページに”C code generation”ボタンがありますので、ここからucfファイルをLoadすればヘッダファイル（ucfの中身データを構造体配列にしている）を生成できます。ファームウェア上で利用する際は、このヘッダファイルを利用してください。中身詳細を意識しなくても使えるようになっています。

レジスタ･アドレスおよびデータ書き込み内容から、どんな操作設定をしているのか以下に記載しました。
LSM6DSOXはレジスタ･マップが少し複雑（0x01へのBit設定によってアクセスできるレジスタページが切り替わる）で、見方には少し注意が必要です。


![301_ucf_header_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/eddf9612-4b4b-c479-c7c2-0041709f6065.png)



以下はデータ配列の最後の方です。MLC用の初期設定（センサの基本設定、MLCを有効にするなど）のためのレジスタ･アクセスを行っています。最初の方（書き込み準備）と最後の方（初期設定）のアクセスは、どのサンプルでもほとんど共通の内容になっています。


![302_ucf_header_end.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/280e9915-1e5c-a1dc-9f21-48209a81373a.png)


MLCデータ書き込み用のレジスタは、Embedded Function registerエリアにありますが、詳細は非公開です。基本的にMLCを利用するだけであればUnico-GUIにより生成されるヘッダファイルを利用すればいいので、アクセス方法詳細を知る必要はありません。
代わりの情報として、同じEmbedded Function Registerへの設定が必要なPedometer機能（歩数カウント）やTilt機能（傾き検知）が参考になります。レジスタ･アクセス例がアプリケーション･ノート（AN5272）に載っているので興味のある方は見てみて下さい。AN5272もAN5259と同じく[LSM6DSOXのwebページ](https://www.st.com/ja/mems-and-sensors/lsm6dsox.html)からダウンロードできます。



![305_pedometer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/586d3d1e-df05-c9ee-5b79-4a2443fa925e.png)



以上、今回は機械学習のサンプル･データを試してみました。他にもサンプルはありますので、ご興味があればぜひ試してみてください。

なお、前回と今回の記事で使ったサンプル･データはあくまで「トライアル用」であり、そのまま製品に利用する目的で提供されているわけではありません。実際の製品化に際しては、ご自身でデータを取得してください。
次回はデータ収集と、Unico-GUIツール上でディシジョン･ツリーを作成してみたいと思います。
[小型IoT端末開発キット「SensorTile.box」 を使って機械学習を体験③](https://qiita.com/ykawano/items/d2c289e2b1d3cdb06734)