Mündəricat:

Eşitmə atlayan bir cek, Google Coral TPU sürətləndirici versiyası: 4 addım
Eşitmə atlayan bir cek, Google Coral TPU sürətləndirici versiyası: 4 addım

Video: Eşitmə atlayan bir cek, Google Coral TPU sürətləndirici versiyası: 4 addım

Video: Eşitmə atlayan bir cek, Google Coral TPU sürətləndirici versiyası: 4 addım
Video: Epi — Göylərə Aşiq Biri 2024, Iyul
Anonim
Eşitmə atlayan cek, Google Coral TPU sürətləndirici versiyası
Eşitmə atlayan cek, Google Coral TPU sürətləndirici versiyası
Eşitmə atlayan cek, Google Coral TPU sürətləndirici versiyası
Eşitmə atlayan cek, Google Coral TPU sürətləndirici versiyası
Eşitmə atlayan cek, Google Coral TPU sürətləndirici versiyası
Eşitmə atlayan cek, Google Coral TPU sürətləndirici versiyası

Əzələrini hərəkət etdirir, sifarişlərinizi dinləyir, ən son maşın öyrənmə texnologiyası ilə idarə olunur

"Eşitmə atlama jakı", iki mikro servo və çox sadə bir dişli ilə idarə olunan, "gözlər" kimi LEDləri olan sadə bir elektromekanik atlama jakıdır. Əvvəlcədən təyin edilmiş doqquz mövqedən hansını alacağını və ya LED -in yandırılmasının və ya söndürülməsinin və ya əvvəlcədən təyin edilmiş "rəqs" və ya təsadüfi hərəkətlər dəstinin yerinə yetiriləcəyini göstərən sadə səs əmrləri ilə idarə olunur.

Sistemin əsas elementi, Raspberry Pi kimi "zəif" bir kompüterdə belə, Tensorflow Lite modellərini çox yüksək sürətlə oflayn rejimdə işləməyə imkan verən Google Coral TPU sürətləndiricisidir. Bu imkan verir, məsələn RPi kamerasını istifadə edərək sürətli obyekt tanıma və təsnifat, həm də maşın öyrənmə əsaslı səs tanıma funksiyalarını yerli olaraq idarə etmək.

Bildiyimə görə, bu, Coral Accelerator səs aşkarlamalı fiziki DIY cihazı üçün ilk nəşr nümunəsidir və əlavə edilmiş kod nümunəsi digər daha mürəkkəb layihələr üçün də istifadə edilə bilər.

Səs nəzarəti, bu yaxınlarda (2019-cu ilin sentyabr ayında) GitHub-da yerləşdirilən "layihə açar sözcüsünü təyin edəndə" (https://github.com/google-coral/project-keyword-spotter) "eşitmə ilanı" nümunəsinə əsaslanır. Konfiqurasiyamda sistem, Adafruit 16 kanallı servo kapot, Google Coral TPU Sürətləndiricisi və burada mikrofon kimi istifadə olunan veb kamerası ilə təchiz olunmuş Raspberry Pi 4 -dən ibarətdir. Jumping Jack, əvvəllər Google Voice kiti tərəfindən səsli əmrləri oxumaq üçün idarə edildiyi bir təlimatda təsvir edilmişdi, aşağıda təsvir edilən 2.0 versiyasında Servo Bonnetə əlavə edilmişdir.

Əvvəlki Google Voice Kit versiyasında üç əsas məhdudiyyət var idi: Google veb əsaslı səs tanıma xidmətlərindən asılı idi və quruluş nisbətən mürəkkəb idi, əmr verməzdən əvvəl bir növ düyməyə basmaq lazım idi və ciddi bir gecikmə oldu əmri söyləməklə sistemin cavabı arasında. Google Coral sürətləndiricisini istifadə etmək, cavab müddətini saniyələrə azaldır, internet bağlantısından asılı deyil və daim dinləyir. Bəzi dəyişikliklərlə, bir Jumping Jack kimi daha mürəkkəb cihazları idarə etmək üçün istifadə edə bilərsiniz, robotlar və ya avtomobillər kimi və ya Raspberry Pi ilə qura biləcəyiniz hər şeyi.

Mövcud versiyasında Açar Söz Spotter, müşayiət olunan model sənədində ("voice_commands_v0.7_egetpu.tflite") müəyyən edilmiş və ayrı bir etiket faylında ("labels_gc2.raw.txt") təsvir olunan təxminən 140 qısa açar sözlər/açar sözlər toplusunu başa düşür.. Sərbəst şəkildə dəyişdirilə bilən bir fayl ("commands_v2_hampelmann.txt") ilə müəyyən edildikdə, skriptimiz tərəfindən xüsusi olaraq istifadə olunan açar sözlər daha sonra virtual klaviaturadakı düymələrin vuruşları ilə müqayisə olunur. hərflər, rəqəmlər, yuxarı/aşağı/sol/sağ, crtl+c və s.

Sonra, məsələn pygame.key istifadə edərək, bu "tuş vuruşları" oxunur və bir cihazın, burada atlama jakının hansı hərəkətləri yerinə yetirəcəyini idarə etmək üçün istifadə olunur. Bizim vəziyyətimizdə bu, iki servonun əvvəlcədən təyin edilmiş mövqelərə sürülməsi və ya LED -lərin açılması və ya söndürülməsi deməkdir. Açar sözcük ayrı bir pillədə işlədiyi üçün sifarişlərinizi daimi dinləyə bilər.

Versiya 21 sentyabr 2019

Təchizat

Raspberry Pi 4, Pimoroni vasitəsi ilə

Google Coral TPU Sürətləndiricisi, Mouser Almaniya vasitəsilə, 72 €

Adafruit 16 Servo Bonnet, Pimoroni vasitəsilə, təxminən 10 €

www.adafruit.com/product/3416

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

Yığıcı başlığı (lazım olduqda)

www.adafruit.com/product/2223

Servo Bonnet üçün 4x AA batareya paketi (və ya digər 5-6V güc mənbəyi)

Köhnə veb kamera, mikrofon kimi

Əvvəlki təlimatda göstərildiyi kimi Servo idarə edən Jumping Jack. Layout təsvirləri növbəti addıma əlavə olunur, lakin düzəlişlər tələb oluna bilər.

Jumping Jack üçün lazım olan hissələr:

- 3 mm Forex lövhəsi

- 2 mikro servo

- 2 və 3 mm vintlər və qoz -fındıq

- 2 ağ LED və bir rezistor

- bir az kabel

Addım 1: Cihazın Qurulması

Cihazın Qurulması
Cihazın Qurulması
Cihazın Qurulması
Cihazın Qurulması
Cihazın Qurulması
Cihazın Qurulması

Jumping Jack qurmaq üçün əvvəlki təlimatlarda göstərilən göstərişlərə əməl edin. Prototipim üçün Forex istifadə etdim, ancaq lazerlə kəsilmiş akril və ya kontrplak lövhələrdən istifadə edə bilərsiniz. Dizaynı servolarınızın ölçüsünə uyğun olaraq düzəltməli ola bilərsiniz. Əzələlərin və dişlilərin sürtünmədən hərəkət edə biləcəyini yoxlayın.

Raspberry Pi qurun. Coral Github saytında, Pi üzərində Coral sürətləndiricisini işə salmaq üçün lazım olan hər şeyi və bir çox layihəni ehtiva edən, bütün parametrləri hazır olan bir Raspian görüntüsü mövcuddur.

Layihə açar sözcüsünü Google Coral GitHub səhifəsindən əldə edin. Göstərildiyi kimi bütün lazımi proqramları quraşdırın.

Təqdim olunan faylları quraşdırın. Atlama jakı python skriptini layihə açar sözünü aşkar edən qovluğa və konfiqurasiya alt qovluğunda əlaqəli əmrlər faylına yerləşdirin.

Adafruit Servo Bonnetini Pi -yə bağlayın. Bir fan ilə RPI korpusundan istifadə etdiyim üçün, əlaqəni təmin etmək üçün GPIO yığıcılarından (məsələn, Pimoroni -dən mövcuddur) istifadə etməliyəm. Adafruit servo kapot üçün təlimatlarda göstərildiyi kimi bütün lazımi kitabxanaları quraşdırın.

Servo kapotuna 5-6V güc mənbəyi bağlayın. Servo və LEDləri bağlayın. Mənim vəziyyətimdə, LEDlər üçün 0 portunu və servolar üçün 11 və 15 portlarını istifadə etdim.

Hər şeyi yoxlamaq üçün əvvəlcə layihə açar sözünün "eşitmə ilanı" nümunəsini və Adafruit servo kapot nümunələrini sınamağı məsləhət görürəm.

Addım 2: Jumping Jack -ı işə salın

Bütün hissələr qurulub və işləyirsə, istifadə etməyə çalışın. Skripti IDE -də və ya əmr satırından işlədə bilərsiniz.

"0 mövqeyi" ilə "9 -cu mövqe" arasında qışqırmaq, Jumping Jack -ı əvvəlcədən təyin edilmiş mövqelərdən birini tutmağa vadar edəcək. "1" i hər iki qolu yuxarı (uu), "3" ü sola, sağa aşağı (ud), "9" a hər iki qolumu aşağı (dd) və "5" ə hər iki qolu mərkəzləşdirilmiş (cc) olaraq təyin etdim.

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" "5" ilə eynidir. "3" və "8" açar söz sahibi tərəfindən çox yaxşı tanınmır və təkrar oluna bilər.

Hər bir servo/tərəf üçün minimum və maksimum dəyərləri tənzimləməli ola bilərsiniz ki, servolar bloklanmasın və sonra çox güc alsın.

"Növbəti oyun" "rəqs" ə, yəni müəyyən edilmiş mövqelər ardıcıllığına, "təsadüfi oyun" təsadüfi hərəkətlər ardıcıllığını yerinə yetirmək üçün Atlama Cekinə başlayacaq. Hər iki halda da əbədi olaraq davam edəcəklər, buna görə də hərəkəti dayandırmalı ola bilərsiniz, məsələn. "sıfır mövqeyi" əmri ilə.

"oyunu dayandır" bir "ctrl + c" oyandıracaq və prosesi dayandıracaq.

"açmaq" və "söndürmək" LEDləri yandırmaq və söndürmək üçün istifadə edilə bilər.

Time.sleep dəyərlərini dəyişdirərək hərəkətlərin sürətini tənzimləyə bilərsiniz.

Addım 3: Kod və Əmrlər Dosyası

Burada təqdim olunan kod, layihə açar sözünü öyrənən paketin bir hissəsi olan "eşitmə ilanı" kodunun dəyişdirilməsidir. Tətbiqim üçün lazım olmayan hər şeyi, detalları heç bir real anlamadan çıxardım. Hər hansı bir təkmilləşdirmə xoş gəlir.

Daha sonra nümunə sənədlərinə əsaslanaraq Adafruit Servo Bonnet üçün lazım olan hissələri əlavə etdim.

Hər iki hissənin proqramçılarına təşəkkür edirəm.

Kodu fayl şəklində əlavə etmək olar. Öz risklərinizdə istifadə edin, dəyişdirin, təkmilləşdirin, onunla oynayın.

# Müəlliflik hüququ 2019 Google LLC

# # Apache Lisenziyası altında Lisenziyalı, Versiya 2.0 ("Lisenziya"); # bu faylı Lisenziyaya uyğun olaraq istifadə edə bilməzsiniz. # Lisenziyanın bir nüsxəsini # # https://www.apache.org/licenses/LICENSE-2.0 # ünvanında əldə edə bilərsiniz. # Müvafiq qanunla tələb olunmadıqda və ya yazılı şəkildə razılaşdırılmadıqda, Lisenziya altında paylanan proqram təminatı # "OLDUĞU kimi" TƏMƏLİ, # ZƏMANƏT VƏ ŞƏRTLƏRİ OLMADAN, açıq və ya örtüklü. # Lisenziyadakı xüsusi dil tənzimləmə icazələri və # məhdudiyyətlər üçün Lisenziyaya baxın. _future_ idxalından _future_ idxalından _future_ idxalından _future_ idxalı print_funksiyasını idxal etməkdən təsadüfi idxal randintindən argparse idxal etmək edgetpu.basic.basic_engine idxalından mövzu idxal zamanı BasicEngine idxal modeli pygame.locals -dan idxal pygame. təsadüfi idxal sıralamasından idxal sırası adafruit_servokit idxalından ServoKit idxal lövhəsi idxal busio idxal adafruit_pca9685 idxal vaxtı i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanallar = 16) # set nömrəsi kanalların sayı #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #yuxarı, orta və aşağı sol və sağ qollar üçün ayarlar yuxarı_l = 35 md_l = 90 dn_l = 160 yuxarı_r = 160 md_r = 90 gn_r = 35

lft = 15 # servo port sayı, sol servo (0-8)

rgt = 11 # servo port sayı, sağ servo (0-8) led_channel_0 = hat.kanallar [0] # portda LED quraşdırılmış 0 led_kanal_0.duty_cycle = 0 # LED yandırmaq 100% # doqquz mövqe mövqeyi üçün qol parametrlərinin siyahısı = [(md_l, md_r), (up_l, up_r), (up_l, md_r), (up_l, dn_r), (md_l, up_r), (md_l, md_r), (md_l, dn_r), (dn_l, up_r), (dn_l, md_r), (dn_l, dn_r)] #, 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2) ədədləri ilə göstərilən 9 JumpingJack mövqeyini təyin edir, 1, 4, 7, 8, 9, 6, 3, 2, 0) # "rəqs" sinfi Controler (obyekt): # Geri çağırma funksiyası _ _ _ (özünü, q): özünü._q = q def geri zəng (özünü), command): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (özünü, hadisə): əgər event.type == pygame. QUIT: self._running = Yanlış def JumpingJack0 (özünü, düymələri): # Jumping Jack, açar sözlər: "mövqe x" düyməsi = int (düymələr) p = mövqe [açar] a = p [0] b = p [1] çap ("Mövqe:", açar, "sol /sağ: ", a,"/", b," dərəcə ") # sys.stdout.write (" Vəzifə: ", düymə," sol/sağ: ", a,"/", b," dərəcə ") kit.servo [lft].angle = bir kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (özünü): # nəzarət Jumping Jack rəqsi, açar söz: "növbəti oyun" dnce = dance1 sp = (l (dnce)) r aralığında (sp): # mövqelərin rəqs sırası, sp addımları dc = dnce [r] if (dc aralığında deyil (10)): # çap ("mövqedə giriş xətası", sp) dc = 4 p = mövqe [dc] a = p [0] b = p [1] kit.servo [lft].angle = bir kit.servo [rgt].angle = b vaxt.yuxu (0.25) # sürəti təyin edir hərəkətlərin def JumpingJack2 (özünü, düymələri): # idarəetmə Jek LEDləri, açar sözlər: "aç/söndür" led = int (düymələr) əgər led == 1: led_channel_0.duty_cycle = 0xffff LED -i yandırın 100% vaxt.yuxu (0.1) əgər led == 0: led_kanal_0.duty_cycle = 0 # LED vaxtını söndürün. Yuxu (0.1) əgər led == 2: # led yanıb sönmə_kanalı_0.duty_cycle = 0xffff # LED -i 100% yandırın. Yuxu (0.5) led_kanalı_0.duty_cycle = 0 #LED -i 100% yandırın. yuxu (0.5) led_kanal_0.duty_cycle = 0xffff #LED -i 100% yandırın.yuxu (0.5) led_kanal_0.duty_cycle = 0 #LED -i 100% yandırın.yuxu (0.5) led_kanalı_0.düz_sikli = 0xffff #LED -i 100% yandırın. yuxu (0.1) def JumpingJack3 (özünü)): # nəzarət Jumping Jack rəqsi, açar söz: "təsadüfi oyun" # aralığında h (10): dr = randrange (9) p = mövqe [dr] a = p [0] b = p [1] kit.servo [lft].angle = bir kit.servo [rgt].angle = b vaxt.yuxu (0.25) # hərəkətlərin sürətini təyin edir defotter (özünü, args): motor = BasicEngine (args.model_file) mikrofon = args.mic əgər args.mic başqa deyil int (args.mic) model.classify_audio (mikrofon, mühərrik, 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 (özünü, args):

yoxsa self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) yoxsa 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 (Doğru, 0.1) queue. Empty: new_item = new_item olmadıqda yoxdur None: item = new_item if (args.debug_keyboard və düymələr [pygame. K_ESCAPE]) və ya maddə == "stop": self._running = False # if (args.debug_keyboard və düymələr [pygame. K_SPACE]) və ya maddə == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard və düymələr [pygame. K_RIGHT]) və ya maddə == "sağ": özünü. JumpingJack0 (6) if (args.debug_keyboard və düymələr [pygame. K_LEFT]) və ya element == "sol": self. JumpingJack0 (4) if (args.debug_keyboard və düymələr [pygame. K_UP]) və ya maddə == " yuxarı ": self. JumpingJack0 (1) əgər (args.debug_keyboard və düymələr [pygame. K_DOWN]) və ya maddə ==" aşağı ": self. JumpingJack0 (9) if (args.debug_keyboard və düymələr [pygam e. K_0]) və ya maddə == "0": self. JumpingJack0 (0) if (args.debug_keyboard və düymələr [pygame. K_1]) və ya maddə == "1": self. JumpingJack0 (1) if (args. debug_keyboard və düymələr [pygame. K_2]) və ya maddə == "2": self. JumpingJack0 (2) əgər (args.debug_keyboard və düymələr [pygame. K_3]) və ya maddə == "3": self. JumpingJack0 (3) if (args.debug_keyboard və düymələr [pygame. K_4]) və ya maddə == "4": self. JumpingJack0 (4) if (args.debug_keyboard və düymələr [pygame. K_5]) və ya maddə == "5": self. JumpingJack0 (5) if (args.debug_keyboard və düymələr [pygame. K_6]) və ya maddə == "6": self. JumpingJack0 (6) if (args.debug_keyboard və düymələr [pygame. K_7]) və ya maddə == "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 və düymələr [pygame. K_j]) və ya maddə == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard və düymələr [pygame. K_k]) və ya maddə ==" k ": self. JumpingJack2 (1) #LED off, if" switchch off "if (args.debug_keyboard and keys [pygame. K_l]) və ya maddə == "l": self. JumpingJack2 (1) #LED "hədəfi" yanıb sönərsə (args.debug_keyboard və düymələr [pygame. K_r]) və ya maddə == "r": self. JumpingJack3 () #təsadüfi rəqs "təsadüfi oyun" time.sleep (0.05) self.on_cleanup () əgər _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'JumpingJack-i idarə etmək üçün klaviaturadan istifadə edin). ', action =' store_true ', default = False) model.add_model_flags (ayrıştırıcı) args = parser.parse_args () the_app = App () the_app.on_execute (args)

"Commands_v2_hampelmann.txt" əmr konfiqurasiya faylı da var. İstədiyiniz kimi dəyişdirin. Bu, etiket faylına əsaslanan "əmr, açar, (güc,)" birləşmələrinin siyahısıdır.

mövqe_ sıfır, 0, mövqe_biri, 1, mövqe_ ikisi, 2, mövqe_üçü, 3, mövqe_dört, 4, mövqe_beş, 5, mövqe_ altı, 6, mövqe_yeddi, 7, mövqe_səkkiz, 8, mövqe_doqquz, 9, hərəkət_ yuxarı, yuxarı, yuxarı_yuxarı, yuxarı, aşağı, aşağı, aşağı aşağı, geri_ hərəkətə, sola, irəli -irəli, sağa, geriyə -geri, sola, irəli -sağa, 0.8 hədəf, l, səssiz, z, bəli, y, yox, n, keçid_on, j, söndürmə, k, həcm_yüksək, yuxarı, səs aşağı, aşağı, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Addım 4: Əlavə Fikirlər və Digər Nümunələr

Bu tənzimləmənin robotları və ya digər cihazları idarə etmək üçün də istifadə edilə biləcəyi çox açıqdır. Əsasən bir Raspberry Pi tərəfindən idarə oluna biləcək hər şey.

MeArm idarə etmək üçün skriptin uzadılması üzərində işləyirəm və bunu 2019 -cu ilin oktyabr ayında təqdim edə biləcəyimə ümid edirəm.

Mən də Jumping Jack -ı semafor kimi istifadə etməyi və "project posenet" əza mövqeyini tanıma proqramını Jumping Jack -in mövqelərini oxumaq və onu bir rəqəmə çevirmək üçün bir vasitə kimi istifadə etməyi düşünürəm. Bu yolla hətta mətnlə əlaqə qura bilər, çünki 2x 8 mövqeyi əlifba, rəqəmlər və işarələr üçün kifayət qədər olan 64 fərqli rəqəm göstərə bilər. Bu, bir qədər dəyişdirilərkən, təklif olunan IETF "Semafor Bayrağı Siqnalizasiya Sistemi (SFSS) üzərindən IP Datagramlarının Göndərilməsi" (https://tools.ietf.org/html/rfc4824) üçün fiziki reallaşdırmaya imkan verə bilər.

Ancaq bu başqa bir təlimat olacaq. Və ilk təcrübələrdə göstərildiyi kimi, atlama yuvasının AI sistemi tərəfindən insan kimi tanınmasından əvvəl əhəmiyyətli dəyişikliklərə ehtiyacı olacağını bir müddət tələb edə bilər.

Diqqətinizi aşağıdakı təlimata yönəltmək istərdim: Raspberry Pi və Google Coral TPU birləşməsindən istifadə edərək bir obyekt tapan robotun təsvir edildiyi Obyekt-Tapma-Şəxsi-Köməkçi-Robot-Ft-Raspberry.

Tövsiyə: