Ccmmutty logo
Commutty IT
4 min read

再学習したTensorFlow Lite for Microcontrollersのmagic wandでちょっと認識できた

https://cdn.magicode.io/media/notebox/e1373d1e-1285-4942-86ab-0e8b98c7a01a.jpeg

はじめに

前回 、自分で集めたデータを用いて再学習をした。
今回は、再学習した結果で推論してみた話をまとめる。(なお、また再学習した)

環境

  • PC
    • windows 10
  • pico
  • USBケーブル
    • 家に転がってたものを
  • 加速度センサー(MMA8452Q)
  • 330Ωの抵抗 x 2
    • 動作確認では手元になかったので使ってないが、ドキュメントを見た感じ合った方がよさそう。
  • ブレッドボードやジャンパー
    • VDD/GND用 2 or 4本
    • SCL/SDA用 2本
  • 開発環境
    • Visual Studio Code
    • Google Colabratory
  • 動作確認環境
    • TeraTerm

推論用のコード

以前の記事を参考に、推論用コードを用意する。

学習済みモデルの更新

magic_wand_model_data.cppの g_magic_wand_model_data[] 前回 得られたmodel.ccからデータをコピペして代入する。
必要であれば、model_tflite_len も更新する。

実行

constantを調整してもあまりいいい感じに認識しない。

状況整理

  1. constant.hでthresholdをかなり低くしても検知しないから、そもそもがおかしそう
  2. kTensorArenaSize を変えても変わらない※
  3. リングバッファに十分溜まるまでは25Hzで動いているが、推論が入ると遅くなって明らかに25Hzより遅くなっている
  4. modelへのinput_lengthは384、つまり128frame分のデータで、128x40=5120msecとかなり長い時間ためてる。
3はすごく怪しいが、リングバッファにためきるタイミングに動かしても認識しないからそもそも論な気がする。
4と関連して、再学習時に、自分で集めたデータのデータ長が短くてエラーが出ていたので、データ長周辺で調べてみた。
※ 下記のようなコメントだったのでいろいろ試したが駄目だった。
// Create an area of memory to use for input, output, and intermediate arrays.
// The size of this will depend on the model you're using, and may need to be
// determined by experimentation.
constexpr int kTensorArenaSize = 60 * 1024;

modelのinput_length

train.py で指定していた。
また、公開されていたdatasetのデータ長より、自身で集めたデータ長がだいたい半分ぐらいだった。
上記から、train.pyのseq_length を調整して再学習することにした。

再学習

基本は前回の通りで、train.pyの128を82にした。
収集したデータはだいたい半分ぐらいだったが、超える時もあったので少し余裕を持たせて82とした。

もう一回実行

なんか、認識しやすくなった。
constantを調整し、 リングバッファに貯め終わるタイミングで動作させる といい感じに認識した。
やはり、推論かけ始めると周波数がずれてしまうので認識に影響している気がする。
タイマー割り込みとかでmain loopで処理しない方がよさそう。
また、wing, slopeは認識するがringが認識しない。これに関してはまだよくわかっていない。

終わりに

独自で集めたデータがもとのデータ長より短いことを考慮し、ニューラルネットワークモデルの構造を調整して再学習し、ある程度ジェスチャ認識できるようになった。
ただ、まだ検出しないジェスチャがあったり、常に正常に認識できなかった理にするので、そのあたりを調査したい。

Discussion

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