Haberler

Wio Terminal ile Küçük ML Akıllı Hava İstasyonu Kurun

28 Şubat 2024’te güncellendi

Bugünkü eğitimde, TinyML destekli tahmin yeteneklerine sahip kendi Wio Terminal Akıllı Hava İstasyonunuzu nasıl oluşturacağınızı öğrenin! Bu makale, bu projeyi Wio Terminal’inizle çalışır hale getirmek için veri toplama, eğitim ve nihayetinde akıllı hava istasyonumuzu Arduino kodu ile dağıtma adımlarını içeren kapsamlı bir rehberdir.

Akıllı Hava İstasyonu: Proje Genel Bakış

Tipik olarak, bir hava istasyonu projesi, sensörü mikrodenetleyici platformumuza bağlamayı ve bu verileri gerçek zamanlı olarak, ya bir LCD ekranda ya da internet bağlantısı üzerinden çevrimiçi bir veritabanına okumayı içerir.

Bugün, Wio Terminal’imizin mevcut hava koşullarını tahmin etme yeteneği ekleyerek oluşturduğum bu hava istasyonu projesinin akıllı versiyonunu paylaşmak istiyorum. Wio Terminal, yerleşik bir TensorFlow Lite modeli ile gerçek zamanlı sıcaklık ve bağıl nem verilerini kullanarak yarım saatlik hava tahminleri yapabilme yeteneğine sahip oluyor!

Öncelikle, aşağıdaki videoda tamamlanmış projeye bir göz atalım.

Proje Gereksinimleri

Bu projeyi takip etmek için aşağıdaki malzemelerin temin edilmesi önerilir.

Wio Terminal’i programlamak için Arduino IDE dışında, Python 3 yüklü bir bilgisayara da ihtiyacınız olacak. Hem Python betikleri (.py dosyaları) hem de Python defterleri (.ipynb dosyaları) ile çalışacağız. Python’a yeniyseniz, tercih ettiğim kod editörü Microsoft’un Visual Studio Code’u. Bu proje için ihtiyaç duyduğumuz her iki dosya türünü de açabilir ve burada takip edebileceğiniz bir kurulum kılavuzu var.

TinyML Nedir: TensorFlow Lite

Makine öğrenimi son on yılda gerçek bir popülerlik kazandı ve bize tahminler, görüntü tanıma ve anomali tespiti gibi harika işlevsellikler sundu. Geleneksel olarak, makine öğrenimini hesaplama açısından yoğun bir görev olarak düşünebilirsiniz – bu doğrudur! Gelişmiş makine öğrenimi görevleri için kullanılan modern derin sinir ağları, güçlü GPU’lar ve derin öğrenme eğitimi için özelleştirilmiş ASIC’lerde büyük miktarda veri ile eğitilmektedir.

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

Ancak, makine öğreniminde yeni bir kavram, bu uygulamaları daha az güçlü, ancak kompakt ve kullanışlı kenar bilişim cihazlarına, yani MCU’lara (mikrodenetleyici birimleri) taşımayı amaçlamaktadır. Bu TinyML’dir.

Genel anlamda, TinyML, makine öğrenimi modellerini daha az yer kaplayacak ve daha az hesaplama gücü gerektirecek şekilde optimize etmeyi hedefler. Özellikle, Edge Impulse, kendi veri setlerinizi oluşturmanıza, optimize edilmiş TinyML modellerinizi eğitmenize ve bunları kolayca dağıtmanıza olanak tanıyan kullanıcı dostu bir platformdur.

Ancak, bugünkü projede TensorFlow Lite kütüphanesini kullanacağız. TensorFlow, Google tarafından sürdürülen açık kaynaklı bir makine öğrenimi platformudur ve Lite versiyonu TinyML için modellerin optimizasyonuna yöneliktir.

TensorFlow Lite Genel Bakış, Kaynak: TensorFlow

Sıcaklık ve Nem Verilerini Alma: 3 Yöntem

Bu eğitimin ilk kısmı, bölgeniz veya şehriniz için tarihsel verileri elde etmeyi içerir. İnanın ya da inanmayın, aslında basit sıcaklık ve bağıl nem ölçümleri için erişilebilir tarihsel verileri bulmak oldukça zordur.

Özetle, bu verileri elde etmenin üç ana yolu vardır.

1. Verileri Kendiniz Ölçün ve Toplayın

Bir hava istasyonu yapmayı planlıyorsanız, muhtemelen zaten bir mikrodenetleyici ve sıcaklık/nem sensörüne sahipsinizdir. Eğer öyleyse, çevresel verileri belirli aralıklarla çekmek için basit bir Arduino programı kullanarak zamanla kendi veri setinizi oluşturabilirsiniz.

Bu kolay ve pratik görünse de, herhangi bir makine öğrenimi modelini eğitmek için yeterli veriyi (en az birkaç yüz) toplamak çok zaman alacaktır! Her saat bir ölçüm alarak ve gün boyunca döngüsel hava desenlerini göz önünde bulundurarak, bir haftalık ölçüm sadece 7 benzersiz veri seti sağlar. Üstelik, verileri kendiniz etiketlemeniz gerekecek.

2. Ücretsiz Bir Veri Seti veya API Arayın

Hava verilerini çekmek için mevcut birçok API (uygulama programlama arayüzü) bulunmaktadır. Ancak, bunların çoğu, ihtiyaç duyduğumuz tarihsel verilere erişmek için ücretli bir abonelik gerektirir.

Yaşadığınız yere bağlı olarak, yerel ajansınız veya hava istasyonunuz bu verileri ücretsiz olarak sunabilir. Örneğin, Singapur’daki Ulusal Çevre Ajansı, tarihsel hava verilerini programlı olarak sorgulamak için ücretsiz bir Hava Verileri API’si sunmaktadır. Kullanmayı düşündüğünüz API için nasıl başlayacağınızı öğrenmek için belgeleri takip edebilirsiniz.

Aksi takdirde, ABD’deyseniz, Ulusal Çevre Bilgileri Merkezleri de web sitelerinde CSV formatında talep edilebilecek güncel saatlik veriler sağlamaktadır. Aksi takdirde, bu verileri programlı olarak çekmek için bu makaleyi takip edebilirsiniz.

3. Python Betiği ile Verileri Çekin

Singapur’un Tarihsel Hava Verileri, Kaynak: Wunderground

Birçok web sitesi, Wunderground gibi, ücretsiz olarak referans almak için detaylı tarihsel hava verileri sağlar, ancak genellikle makine öğrenimi için ihtiyaç duyduğumuz CSV gibi kolay işlenebilir bir formatta değildir. Bu sorunu aşmak için, web sayfalarını açıp bu verileri bizim için kopyalayan bir program (genellikle Python kullanılır) kullanabiliriz. Bu işleme Web Scraping denir ve bugünkü projede kullandığım yöntemdir.

Python ile Hava Verilerini Web Scraping

Bugün makaleyi takip eden herkes için işleri kolaylaştırmak adına, bu amaçla bir Python betiği oluşturmak için Angel R.’nin bu makalesini ve StackOverflow’daki bu gönderiyi referans aldım. Bu betik, Wunderground’ın tarihsel günlük hava verilerinden otomatik olarak veri çekecek ve ardından verileri güzel bir CSV dosyası halinde üretecektir.

Koda geçmeden önce, wunderground.com’u ziyaret edin ve Aşağıdaki gibi Daha Fazla > Tarihsel Hava bölümüne gidin.

“`html

Konumunuzu girmeniz gerekecek, böylece hava durumu istasyonunuzun bulunduğunuz bölgedeki hava koşullarını yorumlaması için veri alabilir ve eğitebilirsiniz. Ayrıca, hava durumu verilerini almaya başlamak istediğiniz tarihi de girebilirsiniz – ben 1 Ocak 2020’yi seçtim.

Görüntüle’ye tıkladıktan sonra yeni bir web sayfası yüklenmelidir. Çalıştığımız şeye bir göz atabilirsiniz, ancak gerçekten almak istediğimiz şey bu sayfanın URL’sidir. İdeal olarak, gösterilen hava durumu verisinin tarihi olarak son bölümün aynı formatta olması gerekir. Bu URL’yi not edin.

Artık web scraping’e başlayabiliriz. Bu proje için kodu aşağıdaki bağlantıdan ZIP dosyası olarak indirin. Ardından, GetWeatherData.py dosyasını tercih ettiğiniz kod editörü ile açın.

Script’i çalıştırmadan önce, bilgisayarınızın komut satırında veya terminalinde aşağıdaki Python paketlerini yüklemeniz gerekecek. Bu paketler, web sayfası verilerini açmadan ayrıştırmamıza yardımcı olacak ve daha sonra kaydedilen verileri işleyebileceğiz.

pip3 install numpy pandas beautifulsoup4 selenium

Değiştirmeniz gereken kodun ilk kısmı lookup_URL’dir. Buraya önceki bölümde bulduğunuz bağlantıyı yerleştirmek isteyeceksiniz. Ancak, tarih numaralarını “{}” ile değiştirdiğimizi unutmayın.

lookup_URL = 'https://www.wunderground.com/history/daily/WSSS/date/{}-{}-{}.html'

Sonra, başlangıç tarihini tanımlayabilir ve toplamak istediğiniz gün sayısını belirleyebilirsiniz. Modelimizin yıl boyunca hava durumu kalıplarını iyi kavrayabilmesi için yaklaşık 400 gün seçtim.

start_date = datetime(2020, 1, 1)
end_date = start_date + pd.Timedelta(days=400)

Kontrol etmeniz gereken bir sonraki şey webdriver’dır. Varsayılan olarak, kod, web sayfası verilerini yüklemek için Google Chrome tarayıcısına dayalı bir chrome webdriver MacOS çalıştırılabilir dosyası kullanacaktır. Windows’taysanız veya başka bir web sürücüsü kullanmak istiyorsanız, Firefox için buraya ve Chrome için buraya gidebilirsiniz.

driver = webdriver.Chrome(executable_path='chromedriver', options=options)

Not: Eğer chromedriver’ınızın bulunmadığını belirten yol hataları alırsanız, komuttaki ‘chromedriver’ ifadesini web sürücüsü çalıştırılabilir dosyanızın mutlak yolu ile değiştirin.

Sonunda Python dosyasını çalıştırabilir ve web scraping’e başlayabiliriz! Programımız her sayfayı birer birer açarken ve hava durumu verilerini toplarken arkanıza yaslanın ve rahatlayın. Bu sırada program çıktınızda aşağıdakine benzer bir şey görebilirsiniz.

Gathering data from:  2020-01-01 00:00:00
Opened URL
Gathering data from:  2020-01-02 00:00:00
Opened URL
Gathering data from:  2020-01-03 00:00:00
Opened URL
Gathering data from:  2020-01-04 00:00:00
Opened URL
...

Sonunda, makine öğrenimi modelimizi oluşturmak için gerekli olan tüm tarihsel hava durumu verileriyle bir CSV dosyası elde ediyoruz!

TensorFlow Lite Modelimizi Eğitmek

Projemizin bir sonraki bölümü BuildTFLiteModel.ipynb dosyasını kullanacaktır. Python not defterleri, veri bilimi ve makine öğrenimi için popüler bir Python dosyası türüdür. Python kodunun parçalar halinde çalıştırılmasına izin verir, bu da projemizi kademeli olarak ilerletmemizi ve önceki bölümlerden çıktılara kolayca atıfta bulunmamızı sağlar.

Not: Parçalar bireysel olarak çalıştırılabilse de, bu not defterinin sırasıyla çalıştırılması önemlidir. Aksi takdirde, kod beklenildiği gibi çalışmayacaktır.

Yine, başlamadan önce aşağıdaki kütüphaneleri yüklemeniz gerekecek. Scikit-learn, başka bir popüler makine öğrenimi kütüphanesidir. Bu proje için kullanacağımız bazı yararlı veri işleme işlevlerine de sahiptir.

pip install tensorflow scikit-learn

Temel amacımız, gerçek zamanlı sıcaklık ve nem verilerini kullanarak mevcut hava koşullarını tahmin etmektir. Bu nedenle, gerekli olmayan diğer sütunları kaldıracağız. Ayrıca, sıcaklık ve nem değerlerini dizgilerden tam sayı değerlerine ayrıştırırken, sıcaklık birimlerini Kelvin (K) cinsine dönüştürüyoruz.

Bu sonraki adım önemlidir ve sizin tarafınızdan yapılmalıdır. Önceki parçada hava koşullarımız için benzersiz etiketleri gösterdik. Modelimizin yalnızca temelde iki girdi aldığı için çok sayıda olası çıktısı olduğundan, bu etiketleri üç ana kategoriye dönüştürmemiz gerekecek.

Bir sonraki parçada, bu etiketleri “Yağmur Yok”, “Yağmur Olabilir” ve “Yağmur” olarak gruplandıran üç liste göreceksiniz. Değerler daha sonra kategorilerimizi sayısal olarak temsil etmek için one-hot encode edilir. Bu etiketleri, yaşadığınız iklime daha uygun hale getirmek için sonunda ayarlayabilirsiniz.

norain = ['Mostly Cloudy', 'Fair', ... , 'Partly Cloudy / Windy']
mightrain = ['Showers in the Vicinity', 'Thunder in the Vicinity', 'Thunder']
rain = ['Rain Shower', 'Light Rain Shower', 'Light Rain', ... , 'Light Rain / Windy']

Sonraki adımda, mevcut girdi verilerimizi daha iyi kullanabilmek için, belirli bir 7 girdi penceresi için yalnızca bir kez tahmin yapacağız. Wunderground’dan her giriş, yarım saat aralıklarla alınan bir okumayı temsil eder. Bunu takip edeceğiz ve mevcut + 6 önceki yarım saatlik okumalarla yarım saatlik tahminler yapacağız.

Bu, modelimizin girdi ve çıktılar arasındaki kalıpları tanıması için daha fazla özellik sağlamamıza olanak tanır, bu da sınıflandırma performansını artırmalıdır. Bu adımın başarıyla tamamlandığından emin olmak için x ve y dizisinin uzunluklarının aynı olduğundan emin olun.

y = processed_data[["NoRain", "MightRain", "Rain"]].to_numpy()[7:]
rawx = processed_data.drop(columns = ["NoRain", "MightRain", "Rain"]).to_numpy()
 
x = []
temp = np.array(0)
for i in range(len(rawx)-7):
    temp = rawx[i:i+6].flatten()
    x.append(temp)
x = np.array(x)
x.shape, y.shape

Bir sonraki parça verileri eğitim ve test verilerine ayırır.

xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size = 0.20, random_state = 33)

Ardından, modelimizi tanımlayıp derleyecek ve verilerimize uyum sağlayacağız. Keras makine öğrenimi modellerine yeniyseniz ve daha fazla bilgi edinmek istiyorsanız, Palash Sharma’nın yeni başlayanlar için kısa okumasına göz atabilirsiniz.

model = tf.keras.Sequential()
model.add(Dense(14, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax'))
 
model.compile(loss = 'categorical_crossentropy',
              optimizer = tf.optimizers.Adam(),
              metrics=['accuracy'])
 
model.fit(xtrain, ytrain, epochs=10, validation_split=0.1)

Son iki parça, muhtemelen en önemli olanlardır – Keras modelimizi TF Lite modeline dönüştürmek için TF Lite dönüştürücüsünü kullanmalıyız; bu model, Wio Terminal’ımızda çıkarımlar için kullanabileceğimiz kadar küçük ve uygun bir formatta olmalıdır.

“`

Son parçayı çalıştırdıktan sonra, bir model.h dosyası klasöre yazılmış olmalıdır. Bu başlık dosyası, eğitilmiş TF Lite modelimizi Arduino’ya getireceğimiz yoldur! Bu bölümdeki son adım olarak, bu dosyayı model.h dosyasının yerine koymak için WioTerminal_SmartWeatherStation klasöründe Arduino kodunun bulunduğu yere yerleştirin.

Wio Terminal’da Makine Öğrenimini Uygulamak

Artık modelimizi Wio Terminal’imizde uygulamaya geçme zamanı geldi.

Donanım Kurulumu

DHT11 sıcaklık ve nem sensörünüzü aşağıda gösterildiği gibi Wio Terminal’inize takın.

Wio Terminal Kütüphanelerini Yükleyin

  • Öncelikle, eğer Wio Terminal ile çalışıyorsanız, önce buradan başlamanız şiddetle tavsiye edilir.
  • Seeed DHT Kütüphanesini indirin ve yükleyin. Eğer Arduino kütüphanelerini ZIP dosyaları aracılığıyla yüklemeye yeniyseniz, bu talimatları takip edebilirsiniz.
  • Son olarak, Araçlar > Kütüphaneleri Yönet üzerinden Arduino TensorFlowLite kütüphanesini yükleyin. Benim başarılı olduğum kütüphane olduğu için 2.1.0 sürümünü yüklemenizi öneririm. Ancak, diğerleri önceden derlenmiş kütüphanelerle sorunlar bildirdi, bu nedenle sizin deneyiminiz farklı olabilir.

Arduino Kodunu Hazırlayın

Kodu Wio Terminal’inize yüklemeden önce dikkat etmeniz gereken tek bir şey var. Eğer modelinizin çıktılarındaki etiketleri değiştirdiyseniz, aşağıdaki parametreleri buna göre düzenlemek isteyeceksiniz.

const char* OUTPUTS[] = {
    "Yağmur Yok",
    "Yağmur Yağabilir",
    "Yağmur"
};
int NUM_OUTPUTS = 3;

Arduino Kodunun Öne Çıkanları

Bu Arduino kodunun daha ‘zorlayıcı’ uygulaması, 7 okumalı pencereyi yönetmek için bir FIFO (ilk giren ilk çıkar) yapısı oluşturma şeklimizdir. Aşağıdaki kısaltılmış koda bir göz atın:

if (array_count == 0 | millis() - dataMarker > 30 * 60000) {
      dataMarker = millis();

      for (int i=0; i<12; i++) {
        temp_hum_val[i] = temp_hum_val[i+2];
      }

      temp_hum_val[12] = reading[1] + 273.15;
      temp_hum_val[13] = reading[0];
      array_count ++;

      if (array_count > 7) array_count = 7;
      if (array_count == 7) {
        
        // Dizi verilerini tensör girdilerine kopyala
        for (int i=0; i<14; i++) {
          tflInputTensor->data.f[i] = temp_hum_val[i];
        }
        
        // Veriler üzerinde çıkarım yap (gösterilmedi)
        // Çıktıyı al ve göster (gösterilmedi)
      }
}

Wio Terminal’i ilk başlattığımızda, array_count başlangıç değeri olan 0 olacaktır. Bu değişkeni, makine öğrenimi modelinin tahmini için en az 7 okuma aldığımızdan emin olmak için toplam okuma sayısını kaydetmek için kullanacağız.

For döngüsü, tüm değerlerin indekslerini 2 ileri kaydırır, böylece en eski sıcaklık ve nem okumalarını siler. Ardından, en son sensör okumalarını kuyruğun arkasına atayacağız ve array_count değerini artıracağız.

for (int i=0; i<12; i++) {
        temp_hum_val[i] = temp_hum_val[i+2];
}

Bundan sonra her yarım saatte bir, bu kodu tekrar çalıştırarak verileri örnekleyeceğiz ve 14 değerlik bir dizi oluşturana kadar devam edeceğiz (yani array_count == 7). Array_count değeri 7’ye ulaştığında, saklanan temp_hum_val dizi değerlerini model girdi işaretçilerine kopyalayacak ve tahminler için TF Lite yorumlayıcısını çağırmaya başlayacağız.

Wio Terminal’da Belleği Yönetmek

Arduino taslağında değişiklikler yaptığınızda, Wio Terminal’imizde yalnızca 192 kilobayt bellek bulunduğunu hatırlamak önemlidir. AllocateTensors() fonksiyonunu çağırdığında Wio Terminal’im birçok kez dondu, bunun büyük ihtimalle mevcut bellek eksikliğinden kaynaklandığını düşünüyorum.

Bu nedenle, bu taslakta her şeyi hafif tutmak en iyisidir, özellikle TF Lite yorumlayıcınızın başarılı bir şekilde başlatılmasından önce tanımladığınız değişkenler açısından!

Son Ürün

Artık TinyML akıllı hava istasyonumuz harekete geçmeye hazır! Aşağıdaki resim, 7 yarım saatlik okuma toplandıktan sonra görmeniz gereken şeyi göstermektedir. Tahmin, gelen yeni verilerle yarım saatte bir güncellenmeye devam edecektir! Testlerinizde, model girdi dizisine yeni okumaların eklenmesi arasındaki aralığı azaltarak yorumlayıcınızın beklendiği gibi çalıştığını kontrol edebilirsiniz.

Özet

Bu öğreticinin, akıllı bir hava istasyonu inşa etmek isteyenler için faydalı olduğunu umuyorum! Ayrıca, Wio Terminal gibi bir mikrodenetleyicide TensorFlow Lite ile TinyML’yi etkinleştirmenin çok temel bir tanıtımıdır.

Kendi verilerinizle çalışacağınız için, sağladığım bazı kodların kutudan çıkar çıkmaz çalışmama olasılığı vardır. Yine de, öğrenme sürecinden keyif almanızı ve kendi projenizi tamamlama tatminini yaşamanızı umuyorum!

Daha fazla TinyML Wio Terminal projeleri için lütfen ziyaret edin:

Diğer Wio Terminal projelerim için de ziyaret edebilirsiniz:

TinyML projeniz için en iyi aracı seçin

Grove – Vision AI Modülü V2

Himax WiseEye2 HX6538 işlemcisiyle güçlendirilmiş MCU tabanlı bir görsel AI modülüdür ve rm Cortex-M55 ve Ethos-U55 özelliklerine sahiptir. Arm Helium teknolojisini entegre eder, bu da vektör veri işleme için ince bir şekilde optimize edilmiştir ve şunları sağlar:

  • Ödüllü düşük güç tüketimi
  • DSP ve ML yeteneklerinde önemli artış
  • Pil ile çalışan uç nokta AI uygulamaları için tasarlandı

Tensorflow ve Pytorch framework’lerini destekleyerek, kullanıcıların Seeed Studio’dan hem hazır hem de özel AI modellerini dağıtmasına olanak tanır SenseCraft AI. Ayrıca, modül IIC, UART, SPI ve Type-C gibi bir dizi arayüz sunarak, Seeed Studio XIAO, Grove, Raspberry Pi, BeagleBoard ve ESP tabanlı ürünler gibi popüler ürünlerle kolay entegrasyon sağlar.

Seeed Studio XIAO ESP32S3 Sense & Seeed Studio XIAO nRF52840 Sense

Seeed Studio XIAO Serisi, benzer bir donanım yapısına sahip, parmak boyutunda olan küçük geliştirme kartlarıdır. Burada “XIAO” kod adı, yarı özelliği “Tiny”yi temsil ederken, diğer yarısı “Puissant” olacaktır.

Seeed Studio XIAO ESP32S3 Sense, bir OV2640 kamera sensörü, dijital mikrofon ve SD kart desteği entegre eder. Gömülü ML hesaplama gücü ve fotoğrafçılık yeteneğini birleştirerek, bu geliştirme kartı, akıllı ses ve görüntü AI ile başlamanız için harika bir araç olabilir.

Seeed Studio XIAO nRF52840 Sense, Bluetooth 5.0 kablosuz yeteneği taşır ve düşük güç tüketimi ile çalışabilir. Yerleşik IMU ve PDM ile, gömülü Makine Öğrenimi projeleri için en iyi aracınız olabilir.

Buraya tıklayın XIAO ailesi hakkında daha fazla bilgi edinmek için!

SenseCraft AI

SenseCraft AI kolay AI modeli eğitimi ve dağıtımı için no-code/low-code ile bir platformdur. Seeed ürünlerini yerel olarak destekleyerek, eğitilen modellerin Seeed ürünlerine tam uyumunu sağlar. Ayrıca, bu platform aracılığıyla modelleri dağıtmak, web sitesinde tanımlama sonuçlarının anlık görselleştirilmesini sağlar ve model performansının hızlı bir şekilde değerlendirilmesine olanak tanır.

tinyML uygulamaları için ideal olan bu platform, cihazı bağlayarak, bir model seçerek ve tanımlama sonuçlarını görüntüleyerek, hazır veya özel AI modellerini zahmetsizce dağıtmanıza olanak tanır.

Leave a Reply

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