ESP32は深い学習の夢を見るか?[3](arduinoでDeepLearning)


目的

 ESP32でDeepLearningをやるひとが増えれば、もっと情報が集まるのではないかと想像する。
 開発環境としてesp-idfを使っているが、arduinoよりちょびっと敷居が高い(マイナーなのか?!)。
 検索してもarduinoの方はガンガンヒットするのに、esp-idfは それなに美味しいのてな感じ。
 ◆◆◆ そうだ、arduinoでDeepLearningを出来るようにしてしまえ ◆◆◆
 仕掛けは判らなくても、お手軽にDeepLearning出来るのであれば、試してみる人もいるんじゃないか。
 数は力なり。

経緯

 (1)前前回 の「アヤメの分類」でneural_network_consoleの使い方は多少分かった。
 (2)neural_network_consoleが吐き出したc_sourceを、esp-idfでコンパイル、実行はできた。
 (3)nnabla-c-runtime をなんとかすればarduinoでも出来るかもと考えた。
 (4)nnabla-c-runtime をarduino環境に持ってきてごそごそ。
 (5)なななんと、DeepLearningがarduinoで動く環境が出来上がってしまったではないか(まじ?!)。
  ※といっても、コンパイル、実行がarduinoから出来るだけで、大部分はCプログラムなんですけどもね。

前提条件

 以下のソフトを予め導入の事。
 (1)neural_network_console (当たり前、for Windows 8.1/10_64bit 1.4.0にて検証)
 (2)arduino         (ESP32の開発環境)

環境整備

 ESP32でのファイル格納場所の確保

 SPIFFSでファイルを格納する場合、パーテーションの設定が必要となる。
 arduinoでボード「ESP32 Dev Module」を選択し、Partition Schemeとして「3MB No OTA」を選択すると、約1MB(実使用は750KB?)が確保できた。

    最大3145728バイトのフラッシュメモリのうち、スケッチが257320バイト(8%)を使っています。
    最大327680バイトのRAMのうち、グローバル変数が13708バイト(4%)を使っていて、ローカル変数で313972バイト使うことができます。

 データのアップロード

 (1)スケッチフォルダにdataフォルダを作成し、必要となるファイルを格納。
 (2)arduino-esp32fs-pluginからESP32FS-1.0.zipをダウンロード。
 (3)解凍し、esp32fs.jarを<スケッチディレクトリ>/tools/ESP32FS/tool/に格納。
 (4)arduinoを再起動すると、ESP32 Sketch Data Upload が出来ているので、選択するとdataフォルダ内のファイルがアップロードされる。
  ※ESP32をダウンロード可能状態にしておくこと。(シリアルモニタは消す)

 コンパイル環境の整備

 (1)nnabla-c-runtimeをダウンロードする。
 (2)スケッチのフォルダに、srcフォルダを作成し、implements utilities nnablart フォルダのファイルをコビー
 (3)コンパイルするとエラーが出るので、includeしているファイルのディレクトリ位置を粛々と調整。
 (4)srcフォルダに、mainフォルダを作成し、c_sourceのファイルをコピー、動かせるように多少変更。
 ※今回はainRuntime_inference.cもいじらないとエラーになる。
 (5)arduinoから呼び出されるファイル(例nnc_main.c,nnc_main.h)を作成。
 (6)呼びだすファイル( ***.ino )を作成。
  ※spiffsの処理は、Cからarduino側を呼びだして実現。
 これだけで判る筈もないので、下記に結果を格納している。ためしてがってん。
  arduino-nnc
 mainフォルダ内のc_sourceファイルがコンパイル、実行される。
 mnistをやりたい場合はmain_mnist内のファイルを全てmainに全てコピーする。main_irisも同様。
 ※ライブラリにするのは大変そうで、かつ環境を汚しそうなので、サブプログラムとして呼び出している。

実行

 次のような実行結果がシリアルモニタに得られる(はず)。

    -- iris --
    Start
    Spiffs.Dir.Info
     /0_1.bin 3136 byte
      :
     /9_2.bin 3136 byte
     /iris_flower.csv 619 byte

     5.0 3.5 1.3 0.3 ( 0 )  +6.443 +2.331 -7.357 ( 0 )
     4.5 2.3 1.3 0.3 ( 0 )  +5.065 +2.398 -6.332 ( 0 )
      :
     6.2 3.4 5.4 2.3 ( 2 )  -4.329 +1.268 +2.976 ( 2 )
     5.9 3.0 5.1 1.8 ( 2 )  -3.711 +1.436 +2.227 ( 2 )
    stop

    -- mnist --
    Start
    Spiffs.Dir.Info
     /0_1.bin 3136 byte
      :
     /9_2.bin 3136 byte
     /iris_flower.csv 619 byte

    0_1.bin  +1.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 ( 0 )
    1_1.bin  +0.000 +1.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 ( 1 )
    2_1.bin  +0.000 +0.000 +1.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 ( 2 )
    3_1.bin  +0.000 +0.000 +0.000 +1.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 ( 3 )
    4_1.bin  +0.000 +0.000 +0.000 +0.000 +1.000 +0.000 +0.000 +0.000 +0.000 +0.000 ( 4 )
    4_2.bin  +0.000 +0.000 +0.000 +0.000 +1.000 +0.000 +0.000 +0.000 +0.000 +0.000 ( 4 )
    9_1.bin  +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +1.000 ( 9 )
    9_2.bin  +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +1.000 ( 9 )
    stop

 今週は余裕が有ったので、力ずくで進めて行ったら、意外と旨く行った。
 これでDeepLearningの信者が、多少なりと増えれば嬉しいかな。
 なお、上記記載内容は無保証であり、各自の責任においてご利用願います。