masato-ka's diary

日々思ったこととか、やったことの備忘録。

AI+IoTなデバイスをお手軽に作れるM5StickVとSORACOM LTE-M Button Plus

1. この記事について

夏の終わりに身の回りのものを整理していたら、購入していたまま放置していたM5StickVとSORCOM LTE-M Button Plusを発掘した。こんな二つを悪魔合体することでお手軽にAIとIoTを組み合わせられるのではと思いつき、「ソラコムポーズを取るだけで触れることなくSORACOM LTE-M Button Plusnを押す」を試してみた。

念の為説明しておくと映像の左上にはM5StickVで撮影した映像が写っている。この部分にソラコムポーズをした手が映るとM5StickVがソラコムポーズを認識してLEDの色を変える。その後三秒ほど待つとM5StickVがリレーを動かしてSORACOM LTE-M Button Plusを動作させる。

補足 ソラコムポーズとは

ソラコムポーズは右手と左手を組み合わせて「S」の字を作ることをそう呼んでいる。株式会社ソラコムサービスを利用しているユーザが集まって構成されているSORACOM UGではユーザグループイベント終了時に希望者でこのソラコムポーズを撮り集合写真を取ることが慣例となっている。

soracomug-tokyo.connpass.com

そんなSORACOM LTE-M Button Plusと縁もゆかりも深いソラコムポーズをキーとしてボタンを押すことができるようになる!

2. やったこと

こんな素敵な使い方ができるデバイス実現のポイントについて解説する。

2.1. M5StickVとSORACOM LTE-M Button Plusの接続

実現したいことはM5StickVとSORACOM LTE-M Buttonを繋げることだ。SORACOM LTE-M Button Plus にはボタンの代わりにA接点が搭載さ入れてる。 M5StickVでソラコムポーズを認識した後、Groveリレーモジュール を介してSORACOM LTE-M Button PlusをA接点をONにする。これでAIの推論結果に応じてSORACOM LTE-M Button Plus経由で情報をクラウドへ上げることができる。立派なAIoTなデバイスの完成だ。接続は無極性の接点接続とGrove端子の接続のみなので難しいことはない、フォースの感じるままに接続すれば良い。

f:id:masato-ka:20190903234016j:plain
接続時の状態、説明する隙がないくらい簡単

2.2. M5StickVのモデル学習

ソラコムポーズを認識させるためにはそのための学習データが必要となる。今回は200毎程度のソラコムポーズを取った手の画像とソラコムポーズを取っていない手の画像を同じく200毎程度作成し学習のデータセットとした。画像サイズは244x244だ。

学習モデルはImageNetでpre-train済みのモデルから転移学習を行なっている。学習はGoogle Colaboratoryで行なった。Google Colaboratoryで動かすPython notebookは以下を参考にさせてもらった。

https://colab.research.google.com/drive/1mirG8BSoB3k87mh-qyY3-8-ZXj0XB6h6

上記のノートブックでは転移学習の際に、MobileNetの畳み込み層の重みは変更しない設定となっていた。何度か学習を試みたが精度が芳しくなかった。そこで、過去の経験からMobileNetの畳み込み層の最終レイヤのみ重みを学習するように変更を行なった。はっきりとはわからないが、pre-train済みのモデルは画像から十分に特徴を抽出できる性能を持っているが、最終段のみタスクに合わせて微調整すると良いのではないかと思っている。(学術的な裏ずけは何もないおまじないです)

上記、Python notebookの「Transfer learning using MobileNet V1」節、2つ目のコードブロックを以下のように変更した。

# 変更前
for i, layer in enumerate(base_model.layers):
    layer.trainable = False
# 変更後
for i, layer in enumerate(base_model.layers):
    layer.trainable = False
    if i > 80:
      layer.trainable = True

Python notebookを最後まで実行するとモデルとモデルを動かすためのMicroPythonのスクリプトがzipファイルとしてダウンロードされる。

ちなみにデータさえあれば細かいことは気にせずAI作れる専用のサービスも始まったようです。

M5Stack - A series of modular stackable development devices

2.3. M5StickVへのモデルの書き込み

 作成されたモデルはM5StickVに配置してプログラム上からロードして利用する。モデルはMicroPythonで書かれたソースコードとともにSDカードに書き込んで、M5StickVにSDカードごと差し込んで利用する使い方が主流だ。M5StickVのファームウェアはSDカードにboot.pyファイルが入っているとそちらを優先して起動するようになっている。しかしM5StickVのSDカードは相性問題がシビアなため、今回はモデルとプログラムを内蔵Flash ROMへ書き込んで利用した。ソースコード中でモデルをロードしている箇所ではFlash ROMのモデルが書き込まれているメモリ番地の先頭をload関数に渡すことでFlash ROMに書き込んだモデルを読み込むことができる。書き込みやモデルロードソースコードのイメージは以下のサイトがわかりやすい。

qiita.com

下記サイトからmaixpy_v0.4.0_39_g083e0cc_m5stickv.binをダウンロードし、FlashROMの先頭0x000000へ書き込む。モデルは0x300000あたりを先頭にして同時に書き込みを行う。

Index of /MAIX/MaixPy/release/master/maixpy_v0.4.0_39_g083e0cc/

3. M5StickVとSORACOM LTE-M Button Plusを組み合わせると何がいいのか。(まとめ)

 M5StickVはカメラとディープラーニング向けアクセラレータが搭載されたRISC-V CPUK210が搭載されたデバイスだ。内蔵のリポバッテリーでディープラーニングを利用した物体認識や物体検知を動かせることができる。しかし、現状のバージョンでは外部との通信機能はついていないため、認識した結果をクラウドに送るなどIoTや遠隔センシング用途に使うには工夫が必要になる。

 対して、SORACOM LTE-M Button Plusは低電力のLTE-M通信ができるデバイスだ。その基本機能は3パターンのボタンクリック(シングルクリック・ダブルクリック・長押し)をイベントとしてクラウドへ通知することだ。また簡易位置計測機能がついているため、通信時の基地局情報を元に位置情報と合わせて送信することができる。つまりこの2つを悪魔合体して得られる効果は以下のようになる。

  1. 必要に応じてディープラーニングのモデルを差し替えるだけで、汎用的なセンサとしてM5StickVを利用することができる。
  2. 認識した結果に応じて簡易位置計測による位置情報とともにイベントをクラウドに送ることができる。
  3. M5StickVもSORACOM LTE-M Button Plusもそれぞれバッテリー内蔵なのでポータブル性に優れている。

 これこれ、こういうのでいいんだよ、最高じゃないか!例えばM5StickVで鳥獣か人かを認識してSORACOM LTE-M Button Plusで位置情報をともにクラウドプラットフォームに送ることで監視アプリができる。田畑をカメラで見張れば正確な水位はわからなくても水位が多い少ないくらいは非接触で見分けることができるだろう。部屋の中でのジェスチャー操作で照明を制御するというのも面白そうだ。M5StickVとSORACOM LTE-M Button Plusの愛称は抜群かもしれない。

 AI+IoTでお手軽に何か作ってみたいと思ったら選択肢の一つとして強くオススメしたい。