ＥＳＰ３２は深い学習の夢を見るか？[６](arduinoでリアルタイムDeepLearning)

#目的
　[「前々前回](https://qiita.com/hi631/items/f9aecba414317484ae37)」arduinoでDeepLearning出来る事を布教しました。
　その後、esp-idf環境ではリアルタイムDeepLearningが可能な事を確認しました。
　時間とゴニョゴニョが無いので、arduino側はそのままにしておりました。
　しかし、ほっといたらarduinoが拗ねるといけません。
　◆◆◆　そうだ、arduinoでもリアルタイムDeepLearningしてみよう　◆◆◆
　今後も同じ扱いに出来るかどうかは不明。


#経緯
　arduino環境はDeepLearning出来ることは確認したので、esp-idf環境で完成してから反映させる予定でした。
　しかし、「TTGO T-CAMERA」が以外に早く入手出来てしまった。
![投稿24-2 Image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/417318f8-c29c-f9e3-00f6-9fbd15ba3d85.jpeg)
　デモ環境を調べると、なななんとarduinoでは有りませんか。
　これはやるしかないと言う事で。
　1. 「TTGO T-CAMERA」の「[デモ環境](https://github.com/lewisxhe/esp32-camera-series)」をコンパイル。
　　でもエラーが出て、コンパイルが通らない。(おいおい)
　2. この辺り「[TTGO T-CAMERAをSTAモードで起動する] (https://qiita.com/yukinolinlin/items/65f6575d13d3bf0717e0) 」を参考にさせて頂き改変しコンパイル。
　　※エラーの回避策は上記と一寸違うが。
　3. うまくいったので、ブラウザで動作確認。
　4. NNCに食わせる、グレィスケールの画像が出せないのには参った。(ライブラリが腐っているような)
　5. 何とかしてからarduino-nncと結合し、コンパイルが通るようにした。
　6. カメラで数値画像を捉え、DeepLearningしてMNIST画像(0-9)をリアルタイム認識。(おお！一応できたぞ)


#前提条件(前々前回と同様)
　以下のソフトを予め導入の事。
　1. neural_network_console　(当たり前、for Windows 8.1/10_64bit 1.4.0にて検証)
　2. arduino開発環境　　　　 (ライブラリの追加が必要になります、エラーが出るのでzipを探す)
　3. visualstudio(2017)　　　　(自分好みにツールの変更を行いたい場合)


#neural_network_consoleでの操作
　「[前々回](https://qiita.com/hi631/items/d6573dbe5b8d30f4ed1b)」と同様。


#arduinoによるEVALUATION
　arduinoでコンパイル、実行可能な形で下記に格納していいる。
　　 [arduinoによるDeepLearningのEVALUATIONソフト] (https://github.com/hi631/esp32-nnc/tree/master/arduino-nnc-cam)
　　※app_camera.cpp内にWiFiのSSID等の設定が必要。
　1. 「[前々前回](https://qiita.com/hi631/items/f9aecba414317484ae37)」を参考に、arduinoの動作環境を設定して、コンパイルを実行する。
　2. ディスプレイに下図のようなMNIST画像を拡大して表示する。
　3. 「 [画像収集ソフト] (https://github.com/hi631/esp32-nnc/tree/master/gethttpfile)」を起動し、画像読込を行う。
　　※画像収集のタイミングで画像認識を行っている。単独で動かしたい場合はarduino-nnc-cam.ino loop(){}の//nnc_loop();の//を削除。
　4. ディスプレイ上の数値画像をカメラで撮影する。(例えば9)
　　※画像は外光の影響を避けた状態で、なるべく画面いっぱいに、カメラを傾けずに撮影するのがコツ。

![Image0-9a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/60b62b00-d40e-710d-f89e-d744adc596ea.jpeg)

　5. 下記のようにシリアルに表示され、( 9 )と認識されれば成功。
　　※上記画像(0-9)を一通り認識できる事を確認している。
　　　esp-idf版とほぼ同様でが、エラー(他の数字と誤認識)の数値が上がっている。

		Pos= -3 -1
		............................
		............................
		............................
		.........OOOOOOO............
		........OO.....O............
		.......OO...................
		......OOO...........O.......
		.....OOO...........OO.......
		.....OO...........OOO.......
		.....OO...........OOO.......
		.....O............OO........
		....OO...........OOO........
		....OO...........OOO........
		....OOO.........OOO.........
		.....OOO......OOOOO.........
		.....OOOOOOOOOOOOOO.........
		.......OOOOOO..OOO..........
		...............OOO..........
		...............OOO..........
		...............OOO..........
		..............OOO...........
		..............OOO...........
		..............OOO...........
		.............OOO............
		.............OOO............
		.............OOO............
		.............OO.............
		............................
		 +0.000 +0.000 +0.000 +0.458 +0.000 +0.000 +0.000 +0.007 +0.079 +0.966 ( 9 )
		PGM: 39200B 142ms


#「TTGO T-CAMERA」使用上の注意
　1. 上記にも書いたが、デモプログラムはそのままでは動作しない。黒魔術が必要。
　　ESP32-CAMERA側での改善が望まれる
　2. WiFiの設定
　　app_camera.cpp内にWiFiのSSID等の設定が有る。
　　これを設定しないとデモプログラムは先に進まない。(....が表示されるだけ)
　3. 標準の魚眼レンズでは認識が悪い。
　　標準では魚眼レンズ付きとなっているが、画像の周辺が歪むので認識に影響が出ている。
　　標準レンズに交換することにより、同程度の認識になる。(魚眼の方が高いのに)
　4. 温まると起動が遅くなる。
　　温まると(?)「Brownout detector was triggered」が発生し、再起動を暫く繰り返す。
　　※当方だけの現象かも知れない。アンテナの当たりを軽く撫ぜてやると機嫌がよくなる。
　5. グレィスケールが使えない。
　　「PIXFORMAT_GRAYSCALE」を指定すると「2BPP/YUV422」で出力される。
　　仕方が無いので、Yだけを取り出し半分に圧縮してグレィスケールを作成。でもメモリは倍(38400バイト)も使っている。


#デモプログラムの他機種への転用
　デモプログラのピン設定を書き換え、他の環境(esp-idfでの動作環境)で動作確認を行った。
　結果的には画像認識は上手くいっているが、画像にラインが表示される。
　クロックを12MHzにする事により、多少緩和される。(10MHzはダメ)
　10MHzでダメな事より、クロックスピードではなくデモプログラムに何か落とし穴が有る模様だが、良く判っていない。

<BR>
　今後は src main内のc_source 派生のプログラムを差し替えれば(一部変更要)、esp-idf版に追随できる。(多分)
　なお、もし追試する奇特な方がおられた場合、上記記載内容は無保証であり、各自の責任においてご利用願います。