今回は、前回 Neural Network Libraries (Nnabla) で作った AI (Auto Encoder) を SPRESENSE で動かしてみたいと思います!そもそも Nnabla を使ったのは、これが目的ですからね。





SPRESENSEに動かすのはここで紹介したコードに次のコードを追記します。


■ Import に nnabla.util.save を追加
ネットワークをメディアに出力するためのユーティリティです。コードの冒頭に追加してください。


import nnabla.utils.save as Save



■ ネットワークをメディアに出力する
NNP というファイルを一旦出力します。フォーマットの詳細はよくわかりませんが、このチュートリアルを参考にしました。次のコードをPythonコードの最後に追加してください。


## save the model
contents = {
'networks' : [
{'name': 'sindet'
,'batch_size': batch_size
,'outputs': {'result': result}
,'names' : {'input': input_data}
}
]
,
'executors' : [
{'name': 'runtime'
,'network': 'sindet'
,'data': ['input']
,'output': ['result']
}
]
}

Save.save('sindet.nnp', contents)


次にSPRESENSE が読み込めるようにここで保存したNNPデータを変換します。


■ NNPファイルをNNBに変換する
SPRESENSE で読み込めるようにするには "NNB" という形式に変換しなければなりません。コマンドラインアプリを使って変換することができます。詳しくはこちらを参照してください。


$ nnabla_cli convert -b 1 sindet.nnp sindet.nnb
[nnabla][INFO]: Initializing CPU extension...
NNabla command line interface (Version:1.7.0, Build:200401213820)
Importing sindet.nnp
Expanding sindet.




■ "sindet.nnb" を SDカードにコピーして SPRESENSE に差し込む
"sindet.nnb" というファイルが生成されるので、それをSDカードにコピーして、SPRESENSEの拡張ボードのSDカードスロットに差し込みましょう。




■ テスト用の Arduino スケッチを SPRESENSE に書き込みを動作確認をする
Arduino IDE を使って、テスト用の Arduino スケッチを書き込みます。SPRESENSE のコードも Python で書けると楽だなと思いましたが、 CircuitPython では まだ DNNRT ライブラリはサポートされていないみたいですね…。もう少し待ちましょう。


#include <SDHCI.h>
#include <DNNRT.h>
#include <math.h>

DNNRT dnnrt;
SDClass SD;

float input_data[64];
float output_data[64];

void setup() {
int ret;

Serial.begin(115200);
SD.begin();

File nnbfile = SD.open("sindet.nnb");
if (!nnbfile) {
Serial.println("nnb not found");
return;
}

ret = dnnrt.begin(nnbfile);
if (ret < 0) {
Serial.println("DNNRT initialization failure: " + String(ret));
return;
}

DNNVariable input(64);
float *d = input.data();
for (int i = 0; i < 64; ++i) {
d[i] = input_data[i] = sin(i/10.0) + float(random(-3, 4))/10.0;
}

dnnrt.inputVariable(input, 0);
dnnrt.forward();
DNNVariable output = dnnrt.outputVariable(0);

Serial.print("sin,");
Serial.print("input,");
Serial.println("output");
for (int i = 0; i < 64; ++i) {
Serial.print(String(sin(i/10.0)) + ",");
Serial.print(String(input_data[i]) + ",");
Serial.println(String(output[i]));
}

dnnrt.end();
}

void loop() {
// put your main code here, to run repeatedly:

}


結果を見てみましょう!





おお、いい感じに出ました!うまくいきましたね。これで、Neural Network Libraries で作った AI も SPRESENSE で動かすことができるようになりました!😆
(^^)/~





ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware