M5core2でリアルタイム7seg推論 - Thu, Dec 7, 2023
Writer: 青木 心路
M5core2とUnitCamでディープラーニング推論
1. はじめに
- 本記事はM5core2内で7seg文字をニューラルネットワークでリアルタイム画像認識をさせようという記事です。 M5stackは約5cm×5cmの正方形のケースの中に、Wi-FiとBluetoothによる無線通信機能を搭載したESP32をはじめ、カラーディスプレイ、ボタン、スピーカー、IMU,MicroSDなどの周辺部品が一つのモジュールとしてまとまっているマイコンモジュールです。さらに、側面、背面のピンにケーブルを接続すれば色々なセンサー類が使用できるようになります。 M5core2はM5basicの上位機種で物理ボタンからタッチセンサに変更になったり、6軸IMUが追加されたり、バッテリー容量が3倍ほどになっていたりしています。 本記事を通じてM5core2でリアルタイムにAIを動かす際の参考になれば幸いです。
2. 開発環境
- 使用した機材、環境は以下になります。
- 端末 : M5core2 (今回は試していないが、M5 basicなどの他のM5シリーズでも可能だと思われる)
- カメラ : UnitCam (Wi-Fi通信 or uart通信で画像を送信できるカメラ)
- 環境 : VSCode + PlatformIO
- 今回使用したファイルは下記のリポジトリにまとめてあります。クローンして使用してください https://github.com/DefiosLab/M5_7seg_program
3. モデル学習
-
7seg画像認識のモデルを作成する際に下記サイトを参考に行い、データセットも下記サイトからお借りしました。とても分かりやすく画像認識のモデルを作成する際に必要な情報がまとめてあっておすすめです。
-
データセットは下記サイトからダウンロードできます。
-
実際に学習に使用したプログラムは"learn_7seg.ipynb"になります
学習済みのmodel.h5ファイルが次のステップで必要になります
4. モデルの量子化
- 量子化とは重みなどのパラメータをより低bitで表すことでモデルの軽量化を行うモデル圧縮の1つの手法です。
- 量子化の際に使用したプログラムは"quantize.ipynb"になります
- 1.下記のコードで整数量子化(入出力の型は元モデルのままfloat)を行います
# settings
input_model = 'model.h5'
keras_model = tf.keras.models.load_model(input_model)
def representative_dataset_gen():
for i in range(100):
input_image = tf.cast(train_images[i], tf.float32)
input_image = tf.reshape(input_image, [1,28,28,1])
yield ([input_image])
converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
tflite_quant_model = converter.convert()
with open("7seg_InOutFloat_intQuantize.tflite", 'wb') as o_:
o_.write(tflite_quant_model)
- 2.量子化を行ったmodel.tfliteをM5core2上で動くようにCファイルに変換します
! xxd -i {MODEL_TFLITE_PATH} > model.c
-
- xxd:ファイルを16進数表記で出力。「-i」オプションはC言語のインクルードファイル形式で表示する
5. tfmicroライブラリの作成
- PlatformIoでのM5core2の開発環境は以下のサイトを参考に行いました。
- VSCodeとPlatformIOでM5Stack Core2開発
- Tensorflow liteをM5core2で使えるようにするためにtfliteのライブラリを自分で作成する必要があります
- 1.PlatformIOでtfmicroというプロジェクトを作成する(boardはM5stack Core2を選択)
- 2.TensorFlow_esp32をcloneする
git clone git@github.com:DefiosLab/TensorFlow_esp32.git
- 3.クローンしてきたTensorflow_esp32/PlatformIO/tfmicro/lib/tfmicroをlib/に入れる
cp -r Tensorflow_esp32/PlatformIO/tfmicro/lib/tfmicro ${Project}/lib
6. M5core2とカメラの接続
- M5core2とカメラはuartで通信を行います。
-
2.M5Core2とカメラをGroveケーブルで接続します
-
- M5core2 : カメラ(Grove接続の場合)
-
- 5v : power(赤線)
-
- Ground : Ground(黒線)
-
- RX : TX(黄色)
-
- TX : RX(白線)
-
- となるように接続します。
-
7. M5core2への実装
- 1.PlarformIOで7segというプロジェクトを作成する(boardはM5stack Core2を選択)
- 3.クローンしたリポジトリからM5_7seg_program/PlatformIO/M5core2_7seg/srcをコピーし、作成したプロジェクトのsrcと置き換える
cp -r ~/M5_7seg_program/PlatformIO/M5core2_7seg/src {Project}
-
3.model.cをmodel_data.ccにリネームしてsrcに配置する。
-
4.この状態でビルド&書き込みを行ったら、自分が学習させたモデルがM5core2上で動作します
8. 改造(7seg以外のモデルを動かしたい場合など)
- 1.分類数、表示部分
-
- detection_responder.ccを書き換えてディスプレイに表示する部分を書き換える
- 2.前処理(必要な場合のみ)
-
- jpg_decoder.ccで8bit推論画像、16bit表示画像の前処理を行っている(標準ではグレースケール化)
-
- image_provider.ccでデコードした画像から、float画像に正規化して変換している
9. おわりに
- 今回はM5core2で7segを動かしました。他のモデルも動かせるので、工場のIoT化などに応用できそうで可能性を感じます。M5stack系でディープラーニングモデルを動かす際には量子化が必須になってきます。今回は重みだけを量子化するダイナミック量子化を行いましたが、最適化を行った場合や完全整数化の実装はまだ行えていないのでそういった所も実装できるようにしていきたいですね。
- 自分が所属している研究室の先生がM5stampをフラコンにしてドローンを飛ばしたりしているので、M5系だけで制御と画像認識ができるドローンとか面白そうです。
- では、良きM5開発ライフを!!!