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.

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.

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)

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.

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:
- Linux veya macOS bilgisayar
- SparkFun Edge kartı
- SparkFun USB-C Serial Basic programlayıcı
- USB-C - USB-A kablosu (USB-C bağlantı noktasına sahip bir bilgisayar kullanıyorsanız bunun yerine USB-C - USB-C kablosu edinin)
- (isteğe bağlı) Çıkarım işlemini programlayıcı ve kablo olmadan çalıştırmak için 3V 20 mm düğme pil (CR2032)
Aşağıdaki yazılımlara ihtiyacınız olacaktır:
- Git (komut satırında
gitkomutunu çalıştırarak yüklü olup olmadığını kontrol edin) - Python 3 (komut satırında
python3veyapython --versionkomutunu ç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 --versionkomutunu ç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:
- 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.

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

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

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:

Kartı sıfırlamak ve yüklemek için aşağıdaki adımları uygulayın:
- Kartınızın programlayıcıya, tüm kurulumun ise USB üzerinden bilgisayarınıza bağlı olduğundan emin olun.
- Tahtada
14işaretli düğmeyi basılı tutmaya başlayın. 6. adıma kadar basılı tutmaya devam edin. 14işaretli düğmeyi basılı tutmaya devam ederken kartı önyükleyici durumuna sıfırlamak içinRSTişaretli düğmeyi tıklayarak kartı sıfırlayın.14iş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
14iş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...]
Sending Data Packet of length 8180simgesini gördüğünüzde karttaki14iş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.

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
- Temel programla çalışma deneyimi kazandığınıza göre artık farklı komutları anlamak için kendi modelinizi eğitebilirsiniz. Not: Eğitim birkaç saat sürer.
- Mikro denetleyiciler için TensorFlow Lite hakkında daha fazla bilgi edinin ( Web sitesi, GitHub).
- Diğer örnekleri deneyin ve destekleniyorsa SparkFun Edge'de çalıştırmayı deneyin.
- Küçük cihazlarda makine öğrenimini tanıtan ve çeşitli eğlenceli projeleri adım adım açıklayan TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Micro-Controllers adlı O'Reilly kitabına göz atın. Bu kod laboratuvarı, kitabın 7. ve 8. bölümlerini temel alır.

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