Mundarija:

Eshitish moslamasi, Google Coral TPU tezlatgichi versiyasi: 4 qadam
Eshitish moslamasi, Google Coral TPU tezlatgichi versiyasi: 4 qadam

Video: Eshitish moslamasi, Google Coral TPU tezlatgichi versiyasi: 4 qadam

Video: Eshitish moslamasi, Google Coral TPU tezlatgichi versiyasi: 4 qadam
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Iyul
Anonim
Eshitish moslamasi, Google Coral TPU Accelerator versiyasi
Eshitish moslamasi, Google Coral TPU Accelerator versiyasi
Eshitish moslamasi, Google Coral TPU Accelerator versiyasi
Eshitish moslamasi, Google Coral TPU Accelerator versiyasi
Eshitish moslamasi, Google Coral TPU Accelerator versiyasi
Eshitish moslamasi, Google Coral TPU Accelerator versiyasi

U oyoq -qo'llarini harakatga keltiradi, sizning buyurtmangizni tinglaydi, u eng yangi mashina o'rganish texnologiyasi bilan boshqariladi

"Eshituvchi sakrash jeki" - bu oddiy elektromekanik sakrash, ikkita mikro servo va juda oddiy vites bilan boshqariladi, "ko'zlar" diodli LEDlarga ega. U oddiy ovozli buyruqlar yordamida boshqariladi, u to'qqizta oldindan belgilangan pozitsiyani egallaydi, yoki LEDni yoqish yoki o'chirish kerak, yoki u oldindan belgilangan "raqs" yoki tasodifiy harakatlar majmuasini bajaradi.

Tizimning asosiy elementi Google Coral TPU tezlatgichidir, bu Tensorflow Lite modellarini oflayn rejimda juda yuqori tezlikda, hatto "zaif" kompyuterda ham Raspberry Pi sifatida ishlatishga imkon beradi. Bu, masalan, RPi kamerasidan foydalangan holda ob'ektlarni tezkor aniqlash va tasniflash, shuningdek, mashinani o'rganishga asoslangan ovozni aniqlash funktsiyalarini mahalliy darajada ishlatish.

Men bilganimdek, bu Coral Accelerator ovozni aniqlaydigan jismoniy DIY qurilmasi uchun birinchi nashr qilingan misol va unga biriktirilgan kod misoli boshqa murakkab loyihalarda ham qo'llanilishi mumkin.

Ovozli boshqaruv yaqinda (2019 yil sentyabr) GitHub-da joylashtirilgan "loyiha kalit so'zlarini aniqlash vositasida" (https://github.com/google-coral/project-keyword-spotter) "eshituvchi ilon" misoliga asoslangan. Mening konfiguratsiyamda, tizim Adafruit 16 kanalli servo qopqog'i, Google Coral TPU Accelerator va bu erda mikrofon sifatida ishlatiladigan veb -kamera bilan jihozlangan Raspberry Pi 4dan iborat. O'tish Jeksi ilgari ko'rsatmada tasvirlangan edi, u erda Google Voice to'plami ovozli buyruqlarni o'qiydi, Servo Bonnet -ga 2.0 -versiyada biriktirilgan.

Oldingi Google Voice Kit versiyasida uchta markaziy cheklovlar bor edi: bu Google-ning ovozni aniqlash xizmatlariga bog'liq edi va sozlash nisbatan murakkab edi, buyruq berishdan oldin biron bir tugmani bosish kerak edi va jiddiy kechikish bo'ldi. buyruqni aytish va tizimning javobi o'rtasida. Google Coral tezlatgichidan foydalanish javob vaqtini soniyalarga qisqartiradi, Internetga ulanmaydi va doimo tinglaydi. Ba'zi o'zgartirishlar bilan siz undan o'tish moslamasi, robotlar yoki mashinalar kabi murakkab qurilmalarni yoki Raspberry Pi yordamida qurishingiz va boshqarishingiz mumkin bo'lgan narsalarni boshqarish uchun foydalanishingiz mumkin.

O'zining joriy versiyasida Keyword Spotter 140 ta qisqa kalit so'zlar/kalit so'zlarni tushunadi, ular bilan birga keladigan model faylida ("voice_commands_v0.7_egetpu.tflite") aniqlangan va alohida yorliq faylida tasvirlangan ("labels_gc2.raw.txt"). Erkin o'zgartirilishi mumkin bo'lgan fayl ("commands_v2_hampelmann.txt") tomonidan aniqlangan, bizning skriptimiz tomonidan ishlatilgan kalit so'zlar, keyin virtual klaviaturadagi klaviatura urishlariga moslashtiriladi, masalan. harflar, raqamlar uchun, yuqoriga/pastga/chapga/o'ngga, crtl+c va boshqalar.

Keyin, masalan. pygame.key -dan foydalanib, bu "tugmachalarni bosish" o'qiladi va qurilma qaysi harakatlarni bajarishini nazorat qilish uchun ishlatiladi. Bizning holatimizda, bu ikkita servolarni oldindan belgilangan holatga o'tkazish yoki LEDlarni yoqish yoki o'chirish demakdir. Spotter kalit so'z alohida yo'lakchada ishlaganligi sababli, u sizning buyurtmangizni doimiy tinglay oladi.

Versiya 21 sentyabr, 2019 yil

Ta'minotlar

Raspberry Pi 4, Pimoroni orqali

Google Coral TPU tezlatgichi, Mouser Germaniya orqali, 72 evro

Adafruit 16 Servo Bonnet, Pimoroni orqali, taxminan 10 evro

www.adafruit.com/product/3416

learn.adafruit.com/adafruit-16-channel-pwm…

Stacker sarlavhasi (agar kerak bo'lsa)

www.adafruit.com/product/2223

Servo Bonnet uchun 4x AA batareya to'plami (yoki boshqa 5-6V quvvat manbai)

Eski veb -kamera, mikrofon sifatida

Oldingi yo'riqnomada tasvirlanganidek, Servo boshqaruvi bilan sakrash. Chizma chizmalar keyingi bosqichga biriktirilgan, lekin ularni o'zgartirish talab qilinishi mumkin.

Jekka o'tish uchun kerakli qismlar:

- 3 mm Forex plitasi

- 2 ta mikro servo

- 2 va 3 mm vintlar va yong'oqlar

- 2 ta oq LED va qarshilik

- bir oz simi

1 -qadam: Qurilmani sozlash

Qurilmani sozlash
Qurilmani sozlash
Qurilmani sozlash
Qurilmani sozlash
Qurilmani sozlash
Qurilmani sozlash

Jekka sakrashni qurish uchun avvalgi yo'riqnomada ko'rsatilgan ko'rsatmalarga amal qiling. Men prototipim uchun Forexdan foydalandim, lekin siz lazerli kesilgan akril yoki kontrplak plitalarini ishlatishingiz mumkin. Siz tartibni servolarning o'lchamiga qarab o'zgartirishingiz kerak bo'lishi mumkin. Oyoq -qo'llar va tishli qutilar ishqalanmasdan harakat qila oladimi -yo'qligini tekshirib ko'ring.

Raspberry Pi -ni o'rnating. Coral Github saytida Pi -da Coral tezlatgichini ishga tushirish uchun zarur bo'lgan hamma narsani o'z ichiga olgan va ko'plab sozlamalarni o'z ichiga olgan raspcha tasvir mavjud.

Google Coral GitHub sahifasidan loyiha kalit so'zini toping. Ko'rsatilganidek, barcha kerakli dasturlarni o'rnating.

Taqdim etilgan fayllarni o'rnating. Python skriptini skriptni loyiha kalit so'zini aniqlaydigan papkaga va konfiguratsiya pastki papkasidagi tegishli buyruqlar fayliga joylashtiring.

Adafruit Servo Bonnetini Pi -ga ulang. Ventilyator bilan RPI korpusidan foydalanayotgan bo'lsam, ulanishni yoqish uchun GPIO stackerlarini (masalan, Pimoroni -da mavjud) ishlatishim kerak edi. Adafruit -da servo kapot uchun ko'rsatmalarda ko'rsatilgan barcha kerakli kutubxonalarni o'rnating.

Servo kapotiga 5-6V quvvat manbaini ulang. Servo va LEDlarni ulang. Menimcha, men LEDlar uchun 0 portni va servolar uchun 11 va 15 portlarini ishlatardim.

Hammasini tekshirish uchun men birinchi navbatda "eshituvchi ilon" loyihasining kalit so'zini va Adafruit servo kapotining misollarini sinab ko'rishni tavsiya qilaman.

2 -qadam: Jekka sakrash

Agar barcha qismlar o'rnatilgan va ishlayotgan bo'lsa, uni ishlatishga harakat qiling. Siz skriptni IDE yoki buyruq satridan ishga tushirishingiz mumkin.

"0 -pozitsiya" dan "9 -pozitsiyaga" baqirish Jekni oldindan belgilangan pozitsiyalardan birini egallashga undaydi. Men "1" ni ikkala qo'lni yuqoriga (uu), "3" ni chapga, o'ngga (ud), "9" ni ikkala qo'lni pastga (dd) va "5" ni ikkala qo'lni markazga (cc) belgiladim.

uu uc ud = 1 2 3

kub cd cd = 4 5 6

dc dd = 7 8 9

"0" "5" bilan bir xil. "3" va "8" kalit so'zlarni aniqlovchi tomonidan yaxshi tan olinmagan va ularni takrorlash kerak bo'lishi mumkin.

Har bir servo/yon tomon uchun minimal va maksimal qiymatlarni sozlashingiz kerak bo'ladi, shunda servo bloklanmaydi va keyin juda ko'p quvvat oladi.

"Keyingi o'yin" "raqs" ni, ya'ni aniqlangan pozitsiyalar ketma -ketligini, "tasodifiy o'yin" esa sakrashni Jekni tasodifiy harakatlar ketma -ketligini bajarishni boshlaydi. Ikkala holatda ham ular abadiy ishlaydi, shuning uchun siz harakatlarni to'xtatishingiz kerak bo'lishi mumkin, masalan. "pozitsiya nol" buyrug'i bilan.

"O'yinni to'xtatish" "ctrl + c" ni chaqiradi va jarayonni to'xtatadi.

"yoqish" va "o'chirish" yordamida LEDlarni yoqish va o'chirish mumkin.

Time.sleep qiymatlarini o'zgartirish orqali siz harakat tezligini sozlashingiz mumkin.

3 -qadam: Kod va buyruqlar fayli

Bu erda keltirilgan kod - bu loyiha kalit so'zlarini aniqlash dasturining bir qismi bo'lgan "eshitish iloni" kodining modifikatsiyasi. Men tafsilotlarni aniq tushunmay turib, arizam uchun kerak bo'lmagan narsalarni olib tashladim. Har qanday yaxshilanishlar qabul qilinadi.

Keyin men misol fayllari asosida Adafruit Servo Bonnet uchun kerakli qismlarni qo'shdim.

Men ikkala qismning dasturchilariga minnatdorchilik bildirmoqchiman.

Kodni fayl sifatida biriktirilgan holda topish mumkin. O'zingizning xavf -xataringizdan foydalaning, o'zgartiring, yaxshilang, o'ynang.

# Mualliflik huquqi 2019 Google LLC

# # Apache litsenziyasi ostida litsenziyalangan, 2.0 -versiya ("Litsenziya"); # siz ushbu faylni litsenziyaga muvofiq ishlata olmaysiz. # Siz Litsenziya nusxasini olishingiz mumkin # # https://www.apache.org/licenses/LICENSE-2.0 # # Agar amaldagi qonunchilik talab qilmasa yoki yozma ravishda rozi bo'lmasa, Litsenziya ostida tarqatilgan dasturiy ta'minot #. "BOShQA" ASOSI, # KAFOLATSIZ VA HAR QANDAY SHARTLARSIZ, aniq yoki shama. # Litsenziyadagi maxsus tilni boshqaruvchi ruxsatnomalar va # cheklovlar uchun Litsenziyani ko'ring. _future_ importdan _future_ import bo'linmasidan _future_dan import print_function import argparse import os tasodifiy import randintidan ipni import qilishdan mavzu import vaqti. adafruit_servokit import ServoKit import kartasi import busio import adafruit_pca9685 import vaqti i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanallar = 16) # to'plam kanallar #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #chap, o'ng qo'llar uchun yuqoriga, o'rta va pastga sozlamalar yuqoriga_l = 35 md_l = 90 dn_l = 160 yuqoriga_r = 160 md_r = 90 dn_r = 35

lft = 15 # servo port soni, chap servo (0-8)

rgt = 11 # servo port soni, o'ng servo (0-8) led_channel_0 = hat.kanallar [0] # LED portda o'rnatilgan 0 led_channel_0.duty_cycle = 0 # LEDni yoqish 100% # to'qqiz pozitsiya uchun qo'l sozlamalari ro'yxati = [(md_l, md_r), (yuqoriga, l_ga), (yuqoriga_l, m_d), (dn_l, md_r), (dn_l, dn_r)] # 9 ta sakrash joylarini belgilaydi, 0-9 raqs tamsayılari bilan ko'rsatilgan1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2), 1, 4, 7, 8, 9, 6, 3, 2, 0) # "raqs" klassi Kontroler (ob'ekt): # Qayta qo'ng'iroq funktsiyasi _ _ _ (o'zini, q): o'z -o'zidan._q = q def qayta qo'ng'iroq (o'zini, buyruq): self._q.put (buyruq) klassi App: def _init _ (o'zini): self._running = Haqiqiy def on_init (o'zini): pygame.init () self.game_started = Haqiqiy o'zini._running = Haqiqiy qaytish Haqiqiy def on_event (o'z -o'zidan, hodisa): agar event.type == pygame. QUIT: self._running = False def JumpingJack0 (o'z -o'zidan, kalitlar): # Jekdan sakrashni boshqaradi, kalit so'zlar: "pozitsiya x" tugmachasi = int (tugmalar) p = pozitsiya [key] a = p [0] b = p [1] chop etish ("Lavozim:", kalit, "chap") /o'ng: ", a,"/", b," daraja ") # sys.stdout.write (" Lavozim: ", kalit," chap/o'ng: ", a,"/", b," daraja ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (o'zini): # boshqaruv Jumping Jek raqsi, kalit so'z: "keyingi o'yin" dnce = raqs1 sp = (len (dnce)) r uchun diapazonda (sp): # pozitsiyalar raqsining tartibi, sp qadamlari dc = dnce [r] if (dc diapazonda emas (10)): # chop etish ("pozitsiyada kirish xatosi", sp) dc = 4 p = pozitsiya [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # tezlikni o'rnatadi JumpingJack2 (o'z -o'zidan, tugmachalari): # nazorat qilish o'tish chiroqlari LEDlari, kalit so'zlar: "yoqish/o'chirish" led = int (tugmalar) agar LED == 1 bo'lsa: led_channel_0.duty_cycle = 0xffff LEDni yoqish 100% vaqt. uyqu (0.1) agar led == 0: led_channel_0.duty_cycle = 0 # LED vaqtini o'chirib qo'ying. Uxlash (0.1) agar led == 2: # led_channel_0.duty_cycle = 0xffff #diodni 100% yoqish. Uyqu (0,5).duty_cycle = 0 #LEDni 100% yoqish. uxlash (0,5) #LEDni 100% vaqtini yoqing.): # boshqarish Jumping Jek raqsi, kalit so'z: "tasodifiy o'yin" # uchun h oralig'ida (10): dr = randrange (9) p = pozitsiya [dr] a = p [0] b = p [1] kit.servo [lft].angle = kit.servo [rgt].angle = b time.sleep (0.25) # spot spotter (self, args) harakatlarining tezligini belgilaydi: motor = BasicEngine (args.model_file) mic = args.mic if args.mic boshqa hech kim emas int (args.mic) model.classify_audio (mikrofon, dvigatel, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v2_hampelmann.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hz), num_frames_hop = int (args.num_frames_hop))

def on_execute (o'zini, args):

bo'lmasa self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (To'g'ri, 0,1) queue. Empty: new_item = new_item bo'lmasa None: item = new_item if (args.debug_keyboard va kalitlari [pygame. K_ESCAPE]) yoki item == "stop": self._running = False # if (args.debug_keyboard va tugmalar [pygame. K_SPACE]) yoki element == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard va kalitlari [pygame. K_RIGHT]) yoki element == "o'ng": o'zini. JumpingJack0 (6) agar (args.debug_keyboard va tugmalar [pygame. K_LEFT]) yoki element == "chapda": self. JumpingJack0 (4) if (args.debug_keyboard va tugmalar [pygame. K_UP]) yoki element == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) yoki item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) yoki element == "0": self. JumpingJack0 (0) if (args.debug_keyboard va tugmalar [pygame. K_1]) yoki element == "1": self. JumpingJack0 (1) if (arg. debug_keyboard va tugmalar [pygame. K_2]) yoki element == "2": self. JumpingJack0 (2) agar (args.debug_keyboard va tugmalar [pygame. K_3]) yoki element == "3": self. JumpingJack0 (3) if (args.debug_keyboard va tugmalar [pygame. K_4]) yoki element == "4": self. JumpingJack0 (4) if (args.debug_keyboard va kalitlari [pygame. K_5]) yoki element == "5": self. JumpingJack0 (5) agar (args.debug_keyboard va tugmalar [pygame. K_6]) yoki element == "6": self. JumpingJack0 (6) if (args.debug_keyboard va tugmalar [pygame. K_7]) yoki element == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard and keys [pygame. K_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) or item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. JumpingJack1 () #dancing Jack, "next_game" if (args. debug_keyboard va tugmalar [pygame. K_j]) yoki element == "j": self. JumpingJack2 (0) #LED yoqilgan, ON " switch_on "if (args.debug_keyboard va kalitlari [pygame. K_k]) yoki element ==" k ": self. JumpingJack2 (1) #LED o'chirilgan bo'lsa," o'chirish "holatida bo'lsa (args.debug_keyboard va tugmalar [pygame. K_l]) yoki element == "l": self. JumpingJack2 (1) #LED "nishon" qilsa, (args.debug_keyboard va tugmalar [pygame. K_r]) yoki element == "r": self. JumpingJack3 () #tasodifiy raqs "tasodifiy o'yin" time.sleep (0.05) self.on_cleanup () agar _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'JumpingJack-ni boshqarish uchun klaviaturadan foydalaning). ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

"Commands_v2_hampelmann.txt" konfiguratsiya fayli ham mavjud. O'zingiz xohlagan tarzda o'zgartiring. Bu faqat yorliq-faylga asoslangan "buyruq, kalit, (kuch,)" kombinatsiyalarining ro'yxati.

pozitsiya nol, 0, bir pozitsiya, 1, ikkita pozitsiya, 2, 3 -pozitsiya, 3, 4 -pozitsiya, 4, 5 -pozitsiya, 5, 6 -pozitsiya, 6, 7 -pozitsiya, 7, 8 -pozitsiya, 8, 8 -pozitsiya, 9 -o'rin, yuqoriga, yuqoriga, yuqoriga, yuqoriga, pastga, pastga, pastga pastga, orqaga, chapga, oldinga siljish, o'ngga, orqaga, chapga, oldinga, o'ngga, 0.8 nishon, l, ovozni o'chirish, z, ha, y, yo'q, n, almashtirish_on, j, o'chirish, k, tovush balandligi, yuqoriga, ovoz balandligi, pastga, pastga, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

4 -qadam: Boshqa fikrlar va boshqa misollar

Shubhasiz, bu sozlama robotlar yoki boshqa qurilmalarni boshqarish uchun ham ishlatilishi mumkin. Asosan, Raspberry Pi tomonidan boshqariladigan hamma narsa.

Men MeArm haydash uchun skriptni kengaytirmoqdaman va buni 2019 yil oktyabr oyida taqdim etishga umid qilaman.

Men, shuningdek, sakrash Jekni semafora sifatida ishlatishni va "loyiha posenet" a'zolar pozitsiyasini aniqlash dasturini Jumping Jek pozitsiyalarini o'qish va uni raqamga tarjima qilish vositasi sifatida ishlatishni o'ylayapman. Shunday qilib, u matnni ham etkazishi mumkin, chunki 2x8 pozitsiyada 64 xil raqam ko'rsatilishi mumkin, bu alifbo, raqamlar va belgilar uchun etarli emas. Bu IETF tomonidan taklif qilingan "Semafor bayroq signalizatsiyasi tizimi (SFSS) orqali IP -ma'lumotlar jadvalini uzatish" (https://tools.ietf.org/html/rfc4824) uchun biroz o'zgartirilgan bo'lsa ham, jismoniy tushunishga imkon beradi.

Ammo bu yana bir ko'rsatma bo'ladi. Va birinchi tajribalarda ko'rsatilishicha, sakrash uyasi sun'iy intellekt tizimi tomonidan inson sifatida tan olinishidan oldin jiddiy o'zgarishlarga muhtoj bo'ladi.

Men sizning e'tiboringizni quyidagi ko'rsatmaga qaratmoqchiman: Raspberry Pi va Google Coral TPU kombinatsiyasidan foydalangan holda ob'ektni topuvchi robot tasvirlangan ob'ektni topish-shaxsiy yordamchisi-robot-Ft-malina.

Tavsiya: