Running TensorFlow Lite for Microcontrollers on MicroPython. (Preparation Edition)
先日、MicroPython で TensorFlow Lite for Microcontrollers(以下 TFLM と略)が動くらしいよ、という記事を書かせて頂きました。
ちょっとずつ、この話題を試してみようと思います。私の手持ちのボード ESP-EYE は、オリジナル作者さんが動作確認をしているものではないので、動かなかったゴメンなさい。
準備運動から
最近、ESP32 + MicroPython の評価から長く離れていたので、まずはプレーンな MicroPython のインストール、動作確認をしてみたいと思います。
まず、MicroPython のチュートリアルサイトを調べます。こちらですね。
私の調べた時には、1.19.1版が最新のようでした。
esptool をインストールする
ファームウェアの書き込みには、Python で書かれた esptool が必要です。上記チュートリアルサイトを参考にインストールしてください。私がインストールしたときは、最新版は 4.3 版のようでした。
ファームウェアを選ぶ
チュートリアルの 1.3. Getting the firmware に従い、こちらからインストールするファームウェアを選びます。残念ながら ESP-EYE はリストアップされていないのですが、ESP32 with SPIRAM の上位互換のように思われるので、そのファームウェアをダウンロードします。今回は(上述の通り)リリース v1.19.1 をダウンロードしました。
ファームウェアを書き込む
ボード ESP-EYE へのファームウェア書き込みは、Arduino などと違って、少々面倒です。ボードのリセット時に、「通常動作モード」か「ブートモード」かを選択しなくてはいけないからです。(ま、ESP32 のオリジナル仕様がそういうものなのですが。)
ESP-EYE のドキュメントを参照しようと思って探したのですが、やや製品が古いためか、情報が失われ始めているようです。これって、ユーザーガイドではないだろうと!
しょうがないので、私が以前に書いたブログを参考にします。(とほほ)
ポイントは、ボード上の BOOT ボタンを押しながら RST ボタンを押すとブートモードになる、という点なのですが、意外とうまく行きません。うまく行かないときは、一度 USB ケーブルを PC から挿抜し直してみると解決することがあります。シリアルターミナルで 115200 bps で接続し
rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download
みたいな表示が出れば、ブートモードで起動しています。ここでシリアルターミナルを終了し、すかさず(慌てなくても大丈夫)
bash$ esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART --baud 460800 \
write_flash -z 0x1000 ~/Downloads/esp32spiram-20220618-v1.19.1.bin
のように(上記の、ESP32 ファームウェアダウンロードページを参照してください)コマンドを実行すると、ファームウェアが書き込まれます。
ブートしてみる
はい、そうしたら今度は、BOOT ボタンを押さない状態で RST ボタンを押してみましょう。シリアルターミナルに次のような表示が出れば、MicroPython は起動しています。
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4540
ho 0 tail 12 room 4
load:0x40078000,len:12788
load:0x40080400,len:4176
entry 0x40080680
MicroPython v1.19.1 on 2022-06-18; ESP32 module (spiram) with ESP32
Type "help()" for more information.
>>>
ちょっと試してみる
せっかくなので、少し動かしてみましょう。
>>> import math
>>> math.pi
3.141593
>>> math.sin(math.pi / 4)
0.7071068
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
>>
あまり面白くありませんね、はい。(汗)
SPIRAM(PSRAM)は使えているの?
今回インストールした MicroPython には、ESP32 の PSRAM を使う機能があるはずです。これが重要で、そうでないと TFLM の person detection(カメラ版)がメモリ不足で動かないのです。
ちゃんとメモリが使えているか確認しておきましょう。こちらのページを参考にします。
>>> import gc
>>> gc.collect()
>>> gc.mem_free()
4096928
>>>
4Mバイト空いているそうなので、ちゃんと PSRAM を認識していると言えるでしょう。(ESP-EYE の PSRAM は 4Mバイト)
TFLM 版の MicroPython ファームウェアを試してみる
次に、TFLM 版のファームウェアを試してみましょう。こちらのサイトの説明を参考に、ファームウェアをダウンロードします。
ここの Build Type から ESP32 の Status Passing をクリックします。グリーンのチェックが付いている最新のファームウェアを選びますが、私のときは
というバージョンでした。そこから、(今回はカメラモジュールを使いたいので)microlite-spiram-cam-esp32-firmwareというものを選んでダウンロードします。
次にフラッシュの書き込みです。こちらの記述を参考に、
bash$ esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART --baud 460800 write_flash \
-z 0x1000 bootloader/bootloader.bin \
0x8000 partition_table/partition-table.bin \
0x10000 micropython.bin
として書き込みました。
ブートして、先ほど同様、メモリサイズを確認してみましょう。
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4604
ho 0 tail 12 room 4
load:0x40078000,len:13872
load:0x40080400,len:3356
entry 0x4008061c
MicroPython 2aa9d11 on 2022-09-01; ESP32-cam module (microlite) with ESP32
Type "help()" for more information.
>>> import gc
>>> gc.collect()
>>> gc.mem_free()
2047984
>>>
フリーエリアは 2Mバイトです。MicroPython 自体は、うまく動いているように見えます。
今日はここまで。