MicroPython で TensorFlow Lite for Micro を試してみる(準備編)

(更新

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 自体は、うまく動いているように見えます。

今日はここまで。

お問い合わせはお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。必ず返信致しますが、時々アドレス誤りと思われる返信エラーがございます。返答が届かない場合、大変お手数ではございますが別のメールアドレスで督促頂けますと幸いです。