Arduino’da Makine Öğrenimi ile Renk Tanımlama

Bu Arduno Makine öğrenimi projesinde nesneleri renklerine göre tanımlamak için bir RGB sensörü kullanacağız.
Bu, Tensorflow blogunda bulunan projenin bir versiyonudur. Bu eğitimde çok daha az güçlü bir çip kullanacağız, 32 kb flaş ve sadece 2 kb RAM ile donatılmış bir Arduino Nano (eski nesil).

Özellikler Tanımı

Hangi nesneye işaret ettiğimizi anlamak için bir renk sensörünün(TCS3200) RGB bileşenlerini kullanacağız. Bu, özelliklerimizin 3 boyutlu olacağı anlamına gelir, bu da çok yüksek doğrulukta gerçekten basit bir modele yol açar.

Örnek Verileri Kaydetmek

Sensör okumalarından özellik vektörüne ulaşmak için herhangi bir işleme ihtiyacımız yok, bu nedenle kod basit olacaktır: sensörden her bileşeni okuyun ve onu özellikler dizisine atayın. Bu kısım, sahip olduğunuz belirli çipe göre değişecektir.

#define S2 2
#define S3 3
#define sensorOut 4

double features[3];

void setup() {
  Serial.begin(115200);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
}

void loop() {
  readRGB();
  printFeatures();
  delay(100);
}

int readComponent(bool s2, bool s3) {
  delay(10);
  digitalWrite(S2, s2);
  digitalWrite(S3, s3);

  return pulseIn(sensorOut, LOW);
}

void readRGB() {
  features[0] = readComponent(LOW, LOW);
  features[1] = readComponent(HIGH, HIGH);
  features[2] = readComponent(LOW, HIGH);
}
void printFeatures() {
    const uint16_t numFeatures = sizeof(features) / sizeof(float);
    
    for (int i = 0; i < numFeatures; i++) {
        Serial.print(features[i]);
        Serial.print(i == numFeatures - 1 ? 'n' : ',');
    }
}

Seri monitörü açın ve sensörün önüne bazı renkli nesneler koyun: nesneyi biraz hareket ettirin ve döndürün, böylece örnekler farklı renk tonları içerecektir.

Her renk için kayıtları, rengin adını taşıyan bir dosyaya kaydedin, böylece daha sonra anlamlı sonuçlar elde edersiniz.

“Boş rengi” de denemeyi unutmayın: sensörün önüne hiçbir şey koymayın ve bir süre kayıt yapmasına izin verin.

Sorunsuz bir kurulum yaparsanız, aşağıdaki kontur grafiğinde gösterildiği gibi ayırt edici özelliklerle bitirmelisiniz.

renk tanımlama

Renk özelliklerinden 2 PCA bileşeninin karar sınırları

Sınıflandırıcıyı Eğitip, Dışa Aktarmak

Ayrıntılı bir kılavuz için bu öğreticiye bakın.

from sklearn.ensemble import RandomForestClassifier
from micromlgen import port

# örneklerinizi veri kümesi klasörüne yerleştirin
# dosya başına bir sınıf
# CSV formatında satır başına bir özellik vektörü
features, classmap = load_features('dataset/')
X, y = features[:, :-1], features[:, -1]
classifier = RandomForestClassifier(n_estimators=30, max_depth=10).fit(X, y)
c_code = port(classifier, classmap=classmap)
print(c_code)

Bu noktada, yazdırılan kodu kopyalamanız ve Arduino projenize mode.hl adlı bir dosyaya aktarmanız gerekir.

Çıkarımı Çalıştırmak

#include model.h

void loop() {
  readRGB();
  Serial.println(classIdxToName(predict(features)));
  delay(1000);
}

Sensörün önüne renkli bir nesne koyun ve seri monitöre yazdırılan tanımlanan nesne adını görün.

“Boş rengi” hatırlıyor musunuz? Kaydedilmesi bu yüzden gerekiyor, böylece hiçbir nesne olmadığında “boş” bir değer olacaksınız, aksi takdirde beklenmedik tahminler alacaksınız

Görevin basitliği göz önüne alındığında, farklı renkler için kolayca% 100’e yakın doğruluk elde etmelisiniz (kötü aydınlatma nedeniyle turuncuyu sarıdan ayırt etmekte bazı sıkıntılar olabilir). Hem eğitim hem de sınıflandırma sırasında aynı kurulumu çoğalttığınızdan emin olun.

İşte bu: makine öğrenimini 2 Kb’de çalıştırdınız!

Arduino Nano’yu (eski nesil) hedefleyen proje 5570 bayt (% 18) program alanı ve 266 bayt (% 12) RAM gerektiriyor. Bu, makine öğrenimini Arduino Nano’nun sağladığından daha az alanda çalıştırabileceğiniz anlamına gelir.