マイコン(Arduino)でTensorFlowを動かしてみた！

# この記事の目的

最近、個人的にTensorflow Liteを使ってIoTエッジデバイスで機械学習モデルを実行してみたいと
思って調べている中で、ArduinoでもDeepLearningモデルが簡単に実行できると知り、実際に試してみました。

ArduinoでTensorflow Liteを動かしてみたので、その流れを書いてみたいと思います。
基本的には、[公式ページ](https://www.tensorflow.org/lite/microcontrollers)の内容を試した形になっています。

# この記事で使用したもの

- Arduino Nano 33 BLE Sense ※[購入ページ](https://store.arduino.cc/usa/nano-33-ble-sense)
- 開発用PC ※私の場合は、macOS Catalina バージョン10.15.2 で行いました。
- Arduino IDE 1.8.10

# 開発環境のセットアップ

Tensorflow Liteをマイコンで実施するには、公式ページに記載されている通りいくつか選択肢があります。
今回は、一番上に記載されているArduino Nano 33 BLE Senseというマイコンを使用しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/9f539a0e-4ef9-cd4e-704f-ae4ccb0adaf8.png" width="600">

## Arduino Nano 33 BLE Sense の特徴

デバイス詳細は[こちら](https://store.arduino.cc/usa/nano-33-ble-sense)をご確認ください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/149af324-720a-205e-5b1b-445554bfcf54.png" width="500">

- デバイス概要
    - 機械学習モデルが実行できるBLE搭載のArduino Nano。
- 特徴、スペック 
    - 9軸慣性センサー、温湿度センサー、気圧センサー、マイク
    - ジェスチャ、近接、光の色、光強度センサー
- 価格
    - 約$30

## Arduino IDEの設定

サンプルスケッチをCompileするためのArduino IDEの設定を行います。

- Arduino IDEをインストール
    - [Arduinoのページ](https://www.arduino.cc/en/main/software)から、ご使用のOSに合わせてインストールを行ってください。
- ボードをインストール
    - Tools -> Board -> Boards Managerを選択してください。
    - Arduino nRF528x Boards(Mbed OS)をインストールしてください。
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/651128e6-568e-71f5-2620-84db623b4d81.png" width="600">
- ライブラリをインストール
    - Sketch -> Include Library -> Manage Librariesを選択してください。
    - Arduino_TensorFlowLite by TensorFlow Authorsをインストールしてください。
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/138f25f4-8613-d30a-754e-e8a3bfd93079.png" width="600">
- ボードの選択
    - Tools -> Board から Arduino Nano 33 BLEを選択してください。

# サンプルスケッチの実行

TensorflowLiteのサンプルスケッチがいくつか用意されています。[参考](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples)

- hello world
    - sine関数の波形を生成し、LEDの点灯もしくはディスプレイへの描画を行うサンプル
    - 実行結果
        - サイン関数に従って、LEDが点灯しています。
        - ![arduino_tflite_hello_world.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/5743c5f3-235e-8066-74fb-ea07a83de2f8.gif)
- magic wand
    - 簡単なジェスチャ認識をするサンプル。
    - Arduino_LSM9DS1 というライブラリが別途必要になりますので、インストールをしておいてください。
    - 実行結果。
        - W, O, Lのジェスチャを識別できるはずなのですが、なかなかうまく認識できなかったです。シリアルモニターに下記のように認識結果が出ます。
        - <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/6c10f4ce-f11f-a71b-9c5c-c9fd66cccc05.png" width="400">
- micro speech
    - yes、noといった簡単な音声認識するサンプル。
    - 実行結果
        - yes, noが認識できました。ただし、精度はあまりよくはなく、誤認識が多かったです。自分の発音にも問題があるかもしれませんが；；
        - <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/f478a342-d88c-1c55-9c55-f39e297cf7d8.png" width="400">
- person detection
    - カメラで人検出するサンプル。
    - Arducam Mini 2MP Plusが別途必要になりますので、今回は実行できませんでした。
   
# 注意事項

- 私のMacはOSがCatalinaだったため、コンパイルで下記のようなエラーが出ていました。Arduino IDE 1.8.0から1.8.10にアップデートすることで、エラーは解消されました。
    - コンパイルエラー：bad CPU type in executable...


# 終わりに

- 意外につまることなく、サンプルが実行できました。ただ、コードやライブラリは理解できていないので、オリジナルモデルを使って、カメラモジュールを使った独自の検出機能を作ったら理解も進んで面白そうだなーと思いました。時間があればやってみようと思います。
- 先日、Tensorflow User Groupに参加した時の感想ですが、エッジデバイスモデルの軽量化、デバイスへの組み込みについては奥が深く、個人ではなかなか手が出せない部分なので、このように簡単に試せるようになっていることに感動しました。

# 参考文献
- https://www.tensorflow.org/lite/microcontrollers
- https://store.arduino.cc/usa/nano-33-ble-sense