Mikrodenetleyiciler için TensorFlow Lite ve SparkFun Edge ile AI Konuşma Tanıma

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.

bf256d403a1821af.gif

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.

1360b61fbfa33657.jpeg

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)

358ffdb9eb758b90.png

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.

aa4493835a2338c6.png

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:

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 veya python --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:

  1. 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.)

25a6cc6b208e8a4e.png

  1. 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.

b140822f0019f92a.png

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:

  1. SparkFun Edge'in yan tarafındaki altı iğneli başlığı bulun.
  2. 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.

b140822f0019f92a.png

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:

64c620570b9d2f83.png

Kartı sıfırlamak ve yanıp sönmek için aşağıdaki adımları uygulayın:

  1. Kartınızın programcıya bağlı olduğundan ve tüm kurulumun bilgisayarınıza USB ile bağlandığından emin olun.
  2. Oyun tahtasında 14 düğmesini basılı tutarak başlayın. 6. adıma kadar basılı tutmaya devam edin.
  3. 14 işaretli düğmeyi basılı tutmaya devam ederek panoyu önyükleyici durumuna sıfırlamak için RST işaretli düğmeyi tıklayarak panoyu sıfırlayın.
  4. 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
  1. 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...]
  1. Sending Data Packet of length 8180 simgesini gördükten sonra kartta 14 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.

bf256d403a1821af.gif

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

26699b18f2b199f.png

Teşekkürler, geliştirmenin keyfini çıkarın!