今回は、前回 Neural Network Libraries (Nnabla) で作った AI (Auto Encoder) を SPRESENSE で動かしてみたいと思います!そもそも Nnabla を使ったのは、これが目的ですからね。
SPRESENSEに動かすのはここで紹介したコードに次のコードを追記します。
■ Import に nnabla.util.save を追加
ネットワークをメディアに出力するためのユーティリティです。コードの冒頭に追加してください。
■ ネットワークをメディアに出力する
NNP というファイルを一旦出力します。フォーマットの詳細はよくわかりませんが、このチュートリアルを参考にしました。次のコードをPythonコードの最後に追加してください。
次にSPRESENSE が読み込めるようにここで保存したNNPデータを変換します。
■ NNPファイルをNNBに変換する
SPRESENSE で読み込めるようにするには "NNB" という形式に変換しなければなりません。コマンドラインアプリを使って変換することができます。詳しくはこちらを参照してください。
■ "sindet.nnb" を SDカードにコピーして SPRESENSE に差し込む
"sindet.nnb" というファイルが生成されるので、それをSDカードにコピーして、SPRESENSEの拡張ボードのSDカードスロットに差し込みましょう。
■ テスト用の Arduino スケッチを SPRESENSE に書き込みを動作確認をする
Arduino IDE を使って、テスト用の Arduino スケッチを書き込みます。SPRESENSE のコードも Python で書けると楽だなと思いましたが、 CircuitPython では まだ DNNRT ライブラリはサポートされていないみたいですね…。もう少し待ちましょう。
結果を見てみましょう!
おお、いい感じに出ました!うまくいきましたね。これで、Neural Network Libraries で作った AI も SPRESENSE で動かすことができるようになりました!😆
(^^)/~
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