Micro:bitでAI(Neural Network Libraries)を使う

SONYのNeural Network Consoleで学習させたモデルをMicro:bit上で動作させたので、そのときの手順を紹介します。
私が実施した環境はWindows 10になります。

# ■全体の流れ
- Micro:bit オフラインコンパイル環境を構築する
- Neural Network Console関連のソースを準備する
- 学習済みモデルを使ったプログラムを作成する

# ■Micro:bit オフラインコンパイル環境を構築する

基本的に[micro:bit runtime](https://lancaster-university.github.io/microbit-docs/offline-toolchains/)、[yotta](http://docs.yottabuild.org/#installing)のページに書かれている手順に従っていきます。

下記のものをインストールしました。

- Python3.7
- cmake3.14.3 x64
- ninja
- gcc4.9
- srecord
- yotta

## Python
バージョンが新しい分には問題ないようです。

## cmake
yottaのページからリンクされています。
[cmakeの公式ページ](http://www.cmake.org/download/)からインストーラーをダウンロードします。
バージョンが新しい分には問題ないようです。
インストール後、cmake.exeのフォルダにパスを通しておきます。

## ninja
yottaのページのリンクからダウンロードできます。
任意の場所に解凍し、パスを通しておきます。

## gcc4.9
yottaのページのリンクからダウンロードできます。
インストーラーを実行するだけです。

## srecord
micro:bit runtimeのページからリンクされています。
[srecordの公式ページ](http://srecord.sourceforge.net/)からダウンロードします。
任意の場所に解凍し、パスを通しておきます。

## yotta
```pip install yotta```でインストールできます。
Pythonで仮想環境を作っておくと良いと思います。

## コンパイル環境の確認
ソフト類を一通り入れたら、適当なプログラムを書いてコンパイルできるか確認しておきましょう。
※以降の説明では、作業フォルダを```c:\hoge\```の前提で記載します。

下記の構成となるようにmodule.json、main.cppというファイルを配置します。
```c:\hoge\module.json```
```c:\hoge\source\main.cpp```

module.jsonには下記のような内容を記述しておきます。

```json:modue.json
{
	"name": "testprogram",
	"version": "0.0.0",
	"description": "test desu",
	"keywords": [],
	"author": "",
	"license": "Apache-2.0",
	"dependencies": {
		"microbit": "lancaster-university/microbit#v2.1.1"
	},
	"bin": "./source"
}
```

main.cppには[micro:bit runtimeのページ](https://lancaster-university.github.io/microbit-docs/)から適当なサンプルをコピペしておきます。

ファイルの準備ができたら、```c:\hoge```で下記コマンドを使ってコンパイルします。

```sh
yt target bbc-microbit-classic-gcc
yt build
```

コンパイルに成功すると、
```c:\hoge\build\bbc-microbit-classic-gcc\source\``` にMicro:bitのバイナリファイルが生成されます。
ファイル名は、module.jsonのnameで指定した名前に「-combined.hex」をつなげたものになります。


生成されたバイナリファイルをMicro:bitにコピーして、動作することを確認します。


# ■Neural Network Console関連のソースを準備する
SONYの[Neural Network Consoleのページ](https://dl.sony.com/ja/)から、Neural Network Console Windowsアプリ版をダウンロードします。
アプリで任意のネットワークを作成してトレーニングしたら、トレーニング結果から「Export - NNB (NNabla C Runtime file format) 」を選びます。
c_sourceというフォルダにソースファイルが出力されるので、下記のものを ```c:\hoge\source\cruntime\``` に配置します。

- MainRuntime_inference.c
- MainRuntime_inference.h
- MainRuntime_parameters.c
- MainRuntime_parameters.h


[https://github.com/sony/nnabla-c-runtime](https://github.com/sony/nnabla-c-runtime/)からソースをダウンロードします。
そのうち、
/nnabla-c-runtime/include/nnablart/ の内容を ```c:\hoge\source\nnablart\``` に、
/nnabla-c-runtime/src/functions/ の内容を ```c:\hoge\source\functions\``` に配置します。


# ■学習済みモデルを使ったプログラムを作成する
[micro:bit runtimeのページ](https://lancaster-university.github.io/microbit-docs/)と、Neural Network Consoleアプリが出力した MainRuntime_example.c あたりを参考に学習済みモデルを使ったプログラムを作成します。

作成したものは ```c:\hoge\source\main.cpp``` に保存します。

あとは前述と同じ方法でコンパイルし、生成されたものをMicro:bitにコピーすれば動作するはずです。

※コンパイル時にやたらwarningが出ますが、バイナリファイルが生成されていれば問題ありません。
※```c:\hoge\source\```以下に不要なソースファイルがあるとコンパイルエラーになる場合があります。例えばmain.cppをコピーしたものがあるとダメです。

# 参考
[Lancaster University micro:bit runtime](https://lancaster-university.github.io/microbit-docs/)
[yotta](http://docs.yottabuild.org/#installing)
[SONY Neural Network Libraries](https://nnabla.org/ja/)
[CQ出版 Interface 2019年 1月号](https://shop.cqpub.co.jp/hanbai/books/MIF/MIF201901.html)