AIoTデバイス「M5StickV」、はじめの一歩

Pocket

今、話題になっているAIoT(AI+IoT)デバイスの「M5StickV」を少し触ってみたので、今回はその際に知り得た情報を紹介します。

M5StickVの概要

まず、M5StickVをご存知ですか?
M5StickVは、M5Stack社が販売している小型AIカメラデバイスで、Kendryte社のプロセッサK210を搭載しています。非常に小さなデバイスで、一般的な消しゴムを少し大きくしたぐらいの大きさですが、カメラ以外に、液晶ディスプレイやLEDランプ、スイッチ、ジャイロセンサーも装備しています。そして、高性能なニューラルネットワークプロセッサ(KPU)をもっているだけでなく、購入後にセットアップすると、すぐにYOLOモデルを利用した物体検出機能が使えるようになっています。

日本では、スイッチサイエンスや共立電子産業などから購入できますが、なんと3000円程度という低価格です!(2020年11月時点の情報)これは、オープンなライセンスとなるRISC-Vを活用しているからなのでしょう。

仕様に関する参考資料

M5StickVのセットアップ

以下の手順でセットアップを実行できます。(私はWindows10で行いした

セットアップ手順:

  1. microSDカードを用意する
  2. 公式ページ「M5StickV Quick Start」を開き、手順通りに作業を行う
    • ファームウェアをダウンロードする
    • ファームウェアの書き込みツール「Kflash_GUI」をダウンロードする
    • 「Kflash_GUI」を利用して、ファームウェアを書き込む

M5StickVで開発

M5StickVでは、MicroPythonをベースにしたMaixPyという言語でプログラミングができます。

また、プログラムを動かす方法として、以下の4つの手段取ることができ

プログラム実行手段:

< シリアル通信 >

「PuTTY」などで接続して、ターミナル上でMaixPyのコードを書いて実行します

< 専用開発環境 >

MaixPy IDE」という開発環境があるので、M5StickVに接続させて、ローカルにあるファイルを作成・編集し、実行すれば動きます

      • ターミナルも実行できます
      • カメラの映像をIDE内でも表示してくれます
      • 手順「MaixPy IDE

< データ転送ツール >

uPyLoader」いうツールが提供されているので、M5StickVに接続させて、ファイルをアップロードさせて、実行することができます

      • ターミナルも実行できます
      • 接続時、M5StickV上でプログラミングが実行中の場合は接続できませんので、処理を終了させておく必要があります
        (※この事については、補足説明を後述します)
      • 資料「uPyLoader – README.md

< その他 >

microSDカードに、プログラムを書いた「boot.py」というファイルを保存し、M5StickVの電源を入れます

    • M5StickVが起動時に、「boot.py」というファイルを探しに行きます。SDカード上にあればをそれを実行します
    • M5StickVが起動時に、「boot.py」ファイルがなければ、自身で「boot.py」ファイルを作成し、実行します

ちなみに、私は主に「MaixPy IDE」を用いて、コードを書いては動かして、という作業を繰り返しました。また、後で取り上げるモデルのファイルをアップロードする際、「uPyLoader」で作業を行うこともできますが、非常に遅いです。面倒ですが、SDカードを直接抜き差ししてファイルを入れ替えた方が断然に速いです。

その他、実際に開発していて困ったところがあったので、その対処方法を記載しておきます。

その1:

M5StickVは上記の4つ目の手段でも記載したように、「boot.py」ファイルを自動実行します。また、ネットの記事でもよく見かけますが、電源がなかなか切れず、すぐに再起動してしまいます。プログラムを実行していると、上記「uPyLoader」での接続が必ず失敗するので、故意にプログラムを停止できる仕組みを用意しておいた方がいいです。
下記例では、ボタンを利用できるようにして、起動時にボタンが押されていていたら、プログラムを停止できるようにしています。

その2

ディスプレイに映る画像の向きが、何もしないと下図「初期状態」のようにおかしいので、以下のコードで下図「修正後」の状態にします。

初期状態 修正後

自身のニューラルネットワークモデルを利用する

M5StickVではデフォルトで、YOLOモデルでの顔認識機能が入っていますが、自身でニューラルネットワークモデルを作って実行することもできます。

モデルの変換

Maixpyで実行できるモデルは「kmodel」というものになります。そのため、例えば「Keras」で学習したモデルを使いたい場合は、その「Keras」モデルを「kmodel」に変換する必要があります。ただし、「kmodel」は「TensorFlow Lite」モデルからしか変換できないので、一旦、「Keras」から「TensorFlow Lite」への変換を行います。

それから、「kmodel」は2MB未満にしないとロード時にメモリ不足となり、処理が落ちてしまうので、「Keras」モデルの時から軽量なものにする必要があります。処理内で他のことも一緒にしようと思うと、ファームウェアを必要最低限の軽量版に変更するなどの対応が必要になります。

その他にも、色々と考慮を行いました。
例えば、今回私は、MobileNetという学習済みのモデルを転移学習したのですが、追加した出力層付近のレイヤーの数、レイヤーあたりのノード数を多くしても、サイズが大きくなるので、その数を調整しました。また、ファインチューニングも試したのですが、ファインチューニングで再学習するレイヤーを増やすと、なぜかサイズが大きくなったので、その点も考慮しました。

ちなみに、私が変換した際のモデルのサイズは以下の通りでした。

モデル サイズ 備考
1 model.h5 7.9M 元々の「Keras」モデル
2 model.tflite 7.1M 変換された「TensorFlow Lite」モデル
3 model.kmodel 1.9M さらに変換された「kmodel」

この「kmodel」のサイズは、非常に小さくなっています。モデル変換時に量子化の処理が行われているようです。量子化の仕様までは分かりませんが、TensorFlow Liteでの量子化した結果と比べると、「Weight quantization Model」と同じくらい軽量化されています。(ちなみに、TensorFlow Liteでの量子化されたモデルを、「kmodel」に変換することはできませんでした。)

モデル サイズ 備考
1 model_wq.tflite 1.9M 「TensorFlow Lite」モデル / Weight quantization Model
2 model_fp16.tflite 3.6M 「TensorFlow Lite」モデル / Float16 quantization Model
3 model_iq.tflite 2.0M 「TensorFlow Lite」モデル / Integer quantization Model
4 model_fi.tflite 2.0M 「TensorFlow Lite」モデル / Full integer quantization Model

※参考:サンプルコード

  • 「TensorFlow Lite」モデル(量子化なし)への変換
  • 「kmodel」への変換

※注意事項:

      •  「ncc」コマンドでオプション「–dataset」で指定している「images」は自身で用意したディレクトリです。
        • ディレクトリの中には学習で用いた画像を入れています。
        • 画像は量子化の処理に利用されるようです。
      • 上記サンプルコードは「Maix ToolBox」のコードを参考にしました。
      • 「Keras」モデルと「kmodel」でパディングの仕様が異なるため、「Keras」モデルのパディングを一部変更しておく必要があるようです。

モデルのデプロイ

「kmodel」の準備ができたら、SDカードにモデルを保存して、Maixpyでロードして、処理することになります。

M5StickVを利用したデモ

M5StickVで元々使える顔検出機能を使って、検出した顔の1つ目と2つ目を入れ替えるカメラを作ってみました。

次のデモ動画を見ると、顔を入れ替える際に、境い目をブレンディングしたりしていないので、入れ替えた箇所がはっきり分かると思います。また、手振れが激しいので、顔を入れ替わった状態の画像をじっと見られるように、ディスプレイの横にあるボタンでディスプレイの描画を一時停止し、確認し易くしました。(一時停止中は白色LEDランプを点灯させています)もう一度、同じボタンを押すと、元の状態に戻ります。

※顔画像は、データセット「IMDB-WIKI」をMatplotlibで画面に描画したものになります。

以下にコードを掲載しますが、画像のリサイズがうまくできなかったり、画像の上書きにスライスが利用できず、1ピクセルずつ上書きしたりと、普段との使い勝手との違いに困りまし

まとめ

普段利用しているPythonと違い、Numpyが使えないなど、使い勝手の違いに悩むところもありましたが、それ以上に、Pythonライクなコードを書いて、SDカード保存するだけで、簡単に動作する容易性が大変うれしいです。

今後はジャイロセンサーのデータを利用したアプリでも作って、試してみたいなと思っています。

このような安価なデバイスが、これからもどんどん出てくると思います。初期投資費用もほとんどかからず非常に簡単なので、是非皆さんも手始めに試してみて下さい。

お問い合わせ先

執筆者プロフィール

Oose Takashi
Oose Takashitdi デジタルイノベーション技術部
入社以来、C/S型の業務システム開発に従事してきました。ここ数年は、SalesforceやOutSystemsなどの製品や、スクラム開発手法に取り組み、現在のテーマは、DeepLearning/機械学習です。
Pocket

関連記事