M5StackでTensorFlow Lite for MCU Hello world

Twitter経由で以下の記事を見つけたので試してみました。この記事はTensorflow Lite for microcontrollersのHello worldサンプルをESP32で動作させる手順をstep-by-stepで解説しています。

TensorFlow, Meet The ESP32

上記の記事では、ライブラリはESP32のArduinoで、IDEはPlatformioを使用しています。
昨年、M5Stack FireでPlatformioを使ったことがありましたので、この環境でビルドしてみました。

概ね記事の手順どおりにやれば動くのですが、現在のtensorflow liteはこの記事の筆者さんのものとは微妙にファイル構成が異なっているようで、若干の修正が必要でした。
修正点を以下に書いておきます。(この修正点は、tensorflowは2019/12/8時点のr2.1ブランチを対象としています。)

まず、libフォルダに入れるtensorflowライブラリですが、thirdpartyというサブディレクトリがあり、この中にもincludeファイルが入っています。
そのため、このディレクトリをincludeパスを追加する必要があります。

パスの追加はplatformio.iniファイルに設定を追加して行います。開発ボードにM5Stack Fireを使っているので、その点も書き換えます。
platformio.iniは以下のようになります。

次に、ビルドの際に以下の2つのエラーが出ました。

(1)lib/tfmicro/tensorflow/lite/experimental/micro/kernels/activation_utils.h
このファイル中で使っているsignbit()が未定義、というエラーだったので、std::signbit()に修正しました。

(2)lib/tfmicro/tensorflow/lite/experimental/micro/micro_optional_debug_tools.cc
このファイル中で使っているprintf()が未定義、というエラーだったので、#include <stdio.h>を追加しました。

以上でライブラリはビルドできるようになりました。

このHello worldサンプルは、xからf(x)を推定するモデルを動作させるものですので、メインルーチンはM5StackのLCDで(x, f(x))をプロットさせるものにしました。
モデルはf(x)としてsin(x)を使って学習しているので、実際に出力されるのはサインカーブ(っぽい曲線)です。

main.cppの中身は以下の通りです。

ループの中でdelay(10)を入れていますが、これが無いと残像がほとんど残りません。
記事冒頭のGIFアニメは、フレームレートの関係で実際の速度よりも少し遅めに映っています。

なお、このGIFアニメはQGiferで作成しました。

コメント