Sony Neural Network Console (以下 NNC)が使えるようになったので、今回はNNCで出力した学習済データを SPRESENSE で使ってみたいと思います。例によって動画にしてみたので、お時間のある方はどうぞ。





最初に、NNC を使って機械学習を行います。今回は、前回使った”4”、”9”を判別するネットワークを使います。





学習済データは、学習結果の履歴を右クリックで出てくるメニューの”Export”で取得することができます。このとき、フォーマットは"NNB"を選択します。





すると"model.nnb"が出力されていますので、それを使います。





次にArduino IDEを開きます。”スケッチ例”の”DNNRT”から”number_recognition”サンプルを起動します。このサンプルでは、学習済データの名前が”network.nnb”となっていますので、"model.nnb"へ変更します。


#include &ltSDHCI.h>
#include &ltNetPBM.h>
#include &ltDNNRT.h>

DNNRT dnnrt; // NNCの学習済データを使うためのライブラリ
SDClass SD;

void setup() {

Serial.begin(115200);

File nnbfile = SD.open("model.nnb"); // NNCの学習済データを読み込み(拡張ボードが必要)
if (!nnbfile) {
Serial.print("nnb not found");
return;
}
int ret = dnnrt.begin(nnbfile);
if (ret < 0) {
Serial.print("Runtime initialization failure. ");
if (ret == -16) {
Serial.println("Please update bootloader!");
} else {
Serial.println(ret);
}
return;
}

// Image size for this network model is 28 x 28.

File pgmfile("number4.pgm"); // 識別したいファイルを指定
NetPBM pgm(pgmfile);

unsigned short width, height;
pgm.size(&width, &height);

DNNVariable input(width * height);
float *buf = input.data();
int i = 0;

// Normalize pixel data into between 0.0 and 1.0.
// PGM file is gray scale pixel map, so divide by 255.
// This normalization depends on the network model.

for (int x = 0; x < height; x++) {
for (int y = 0; y < width; y++) {
buf[i] = float(pgm.getpixel(x, y)) / 255.0;
i++;
}
}

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

// Get index for maximum value.
// In this example network model, this index represents a number,
// so you can determine recognized number from this index.

int index = output.maxIndex();
Serial.print("Image is ");
Serial.print(index);
Serial.println();
Serial.print("value ");
Serial.print(output[index]);
Serial.println();
if (output[index] < 0.2) Serial.println("the result is 4");
else if (output[index] > 0.8) Serial.println("the result is 9");

dnnrt.end();
}

void loop() {
}



SPRESENSEは、メインボードと拡張ボードを使います。出力した "model.nnb"とサンプルに使う画像をSDカードにコピーをして拡張ボードのSDカードスロットに差し込みます。





サンプルの画像は自作したものを使ってみました。こちらから取得ください。





number4.pgm を読み込ませてみた結果です。




number9.pgm を読み込ませてみた結果です。



うまく動きました!

Arduino IDE でAIプログラミングができるなんてすごく便利ですね。次はカメラから取得した画像を認識できるようにしてみたいと思います!
(^^)/~




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

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