Ccmmutty logo
Commutty IT
5 min read

TensorFlow Lite for Microcontrollersのmagic wandの学習部分について調べてみた

https://cdn.magicode.io/media/notebox/b4f42779-227f-4907-baeb-5e8bc2560554.jpeg

はじめに

前回 raspberry pi picoでtensorflow lite for microcontrollersのmagic wandというサンプルを動かしてみた。
結果としてはうまく認識してくれなかったので、自分の環境でデータを集め、再学習してみることにした。
今回は、学習部分のドキュメントを読んだので、そちらのメモとなる。

環境

  • 動作確認
    • Google Colaboratory

ドキュメントについて

GithubのREADME に学習方法は書いてある。

Dataset

概要

3つのジェスチャーを7人から集めた。一連の動作から分割して作った模様。
ジェスチャーに該当しないものはnegativeとしてランダムに自動生成。

ダウンロード

datasetは公開されている
私の環境がwindowsなので、tarかー と思ったが、windows 10にはコマンドがはいっているよう。
https://rcmdnk.com/blog/2021/09/17/computer-windows/

中身について

ジェスチャごとにフォルダがあり、その下に人物ごとにテキストファイルがある。
テキストファイルを見た感じ、一回のジェスチャは-,-,-で区切られる模様。
また、ジェスチャの長さは特に固定ではなさそう。

疑問:どうやって分割したんだろう

Collecting new dataの項にこうあり、データをキャプチャする際に、ボタンを押している模様。
Press the RST button to start capturing a new gesture, then press Button 14 when it ends. New data will begin with a line "-,-,-".

動作確認

colabソースコードからの二択だが、colabなら環境が楽なのでcolabを使うことにする。

学習方法について

学習パターン

二つ学習のやり方がある。
  1. Random data split, which mixes different people's data together and randomly splits them into training, validation, and test sets
  2. Person data split, which splits the data by person
randomは学習のaccuracyはいいが、new dataのパフォーマンスが劣る。
personは逆

学習の実行方法

Random data splitの時
$ python data_prepare.py

$ python data_split.py

$ python train.py --model CNN --person false
Person data splitの時
$ python data_prepare.py

$ python data_split_person.py

$ python train.py --model CNN --person true
data_splitのpythonプログラムとtrain時のオプション引数に差がある。
また、--modelでは CNNLSTM が選択できる。CNNの方がサイズ小さくてレイテンシも低い。

colabで実行

とりあえず動かす

cp: cannot stat 'tensorflow/tensorflow/lite/micro/examples/magic_wand/train': No such file or directory
まあ、そんなもん

原因と解決法

tensorflowのリポジトリから分かれているので、cloneするリポジトリを変更する。
!git clone --depth 1 -q https://github.com/tensorflow/tflite-micro.git
また、コピー元も変わるので
!cp -r tflite-micro/tensorflow/lite/micro/examples/magic_wand/train train

再実行

Load TensorBoardのところで、「No dashboards are active for the current data set.」と出るが、まだ学習してなく表示するものがないだけなのでスルー。
学習は5分かからず終わった。 TensorBoardは図のようになった。(後半のvalidationが気になるけど動かしたかっただけなのでスルー)
最後のセルが実行されると、 /contentmodel.cc というファイルができる。
この中身を、
magic_wand_model_data.cppg_magic_wand_model_datamodel_tflite_len に移せばいい、はず。

学習データの収集

Collecting new dataの項に、 SparkFun Edge development board を使った動作例が書かれている。
私はraspberry pi picoを使いたいので、独自でプログラムを組む必要がある。
そのために、重要そうなポイントだけ抜き出すと
  1. ジェスチャの開始時に "-,-,-\r\n" がある。
  2. 各フレームのジェスチャの値のフォーマットは、 ("%04.2f,%04.2f,%04.2f\r\n", acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]) である
  3. ジェスチャの開始と終了はボタンの押下で判断する
  4. outputのファイル名は、output_{gesture_name}_{person_name}.txt とする
この辺りを守れば学習用データになるだろう。

終わりに

今回は、magic wandを再学習するドキュメントの調査をした。
再学習時に自分のデータを使いたく、集め方の指針が立ったので、次は集めるためのプログラムを書くのに挑戦する。
また、モデルの構造も特にみていないので、そのうちそのあたりも確認したい。

Discussion

コメントにはログインが必要です。