SSブログ

Neural Network Libraries (Nnabla) で作った AI を SPRESENSE で動かす! [AI]

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


DSC_0991.JPG


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カードスロットに差し込みましょう。

2020-05-31 (1).png


■ テスト用の 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:

}


結果を見てみましょう!


2020-05-31.png


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





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

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

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



SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

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




nice!(23)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 23

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。