#目的
ESP32でDeepLearningをやるひとが増えれば、もっと情報が集まるのではないかと想像する。
開発環境としてesp-idfを使っているが、arduinoよりちょびっと敷居が高い(マイナーなのか?!)。
検索してもarduinoの方はガンガンヒットするのに、esp-idfは それなに美味しいのてな感じ。
◆◆◆ そうだ、arduinoでDeepLearningを出来るようにしてしまえ ◆◆◆
仕掛けは判らなくても、お手軽にDeepLearning出来るのであれば、試してみる人もいるんじゃないか。
数は力なり。
#経緯
(1)[前前回] (https://qiita.com/hi631/items/7192421626308d521be0) の「アヤメの分類」でneural_network_consoleの使い方は多少分かった。
(2)neural_network_consoleが吐き出したc_sourceを、esp-idfでコンパイル、実行はできた。
(3)[nnabla-c-runtime] (https://github.com/sony/nnabla-c-runtime) をなんとかすればarduinoでも出来るかもと考えた。
(4)[nnabla-c-runtime] (https://github.com/sony/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] (https://github.com/sony/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] (https://github.com/hi631/esp32-nnc/tree/master/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の信者が、多少なりと増えれば嬉しいかな。
なお、上記記載内容は無保証であり、各自の責任においてご利用願います。