TensorFlow Lite for Microcontrollers, MicrPython etc.
以前に TensorFlow Lite for Microcontrollers(以下 TFLM と略)を評価してから、いつの間にか 1年半以上が経ってしまいました。月日の変わるのが早くて不安になります…。
当時は、TensorFlow v2.2.1 を評価していたのですが(v2.4.0 のリリース直前だった)、現在は v2.10.0 がリリースされています。ちなみにこちらの README.md を見て驚いたのですが、TFLM は 2021年の 6月から、アップストリームの TensorFlow および TensorFlow Lite からリポジトリが分離してしまったのですね。恐らく、アップストリームと、TFLM の開発速度や開発文化の間に差が大きすぎて、お互いに不自由が生じてきた、ということがあるのではないかと想像します。実際、当時のブログで書いたように、最新の TensorFlow リポジトリをチェックアウトしても、TFLM のサンプルプロジェクトがうまくビルドできない、ということがありました。また、TFLM では、リリース時の動作確認には実際のボードが必要でしょうから、アップストリームのような continuous integration は難しいのでしょう。
教育現場において TensowFlow をマイコン上で簡単に動かせないか
閑話休題。長いタイトルですみません。
前回、TensorFlow を Jupyter 上で動かす話をしました。流行りの機械学習(ML)、ディープラーニングを中高生くらいのお子さんに紹介しようとすると、TensorFlow の環境をどうやって用意して貰うかが問題になります。Google Colab や(まだ非公式の)JupyterLite を使えたら便利だと思うのですが、学習者さんにとっては、やっぱり手元のデバイスで機械学習が動くほうが、感動が大きいに違いありません。
ちなみに、JupyterLite で TensorFlow を動かすのは、当面は難しそうです。scikit-learn なら動きそうですが。
一つの選択肢は有名な Raspberry Pi だと思うのですが、Raspberry Pi で TensorFlow を動かすとすると前準備が大変ですし、ビルド済みの SD カードを配ってしまう、というのも、いまひとつ面白くありません。もう一つ、最近は Raspberry Pi の入手が困難で、誰にでもお勧めできるという状況ではなくなっています。(ま、入手性については 1年以内くらいに改善するかも知れませんが。)
こうなると、もっと規模の小さいマイコンボードによる機械学習のデモンストレーションに興味が出てきます。Raspberry Pi Pico RP2040(Linux は動作しません!)や ESP32 という安価で流行りのマイコンなら普通に市場に出回ってますし、クラウドで動かす TensorFlow と、学習者さんのギャップを埋める道具として使えないかな、という期待が膨らんできます。
上述の TFLM も一つの候補ですが、ようやく Python が少し分かるようになった学習者さんに、「さて、次に C++ を覚えましょう」というのは酷のような気がします。プロの製品設計の分野ではともなく、学習者さんに「わっ! マイコンで機械学習が動いた!」という感動を、もう少し容易に味わせてあげることはできないものでしょうか。
毎度、前振りが長いな…
MicroPython で TFLM を動かすプロジェクトを見つけた!
そんな折、こんなプロジェクトに取り組んでいるサイトを見つけました。
簡単に言うと、マイコンボード上で動く MicroPython で TensorFlow Lite のモデルを動かそう、というアイデアです。調べてみると、RAM の多い(外部に RAM を接続した)ESP32 であれば、person detection(画像に人が写っているかどうかの判定)プログラムくらい動いてしまうそうです。これは興味深いです。
MicroPython で大きな TensorFlow モデルを動かそうとすると、通常のやり方ではモデルを RAM 上にロードする必要が出てくるので、RAM の少ないマイコンではちょっと厳しそうですが、それでも素晴らしい試みだと思います。
工夫すれば、モデルを ROM 上に置いたまま TFLM で推論させることもできそうですが、フラッシュファイルシステム上にあるモデルデータで、そのまま演算させるのは、やっぱり難しいでしょう。フラッシュメモリを分割して、モデルデータをリニアに展開しておく、というアイデアはありそうですが、そうなると MicroPython を使う手軽さが失われてきて、これまた学習者さん向けではなくなってしまいます。
次回への布石
さて、上記のプロジェクトにある person detection は、ESP32-CAM-MB あるいは M5 Timer Camera での動作が確認されているそうです。私は、これとは異なる ESP-EYE というボードなら持っています。
ESP-EYE のカメラも OmniVision OV2640 ぽいですし、ESP32-CAM も ESP-EYE も、いずれも ESP-WHO というソフトでサポートされているので、ピン接続の指定だけ変えれば動くんじゃないかなあ、と「甘く」想像しています。
蛇足ですが、ESP-EYE の残念な点は GPIO ピンが全く出ていない点です。外部とのインターフェイスは、USB 経由の UART か、Wi-Fi を使うしかなさそうです。ESP-EYE で外部 I/O 制御する人はないだろう、という設計コンセプトだったのでしょうが、ちょっと残念に思います。(ただし、押しボタンスイッチ 1つと、LED 2つが付いているので、それを利用することは可能。)
今日はここまで。