はじめに
初めての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言語で出力する」で出力したコードの中身をコピペします。
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にデプロイする方法となります。
さいごに
間違い等あればご指摘いただけると幸いです。
参考文献