1. Giriş
Oluşturacaklarınız
Bu codelab'de, SparkFun Edge Development Board'da bir derin öğrenme modeli çalıştırmak için Mikrodenetleyiciler İçin TensorFlow Lite'ı kullanmayı öğreneceğiz. Kurulun "evet" kelimelerini algılamak için konvolüsyonel nöral ağ kullanan yerleşik konuşma algılama modeliyle çalışacağız. ve "no" cihazın iki mikrofonuyla konuşulanları tespit edebilirsiniz.
Mikrodenetleyicilerde Makine Öğrenimi
Makine öğrenimi, kullanıcıların işlerini kolaylaştıran akıllı araçlar Google Asistan gibi özelliklerle hayatınızı kolaylaştırır. Ancak çoğu zaman bu deneyimler, çok fazla hesaplama işlemi veya güçlü bir bulut sunucusu ya da masaüstü gibi kaynaklar gerektirir. Ancak artık mikrodenetleyiciler gibi küçük ve düşük güçlü donanımlarda makine öğrenimi çıkarımı yapmak mümkündür.
Mikrodenetleyiciler son derece yaygındır, ucuzdur, çok az enerji gerektirir ve son derece güvenilirdir. Bunlar her türlü ev cihazının bir parçasıdır: aletler, arabalar ve oyuncaklar. Öyle ki, her yıl mikrodenetleyiciyle çalışan yaklaşık 30 milyar cihaz üretiliyor.
Makine öğrenimini küçük mikrodenetleyicilerin kullanımına sunarak pahalı donanımlara veya güvenilir internet bağlantılarına gerek kalmadan hayatımızda kullandığımız milyarlarca cihazın zekasını artırabiliriz. Günlük rutininize uyum sağlayabilen akıllı cihazlar, sorunlar ile normal işleyiş arasındaki farkı anlayan akıllı endüstriyel sensörler ve çocukların eğlenceli ve keyifli şekilde öğrenmesine yardımcı olabilecek sihirli oyuncaklar hayal edin.
Mikrodenetleyiciler İçin TensorFlow Lite (Yazılım)
TensorFlow, Google'ın modelleri eğitmeye ve çalıştırmaya yönelik açık kaynak makine öğrenimi çerçevesidir. TensorFlow Lite, TensorFlow'un optimize edilmiş bir sürümü olan ve cep telefonları gibi küçük, nispeten düşük güçlü cihazlarda tensorflow modellerini çalıştırmayı hedefleyen bir yazılım çerçevesidir.
Mikrodenetleyiciler İçin TensorFlow Lite, TensorFlow'un optimize edilmiş bir sürümü olan bir yazılım çerçevesidir. Mikrodenetleyiciler gibi küçük, düşük güçlü donanımlarda tensorflow modelleri çalıştırmayı hedefler. Bu yerleşik ortamlarda gerekli olan kısıtlamalara uyar.Örneğin, küçük bir ikili program boyutuna sahiptir, işletim sistemi desteği, standart C veya C++ kitaplıkları ya da dinamik bellek ayırması gerektirmez.
SparkFun Edge (Donanım)
SparkFun Edge, mikrodenetleyici tabanlı bir platform olup tek bir devre kartı üzerinde küçük bir bilgisayardır. Diğer cihazlara dijital sinyaller gönderip almasına olanak tanıyan bir işlemci, bellek ve G/Ç donanımına sahiptir. Yazılım tarafından kontrol edilen, en sevdiğiniz Google renklerine sahip dört LED vardır.
Bilgisayardan farklı olarak mikrodenetleyiciler bir işletim sistemini çalıştırmaz. Bunun yerine, yazdığınız programlar doğrudan donanımda çalışır. Kodunuzu bilgisayarda yazıyorsunuz ve programcı adı verilen bir cihaz aracılığıyla mikrodenetleyiciye indiriyorsunuz.
Mikrodenetleyiciler güçlü bilgisayarlar değildir. İşlemciler küçük ancak belleğe sahip değiller. Ancak mümkün olduğunca basit olacak şekilde tasarlandıkları için mikrodenetleyici çok az enerji kullanabilir. Programınızın işlevine bağlı olarak SparkFun Edge tek bir jeton hücreli pille haftalarca çalışabilir.
Neler öğreneceksiniz?
- Bilgisayarınızda SparkFun Edge için örnek programı derleyin
- Programı cihazınıza dağıtın
- Programda değişiklik yapıp programı tekrar dağıtma
Gerekenler
Aşağıdaki donanıma ihtiyacınız olacaktır:
- Linux veya MacOS bilgisayar
- SparkFun Edge panosu
- SparkFun USB-C Serial Basic programcısı
- USB-C - USB-A kablosu (USB-C bilgisayar kullanıyorsanız bunun yerine USB-C - USB-C kablosunu kullanın)
- (isteğe bağlı) Programcı ve kablo olmadan çıkarım yapmak için 3 V 20 mm'lik düğmeli lityum pil (CR2032)
Aşağıdaki yazılımlara ihtiyacınız olacaktır:
- Git (komut satırında
git
komutunu çalıştırarak yüklü olup olmadığını kontrol edin) - Python 3 (komut satırında
python3
veyapython --version
komutunu çalıştırarak yüklü olup olmadığını kontrol edin) - Python 3 için Pip ( faydalı StackOverflow yanıtı)
- 4.2.1 veya sonraki bir sürümü yapın (komut satırında
make --version
komutunu çalıştırarak yüklü olup olmadığını kontrol edin) - SparkFun Serial Basic sürücüleri
2. Donanımınızı kurun
SparkFun Edge mikrodenetleyici, konuşma modelini çalıştırabilen önceden yüklenmiş bir ikili programla birlikte gelir. Bunun yerine kendi sürümümüzün üzerine yazmadan önce bu modeli çalıştıralım.
Jamboard'unuzu güçlendirmek için:
- Kartın arkasındaki pil bağlayıcısına (pilin "+" tarafı yukarı bakacak şekilde) bir bozuk para hücreli pil takın. Kartınız önceden takılı bir pille geldiyse plastik sekmeyi çıkarın ve pili tam olarak takıldığından emin olun.)
- Bozuk piliniz yoksa karta güç vermek için SparkFun USB-C Serial Basic programcı cihazını kullanabilirsiniz. Bu cihazı ana panelinize bağlamak için aşağıdaki adımları uygulayın:
- SparkFun Edge'in yan tarafındaki altı iğneli başlığı bulun.
- SparkFun USB-C Serial Basic cihazını bu pimelere takın ve pinlerin "BLK" etiketli olduğundan emin olun. ve "GRN" doğru hizalandığından emin olun.
- SparkFun USB-C Serial Basic ile bilgisayarınız arasında bir USB-C kablosu bağlayın.
Pili takarak veya USB programlayıcıyı bağlayarak anakartınızı açtıktan sonra kart uyanır ve mikrofonlarıyla dinlemeye başlar. Mavi ışık yanıp sönmeye başlar.
Karttaki makine öğrenimi modeli "evet" kelimelerini tanıyacak şekilde eğitildi ve konuşma yokluğunu tespit etmek için kullanılır. Sonuçlarını renkli LED'ler yakarak iletir. Aşağıdaki tabloda her bir LED renginin anlamı gösterilmektedir:
Algılama sonucu | LED rengi |
"Evet" | Sarı |
"Hayır" | Kırmızı |
Bilinmeyen konuşma | Yeşil |
Konuşma algılanmadı | LED yanmıyor |
Siz de deneyin
Tahtayı ağzınıza doğru tutup "evet" deyin birkaç kez. Sarı LED flaşı görürsünüz. "Evet" dediğinizde hiçbir şey olmazsa şunları deneyebilirsiniz:
- Tahtayı 10 inç arasında tutun. ağzınızdan
- Arka plandaki aşırı gürültüden kaçının
- "Evet" olarak tekrar et hızlı bir şekilde birkaç kez ("evet evet evet" demeyi deneyin)
3. Yazılımınızı kurun
Şimdi konuşma modelini mikrodenetleyiciye indirip yükleyeceğiz ve çalıştıracağız. Bunun için önce programın kaynak kodunu ve programı derlemek için ihtiyaç duyduğumuz bağımlılıkları indiriyoruz. Program, C++ dilinde yazılmıştır. Bu dilin panoya indirilmeden önce bir ikili olarak derlenmesi gerekir. İkili program, doğrudan SparkFun Edge donanımı tarafından çalıştırılabilecek bir biçimde programı içeren bir dosyadır.
Aşağıdaki talimatlar Linux veya MacOS için yazılmıştır.
TensorFlow deposunu indirin
Bu kod, GitHub'daki TensorFlow deposunda ve aşağıdaki konumda mevcuttur:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro
Bilgisayarınızda bir terminal açın, genellikle kodlama projelerini depoladığınız dizine geçin, TensorFlow deposunu indirin ve oluşturulan dizini aşağıda gösterildiği gibi girin:
cd ~ # change into your home (or any other) directory git clone --depth 1 https://github.com/tensorflow/tensorflow.git cd tensorflow
Python bağımlılıklarını indirin
İkili dosyamızı hazırlamak ve cihaza yüklemek için Python 3 kullanacağız. Python komut dosyaları, belirli kitaplıkların kullanılabilir olmasına bağlıdır. Bu bağımlılıkları yüklemek için aşağıdaki komutu çalıştırın:
pip3 install pycrypto pyserial --user
4. İkili dosyayı derleme ve hazırlama
İkili dosyayı derleyip, cihaza indirmeye hazırlayan komutlar çalıştıracağız.
İkili dosyayı oluşturma
Gerekli tüm bağımlılıkları indirmek ve ikili programı oluşturmak için aşağıdaki komutu çalıştırın:
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge micro_speech_bin
Derleme başarılı bir şekilde çalışırsa çıktının son satırı aşağıdaki gibi görünmelidir:
arm-none-eabi-objcopy tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin -O binary
İkili programın başarıyla oluşturulduğunu onaylamak için aşağıdaki komutu çalıştırın:
test -f \ tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin && \ echo "Binary was successfully created" || echo "Binary is missing"
Konsolda yazdırılmış bir Binary was successfully created
göreceksiniz. Binary is missing
görüyorsanız derleme işlemiyle ilgili hata ayıklama gerektirecek bir sorun oluşmuştur.
İkili dosyayı hazırlama
İkili programın cihaza dağıtılması için şifreleme anahtarlarıyla imzalanması gerekir. Şimdi, ikili dosyamızı SparkFun Edge'e indirebilmek için imzalayacak bazı komutlar çalıştıracağız.
Geliştirme için kullanabileceğimiz sahte şifreleme anahtarları oluşturmak için aşağıdaki komutu girin:
cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py
Şimdi, imzalı bir ikili program oluşturmak için aşağıdaki komutu çalıştırın:
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \ --bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \ --load-address 0xC000 \ --magic-num 0xCB \ -o main_nonsecure_ota \ --version 0x0
Bu işlem, main_nonsecure_ota.bin
dosyasını oluşturur. Şimdi, dosyanın son sürümünü oluşturmak için başka bir komut çalıştıracağız. Bu sürüm, bir sonraki adımda kullanacağımız bootloader komut dosyasını cihazımıza yüklemek için kullanılabilir:
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ --load-address 0x20000 \ --bin main_nonsecure_ota.bin \ -i 6 \ -o main_nonsecure_wire \ --options 0x1
Şimdi, komutları çalıştırdığınız dizinde main_nonsecure_wire.bin
adlı bir dosyanız olmalıdır. Bu, cihaza yükleyeceğimiz dosyadır.
5. İkili dosyayı yüklemeye hazırlanın
Yanıp sönen nedir?
SparkFun Edge, şu anda çalıştırmakta olduğu programı 512 kilobaytlık flash belleğinde depolar. Panonun yeni bir program çalıştırmasını istersek, panoya göndermemiz gerekir. Böylece pano, flash bellekte saklanır ve daha önce kaydedilmiş olan tüm programların üzerine yazılır.
"Yanıp sönme" adı verilen bu yöntemi, programımızı yönetim kuruluna göndermek için kullanacağız.
Programlayıcıyı panoya takma
Panele yeni programlar indirmek için SparkFun USB-C Serial Basic seri programlayıcıyı kullanacağız. Bu cihaz, bilgisayarınızın USB üzerinden mikrodenetleyiciyle iletişim kurmasına olanak tanır.
Bu cihazı ana panelinize bağlamak için aşağıdaki adımları uygulayın:
- SparkFun Edge'in yan tarafındaki altı iğneli başlığı bulun.
- SparkFun USB-C Serial Basic cihazını bu pimelere takın ve pinlerin "BLK" etiketli olduğundan emin olun. ve "GRN" doğru hizalandığından emin olun.
Programlayıcıyı bilgisayarınıza bağlama
Kartı bilgisayarınıza USB ile bağlayacağız. Kartı programlamak için bilgisayarınızın cihaza verdiği adı bilmemiz gerekir. Bunu yapmanın en iyi yolu, bilgisayarı takmadan önce ve ekledikten sonra tüm cihazları listelemek ve hangi cihazın yeni olduğunu görmektir.
Cihazı USB üzerinden takmadan önce aşağıdaki komutu çalıştırın:
If you are using Linux: ls /dev/tty* If you are using MacOS: ls /dev/cu*
Bu komut, bağlı cihazların listesini aşağıdaki gibi gösterir:
/dev/cu.Bluetooth-Incoming-Port /dev/cu.MALS /dev/cu.SOC
Şimdi de programlayıcıyı bilgisayarınızın USB bağlantı noktasına bağlayın. Aşağıdaki komutu tekrar girin:
If you are using Linux: ls /dev/tty* If you are using MacOS: ls /dev/cu*
Aşağıdaki örnekte gösterildiği gibi çıkışta fazladan bir öğe görmeniz gerekir. Yeni öğenizin adı farklı olabilir. Bu yeni öğe cihazın adıdır.
/dev/cu.Bluetooth-Incoming-Port /dev/cu.MALS /dev/cu.SOC /dev/cu.wchusbserial-1450
Öncelikle, cihaz adını tanımlamak için bir ortam değişkeni oluşturacağız:
export DEVICENAME=put your device name here
Ardından, verilerin cihaza gönderileceği hız olan bilgi akış hızını belirtmek için bir ortam değişkeni oluşturacağız:
export BAUD_RATE=921600
6. İkili dosyayı flaşlayın
Tahtanızı fırlatmak için komut dosyasını çalıştırın
Kartı yüklemek için özel bir "bootloader"a yerleştirmemiz gerekiyor. değerini alır. Ardından, ikili dosyayı panoya göndermek için bir komut dosyası çalıştıracağız.
Tahtada bulunan aşağıdaki düğmeleri yakından inceleyelim:
Kartı sıfırlamak ve yanıp sönmek için aşağıdaki adımları uygulayın:
- Kartınızın programcıya bağlı olduğundan ve tüm kurulumun bilgisayarınıza USB ile bağlandığından emin olun.
- Oyun tahtasında
14
düğmesini basılı tutarak başlayın. 6. adıma kadar basılı tutmaya devam edin. 14
işaretli düğmeyi basılı tutmaya devam ederek panoyu önyükleyici durumuna sıfırlamak içinRST
işaretli düğmeyi tıklayarak panoyu sıfırlayın.14
işaretli düğmeyi hâlâ basılı tutarken aşağıdaki komutu terminalinize yapıştırın ve çalıştırmak için Enter tuşuna basın (Kolaylık olması açısından, düğmeyi basılı tutmaya başlamadan önce bu komutu terminalinize yapıştırabilirsiniz, ancak bu adıma ulaşana kadar Enter tuşuna basmayın)
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py -b ${BAUD_RATE} ${DEVICENAME} -r 1 -f main_nonsecure_wire.bin -i 6
14
işaretli düğmeyi hâlâ basılı tuttuğunuzda ekranda şuna benzer bir şey göreceksiniz:
Connecting with Corvette over serial port /dev/cu.usbserial-1440... Sending Hello. Received response for Hello Received Status length = 0x58 version = 0x3 Max Storage = 0x4ffa0 Status = 0x2 State = 0x7 AMInfo = 0x1 0xff2da3ff 0x55fff 0x1 0x49f40003 0xffffffff [...lots more 0xffffffff...] Sending OTA Descriptor = 0xfe000 Sending Update Command. number of updates needed = 1 Sending block of size 0x158b0 from 0x0 to 0x158b0 Sending Data Packet of length 8180 Sending Data Packet of length 8180 [...lots more Sending Data Packet of length 8180...]
Sending Data Packet of length 8180
simgesini gördükten sonra kartta14
işaretli düğmeyi basılı tutmayı durun (ancak basılı tutmaya devam etmenizde sakınca yoktur). Program, terminaldeki satırları yazdırmaya devam eder. Bağlantı zaman içinde aşağıdaki gibi görünür:
[...lots more Sending Data Packet of length 8180...] Sending Data Packet of length 8180 Sending Data Packet of length 6440 Sending Reset Command. Done.
Done
görürseniz bu, yanıp sönmenin başarılı olduğunu gösterir. Program çıkışı bir hatayla bitiyorsa Sending Reset Command
adlı yazıcının yazdırılıp yazdırılmadığını kontrol edin. Bu durumda, hataya rağmen yanıp sönme büyük olasılıkla başarılı olmuştur.
Bir Linux makinede NoResponse Error
ile karşılaşabilirsiniz. Bunun nedeni, ch34x seri sürücüsü'nün mevcut seri sürücüyle birlikte yüklenmesidir. Bu durum aşağıdaki şekilde çözülebilir:
1. Adım: ch34x kitaplığının doğru sürümünü yeniden yükleyin. Yükleme sırasında cihazın bilgisayarla olan fişini çekmediğinden emin olun.
git clone https://github.com/juliagoda/CH341SER.git cd CH341SER/ make sudo insmod ch34x.ko sudo rmmod ch341
2. adım: Kartın USB'sini takın ve aşağıdaki adımları uygulayın:
dmesg | grep "ch34x"
Şuna benzer bir mesaj görürsünüz:
[ 1299.444724] ch34x_attach+0x1af/0x280 [ch34x] [ 1299.445386] usb 2-13.1: ch34x converter now attached to ttyUSB0
Kullanılan sürücü "ch34x" değilse (ör. ch341), aşağıdaki komutu çalıştırarak diğer sürücüyü devre dışı bırakmayı deneyin:
rmmod <non-ch34x driver name>
Cihazın fişini çıkarıp tekrar takın ve kullanılan sürücünün "ch34x" olduğundan emin olun.
7. Demo
Programı deneyin
Kartınız başarıyla yanıp söndükten sonra işaretli düğmeye basın
Jamboard'u yeniden başlatmak ve programı başlatmak için RST
tuşlarına basın. Mavi LED yanıp sönmeye başlıyorsa, yanıp sönme başarılıdır. Bulamadıysanız aşağıdaki "Çalışmazsa ne olur?" bölümüne gidin.
Karttaki makine öğrenimi modeli "evet" kelimelerini tanıyacak şekilde eğitildi ve konuşma yokluğunu tespit etmek için kullanılır. Sonuçlarını renkli LED'ler yakarak iletir. Aşağıdaki tabloda her bir LED renginin anlamı gösterilmektedir:
Algılama sonucu | LED rengi |
"Evet" | Sarı |
"Hayır" | Kırmızı |
Bilinmeyen konuşma | Yeşil |
Konuşma algılanmadı | LED yanmıyor |
Siz de deneyin
Tahtayı ağzınıza doğru tutup "evet" deyin birkaç kez. Sarı LED flaşı görürsünüz. "Evet" dediğinizde hiçbir şey olmazsa şunları deneyebilirsiniz:
- Tahtayı 10 inç arasında tutun. ağzınızdan
- Arka plandaki aşırı gürültüden kaçının
- "Evet" olarak tekrar et hızlı bir şekilde birkaç kez ("evet evet evet" demeyi deneyin)
İşe yaramadıysa ne olur?
Bazı olası sorunlar ve bu sorunların nasıl ayıklanacağı aşağıda açıklanmıştır:
Sorun: Yanıp söndükten sonra LED'lerin hiçbiri yanmıyor.
Çözüm: RST
düğmesine basmayı veya kart ile programcı arasındaki bağlantıyı kesip yeniden bağlamayı deneyin. Bunların hiçbiri işe yaramazsa panoyu tekrar temizlemeyi deneyin.
Sorun: Mavi LED yanıyor ancak çok karanlık.
Çözüm: Azalan pili değiştirin. Alternatif olarak, kart programcı ve kablo kullanılarak bilgisayarla çalıştırılabilir.
8. Hata ayıklama çıkışını okuyun (isteğe bağlı)
Sorunlarla karşılaşırsanız ve kodunuzda ayrıntılı hata ayıklamanız gerekiyorsa bu bölümü inceleyin. Kodunuz çalışırken mikrodenetleyicide neler olduğunu anlamak için kartın seri bağlantısı üzerinden hata ayıklama bilgilerini yazdırabilirsiniz. Karta bağlanmak ve kartın gönderdiği verileri görüntülemek için bilgisayarınızı kullanırsınız.
Seri bağlantıyı açma
Varsayılan olarak SparkFun Edge örnek kodumuz, tüm sesli komutları güvenleriyle birlikte günlüğe kaydeder. Kartın çıkışını görmek için aşağıdaki komutu çalıştırabilirsiniz:
screen ${DEVICENAME} 115200
Başlangıçta aşağıdakine benzer bir çıkış görebilirsiniz: (Bu hata yalnızca kart sıfırlandığında hata ayıklama bilgilerini görmeye başlayabilirsiniz.)
Apollo3 Burst Mode is Available Apollo3 operating in Burst Mode (96MHz)
"Evet" diyerek bazı komutlar vermeyi deneyin veya "hayır". Her komutla ilgili kart yazdırma hata ayıklama bilgilerini görürsünüz:
Heard yes (202) @65536ms
Yukarıdaki günlükte yes
, komut anlamına gelir. 202
sayısı, komutun duyulduğuna dair güven düzeyini ifade eder (en düşük değer 200'dür). Son olarak 65536ms
, mikrodenetleyicinin son sıfırlanmasından bu yana geçen süreyi ifade eder.
Hata ayıklama çıkışını görüntülemeyi durdurmak için Ctrl+A
tuşuna, hemen ardından K
tuşuna ve ardından Y
tuşuna basın.
Hata ayıklama günlüklerini yazma
Bu bilgileri günlüğe kaydeden kodu, az önce çalıştığınız komut_yanıtı.cc dosyasında görebilirsiniz:
tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
Verileri günlüğe kaydetmek için error_reporter->Report()
yöntemini çağırabilirsiniz. Dize interpolasyonu için standart printf
jetonlarını destekler. Bu jetonları günlüklerinize önemli bilgileri dahil etmek üzere kullanabilirsiniz:
error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);
Bir sonraki bölümde kod üzerinde kendi değişikliklerinizi yaparken bu yöntem işinize yarayacaktır.
9. Kodun süresini uzatın (isteğe bağlı)
SparkFun Edge'i nasıl derleyip yükleyeceğinizi öğrendiğinize göre kodu kullanmaya ve cihazınıza dağıtarak sonuçları görebilirsiniz.
Kodu okuyun
command_responder.cc.
dosyası, kodu okumaya başlamak için iyi bir yerdir.
tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
Dosyayı GitHub'da burada bulabilirsiniz.
Bir sesli komut algılandığında bu dosyadaki RespondToCommand
yöntemi çağrılır. Mevcut kod "evet", "hayır" veya bilinmeyen bir komut duyulmasına bağlı olarak farklı bir LED'i yakır. Aşağıdaki snippet'te bunun nasıl çalıştığı gösterilmektedir:
if (found_command[0] == 'y') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
if (found_command[0] == 'n') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
}
if (found_command[0] == 'u') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}
found_command
bağımsız değişkeni, algılanan komutun adını içerir. İlk karakteri kontrol ederek bu if
ifadeleri kümesi, hangi LED'in yanacağını belirler.
ReplyToCommand yöntemi birkaç bağımsız değişkenle çağrılır:
void RespondToCommand(tflite::ErrorReporter* error_reporter,
int32_t current_time, const char* found_command,
uint8_t score, bool is_new_command) {
error_reporter
, hata ayıklama bilgilerini günlüğe kaydetmek için kullanılır (bununla ilgili daha fazla bilgi vereceğim).current_time
, komutun algılandığı zamanı gösterir.found_command
, hangi komutun algılandığını bildirir.score
, bir komut algıladığımızdan ne kadar emin olduğumuzu belirtir.is_new_command
, komutu ilk kez mi duyduğunuzu bize bildirir.
score
, bir komutun algılanma olasılığını temsil eden 0 ile 255 arasında bir tam sayıdır. Örnek kod, yalnızca puan 200'den büyükse bir komutu geçerli olarak kabul eder. Testlerimize göre, en geçerli komutlar 200-210 aralığındadır.
Kodu değiştirme
SparkFun Edge ana kartında dört LED vardır. Şu anda, tanıma işleminin gerçekleştiğini göstermek için mavi LED ışığını yanıp söndürüyoruz. Bunu command_responder.cc
dosyasında görebilirsiniz:
static int count = 0;
// Toggle the blue LED every time an inference is performed.
++count;
if (count & 1) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
} else {
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
}
Dört LED'li bir bankamız olduğu için programı, belirli bir komutun score
değerinin görsel göstergesi olarak kullanacak şekilde değiştirelim. Düşük bir puan tek bir LED'in yanması için yeterli olur, yüksek bir puansa birden fazla ışığın yanmasına neden olur.
Programın çalıştığından emin olmak için mavi yerine sürekli olarak kırmızı LED yanıp söner. Bitişikteki mavi, yeşil ve sarı LED'ler, en son score
cihazınızın gücünü göstermek için kullanılır. Kolaylık sağlaması açısından, bu LED'leri yalnızca "evet" ifadesi söylenebilir. Başka bir kelime algılanırsa LED'ler söner.
Bu değişikliği yapmak için command_responder.cc
dosyanızdaki tüm kodu aşağıdaki snippet ile değiştirin:
#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h"
#include "am_bsp.h"
// This implementation will light up the LEDs on the board in response to different commands.
void RespondToCommand(tflite::ErrorReporter* error_reporter,
int32_t current_time, const char* found_command,
uint8_t score, bool is_new_command) {
static bool is_initialized = false;
if (!is_initialized) {
// Setup LEDs as outputs
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_RED, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_BLUE, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_GREEN, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_YELLOW, g_AM_HAL_GPIO_OUTPUT_12);
// Ensure all pins are cleared
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
is_initialized = true;
}
static int count = 0;
// Toggle the red LED every time an inference is performed.
++count;
if (count & 1) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
} else {
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
}
if (is_new_command) {
// Clear the last three LEDs
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
error_reporter->Report("Heard %s (%d) @%dms", found_command, score,
current_time);
// Only indicate a 'yes'
if (found_command[0] == 'y') {
// Always light the blue LED
am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
// Light the other LEDs depending on score
if (score >= 205) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}
if(score >= 210) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
}
}
}
Yeni bir komut algılanırsa is_new_command
doğru değerini alır. Mavi, yeşil ve sarı LED'leri temizleyip found_command
ve score
değerlerine bağlı olarak tekrar yanayacağız.
Yeniden inşa edin ve yanıp sönün
Kod değişiklikleri yaptıktan sonra, İkili dosyayı derleme ve hazırlama sayfasındaki tüm adımları çalıştırarak test edin.
10. Sonraki Adımlar
Tebrikler, ilk konuşma dedektörünüzü bir mikrodenetleyicide başarıyla derlediniz.
Mikrodenetleyiciler için TensorFlow Lite ile uygulama geliştirme konusundaki bu kısa tanıtımdan memnun kaldığınızı umuyoruz. Mikrodenetleyicilerle ilgili derin öğrenme fikri yeni ve heyecan verici. Bu nedenle sizi deneyerek denemenizi öneririz.
Referans belgeler
- Temel programla çalışma konusunda artık deneyiminiz var. Artık farklı komutları anlamak için kendi modelinizi eğitin. Not: Eğitim birkaç saat sürecek.
- Mikrodenetleyiciler için TensorFlow Lite ( Web sitesi, GitHub) hakkında daha fazla bilgi edinin.
- Diğer örnekleri deneyin ve destekleniyorsa SparkFun Edge'de çalıştırmayı deneyin.
- O'Reilly'nin TinyML: Arduino ve Ultra Düşük Güçlü Mikro Denetleyiciler'de TensorFlow ile Makine Öğrenimi adlı kitabına göz atın. Bu kitapta, küçük cihazlarda makine öğrenimi tanıtılır ve eğlenceli projelerden bahsedilir. Bu codelab, kitabın 7. ve 8. bölümüne dayanmaktadır.
Teşekkürler, geliştirmenin keyfini çıkarın!