4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

scikit-learnで学習した分類モデルをM5Stackにデプロイする方法

Posted at

はじめに

初めてのQiita投稿になります。
今後、業務で学んだこと、躓いたことを継続的にアウトプットしていければと考えています。

事前準備

環境

Python 3.9.7
Arduino IDE 1.8.19
M5Stack

必要なライブラリを事前にインストール

pip install scikit-learn
pip install micromlgen

分類モデルを作成する

分類モデルを作成するために、データセットを準備します。
今回、サンプルデータセットで有名なirisデータセットを採用しました。

# データセットの読込
from sklearn.datasets import load_iris
data = load_iris()
# 特徴量データセット
X = iris.data
# ラベルデータセット
y = iris.target

次に、用意したデータセットを用いて分類モデルを作成します。
今回は、ランダムフォレストを採用しました。

# ランダムフォレストを用いて分類モデルを作成
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state=1)
model = clf.fit(X, y)

学習したモデルをC言語で出力する

上記で学習したモデルをC言語で出力します。

from micromlgen import port
classmap = { 0: 'setosa', 1: 'versicolor', 2: 'virginica' }
# port()の第一引数に学習したモデルを指定
# port()の第二引数にクラスマップを指定(省略可能)
# クラスマップを指定すると、ラベル予測時に各ラベルに割り当てられた文字列を出力させることが可能。
c_code = port(model, classmap=classmap)
# C言語で書かれたコードを出力
print(c_code)

ちなみにmicromlgenがサポートしているモデルは下記となります(https://github.com/eloquentarduino/micromlgen より引用)。

micromlgen can port to plain C many types of classifiers:
・DecisionTree
・RandomForest
・XGBoost
・GaussianNB
・Support Vector Machines (SVC and OneClassSVM)
・Relevant Vector Machines (from skbayes.rvm_ard_models package)
・SEFR
・PCA

分類モデルをM5Stackにデプロイする

Arduino IDEで、新しいスケッチを開きます(既存のスケッチでも可)。

model.h作成

空ファイルmodel.hを作成して、「学習したモデルをC言語で出力する」で出力したコードの中身をコピペします。
スクリーンショット 2022-11-30 21.40.52.png

inoファイル編集 & M5Stackにデプロイ

続いて、inoファイルに下記コードを記述し、M5Stackに書き込みを行います。
setosaの特徴量をサンプルとして用意し、C言語で出力された学習モデルがラベルを予測できるかM5Stack上で確認します。

#include <M5Stack.h>
// 分類モデルを変換させたコード
#include "model.h"
// ランダムフォレスト以外の分類モデルを使用する場合、model.hの中身によってクラス名を変更
Eloquent::ML::Port::RandomForest classifier;

void setup() {
  M5.begin();
  M5.Power.begin();
  // ラベル予測用のサンプル(0: setosa)
  float X_sample[] = {5.1, 3.5, 1.4, 0.2};
  // ラベル予測結果出力
  Serial.print("Predicted class: ");
  Serial.println(classifier.predictLabel(X_sample));
}

M5Stackに書き込み後、シリアルモニタを確認するとsetosaが出力されていることを確認できます。
以上、scikit-learnで学習した分類モデルをM5Stackにデプロイする方法となります。
スクリーンショット 2022-11-30 0.38.02.png

さいごに

間違い等あればご指摘いただけると幸いです。

参考文献

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?