Arduino Makine Öğrenimi Sınıflandırıcı Eğitimi

Arduino geliştirme kartlarında ve benzer mikroişlemcilerde makine öğrenimine mi başlıyorsunuz ? Python’da eğittiğiniz modeli Arduino, STM32, ESP32 gibi herhangi bir C++ projesinde çalıştırmak ister misiniz?

Bu içerikte size bunun ne kadar kolay olduğunu göstereceğiz.

Verileri Yüklemek

Bir sınıflandırıcıyı eğitmek için bazı verilere ihtiyacımız var. Sıfırdan başlıyorsanız ve hali hazırda tercih ettiğiniz bir klasör yapısına sahip değilseniz, topladığınız verileri tutacak bir klasör oluşturmanızı öneririz.

Bu klasörün içinde, sınıflandırmak istediğiniz sınıfların her biri için her satıra bir örnek koyarak .csv uzantılı özel bir dosya oluşturun. Bunu yaptıysanız, bu verileri yüklemek için sonraki işlevi kullanabilirsiniz.

import numpy as np
from glob import glob
from os.path import basename

def load_features(folder):
    dataset = None
    classmap = {}
    for class_idx, filename in enumerate(glob('%s/*.csv' % folder)):
        class_name = basename(filename)[:-4]
        classmap[class_idx] = class_name
        samples = np.loadtxt(filename, dtype=float, delimiter=',')
        labels = np.ones((len(samples), 1)) * class_idx
        samples = np.hstack((samples, labels))
        dataset = samples if dataset is None else np.vstack((dataset, samples))

    return dataset, classmap

Sınıflandırıcıyı Eğitmek

Verilere sahip olduğumuzda, sınıflandırıcıyı eğitebiliriz.

micromlgenpaketi (makine öğrenimi sınıflandırıcılarını düz C koduna taşıyabilen paket) aşağıdaki sınıfları destekler:

Bu yazıda Random Forest sınıfını kullanacağız, ancak kodun geri kalanını değiştirmeden diğer sınıflarla değiştirebilirsiniz.

from sklearn.ensemble import RandomForestClassifier

def get_classifier(features):
    X, y = features[:, :-1], features[:, -1]

    return RandomForestClassifier(20, max_depth=10).fit(X, y)

Düz C Kodunu Dışa Aktarmak

Artık micromlgenpaketi kullanarak eğitilmiş sınıflandırıcıyı düz C koduna dönüştürebiliriz.

pip install micromlgen
from micromlgen import port

if __name__ == '__main__':
    features, classmap = load_features('your-data-folder')
    classifier = get_model(features)
    c_code = port(classifier, classmap=classmap)
    print(c_code)

Arduino projenize aktarmanız gereken kod budur. Bu içerikteki öğreticilerle bütünlük sağlamak için, bu kodu model.h adlı bir dosya şeklinde kaydedin.

Projede Kullanmak

Artık doğrudan mikrodenetleyicimizde Makine Öğrenimini çalıştırmak için ihtiyacımız olan koda sahibiz.

// 3. adımda aldığınız kodu bu dosyaya koyun
#include "model.h"

// başka bir sınıflandırıcı türü kullandıysanız bu sınıf farklı olacaktır, model.h dosyasını kontrol edin
Eloquent::ML::Port::RandomForest classifier;

void classify() {
    float x_sample[] = { /* fill this vector with sample values */ };

    Serial.print("Predicted class: ");
    Serial.println(classifier.predictLabel(x_sample));
}

Her şey sorunsuz gittiyse, mikroişlemciniz makine öğrenimini sorunsuz bir şekilde çalıştırıyor olacak.