5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-28

#目的
 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

## データのアップロード
 (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の信者が、多少なりと増えれば嬉しいかな。
 なお、上記記載内容は無保証であり、各自の責任においてご利用願います。

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?