Haberler

Wio Terminal & Edge Impulse ile El Yazısı Tanıma Oluşturma

Bugünkü eğitimde, Wio Terminal ve Edge Impulse ile makine öğrenimi tabanlı bir el yazısı tanıma cihazı nasıl inşa edebileceğinizi göstereceğim. El yazısı hareketlerini tanıyıp bunları metne dönüştürmenizi sağlayan tek bir zaman uçuşu sensörünün nasıl kullanılacağını öğrenmek için bu ayrıntılı kılavuzu takip edin!

Bu kapsamlı eğitimde, şunları ele alacağız:

  • Anahtar Kavramlar: Zaman Uçuşu Sensörleri, Makine Öğrenimi & TinyML
  • Geliştirme ortamının kurulumu
  • Edge Impulse ile Veri Toplama Nasıl Yapılır
  • Edge Impulse ile Makine Öğrenimi modelinin Tasarımı, Eğitimi, Değerlendirilmesi & Dağıtımı
  • Arduino ile Wio Terminal üzerinde Canlı Çıkarımların Uygulanması
  • Bu Projeye Potansiyel İyileştirmeler

Proje Genel Bakış: El Yazısı Tanıma

El yazısı tanıma, dijitalleşmenin küresel ölçekte gerçekleşmeye başlamasından bu yana sürekli popüler bir gelişim alanı olmuştur. Belki de aşina olduğunuz yaygın bir kullanım durumu, el yazısıyla yazılmış metinlerin optik karakter tanıma (OCR) aracılığıyla bilgisayar okunabilir formatlara dönüştürülmesidir.

Kamera tabanlı sistemlerin yanı sıra, el yazısı tanıma elde etmenin birçok başka yolu vardır; bunlar arasında mobil telefonlarımızın ve tabletlerimizin dokunmatik ekranları veya ivmeölçer birimleri (IMU’lar) ile hareket tabanlı izleme yer alır. Ancak, bugün ele alacağımız proje çok daha basit olacak – el yazısı hareketlerini tanımak için sadece tek bir zaman uçuşu sensörü kullanacağız.

Öncelikle projenin uygulamada nasıl çalıştığını gösteren bir video gösterimine bakalım.

TinyML ve Edge Impulse Hakkında Kısa Bilgi

Makine öğrenimi, veri analizi yöntemidir. Sistemlerin, verilerden otomatik olarak öğrenebileceği fikrine dayanır; algoritmalar yardımıyla kalıpları tanımlayıp kararlar alabilirler. Görüntü tanıma, borsa tahmini ve sesli metin doğal dil işleme, makine öğreniminin sağladığı uygulamalardan sadece birkaçıdır.

Görüntü Sınıflandırması için Sinir Ağı, Kaynak: Carnegie Mellon Üniversitesi

TinyML, Tiny Machine Learning’in kısaltmasıdır ve makine öğreniminin bir alt kümesidir; makine öğrenimi modellerinin gerektirdiği hesaplama alanı ve gücü azaltmak için optimizasyon teknikleri kullanır. Özellikle, ML uygulamalarını mikrodenetleyici birimleri gibi kompakt, enerji verimli ve en önemlisi uygun fiyatlı cihazlara getirmeyi amaçlar.

Bugünkü projede Edge Impulse kullanacağız. Edge Impulse, veri toplama ve işleme, model eğitimi ve nihayetinde dağıtım aşamalarına kadar makine öğrenimi modelleri oluşturmayı kolaylaştıran bir platformdur. 

Bu proje için, kişisel kullanım için ücretsiz olan bir Edge Impulse hesabı oluşturmamız gerekecek. Kayıt olmak için buraya

Zaman Uçuşu & El Yazısı Tanıma

Öncelikle, zaman uçuşu veya ToF, mesafe ölçme veya aralık belirleme yöntemidir. ToF sensörlerinde, bir sinyal önce sensörden çevreye yayılır. Sinyal bir engel veya nesneye çarptığında, yansır ve sensöre geri döner. Sensör, sinyalin geri dönmesi için geçen süreyi ölçer ve dalganın kat ettiği mesafeyi hesaplamak için kullanır; bu nedenle “zaman uçuşu” olarak adlandırılır.

Kaynak: Terabee

Peki bu, el yazısı tanımayı nasıl sağlıyor? Bugünkü projenin arkasındaki kavram aslında oldukça basit. ToF sensörünü “çizim tahtamızın” yanına yerleştireceğiz ve el yazısı hareketlerimizi sensörün görüş alanında gerçekleştireceğiz. Hareketimizi gerçekleştirirken, elimiz hareket edecek ve sensör tarafından okunan mesafe değerlerinde değişikliklere neden olacaktır.

Yazdığımız her harf genel olarak aynı hareketleri takip edeceğinden, sensör tarafından hareketler sırasında kaydedilen mesafe serisinin belirli soyut kalıpları takip etmesini bekliyoruz. Evet, bir dizi değerden el yazısını tanımlamak insan gözü için kolay bir iş değil, ancak bu kesinlikle makine öğreniminin yeteneklerinin ötesinde değil!

Proje Malzemeleri

Daha fazla ilerlemeden önce, bu eğitimi takip etmek isterseniz aşağıdaki öğeleri öneririm.

Bu proje için, Grove Ultrasonik Ranger veya Grove TF Mini LiDAR Sensörü gibi herhangi bir türde mesafe sensörü kullanabilirsiniz; bunlar aslında Edge Impulse ile veri toplama için resmi olarak desteklenmektedir. Yine de, elimde bulunan VL53L0X sensörünü kullanıyorum.

Wio Terminal & Bilgisayarı Kurma

Başlamak için önce Wio Terminalimizi ve bilgisayarımızdaki geliştirme ortamını kurmamız gerekiyor.

  1. Eğer Wio Terminal ile ilk kez çalışıyorsanız, öncelikle Seeed Wiki’deki Başlarken kılavuzunu ziyaret etmeniz şiddetle önerilir.
  2. Sonra, VL53L0X Grove Mesafe Sensörü Kütüphanesini ZIP olarak indirip Arduino IDE aracılığıyla kurarak yükleyin. Ayrıntılı talimatlar burada bulunabilir.
  3. Son olarak, Edge Impulse ile kullanmak için Wio Terminalinizi ve bilgisayarınızı kurmak için bu bağlantıdaki talimatları takip edin.

Veri Toplama Kurulumu

Herhangi bir makine öğrenimi projesinde olduğu gibi, ilk adımımız bir tür veri edinmektir. Bugünkü projede, hareketlerimizi gerçekleştirirken sensör değerlerimizi kaydederek kendi veri setimizi oluşturacağız. Neyse ki, bunu Edge Impulse ile yapmak oldukça basit!

Verileri Edge Impulse’a Yükleme

Edge Impulse, kendi veri setleriniz de dahil olmak üzere çeşitli kaynaklardan veri yüklemenize olanak tanır; hatta mobil telefonunuzu kullanarak bile. Wio Terminal’den veri yüklemek için iki ana yol vardır.

Eğer yukarıda belirtilen Edge Impulse destekli Grove Ultrasonik Ranger veya Grove TF Mini LiDAR Sensörü‘nı kullanıyorsanız, verileri toplamak ve yüklemek için terminalinizde doğrudan edge-impulse-daemon komutunu kullanabilirsiniz. Detaylı talimatlar için Seeed Wiki’deki bu Edge Impulse alkol ayırt etme projesine başvurabilirsiniz.

Aksi takdirde, desteklenmeyen diğer sensörler için toplamak istediğimiz verileri veri yönlendirici ile iletmemiz gerekecek!

Adım 1: TOF Sensörünü Wio Terminal’e Bağlayın

Grove VL53L0X ToF sensörünüzü aşağıda gösterildiği gibi Wio Terminal’in I2C Grove portuna takın.

Adım 2: Arduino Sketch’ini Yükleyin ve Sensör Okumalarını Seri Port’a Gönderin

Edge Impulse veri yönlendiricisi, sensör okumalarımızı elde etmek ve kaydetmek için seri iletişim kullanır. Okumaları beslemek için, önce seri arayüze göndermek istediğimiz değerleri çıkartan bir Arduino sketch’ini yüklememiz gerekecek.

Bu noktada, projeye ait dosyaları bu Github deposundan indirebilirsiniz.

ToF_DataForwarder klasörünün içinde, ToF_DataForwarder.ino dosyasını açın ve bunu Wio Terminal’inize yükleyin. Alternatif olarak, Files > Examples > Grove VL53L0X Library altında bulunan örneklerden birinden kendi veri yönlendirme sketch’inizi de oluşturabilirsiniz. Sağladığım veri yönlendirici sketch’i, yüksek hassasiyetli mesafe ölçüm örneğine dayanmaktadır ve verileri seri monitöre 5Hz frekansında iletmektedir.

Yükledikten sonra, sensör değerlerinizin doğru bir şekilde iletildiğini doğrulamak isteyeceksiniz. Arduino IDE’de seri monitörü açın ve aşağıda gösterildiği gibi bir mesafe değerleri akışı görmelisiniz.

Veri yönlendirici hakkında daha fazla bilgi almak isterseniz, buraya gidin.

Adım 3: Edge Impulse Veri Yönlendiricisini Çalıştırın

Sonraki adımda, seri monitörü kapatın ve bilgisayarınızda terminal veya komut satırını açın. Edge Impulse veri yönlendiricisini başlatmak için:

edge-impulse-data-forwarder

Edge Impulse hesap bilgilerinizi girmeniz istenecek ve Wio Terminal’iniz birkaç saniye içinde Edge Impulse Web UI’ye bağlanacaktır! Bunu kontrol etmek için, Edge Impulse projenize gidin ve cihazlar sekmenizi kontrol edin. Aşağıda gösterilenlere benzer bir şey görmelisiniz.


Veri Toplama

Artık veri setimizi oluşturmaya hazırız! Yan paneldeki Veri toplama sekmesine gidin ve aşağıdaki ekranla karşılaşmalısınız, ancak veri gösterilmiyor.

Kaydetme Parametreleri

Sağ tarafta, Wio Terminal’inizin ve ToF sensörünüzün “Cihaz” ve “Sensör” alanlarında seçili olduğundan emin olun. “Frekans” değerini veri yönlendirici sketch’inizin çıkış frekansına ayarlayın, ardından “Etiket” alanına çizeceğiniz harfi girin.

Son olarak, süre hakkında biraz konuşalım. Başlangıçta, tekrarlayan hareketlerin daha uzun kesitlerini kaydetmek istedim, ardından bunları Edge Impulse’un “Kesitleri Böl” işlevi ile farklı örneklere ayırmayı planladım. Ancak, kesitleri tanımlama süreci kısmen otomatik olarak yapıldığından, 20 kez hareketi gerçekleştirmeme rağmen bir dakikalık kayıttan yalnızca 2-3 örnek elde ettim.

Sonunda, kesitleri bölmeden kullanmak için 10 saniyelik örnekler kaydettim; burada hareketi pencere içinde tekrar tekrar gerçekleştirdim. Ancak, her kayıtta bir hareket kaydetmeyi kesinlikle tercih edebilirsiniz, bu daha basit bir yaklaşımdır.

Aslında, bu yaklaşımı öneririm, çünkü harfleri çizerkenki hareketler örneğe gürültü ekleyebilir ve öğrenme özelliklerimizi seyreltir. Ancak modelim yine de iyi bir performans sergilediği için (spoiler alert!), bunu değiştirmek için geri dönmedim.

Hazır olduğunuzda, “Örneklemeye Başla” butonuna tıklayın. Kayıt başladığında, ne kadar süreniz kaldığını gösteren canlı bir geri sayım göreceksiniz.

Ne kadar veri gerekiyor?

Bir kavram kanıtı projesi için, yalnızca ‘A’, ‘B’, ‘C’ büyük harfleri ile birlikte bir Null sınıfı olmak üzere toplam 4 sınıf eğittim. Eğer benim gibi 10 saniyelik kesitler kaydediyorsanız, her sınıf için eğitim amacıyla en az 10 veri örneği, ardından test için her biri için 3 daha fazla örnek almak isteyeceksiniz. Eğer bireysel kesitler kaydediyorsanız, bu eğitim ve test için sırasıyla her sınıf için yaklaşık 30 ve 10 örneğe denk gelir.


Impulse Tasarımı

Topladığınız verilerden memnun kaldığınızda, makine öğrenimi modelimiz üzerinde çalışmaya başlamak için Impulse Tasarımı’na geçebiliriz. Burada oldukça kafa karıştırıcı olabilecek birkaç sütun var, ancak bu proje için temel unsurları açıklamak için elimden geleni yapacağım.

Bir Giriş Bloğu Ekleyin

En soldaki sütunda “Zaman serisi verisi” seçin, çünkü bir süre boyunca kaydedilen mesafe değerleri ile çalışıyoruz. İki ayarlanabilir parametre göreceksiniz: “Pencere Boyutu” ve “Pencere Artışı”.

Basit bir dille, Edge Impulse’un verileri nasıl işlediği, örneğinizi taramak için hareket eden bir pencere kullanmasıdır. Pencere Boyutu, o pencerenin boyutunu değiştirir ve Pencere Artışı, pencere sağa kaydırıldığında alınacak adımın boyutudur. Her adımda her pencere, kendi başına bir veri özelliği olacaktır.

Bu değerler, modelinizin sonraki performansını büyük ölçüde etkileyebilir, bu nedenle istenen performansı göremiyorsanız bunu ayarlamak için geri dönmeyi unutmayın.

Bir İşleme Bloğu / Öğrenme Bloğu Ekleyin

Edge Impulse, oldukça fazla sayıda işleme yöntemi sunar, ancak bu proje için çok basit olan düzleştirmeyi kullandım. Eğer daha sonra daha fazla sınıf eklemeyi planlıyorsanız, ön işleme olmadan ham verilerle çalışmak sizin için iyi bir seçim olabilir. Bunun nedeni, verilerimizin zaman serisi tabanlı olmasıdır; bu, istenen eğitim özelliklerinin zaten ham verilerimizde mevcut olduğu anlamına gelir. Düzleştirme ile ön işleme kullanmak, sınıflarımız arasındaki ayrımı azaltabilir ve daha fazla sınıf tanıtıldığında daha kötü bir performansa yol açabilir.

Öğrenme için, başka bir seçeneğimiz yok, Neural Network sınıflandırıcısı ile gitmek zorundayız. İşiniz bittiğinde, çıkış özelliklerinizi kontrol edin ve “Impulse’u Kaydet” butonuna tıklayın.

“`html


Veri İşleme

Şimdi, proje yan çubuğunuzda “Düzleştir” seçeneğine geçin. Ölçekleme gibi bazı özellik işleme seçenekleri ile ortalama, minimum, maksimum, kök ortalama kareler gibi üretilen özelliklerin seçimleriyle karşılaşacaksınız. İşte burada ham verilerimiz, modelimizin el yazısı jestini tanımlaması için muhtemelen daha faydalı olacak özelliklere dönüştürülecek. Şimdilik hepsini seçebilirsiniz.

Parametreleri kaydet butonuna tıkladıktan sonra, bir sonraki sayfaya yönlendirileceksiniz. “Özellikleri Üret” butonuna tıklayın ve programın işini yapmasına izin verin. Sağda, her sınıfın üretilen özelliklerini keşfetmeniz için bir 3D grafik gösterilecektir ve bunların birbirleriyle nasıl ilişkili olduğunu göreceksiniz.

Modelinizin daha iyi öğrenmesine yardımcı olmak için, sınıflarınızı birbirinden temiz ve net bir şekilde ayıran özellikleri bulmak istersiniz. Benim durumumda, standart sapma, çarpıklık ve basıklık her bir sınıf arasında makul bir ayrım sağladı, bu yüzden son modelimde yalnızca bu üç özelliği kullanmaya karar verdim, böylece hesaplama gücünden tasarruf ettim.

Buradan devam edip modelimizi eğitmeye başlamak cazip olsa da, eğer hiçbir özellik sınıflar arasında iyi ayrımlar sağlamıyorsa verilerinizi gözden geçirmek için biraz zaman ayırmaya değer. Benim durumumda, model eğitimi için faydalı olamayacak kadar fazla gürültü içeren birkaç örneği yeniden kaydetmem gerekti.


Model Eğitimi

Sonunda, sinir ağımızı eğitme zamanı! Eğitim döngülerinin sayısını 500’e çıkarın (bunu daha sonra azaltabilirsiniz) ve öğrenme oranı ile güven derecesini şimdilik olduğu gibi bırakın. NN sınıflandırıcınızın yapısı konusunda oldukça fazla özgürlük kullanabilirsiniz. Bununla oynamanızı ve en iyi sonuçları neyin getirdiğini görmenizi öneririm!

Kullandığım modelin mimarisi aşağıda gösterilmektedir.

Modeliniz eğitimi tamamlandığında, eğitim performansı hakkında bazı metrikler görmelisiniz. İdeal olarak, bunun en az %90’ın üzerinde olmasını istersiniz. Bu, modelin hangi sınıflarla zorlandığını görmek için de iyi bir fırsattır. Örneğin, eğitim verilerimi yeniden kaydetmeden önce, A ve B sınıfı arasında birçok yanlış sınıflandırma alıyordum, bu da veri toplama sürecimi nasıl geliştirebileceğim konusunda ipuçları verdi.


Modeli Test Etme

Modeli “Canlı sınıflandırma” sayfasına giderek test edebilirsiniz. Orada, veri toplama aşamasında yaptığımız gibi örnekleri yükleyebilir ve modelin doğrulama için bir sınıflandırma sonucu üretmesini sağlayabilirsiniz. Ayrıca, “Model testi” sayfasında daha önce kaydettiğiniz test verileri üzerinde modelinizi de test etmelisiniz. Performansından memnunsanız devam edebilirsiniz veya iyileştirmeler için daha önceki bir adıma geri dönebilirsiniz.

Not: Projenizin mevcut durumunu kaydetmek için “Sürümleme” kullanabilirsiniz. Bu, değişiklik yapmanız için size rahat bir alan sağlamalıdır. Keşfetmekten korkmayın!


Modeli Yayınlama

Bu noktaya kadar geldiğiniz için tebrikler! Nihayet modelimizi Wio Terminal’imizde kullanmak üzere dışa aktarmaya başlamak için “Dağıtım” sayfasına gidin. Öncelikle Arduino kütüphanesini seçin.

Ardından, “Kuantize (int8)” modelini seçin ve derlemeye tıklayın. Kuantizasyon, ondalık sayıları (ondalık kesirli olanlar) daha az bellek ve işlem gücü gerektiren tam sayılara dönüştüren bir TinyML tekniğidir. Bu optimizasyon genellikle küçük bir doğruluk kaybıyla birlikte gelir, ancak gecikmede büyük iyileşmeler ve hesaplama gereksiniminde bir azalma sağlar.

Edge Impulse, ardından Arduino Kütüphanesini oluşturmaya başlayacak ve tamamlandığında bilgisayarınıza ZIP olarak indirilecektir. Bu ZIP dosyasını Arduino IDE’nizle yükleyin.


Arduino Uygulaması

Doğal olarak, Wio Terminal’imize Arduino ile dağıtım yapmak için bir Arduino taslağına ihtiyacımız olacak. Neyse ki, yeni yüklediğiniz kütüphane, amacımız için kolayca değiştirebileceğimiz birkaç örnekle birlikte gelir. Dosyalar > Örnekler > <Kütüphane Adı> yolunu izleyin ve static_buffer örneğini seçin.

Açıldığında, taslağı istediğiniz bir konuma kaydedin. Ardından, Arduino kodunda aşağıdaki değişiklikleri yapmamız gerekecek.

1.  Kütüphaneleri ve Bildirimleri Ekleyin

Öncelikle, ToF sensörümüzden giriş verisi alabilmemiz için taslağın en üstüne aşağıdaki kodu ekleyin.

#include <wio_terminal_handwriting_recogniser_inference.h>
#include <wio_terminal_handwriting_recogniser_inference.h>
#include "Seeed_vl53l0x.h"
Seeed_vl53l0x VL53L0X;

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL SerialUSB
#else
    #define SERIAL Serial
#endif

Ardından, özellikler dizisi bildirimini const ve dizi içeriğini kaldırarak aşağıdaki gibi değiştirin. Benim durumumda, modelim 25 özellik (mesafe değerleri) girişi beklediği için 25 kullanıyorum. Eğer Edge Impulse’da farklı bir pencere boyutu veya adım seçtiyseniz bu sizin için farklı olabilir.

static float features[25];

Gerekli olan giriş özelliklerinin sayısından emin değilseniz, önce rastgele bir tam sayı bildirebilir ve seri monitör çıktısını izleyebilirsiniz. Program bir hata mesajı verecek ve beklediği boyutları size bildirecektir.

2.  setup() Fonksiyonunu Değiştirin

setup() fonksiyonunu tamamen aşağıdaki kod ile değiştirin.

“““html

void setup() {
    Serial.begin(115200);

    VL53L0X_Error Status = VL53L0X_ERROR_NONE;
    Status = VL53L0X.VL53L0X_common_init();
    if (VL53L0X_ERROR_NONE != Status) {
        SERIAL.println("vl53l0x ölçüm başlatma başarısız oldu!");
        VL53L0X.print_pal_error(Status);
        while (1);
    }

    VL53L0X.VL53L0X_high_accuracy_ranging_init();

    if (VL53L0X_ERROR_NONE != Status) {
        SERIAL.println("vl53l0x ölçüm başlatma başarısız oldu!");
        VL53L0X.print_pal_error(Status);
        while (1);
    }
    
    Serial.println("Edge Impulse Çıkarım Demo");
}

3.  loop() Fonksiyonunu Değiştirin

Son olarak, loop() fonksiyonunuzun başına aşağıdaki kodu ekleyin. Lütfen for döngüsünde tanımlanan i’nin maksimum değerinin, özellik dizinizin uzunluğuna uyacak şekilde güncellenmesi gerektiğini unutmayın.

Serial.print("3... içinde jest yapın ");
delay(1000);
Serial.print("2... ");
delay(1000);
Serial.print("1... ");
delay(1000);
Serial.print("Başla! ...");
    
for (int i = 0; i<25; i++) {
    VL53L0X_RangingMeasurementData_t RangingMeasurementData;
    VL53L0X_Error Status = VL53L0X_ERROR_NONE;
    
    memset(&RangingMeasurementData, 0, sizeof(VL53L0X_RangingMeasurementData_t));
    Status = VL53L0X.PerformSingleRangingMeasurement(&RangingMeasurementData);
    if (VL53L0X_ERROR_NONE == Status) {
        if (RangingMeasurementData.RangeMilliMeter >= 2000) {
            //SERIAL.println("menzil dışında!!");
            SERIAL.println(-50);
        } else {
            // SERIAL.print("Ölçülen mesafe:");
            features[i] = RangingMeasurementData.RangeMilliMeter;
            // SERIAL.println(" mm");
        }
    } else {
        SERIAL.print("ölçüm başarısız !! Durum kodu =");
        SERIAL.println(Status);
    }
    delay(200);
}
Serial.println("Bitti!");

Artık Serial monitörü açabilir ve modelinizi Wio Terminal üzerinde canlı çıkarımlarla test edebilirsiniz. Kod, jest yapmaya başlamanızı bir geri sayım ile isteyecek, ardından çıkarımı gerçekleştirecek ve sonuçları gösterecektir.

Örneğin, A harfini çizdiğimde bu çıktı alındı… ardından modelin C olarak düşündüğü bazı diğer hareketler geldi.


LCD Ekranı Entegre Etme

Bir sonraki adım, bu cihazı gerçek bir el yazısı tanıma cihazına dönüştürmek için Wio Terminal’in yerleşik LCD ekranında görüntüleme istemlerini entegre etmektir! Bu bölümdeki talimatları takip edebilir veya bu projenin koduyla birlikte indirilmiş olan Test_EIModel_TFT.ino dosyasına başvurabilirsiniz.

Öncelikle, TFT kütüphanesini dahil ediyoruz ve bir örnek tanımlıyoruz. Wio Terminal için TFT kütüphanesi, bu eğitimin “Wio Terminal & Bilgisayar Kurulumu” bölümünün 1. Adımını gerçekleştirdiyseniz bilgisayarınıza zaten yüklenmiş olmalıdır.

#include "TFT_eSPI.h"
TFT_eSPI tft;

Ardından, setup() fonksiyonumuzda bir başlatma ekliyoruz, bazı parametreler tanımlıyoruz ve başlangıçta basit bir açılış ekranı ekliyoruz.

tft.begin();
tft.fillScreen(TFT_BLACK);
tft.setRotation(3);
tft.setTextDatum(MC_DATUM);
tft.setTextPadding(320);
tft.drawString("Wio Terminal El Yazısı Tanıyıcı!", 160, 120);
delay(1000);
tft.setTextSize(2);
tft.fillScreen(TFT_BLACK);

loop() fonksiyonundaki değişiklikler, Serial.print() fonksiyonlarımızın tümünü tft.drawString() çağrılarına dönüştürmeyi içerir, böylece istemler ekranımızda görüntülenecek ve seri monitör aracılığıyla değil. Örneğin:

tft.fillScreen(TFT_BLACK);
tft.drawString(F("3 içinde jest yapın"), 160, 120);
delay(1000);
tft.drawString(F("3 2 içinde jest yapın"), 160, 120);
delay(1000);
tft.drawString(F("3 2 1 içinde jest yapın"), 160, 120);
delay(1000);
tft.drawString(F("Başla!"), 160, 120);

Artık, tüm olası çıktılar için tüm güven değerlerini sağlamak yerine, yalnızca en yüksek olasılığa sahip tahminin değerlerini göstermek istiyoruz. Kodunuzda “insan okunabilir tahminler” kısmını bulana kadar aşağıya inin. Ardından, kodunuzu aşağıdaki kodla eşleşecek şekilde değiştirin.

// insan okunabilir tahminler
String output = "Null";
float confidence = 0;
    
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
    if (result.classification[ix].value > confidence) {
        ei_printf("    %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
        output = result.classification[ix].label;
        confidence = result.classification[ix].value;
    }
}

tft.drawString(output + ", " + confidence, 160, 120);

Son Ürün

Hepsi bu kadar! Artık, Wio Terminal’imizde çalışan Edge Impulse ile oluşturulmuş bir sinir ağına sahibiz ve bu, el yazısı jestlerinin anında tanınmasını sağlıyor! Şimdi, son ürünün çalışmasını tekrar gözden geçirelim.

Proje için Gelecek İyileştirmeleri

Şüphesiz, bu proje sadece bir kavramsal kanıt ve uygulanabilir bir ürün haline gelmesi için uzun bir yolu var. Yine de, yalnızca bir ToF sensörü ve makine öğrenimi ile nelerin yapılabileceğini görmek etkileyici! İşte bu projenin kesinlikle daha da geliştirilebileceği bazı yollar.

1. Modeli Daha Fazla Veri ile Eğitin

Eğer bu eğitimin bu adımına geldiyseniz, sadece 3 sınıfı (Null hariç) eğitmenin bile oldukça fazla jest yapmayı gerektirdiğini bilirsiniz. Üzücü gerçek, makine öğreniminin tamamen verilere dayalı olduğudur. Genel olarak, modelimize eğitim için verdiğimiz örnek sayısı arttıkça, sonunda daha iyi performans gösterir.

Ayrıca, eğitim verilerimizdeki varyasyonları tanıtmak da önemlidir; jestlerimizin başlangıç pozisyonunu ToF sensörüne daha yakın veya daha uzak olacak şekilde değiştirerek, farklı hızlarla veya hatta farklı el yazısı stilleriyle jest yaparak. Bu, modelimizin daha sağlam olmasını sağlayacak ve el yazısı harflerini, çeşitli şekillerde yapılsa bile tanımayı öğrenmesini sağlayacaktır.

2. Daha Yüksek Performanslı Bir ToF Sensörü Kullanın

Karşılaştığım en büyük sorun, ToF sensöründen üretilen verilerin çözünürlüğüydü. Daha yüksek örnekleme hızlarında hatalarla karşılaşmaya başladığım için, yalnızca saniyede 5 okuma ile sınırlı kaldım, bu da optimal değil.

Bu nedenle, hareket özelliklerinin örneklerimde yeterince yakalanabilmesi için büyük harfler çizmeye de sınırlı kaldım. Daha hızlı ve daha hassas bir ToF sensörü ile, normal boyutlarda el yazısı ile bile yeterli özellikleri çıkarmak mümkün olmalıdır.

3. Daha Fazla veya Diğer Sensörler Kullanın

Tek bir ToF sensörü ile bu kadar ilerlemek etkileyici olsa da, ondan çok daha fazlasını beklemek de oldukça pratik değil. Eğer 26 harfi tanımak için bir model eğitmeye çalışırsak, en az birkaçını ayırt etmek için yeterli özellik olmayacaktır. İkinci bir ToF sensörü ile, ek bir eksen için ölçümler alabiliriz, bu da farklı harfler arasında çok daha iyi bir ayrım sağlayacaktır.

Özellikle ToF sensörleri oldukça dar bir “görüş alanına” sahiptir, bu da jestlerin kör noktalarda yapılmasını oldukça kolay hale getirir ve yanlış sınıflandırmalara yol açar. Belki de diğer tür mesafe sensörleri veya hatta pasif kızılötesi (PIR) sensörler bu uygulama için daha uygun olabilir!


Özet & Bazı Kapanış Düşünceleri

Wio Terminal’inizle makine öğrenimi destekli bir el yazısı tanıma cihazı oluşturma konusundaki bugünkü eğitimi beğenmişsinizdir umarım! Makine öğreniminin sağladığı yeni olanakları düşünmek gerçekten heyecan verici – ve şimdi Edge Impulse gibi platformlar sayesinde daha da erişilebilir hale geldi.

Edge Impulse, veri analizi ve makine öğrenimi hakkında bazı bilgilere sahip olduğunuzu varsayıyor ve bu nedenle bazıları için kafa karıştırıcı olabilir. Ancak, sınırlı uzmanlığımda kullandığım en kullanıcı dostu deneyimlerden biri olduğu kesin. TinyML veya genel olarak makine öğrenimine başlamak isteyen herkesi bununla oynamaya teşvik ediyorum!

“`

Bir kez daha, proje kodunu bu Github deposunda bulabilirsiniz. Edge Impulse’tan oluşturduğum Arduino kütüphanesi ZIP dosyası da burada mevcut, bu projeyi denemek için basit bir yol isterseniz.

Wio Terminal ile daha fazla TinyML projesi için lütfen ziyaret edin:

Diğer Wio Terminal projeleri için lütfen ziyaret edin:

Leave a Reply

Your email address will not be published. Required fields are marked *