Arduino Makine Öğrenimi ile Hareket Tanımlama

Arduino Makine Öğrenimi ile Hareket Tanımlama

Bu Arduino makine öğrenimi projesinde, yaptığınız hareketleri tanımlamak için bir ivmeölçer sensör kullanacağız. İçerik, TensorFlow blogundaki bir çalışmanın yeniden uygulanmış hâlidir. Orijinal projede Arduino Nano 33 BLE kullanılırken, burada daha sınırlı kaynaklara sahip klasik Arduino Nano ile ilerleyeceğiz. Arduino Nano, 32KB flash ve 2KB RAM sunan bir geliştirme kartıdır.

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer
Kara sınırı(decision), %99 doğruluk

Özelliklerin Tanımı

Hangi hareketi yaptığımızı anlamak için bir IMU’dan yani ivme ölçer sensöründen gelen 3 eksen (X, Y, Z) boyunca ivmeleri kullanacağız. NUM_SAMPLES ile ilk hareket algılamasından başlayarak sabit bir sayıda hareketleri kaydedeceğiz.

Bu, özellik vektörlerimizin 3 * NUM_SAMPLESArduino Nano’nun hafızasına sığmayacak kadar büyük olabilecek boyutta olacağı anlamına gelir. NUM_SAMPLESmümkün olduğu kadar yalın tutmak için düşük bir değerle başlayacağız. Sınıflandırmalarınız yetersiz doğruluktan muzdaripse, bu sayıyı artırabilirsiniz.

Örnek Verileri Kaydetmek

Sensörden(IMU) Gelen Verileri Okumak

Her şeyden önce, sensörden ham verileri okumamız gerekiyor. Bu kod parçası, kullandığınız belirli sensöre göre farklı olacaktır. Biz 9 eksenli “MPU9250” sensörünü kullanacağız alternatif olarak farklı bir ivme sensörünü ya da aynı aile üyesi olan MPU6050 sensörünü kullanabilirsiniz. İşleri basit ve anlaşılır tutmak için sensör kurulumu ve okuma işlemini 2 fonksiyonda yapacağız: imu_setupve imu_read.

MPU6050 ve MPU 9250 için birkaç örnek uygulamayı görebilirsiniz. Hangi kodu kullanırsanız kullanın projenin ana kodunda çağırmak için kullandığınız sensör kodunu imu.h isminde bir dosyaya kaydetmelisiniz. Ayrıca tüm kodları ve dosyaları tek bir klasörde tutmanız işlerinizi kolaylaştıracaktır.

MPU6050 İçin

MPU9250 İçin

Ana .ino dosyasında, sensör değerlerini seri monitör / çiziciye döküyoruz:

Seri çiziciyi açıp, okumalarınızın aralığı hakkında fikir sahibi olmak için biraz hareket ettirin:

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer

Kalibrasyon

Yerçekimi nedeniyle, durağan Z ekseninde -9.8’lik sabit bir değer alıyoruz (bunu üstteki hareketli görselden görebilirsiniz). Bu sabit değeri ortadan kaldırmak için 9.8’lik bir ofset oluşturmamız gerekiyor, bu sayede Z ekseninde yapılan hareketli yerçekiminden etkilenmemesini sağlıyoruz.

Z ekseni kalibrasyonundan sonra seri çizici böyle görünecek:

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer

İlk Hareketi Algılama

Şimdi hareket olup olmadığını kontrol etmemiz gerekiyor. Basit tutmak için, hızlanmada yüksek bir değer arayacak saf bir yaklaşım kullanacağız: bir eşik aşılırsa, bir hareket başlıyor anlamına gelecek.

Kalibrasyon adımını yaptıysanız, 5’lik bir eşik iyi çalışmalıdır. Kalibrasyon yapmadıysanız, ihtiyaçlarınıza uygun bir değer bulmanız gerekir.

Kayıt Optimizasyonu

Herhangi bir hareket olmazsa herhangi bir işlem yapmıyoruz ve izlemeye devam ediyoruz. Hareket oluyorsa, sonraki NUM_SAMPLESokumalarını seri monitöre yazdırıyoruz.

Her hareket için 15-20 örnek kaydedin ve her hareket sınıfını ayrı dosyada tutun. Çok boyutlu verilerle çalıştığımız için gürültü etkisini azaltmak adına mümkün olduğunca fazla örnek toplamak genellikle daha iyi sonuç verir.

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

Eğer aşağıda ki kod sizin için bir anlam ifade etmiyorsa; Python ya da C++ ile eğittiğiniz bir modeli Arduino veya diğer geliştirme kartlarında kullanmak istiyorsanız, bu yazımızdan detayları öğrenebilirsiniz.

Bu noktada yazdırılan kodu kopyalamanız ve Arduino proje klasörünüze model.h olarak kaydetmeniz gerekiyor.

Makine öğrenimi ile ilgili bu projede, önceki ve daha basit olanlardan farklı olarak, %100 doğruluğa kolayca ulaşamıyoruz. Hareket oldukça gürültülüdür, bu nedenle sınıflandırıcı için birkaç parametre denemeli ve en iyi performansı gösterenleri seçmelisiniz. Birkaç örnek gösterelim:

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer

Sensör özelliklerinin 2 PCA bileşeninin karar sınırları, doğrusal çekirdek(Linear kernel)

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer

Sensör özelliklerinin 2 PCA bileşeninin karar sınırları, Polinom çekirdeği(Polynomial kernel)

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer

Sensör özelliklerinin 2 PCA bileşeninin karar sınırları, RBF çekirdeği(kernel), 0.01 gama

Arduino Makine Öğrenimi ile Hareket Tanımlama arduino makine öğrenimi,hareket tanımlama,ivmeölçer

Sensör özelliklerinin 2 PCA bileşeninin karar sınırları, RBF çekirdeği(kernel), 0.001 gama

Uygun Modeli Seçmek

Şimdi en iyi modeli seçtiğimize göre onu C koduna aktarmalıyız. İşte sorun geliyor: tüm modeller geliştirme kartına sığmayacak.

SVM’nin (Destek Vektör Makineleri) çekirdeği, destek vektörleridir: her eğitilmiş sınıflandırıcı, belirli bir sayı ile karakterize edilecektir. Sorun şu ki: çok fazla varsa, oluşturulan kod mikroişlemcinin flaşına sığmayacak kadar büyük olacaktır.

Bu nedenle doğruluk konusunda en iyi modeli seçmek yerine en iyi performans gösterenden en kötüye doğru bir sıralama yapmalısınız. Her model için, en baştan başlayarak, onu Arduino projenize aktarmalı ve derlemeye çalışmalısınız: eğer uyuyorsa sorunsuz kullanabilirsiniz. Aksi takdirde, bir sonrakini seçmeli ve tekrar denemelisiniz.

Sıkıcı bir süreç gibi görünebilir, ancak 2 Kb RAM ve 32 Kb flash’ta 90 özellikten bir sınıf çıkarmaya çalıştığımızı unutmayın.

Test ettiğimiz farklı kombinasyonlar için birkaç rakam raporu:

Çekirdek C Gamma Derece Vektörler Flaş boyutu RAM (b) Ort. doğruluk
RBF 10 0.001 37 53 Kb 1228 %99
Poly 100 0.001 2 12 25 Kb 1228 %99
Poly 100 0.001 3 25 40 Kb 1228 %97
Doğrusal 50 1 40 55 Kb 1228 %95
RBF 100 0.01 61 80 Kb 1228 %95

Gördüğünüz gibi, tüm sınıflandırıcılar için test setinde çok yüksek bir doğruluk elde ettik: Arduino Nano’da sadece bir tanesidi kullandık. Tabii ki, daha büyük bir mikroişlemci kullanırsanız, diğerlerini de kullanabilirsiniz.

Hatırlatma

Bir yan not olarak, RAM sütuna bir göz atın, tüm değerler eşittir. Bunun nedeni uygulamada destek vektörlerinin sayısından bağımsız olması ve yalnızca özellik sayısına bağlı olmasıdır.

Çıkarımı Çalıştırma

Veri Toplama İçin Pratik Öneriler

  • Her sınıf için benzer sayıda örnek toplayarak sınıf dengesini koruyun.
  • Sensörün yönünü değiştirecekseniz eğitim verisine bu varyasyonları da dahil edin.
  • Kalibrasyon adımını atlamayın; özellikle Z ekseni ofseti sonuçları doğrudan etkiler.
  • Model performansını yalnızca eğitim doğruluğu ile değil, gerçek zamanlı testle değerlendirin.

Tüm adımları tamamladığınızda, Arduino Nano ve 2KB RAM ile hareket sınıflandırması yapabilirsiniz. Böylece ağır sinir ağları veya yüksek kaynaklı işlemciler olmadan, 8-bit bir mikrodenetleyicide SVM tabanlı etkili bir makine öğrenimi uygulaması geliştirmiş olursunuz.

Arduino Nano’yu (eski nesil) hedef alan program, 25310 bayt (%82) program alanı ve 1228 bayt (%59) RAM gerektiriyor. Bu, Arduino Nano’nun sağladığından bile daha az alanda makine öğrenimini çalıştırabileceğiniz anlamına gelir. Peki Arduino üzerinde makine öğrenimi çalıştırabilir miyim sorusunun cevabının net bir şekilde EVET olduğunu göstermiş olduk.

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.