ＥＳＰ３２は深い学習の夢を見るか？[３](arduinoでDeepLearning)

#目的
　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バイト使うことができます。
![Image5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/554f3fcb-ddf0-0c92-ab1e-32f57a141059.jpeg)

##　データのアップロード
　(1)スケッチフォルダにdataフォルダを作成し、必要となるファイルを格納。
　(2)[arduino-esp32fs-plugin](https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/tag/1.0)から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の信者が、多少なりと増えれば嬉しいかな。
　なお、上記記載内容は無保証であり、各自の責任においてご利用願います。