GR-MANGOでDRP

例によって書きかけです…  
  
![sushi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/fdad8ce3-17e0-40d5-c519-fec106fd8025.jpeg)

GR-MANGO(Core)をお借りしたので，遊んでみる．
せっかくなので，DRPへ処理の一部をオフロードしてみたい．  
  
さっそく製造元のページを見てみると，
「GR-MANGO 新規製造中止」　が～ん！．  
でも，ちゃんと情報は見られる状態になっている．よかった  
（販売はまだしているようなので買えます）  

# その1：DRPを使った画像処理デモアプリを動かす
 Mbedフレームワークを使ったサンプルアプリが提供されている．  
## 使うもの
- GR-MANGO
- Pi Camera V2
- PC

## GR-MANGOのファームウェア
　ファームウェアは，オブジェクトファイル（.bin）になっている．ボードをUSBケーブルでPCにつなぐと，ストレージとして認識されるので，ドラッグ＆ドロップでファームウェア書き込みできる．  
![1676289818264.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/2d9c3be7-4e12-6f7c-33de-13ec3aebcf98.jpeg)

## PC側のソフト
　デモアプリのためのPC側アプリケーションも.exeファイルで提供されている．  

GUIアプリケーションなので分かりやすい．実行したら，GR-MANGOをつないだcomポートを選択する（ファームウェアは事前に書き込んでおく）．  
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/05304cc6-b54a-061b-3d07-5aea2e2a79e2.png)

　GR-MANGOとPCとは，シリアル通信で連携させる(このときは，USB type-C側を使う)  
．
PCアプリで画像用のフィルタとかを選ぶと，Pythonコードが自動生成され，それがGR-MANGOで実行されるようである．  
カメラ画像と，処理後の画像が共に表示される．  
これらはリアルタイムに更新される．  
画像も，仮想COMポート経由でPCアプリに表示されるようである． 
(HDMIコネクタからも結果画像を出せる)   
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/8f16c017-bcd2-1f46-ad9e-b2d0640484b4.png)

幾つかフィルタが用意されており組み合わせ（フィルタの適用順）も替えられる（フィルタの適用順も）．
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/14d5a9c4-0596-079c-68dd-a22341b7bd65.png)



# その2：Classification
カメラ画像による物体分類を試してみる．  
## デモアプリは簡単に動く
学習済みモデルを使った分類アプリケーションがデモとして用意されている．  
画像による分類を試す．  
GR-MANGO上で動くサンプルアプリとして，カメラ画像を食べ物16クラスに分類するものが用意されている．  
mbedで書き込むだけで動くのですぐ試せる．  

## TensorFlowで自前の学習済みモデルを用意する

https://github.com/renesas-rz/rza2m-food-recognition-demo

公式サイトで必要なものをゲット． (`rza2m-food-recognition-demo-main.zip` )  
### Windows11だとうまくいかなかったナリ
差し当たって，説明書通りに進める．  
TensorFlowのバージョンは2.0.1，古い！  
Windows11上で環境構築にトライしたものの，VC＋＋だかのライブラリバージョンの問題で失敗．  
  
### Ubuntuだとできた
WSL2のUbuntuで再トライ．

まず，aptで2，3個ライブラリ（なんだっけ？）をインストール．  

```
sudo apt install zlib1g zlib1g-dev libssl-dev libbz2-dev libsqlite3-dev
```

次に，pyenv経由でPython3.5.1をインストール．  
（もし，先にPythonをインストールしてしまった場合，一度 `pyenv uninstall 3.5.1` してから，aptでライブラリをインストール後，pyenv 3.5.1でPythonを再インストールする．  
ライブラリ何だったっけ？忘れちゃった（笑））  
説明書には書いていないけど，pandasのインストールが必要．  
後は，説明書通りに環境構築する．  
  
## 画像を用意して学習を実行
今回は6種類の寿司の分類を試してみる．  
各々のすしについて，1600枚程度の画像を用意して，`data15` フォルダ以下に設置．  
学習用のPythonスクリプト（ `food-menu-recognize.py` ）が用意されているので，それを実行する．  
GPUを使わないのでめっちゃ遅い！！
「果報は寝て待て」一旦帰る．続きは明日…  

翌朝出社（昼だったけど…）  
学習が終わっている．  
accuracy 0.7程度…　弱い   
なにしろ まず1度動かしてみないことには始まらないので，これで進めてみる．  
  
### 学習済みモデルの変換  
学習済みモデル`food_menu_recognition.tflite`を次のコマンドでC++から読めるように変換する．  
`xxd -i food_menu_recognition.tflite > food_menu_recognition.cc`  

できた`food_menu_recognition.cc`ファイルを修正する（2か所ある変数宣言にconstを付ける）．  

## e2studioでビルド
取説（GR-MANGO で AI Customization Guide）に従ってe2studioでビルドする．大まかな手順は次の通り．
（RZデバイスサポートが必要なのでない場合はセットアップしておく）   
![rz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/58be3c7d-d2c1-b56e-784c-7492f55d962b.png)
ビルドするためには，いろいろ入れないとダメらしくて…  （Rzは初めて使ったので追加インストールするものが多かった）
![rza.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/1cc531f1-bcdb-d4d3-4b86-2771f8101e18.png)

   
### 分類クラス定義の修正
e2studioでプロジェクトを開く．  
次の4つのファイルを編集する．  
- inference_exec.h  
- inference_exec.ino.cpp
- model_settings.cpp
- model_settings.h
  
### ビルド
「プロジェクトをクリーンにする」  
「プロジェクトをビルド」  
エラーが出るので，数か所を修正する．  
いずれも，分類対象関係の変数名からみである．  
  
出来上がった`.bin`ファイルをドラッグ＆ドロップでGR-MANGOに書き込んで，リセットすると動作する．
画面出力はHDMIから出る．  
  
![tamago.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/3fc9c467-dcae-c7b1-dd8e-ae0ca5924943.jpeg)


＝＝＝＝以降，トライ中  
# 今どきのTensorFlowでも試す
うまく行かない…
後日　Dockerでトライします…

Pythonのバージョンは3.9.16にする．  
#### CUDA 11.2をインストール<sup>（2）</sup> 
#### cuDNN 8.1をインストール<sup>（2）</sup> 
https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
#### tensorrt 2.11をインストール
 `python -m pip install tensorrt`  

# 参考ウェブサイト
（1）Core公式サイト
https://www.core.co.jp/service/iot/gr-mango
（2）WSLへCUDAをインストール
https://zenn.dev/he/articles/31c922209335b9
（3）cudnnダウンロード
https://developer.nvidia.com/rdp/cudnn-download