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

1. Giriş

Ne oluşturacaksınız?

Bu codelab'de, TensorFlow Lite For Microcontrollers'ı kullanarak SparkFun Edge Development Board'da derin öğrenme modeli çalıştırmayı öğreneceğiz. Kartın iki mikrofonu aracılığıyla söylenen "evet" ve "hayır" kelimelerini algılamak için evrişimli sinir ağı kullanan, kartın yerleşik konuşma algılama modeliyle çalışacağız.

bf256d403a1821af.gif

Mikrodenetleyicilerde Makine Öğrenimi

Makine öğrenimi, kullanıcıların hayatını kolaylaştıran akıllı araçlar (ör. Google Asistan) oluşturmak için kullanılabilir. Ancak bu deneyimler genellikle güçlü bir bulut sunucusu veya masaüstü bilgisayar gibi çok fazla işlem ya da kaynak gerektirir. Ancak artık mikro denetleyiciler gibi küçük ve düşük güçlü donanımlarda makine öğrenimi çıkarımı çalıştırmak mümkün.

Mikro denetleyiciler son derece yaygın, ucuz, çok az enerji gerektirir ve çok güvenilirdir. Cihazlar, arabalar ve oyuncaklar gibi her türlü ev aletinde yer alırlar. Her yıl yaklaşık 30 milyar mikro denetleyici destekli cihaz üretiliyor.

1360b61fbfa33657.jpeg

Makine öğrenimini küçük mikro denetleyicilere taşıyarak, pahalı donanımlara veya güvenilir internet bağlantılarına ihtiyaç duymadan 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 çalışma arasındaki farkı anlayabilen akıllı endüstriyel sensörler ve çocukların eğlenceli ve keyifli bir şekilde öğrenmesine yardımcı olabilecek sihirli oyuncaklar hayal edin.

TensorFlow Lite For Microcontrollers (Yazılım)

358ffdb9eb758b90.png

TensorFlow, modelleri eğitmek ve çalıştırmak için Google'ın açık kaynaklı makine öğrenimi çerçevesidir. TensorFlow Lite, TensorFlow'un optimize edilmiş bir sürümü olan bir yazılım çerçevesidir. TensorFlow modellerini cep telefonları gibi küçük ve nispeten düşük güçlü cihazlarda çalıştırmak için tasarlanmıştır.

TensorFlow Lite For Microcontrollers, TensorFlow'un optimize edilmiş bir sürümü olan bir yazılım çerçevesidir. TensorFlow modellerini mikro denetleyiciler gibi küçük ve düşük güçlü donanımlarda çalıştırmayı hedefler. Bu yerleştirilmiş ortamlarda gerekli kısıtlamalara uyar.Örneğin, küçük bir ikili boyuta sahiptir, işletim sistemi desteği, standart C veya C++ kitaplıkları ya da dinamik bellek ayırma gerektirmez.

SparkFun Edge (Donanım)

SparkFun Edge, mikro denetleyici tabanlı bir platformdur: tek bir devre kartı üzerinde küçük bir bilgisayar. Diğer cihazlara dijital sinyaller gönderip almasını sağlayan bir işlemci, bellek ve G/Ç donanımı vardır. En sevdiğiniz Google renklerinde, yazılımla kontrol edilebilen dört LED'e sahiptir.

aa4493835a2338c6.png

Mikro denetleyiciler, bilgisayarların aksine işletim sistemi çalıştırmaz. Bunun yerine, yazdığınız programlar doğrudan donanım üzerinde çalışır. Kodunuzu bilgisayarda yazıp programlayıcı adı verilen bir cihaz aracılığıyla mikrodenetleyiciye indirirsiniz.

Mikro denetleyiciler güçlü bilgisayarlar değildir. Küçük işlemcilere ve fazla belleğe sahip değildirler. Ancak mümkün olduğunca basit olacak şekilde tasarlandıkları için mikrodenetleyiciler çok az enerji kullanabilir. Programınızın ne yaptığına bağlı olarak SparkFun Edge, tek bir düğme pille haftalarca çalışabilir.

Neler öğreneceksiniz?

  • Bilgisayarınızda SparkFun Edge için örnek programı derleyin.
  • Programı cihazınıza dağıtma
  • Programda değişiklik yapma ve programı tekrar dağıtma

Gerekenler

Aşağıdaki donanımlara 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 daha yeni bir sürüm olmalıdır (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ı kurma

SparkFun Edge mikrodenetleyicisinde, konuşma modelini çalıştırabilen önceden yüklenmiş bir ikili dosya bulunur. Bunu kendi sürümümüzle değiştirmeden önce modeli çalıştıralım.

Aşağıdaki yöntemlerle tahtanızı güçlendirin:

  1. Düğme pili, kartın arkasındaki pil konnektörüne yerleştirin (pilin "+" tarafı yukarı bakacak şekilde). Kartınızda pil takılı olarak geldiyse plastik bandı çıkarın ve pilin tamamen takıldığından emin olmak için pili itin.

25a6cc6b208e8a4e.png

  1. Düğme piliniz yoksa kartı çalıştırmak için SparkFun USB-C Serial Basic programlayıcı cihazını kullanabilirsiniz. Bu cihazı kartınıza bağlamak için aşağıdaki adımları uygulayın:
  • SparkFun Edge'in yan tarafındaki altı pinli başlığı bulun.
  • SparkFun USB-C Serial Basic'i bu pinlere takın. Her cihazda "BLK" ve "GRN" etiketli pinlerin doğru şekilde hizalandığından emin olun.
  • SparkFun USB-C Serial Basic ile bilgisayarınız arasına bir USB-C kablosu bağlayın.

b140822f0019f92a.png

Pili takarak veya USB programlayıcıyı bağlayarak kartınıza güç verdikten sonra kart uyanır ve mikrofonlarıyla dinlemeye başlar. Mavi ışık yanıp sönmeye başlar.

Kart üzerindeki makine öğrenimi modeli, "evet" ve "hayır" kelimelerini tanıyacak ve konuşmanın varlığını ya da yokluğunu algılayacak şekilde eğitilir. Sonuçlarını renkli LED'leri yakarak bildirir. Aşağıdaki tabloda her LED renginin anlamı gösterilmektedir:

Tespit sonucu

LED rengi

"Evet"

Sarı

"Hayır"

Kırmızı

Bilinmeyen konuşma

Yeşil

Konuşma algılanmadı

LED'ler yanmıyor

Siz de deneyin

Kartı ağzınıza yaklaştırıp birkaç kez "evet" deyin. Sarı LED'in yanıp söndüğünü görürsünüz. "Evet" dediğinizde herhangi bir işlem yapılmıyorsa deneyebileceğiniz bazı çözümler:

  • Tahtayı ağzınızdan yaklaşık 25 cm uzakta tutun.
  • Aşırı arka plan gürültüsünden kaçının
  • "Evet"i hızlıca birkaç kez tekrarlayın (ör. "evet evet evet" deyin).

3. Yazılımınızı ayarlama

Şimdi konuşma modelini mikrodenetleyiciye indirip yükleyip kendimiz çalıştıracağız. Bunun için öncelikle bu programın kaynak kodunu ve oluşturmak için ihtiyaç duyduğumuz bağımlılıkları indiririz. Program, kart üzerine indirilmeden önce ikili olarak derlenmesi gereken C++ ile yazılmıştır. İkili dosya, programı SparkFun Edge donanımı tarafından doğrudan çalıştırılabilecek bir biçimde içeren dosyadır.

Aşağıdaki talimatlar Linux veya macOS için yazılmıştır.

TensorFlow deposunu indirme

Kod, GitHub'daki TensorFlow deposunda şu konumda bulunur:

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro

Bilgisayarınızda bir terminal açın, genellikle kodlama projelerini depoladığınız bir dizine geçin, TensorFlow deposunu indirin ve oluşturulan dizine girin (aşağıda gösterildiği gibi):

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ı indirme

İ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 programı oluşturma ve hazırlama

İkili dosyayı oluşturup cihaza indirilmeye hazırlayan komutları çalıştıracağız.

İkili programı 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ı olursa çıkışı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 dosyanı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"

Konsola Binary was successfully created yazdırıldığını görmelisiniz. Binary is missing simgesini görüyorsanız derleme işlemiyle ilgili bir sorun oluşmuştur ve hata ayıklama yapılması gerekir.

İkili programı hazırlama

İkili dosyanın cihaza dağıtılabilmesi için kriptografik anahtarlarla imzalanması gerekir. Şimdi, ikili dosyamızı imzalayacak ve SparkFun Edge'e indirilebilmesini sağlayacak bazı komutlar çalıştıracağız.

Geliştirme için kullanabileceğimiz bazı sahte şifreleme anahtarları oluşturmak üzere 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 dosya 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, cihazımızı bir sonraki adımda kullanacağımız önyükleyici komut dosyasıyla flaşlamak için kullanılabilecek dosyanın son sürümünü oluşturmak üzere başka bir komut çalıştıracağız:

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

Komutları çalıştırdığınız dizinde artık main_nonsecure_wire.bin adlı bir dosyanız olmalıdır. Bu dosya, cihaza yüklenecek olan dosyadır.

5. İkili programı yüklemeye hazırlanın

Flaş nedir?

SparkFun Edge, şu anda çalıştırdığı programı 512 kilobaytlık flash belleğinde saklar. Kartın yeni bir program çalıştırmasını istiyorsak programı karta göndermemiz gerekir. Kart, programı flash bellekte saklar ve daha önce kaydedilmiş tüm programların üzerine yazar.

Bu işleme "yanıp sönme" adı verilir ve programımızı karta göndermek için bu işlemi kullanırız.

Programlayıcıyı karta takma

Karta yeni programlar indirmek için SparkFun USB-C Serial Basic seri programlayıcıyı kullanacağız. Bu cihaz, bilgisayarınızın USB üzerinden mikro denetleyiciyle iletişim kurmasına olanak tanır.

Bu cihazı kartınıza bağlamak için aşağıdaki adımları uygulayın:

  1. SparkFun Edge'in yan tarafındaki altı pinli başlığı bulun.
  2. SparkFun USB-C Serial Basic'i bu pinlere takın. Her cihazda "BLK" ve "GRN" etiketli pinlerin doğru şekilde hizalandığından emin olun.

b140822f0019f92a.png

Programlayıcıyı bilgisayarınıza bağlama

Jamboard'u USB üzerinden bilgisayarınıza bağlayacağız. Kartı programlamak için bilgisayarınızın cihaza verdiği adı bilmemiz gerekir. Bunun en iyi yolu, bilgisayara bağlamadan önce ve bağladıktan sonra tüm cihazları listelemek ve hangi cihazın yeni olduğunu kontrol etmektir.

Cihazı USB ile bağlamadan ö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, aşağıdaki gibi bir bağlı cihaz listesi oluşturur:

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC

Şimdi 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*

Çıkışta, aşağıdaki örnekte olduğu gibi 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ı ifade eden baud hızını belirtmek için bir ortam değişkeni oluşturacağız:

export BAUD_RATE=921600

6. İkili programı yüklemek

Kartınıza yazılım yüklemek için komut dosyasını çalıştırın

Kartı flaşlamak için yeni ikili programı almaya hazırlayan özel bir "önyükleyici" durumuna getirmemiz gerekir. Ardından, ikili dosyayı karta göndermek için bir komut dosyası çalıştırırız.

Panodaki aşağıdaki düğmeleri tanıyalım:

64c620570b9d2f83.png

Kartı sıfırlamak ve yüklemek için aşağıdaki adımları uygulayın:

  1. Kartınızın programlayıcıya, tüm kurulumun ise USB üzerinden bilgisayarınıza bağlı olduğundan emin olun.
  2. Tahtada 14 işaretli düğmeyi basılı tutmaya başlayın. 6. adıma kadar basılı tutmaya devam edin.
  3. 14 işaretli düğmeyi basılı tutmaya devam ederken kartı önyükleyici durumuna sıfırlamak için RST işaretli düğmeyi tıklayarak kartı sıfırlayın.
  4. 14 işaretli düğmeyi basılı tutmaya devam ederken aşağıdaki komutu terminalinize yapıştırın ve çalıştırmak için Enter tuşuna basın (Kolaylık sağlaması açısından bu komutu düğmeyi basılı tutmaya başlamadan önce terminalinize yapıştırabilirsiniz ancak bu adıma gelene 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 basılı tutmaya devam ettiğinizde ekranda aşağıdakine benzer bir mesaj görünür:
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üğünüzde karttaki 14 işaretli düğmeyi basılı tutmayı bırakın (basılı tutmaya devam etmeniz de sorun olmaz). Program, terminalde satır yazdırmaya devam eder. Sonunda aşağıdaki gibi bir görünüm elde edersiniz:
[...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 simgesini görüyorsanız bu, başarılı bir yanıp sönme olduğunu gösterir. Program çıkışı hatayla bitiyorsa Sending Reset Command karakterinin yazdırılıp yazdırılmadığını kontrol edin. Bu durumda, hataya rağmen yanıp sönme işlemi büyük olasılıkla başarılı olmuştur.

Linux makinede NoResponse Error ile karşılaşabilirsiniz. Bunun nedeni, mevcut seri sürücünün yanına ch34x seri sürücüsünün yüklenmesidir. Bu sorun 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 bilgisayardan çıkarıldığından emin olun.

git clone https://github.com/juliagoda/CH341SER.git
cd CH341SER/
make
sudo insmod ch34x.ko
sudo rmmod ch341

2. adım: Kart USB'sini takın ve şu komutu çalıştırı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), şu komutu çalıştırarak diğer sürücüyü devre dışı bırakmayı deneyin:

rmmod <non-ch34x driver name>

Cihazı çı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 flaşlandıktan sonra işaretli düğmeye basın .

RST düğmesine basarak kartı yeniden başlatın ve programı başlatın. Mavi LED yanıp sönmeye başlarsa flaş işlemi başarılı olmuştur. Aksi takdirde, sayfayı aşağı kaydırarak "Çalışmadıysa ne yapmalıyım?" bölümüne gidin.

bf256d403a1821af.gif

Kart üzerindeki makine öğrenimi modeli, "evet" ve "hayır" kelimelerini tanıyacak ve konuşmanın varlığını ya da yokluğunu algılayacak şekilde eğitilir. Sonuçlarını renkli LED'leri yakarak bildirir. Aşağıdaki tabloda her LED renginin anlamı gösterilmektedir:

Tespit sonucu

LED rengi

"Evet"

Sarı

"Hayır"

Kırmızı

Bilinmeyen konuşma

Yeşil

Konuşma algılanmadı

LED'ler yanmıyor

Siz de deneyin

Kartı ağzınıza yaklaştırıp birkaç kez "evet" deyin. Sarı LED'in yanıp söndüğünü görürsünüz. "Evet" dediğinizde herhangi bir işlem yapılmıyorsa deneyebileceğiniz bazı çözümler:

  • Tahtayı ağzınızdan yaklaşık 25 cm uzakta tutun.
  • Aşırı arka plan gürültüsünden kaçının
  • "Evet"i hızlıca birkaç kez tekrarlayın (ör. "evet evet evet" deyin).

İşe yaramazsa ne yapmalıyım?

Olası sorunlar ve bunları nasıl ayıklayacağınız aşağıda açıklanmıştır:

Sorun: Flaş işleminden sonra hiçbir LED yanmıyor.

Çözüm: RST düğmesine basmayı veya kartın programlayıcıyla bağlantısını kesip yeniden bağlamayı deneyin. Bunların hiçbiri işe yaramazsa kartı tekrar yanıp söndürmeyi deneyin.

Sorun: Mavi LED yanıyor ancak çok sönük.

Çözüm: Pili değiştirin. Alternatif olarak, kart programlayıcı ve kablo kullanılarak bilgisayardan da güç alabilir.

8. Hata ayıklama çıkışını okuma (isteğe bağlı)

Sorun yaşıyorsanız ve kodunuzda ayrıntılı hata ayıklama yapmanız gerekiyorsa bu bölümü inceleyin. Kodunuz çalışırken bir mikro denetleyicide neler olduğunu anlamak için kartın seri bağlantısı üzerinden hata ayıklama bilgilerini yazdırabilirsiniz. Bilgisayarınızı kullanarak Jamboard'a bağlanır ve Jamboard'ın gönderdiği verileri görüntülersiniz.

Seri bağlantı açma

Varsayılan olarak, SparkFun Edge örnek kodumuz, konuşulan tüm komutları güvenilirlikleriyle birlikte kaydeder. Kartın çıkışını görmek için aşağıdaki komutu çalıştırabilirsiniz:

screen ${DEVICENAME} 115200

Başlangıçta aşağıdaki gibi bir çıktı görebilirsiniz: (Bu yalnızca kart bağlandıktan sonra sıfırlanırsa görünür. Aksi takdirde hata ayıklama bilgilerini görmeye başlayabilirsiniz.)

Apollo3 Burst Mode is Available

                               Apollo3 operating in Burst Mode (96MHz)

"Evet" veya "Hayır" diyerek bazı komutlar vermeyi deneyin. Her komut için kart yazdırma hata ayıklama bilgilerini görmelisiniz:

 Heard yes (202) @65536ms

Yukarıdaki günlükte yes komutu ifade eder. 202 sayısı, komutun duyulduğuna dair güven düzeyini ifade eder (minimum 200). Son olarak, 65536ms, mikro denetleyici son sıfırlandığından beri geçen süreyi ifade eder.

Hata ayıklama çıkışını görüntülemeyi durdurmak için Ctrl+A tuşuna, ardından hemen K tuşuna ve son olarak Y tuşuna basın.

Hata ayıklama günlükleri yazma

Bu bilgileri günlüğe kaydeden kodu, az önce çalıştığınız command_responder.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 enterpolasyonu için standart printf jetonlarını destekler. Bu jetonları, günlüklerinize önemli bilgiler eklemek için kullanabilirsiniz:

error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);

Bu yöntem, bir sonraki bölümde koda kendi değişikliklerinizi yaparken işinize yarayacaktır.

9. Kodu genişletme (isteğe bağlı)

SparkFun Edge'inizi nasıl oluşturacağınızı ve flash edeceğinizi öğrendiğinize göre artık kodla oynamaya ve sonuçları görmek için kodu cihazınıza dağıtmaya başlayabilirsiniz.

Kodu okuyun

Kodu okumaya başlamak için iyi bir yer olan command_responder.cc. dosyasını inceleyin.

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

Dosyayı GitHub'da buradan görebilirsiniz.

Bu dosyadaki RespondToCommand yöntemi, sesli komut algılandığında çağrılır. Mevcut kod, "evet", "hayır" veya bilinmeyen bir komut duyulmasına bağlı olarak farklı bir LED'i açar. Aşağıdaki snippet'te bu işlemin 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. Bu if ifadeleri grubu, ilk karakteri kontrol ederek hangi LED'in yanacağını belirler.

RespondToCommand yöntemi çeşitli bağımsız değişkenlerle ç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 kaydetmek için kullanılır (bu konuyla ilgili daha fazla bilgiye sonraki bölümlerde yer verilecektir).
  • current_time, komutun algılandığı zamanı gösterir.
  • found_command, hangi komutun algılandığını gösterir.
  • score, bir komut algıladığımızdan ne kadar emin olduğumuzu gösterir.
  • is_new_command, komutun ilk kez duyulup duyulmadığını anlamamızı sağlar.

score, bir komutun algılanma olasılığını temsil eden 0-255 arasındaki bir tam sayıdır. Örnek kod, yalnızca puan 200'den yüksekse komutu geçerli olarak kabul eder. Testlerimize göre, geçerli komutların çoğu 200-210 aralığında yer alıyor.

Kodu değiştirme

SparkFun Edge kartında dört LED bulunur. Şu anda tanıma işleminin gerçekleştiğini belirtmek için mavi LED'i 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'imiz olduğundan programı, bunları belirli bir komutun score görsel göstergesi olarak kullanacak şekilde değiştirelim. Düşük puanlarda tek bir LED yanar, yüksek puanlarda ise birden fazla LED yanar.

Programın çalıştığını bildiğimizden emin olmak için mavi yerine kırmızı LED'in sürekli yanıp sönmesini sağlayacağız. En son score sinyalimizin gücünü göstermek için bitişik mavi, yeşil ve sarı LED'ler kullanılır. Basitlik için, yalnızca "evet " kelimesi söylendiğinde bu LED'leri yakacağız. Başka bir kelime algılanırsa LED'ler temizlenir.

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 olur. Mavi, yeşil ve sarı LED'leri temizleyip found_command ve score değerlerine bağlı olarak tekrar yakacağız.

Yeniden oluşturma ve yükleme

Kod değişikliklerini yaptıktan sonra İkili dosyayı oluşturun ve hazırlayın bölümündeki tüm adımları uygulayarak kodu test edin.

10. Sonraki Adımlar

Tebrikler, mikro denetleyicide ilk konuşma dedektörünüzü başarıyla oluşturdunuz.

Mikro denetleyiciler için TensorFlow Lite ile geliştirme konusundaki bu kısa girişten memnun kaldığınızı umuyoruz. Mikro denetleyicilerde derin öğrenme fikri yeni ve heyecan verici. Bu nedenle, denemeler yapmanızı öneririz.

Referans belgeler

26699b18f2b199f.png

Teşekkürler, keyifli bir şekilde içerik üretmeye devam etmeniz dileğiyle.