UnlimitedHandを使って血流のヘモグロビン濃度値を計測したりlibsvmで分類器を作った話
先日UnlimitedHandというデバイスを会社の上司から貸してもらいまして、
そのデバイスを用いて検証することにしました。
測定自体は比較的に楽にできるのですがいくつか問題点はありました。
- 取り付けるのが難しい
誰かサポートが必要かもしれないです。
- 腕とデバイスの接合部のゲルパッドがかなり剥がれやすい
ゲルパッドが丸まってしまうと再度使用するのが結構厳しい
amazonでゲルパッド2セット1680円で販売しています
気軽に装着できるデバイスとしてUnlimitedHandを使用するのは
少し厳しい感じがします。
今回Unityプロジェクトからヘモグロビン濃度の測定を行うための手順を説明します。
1. Arduino IDEをインストールしてシリアル通信を行う
以下の公式ドキュメントを見てIDEのインストールをして
シリアル通信を行ってください。
通信しなければUnityプロジェクトで測定値の受信ができません。
http://dev.unlimitedhand.com/ja/introduction/index_intro.html#3
2. UnityプロジェクトにUnity用プラグインを導入する
以下のURLのPlugin for Unityをダウンロードし、Unityプロジェクトに組み込みます。
http://dev.unlimitedhand.com/download.html
このプラグインのスクリプトをゲームオブジェクトに追加することで
測定できるようになります。
あとは適当にファイル出力用のスクリプトを作成して計測値を測定します。
ヘモグロビン濃度だけでなくデバイスのジャイロセンサーや温度センサーの値も
測定することが可能です。
測定用のスクリプト自体は比較的に楽に作成できますが、
実際その値を用いた手の動作キャプチャは精度が微妙だというのを聞いていました。
そこで、このヘモグロビン濃度の時系列データを周波数解析し、
スペクトルを特徴量とした分類器の作成をしました。
何を分類するかというと
- 力をいれずに手の指を適当に動かしている状態1パターン
- 握りこぶしを作っている状態1パターン
- 皮膚の一部をスイッチのように押す状態2パターン
この4パターンで分類を行いました。
目的としてはUnlimitedHandを装着している状態で、
手の一部を押下することで、スイッチの役割として利用できないかを検証するために
行いました。
分類器作成用のスクリプトはPythonとlibsvmを用いた
SVMの分類器を作成しました。
特徴量は高速フーリエ変換によるパワースペクトルを用いました。
開発環境のIDEはPycharmを使用したのですが、libsvmを使用するために
プロジェクトの構造をlibsvm用に設定しなければいけません。
libsvmのso.2ファイルをmakeした後、以下のサイトを見て
Pycharmに合わせたプロジェクトの構成に変更してください。
http://digitallibraryworld.com/?p=520
で、結果なのですが上記の4パターンのクラスに分類した結果、
クロスバリデーションで評価したところ分類精度は61%くらいしかなかったです。
分類精度としてはかなり低めだと感じました。
そこで「皮膚の一部をスイッチのように押す状態2パターン」のデータで
分類器を作成し分類精度を出したところ55%でした。
この2パターンのデータが分類精度を下げる要因であることがわかりました。
そこでこの2パターンのデータのうち片方のパターンを除外し、
3パターンの学習データで分類器を作成しました。
その結果、分類精度83%となり、3クラスの分類器としては
かなり高めの精度となりました。
一応、手の状態における分類をUnlimitedHandで可能だと思いますが、
手への刺激を検知するのはあまり特徴として出ないと考えられます。
腕に力をいれることで魔法のように電子機器を操作することならできるように思えます。