Talaan ng mga Nilalaman:

Isang Pagdinig na Tumalon na Jack, Bersyon ng Google Coral TPU Accelerator: 4 na Hakbang
Isang Pagdinig na Tumalon na Jack, Bersyon ng Google Coral TPU Accelerator: 4 na Hakbang

Video: Isang Pagdinig na Tumalon na Jack, Bersyon ng Google Coral TPU Accelerator: 4 na Hakbang

Video: Isang Pagdinig na Tumalon na Jack, Bersyon ng Google Coral TPU Accelerator: 4 na Hakbang
Video: Ross Coulthart: UFOs, Wilson Memos, SAFIRE Project [Part 1] 2024, Hulyo
Anonim
Isang Pandinig na Jumping Jack, Bersyon ng Google Coral TPU Accelerator
Isang Pandinig na Jumping Jack, Bersyon ng Google Coral TPU Accelerator
Isang Pandinig na Jumping Jack, Bersyon ng Google Coral TPU Accelerator
Isang Pandinig na Jumping Jack, Bersyon ng Google Coral TPU Accelerator
Isang Pandinig na Jumping Jack, Bersyon ng Google Coral TPU Accelerator
Isang Pandinig na Jumping Jack, Bersyon ng Google Coral TPU Accelerator

Ginagalaw nito ang mga limbs, nakikinig ito sa iyong mga order, hinihimok ito ng pinakabagong teknolohiya sa pag-aaral ng machine

Ang "Hearing Jumping Jack" ay isang simpleng electromekanical Jumping Jack, na hinihimok ng dalawang micro servos at isang napaka-simpleng gamit, na mayroong mga LED bilang "mga mata". Kinokontrol ito ng mga simpleng utos ng boses na nagpapahiwatig kung alin sa siyam na paunang natukoy na posisyon ang dapat gawin, o kung ang LED ay dapat na i-on o i-off, o kung gagawa ito ng isang paunang natukoy na "sayaw" o random na hanay ng mga galaw.

Ang pangunahing elemento ng system ay ang Google Coral TPU accelerator, na nagbibigay-daan upang patakbuhin ang mga modelo ng Tensorflow Lite offline na may napakataas na tulin, kahit sa isang "mahina" na computer bilang Raspberry Pi. Pinapayagan nito hal. mabilis na pagkakakilanlan ng bagay at pag-uuri gamit ang RPi camera, ngunit din upang patakbuhin nang lokal ang pag-andar ng boses na batay sa pagkatuto ng machine.

Sa aking pagkakaalam ito ang unang nai-publish na halimbawa para sa isang Coral Accelerator na boses na hinihimok ng boses ng pisikal na DIY na aparato, at ang halimbawa ng nakalakip na code ay maaari ding gamitin para sa iba pa, mas kumplikadong mga proyekto.

Ang pagkontrol ng boses ay batay sa halimbawang "ahas sa pandinig" sa "spotter ng keyword ng proyekto" (https://github.com/google-coral/project-keyword-spotter) na kamakailan (Setyembre 2019) ay inilagay sa GitHub. Sa aking pagsasaayos, ang sistema ay binubuo ng isang Raspberry Pi 4 na nilagyan ng isang Adafruit 16 channel servo bonnet, isang Google Coral TPU Accelerator at isang webcam, dito ginamit bilang mikropono. Ang Jumping Jack ay inilarawan dati sa isang nakaraang itinuro, kung saan hinihimok ito ng Google Voice kit na basahin ang mga utos ng boses, ay nakakabit sa Servo Bonnet sa bersyon 2.0 na inilarawan sa sumusunod.

Ang nakaraang bersyon ng Google Voice Kit ay mayroong tatlong mga limitasyong limitasyon: nakasalalay ito sa mga serbisyo sa pagkilala ng boses na nakabatay sa web ng Google at ang pag-setup ay medyo kumplikado, kinakailangan nitong pindutin ang ilang uri ng pindutan bago ka makapagbigay ng isang utos, at mayroong isang seryosong pagkaantala sa pagitan ng pagsasabi ng utos at tugon ng system. Ang paggamit ng Google Coral accelerator ay nagbabawas ng oras ng pagtugon sa mga segundo, ay independiyente sa isang koneksyon sa internet at nakikinig sa lahat ng oras. Sa ilang mga pagbabago maaari mo itong gamitin upang makontrol ang mga aparato na mas kumplikado bilang isang Jumping Jack, bilang mga robot o kotse, o kung ano ang maitatayo at makontrol mo sa isang Raspberry Pi.

Sa kasalukuyang bersyon nito, naiintindihan ng Keyword Spotter ang isang hanay ng halos 140 mga maikling keyword / pangunahing parirala, na tinukoy sa kasamang modelo ng file ("voice_commands_v0.7_egetpu.tflite") at inilarawan sa isang hiwalay na file ng label ("labels_gc2.raw.txt"). Natukoy ng isang malayang nababago na file ("Command_v2_hampelmann.txt"), ang mga keyword na partikular na ginamit ng aming script pagkatapos ay nai-mapa sa mga keystroke sa isang virtual na keyboard, hal. para sa mga titik, numero, pataas / pababa / kaliwa / pakanan, crtl + c, at iba pa.

Pagkatapos, hal. gamit ang pygame.key, ang mga "keystroke" na ito ay binabasa at ginagamit upang makontrol kung aling mga pagkilos ang dapat gampanan ng isang aparato, dito ang jumping jack. Sa aming kaso nangangahulugan ito na himukin ang dalawang servos sa paunang natukoy na mga posisyon, o upang i-on o i-off ang mga LED. Habang tumatakbo ang spotter ng keyword sa isang hiwalay na tread, maaari itong makinig nang tuluyan sa iyong mga order.

Bersyon Setyembre 21, 2019

Mga gamit

Raspberry Pi 4, sa pamamagitan ng Pimoroni

Google Coral TPU Accelerator, sa pamamagitan ng Mouser Germany, 72 €

Adafruit 16 Servo Bonnet, sa pamamagitan ng Pimoroni, mga 10 €

www.adafruit.com/product/3416

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

Header ng stacker (kung kinakailangan)

www.adafruit.com/product/2223

4x AA baterya pack (o iba pang mapagkukunan ng lakas na 5-6V) para sa Servo Bonnet

Lumang webcam, bilang mikropono

Hinimok ni Servo ang Jumping Jack, tulad ng inilarawan sa isang nakaraang itinuro. Ang mga guhit ng layout ay nakakabit sa susunod na hakbang, ngunit maaaring mangailangan ng mga pagsasaayos.

Mga kinakailangang bahagi para sa Jumping Jack:

- 3 mm Forex plate

- 2 micro servos

- 2 at 3 mm na mga tornilyo at mani

- 2 puting LEDs at isang risistor

- isang piraso ng cable

Hakbang 1: Pag-set up ng Device

Pag-set up ng Device
Pag-set up ng Device
Pag-set up ng Device
Pag-set up ng Device
Pag-set up ng Device
Pag-set up ng Device

Upang maitayo ang Jumping Jack, mangyaring sundin ang mga pahiwatig na ibinigay sa isang nakaraang itinuro. Gumamit ako ng Forex para sa aking prototype, ngunit maaari kang gumamit ng mga plate na cut ng acrylic o playwud. Maaaring kailanganin mong ayusin ang layout ayon sa laki ng iyong mga servo atbp Subukin kung ang mga limbs at gear ay maaaring ilipat nang walang alitan.

I-setup ang iyong Raspberry Pi. Sa site ng Coral Github, mayroong magagamit na imahe ng Raspian na naglalaman ng lahat ng kinakailangan upang patakbuhin ang Coral accelerator sa Pi at naglalaman ng maraming mga proyekto, na nasa lugar na ang lahat ng mga setting.

Kunin ang spotter ng keyword ng proyekto mula sa pahina ng Google Coral GitHub. I-install ang lahat ng kinakailangang software tulad ng ipinahiwatig.

I-install ang mga ibinigay na file. Ilagay ang script ng jumping jack python sa folder ng spotter ng keyword ng proyekto at ang file ng mga utos na coresponding sa config subfolder.

Ikabit ang Adafruit Servo Bonnet sa Pi. Habang gumagamit ako ng isang pabahay ng RPI na may isang tagahanga, kailangan kong gumamit ng mga stacker ng GPIO (hal. Magagamit mula sa Pimoroni) upang paganahin ang koneksyon. I-install ang lahat ng kinakailangang mga silid-aklatan, tulad ng ipinahiwatig sa mga tagubilin ng Adafruit para sa servo bonnet.

Ikabit ang isang mapagkukunan ng lakas na 5-6V sa servo bonnet. Maglakip ng mga servo at LED. Ako ang aking kaso, gumamit ako ng port 0 para sa mga LED at port 11 at 15 para sa mga servos.

Upang suriin ang lahat, inirerekumenda kong subukan ang halimbawa ng keyword na spotter na "pandinig ng ahas" at ang mga halimbawa ng Adafruit servo bonnet muna.

Hakbang 2: Pagpapatakbo ng Jumping Jack

Kung ang lahat ng mga bahagi ay na-set up at tumatakbo, subukang gamitin ito. Maaari mong patakbuhin ang script sa IDE o mula sa linya ng utos.

Ang pagsigaw ng "posisyon 0" sa "posisyon 9" ay magpapukaw sa Jumping Jack upang kunin ang isa sa mga paunang natukoy na posisyon. Tinukoy ko ang "1" bilang parehong mga braso pataas (uu), "3" bilang kaliwa pataas, pakanan pababa (ud), "9" bilang parehong mga braso pababa (dd) at "5" bilang parehong mga armas na nakasentro (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

Ang "0" ay magkapareho sa "5". Ang "3" at "8" ay hindi gaanong kinikilala ng spotter ng keyword at maaaring kailanganing ulitin.

Maaaring kailanganin mong ayusin ang minimum at maximum na mga halaga para sa bawat servo / gilid upang ang mga servo ay hindi ma-block at pagkatapos ay gumuhit ng sobrang lakas.

Sisimulan ng "susunod na laro" ang "sayaw", ibig sabihin, isang tinukoy na pagkakasunud-sunod ng mga posisyon, habang ang "random na laro" ay sisimulan ang Jumping Jack upang magsagawa ng isang random na pagkakasunud-sunod ng mga galaw. Sa parehong kaso tatakbo sila magpakailanman, kaya maaaring ihinto mo ang paggalaw, hal. na may isang "posisyon zero" na utos.

Ang "stop game" ay pukawin ang isang "ctrl + c" at ititigil ang proseso.

Ang "switch on" at "switch off" ay maaaring magamit i-on at i-off ang mga LED.

Sa pamamagitan ng pagbabago ng oras. Mga halagang natutulog maaari mong ayusin ang bilis ng paggalaw.

Hakbang 3: Ang Code at ang File ng Mga Utos

Ang ipinakita na code dito ay isang pagbabago ng code na "pandinig ng ahas" na bahagi ng pakete ng spotter ng keyword ng proyekto. Inalis ko lang ang anumang hindi kinakailangan para sa aking aplikasyon, nang walang anumang tunay na pag-unawa sa mga detalye. Anumang mga pagpapabuti ay maligayang pagdating.

Pagkatapos ay idinagdag ko ang mga bahaging kinakailangan para sa Adafruit Servo Bonnet, batay sa kanilang mga halimbawang mga file.

Nais kong pasalamatan ang mga programmer ng parehong bahagi.

Ang code ay maaaring matagpuan naka-attach bilang file. Gamitin ito sa iyong sariling mga panganib, baguhin ito, pagbutihin ito, i-play ito.

# Copyright 2019 Google LLC

# # Lisensyado sa ilalim ng Lisensya ng Apache, Bersyon 2.0 (ang "Lisensya"); # hindi mo maaaring gamitin ang file na ito maliban sa pagsunod sa Lisensya. # Maaari kang makakuha ng isang kopya ng Lisensya sa # # https://www.apache.org/licenses/LICENSE-2.0 # # Maliban kung hinihiling ng naaangkop na batas o sumang-ayon sa pagsulat, ang software # na ipinamamahagi sa ilalim ng Lisensya ay ipinamamahagi sa isang "AS IS" BATAYAN, # NG WALANG mga garantiya O KUNDISYON NG ANUMANG URI, alinman sa pagpapahayag o ipinahiwatig. # Tingnan ang Lisensya para sa tukoy na mga pahintulot sa pamamahala ng wika at # mga limitasyon sa ilalim ng Lisensya. mula sa _future_ import absolute_import mula sa _future_ import division mula sa _future_ import print_unction import argparse import os mula sa random import randint mula sa threading import Thread import time mula sa edgetpu.basic.basic_engine import BasicEngine import model import pygame mula sa pygame.locals import * import pila mula sa random import randrange mula sa adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 oras ng pag-import i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (channel = 16) # set number ng mga channel # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # pataas, gitna at pababang mga setting para sa kaliwa at kanang mga braso up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # bilang ng servo port, kaliwang servo (0-8)

rgt = 11 # bilang ng servo port, kanang servo (0-8) led_channel_0 = hat.channels [0] # LED na nakatakda sa port 0 led_channel_0.duty_cycle = 0 #turn on LED 100% #list ng mga setting ng braso para sa siyam na posisyon ng posisyon = [(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)] # ang tumutukoy sa 9 na mga posisyon ng JumpingJack, na ipinahiwatig ng mga integer 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dance" class Controler (object): #Callback function def _init _ (self, q): self._q = q def callback (sarili, utos): self._q.put (utos) klase 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 (sarili, kaganapan): kung event.type == pygame. QUIT: self._running = Maling def JumpingJack0 (sarili, key): # kinokontrol ang Jumping Jack, mga keyword: "posisyon x" key = int (key) p = posisyon [key] a = p [0] b = p [1] print ("Posisyon:", key, "naiwan / kanan: ", a," / ", b," degree ") # sys.stdout.write (" Posisyon: ", key," left / right: ", a," / ", b," degree ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.s Sleep (0.1) def JumpingJack1 (self): # kinokontrol ang Jumping Jack dance, keyword: "susunod na laro" dnce = dance1 sp = (len (dnce)) para sa r sa saklaw (sp): #sayawan ng pagkakasunud-sunod ng mga posisyon, sp hakbang dc = dnce [r] kung (dc wala sa saklaw (10)): # print ("error sa pag-input sa posisyon", sp) dc = 4 p = posisyon [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sulog (0.25) # nagtatakda ng tulin ng mga paggalaw def JumpingJack2 (sarili, mga key): # kinokontrol ang Jumping Jack LEDs, mga keyword: "switch on / off" led = int (keys) kung pinangunahan == 1: led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sulog (0.1) kung humantong == 0: led_channel_0.duty_cycle = 0 # patayin ang oras ng LED. Tulog (0.1) kung humantong == 2: # blink led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sulog (0.5) led_channel_0.duty_cycle = 0 #turn on LED 100% time. sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.s Sleep (0.5) led_channel_0.duty_cycle = 0 #turn on LED 100% time.s Sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.s Sleep (0.1) def JumpingJack3 (self): # kinokontrol ang Jumping Jack dance, keyword: "random game" # para sa saklaw (10): dr = randrange (9) p = posisyon [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.s Sleep (0.25) # nagtatakda ng tulin ng mga paggalaw def spotter (sarili, args): engine = BasicEngine (args.model_file) mic = args.mic kung Ang args.mic ay Wala ng iba pang int (args.mic) model.classify_audio (mic, engine, labels_file = "config / labels_gc2.raw.txt", Command_file = "config / Command_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_execut (self, args):

kung hindi self.on_init (): self._running = Mali q = model.get_queue () self._controler = Controler (q) kung hindi args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 habang sarili._running: pygame.event.pump () kung args.debug_keyboard: keys = pygame.key.get_pressed () iba pa: subukan: new_item = q.get (Totoo, 0.1) maliban sa pila. Edomy: new_item = Wala kung ang new_item ay wala: item = new_item kung (args.debug_keyboard at mga key [pygame. K_ESCAPE]) o item == "stop": self._running = Mali # kung (args.debug_keyboard at mga key [pygame. K_SPACE]) o item == "go": # self. JumpingJack0 (7) # kung (args.debug_keyboard at mga key [pygame. K_RIGHT]) o item == "kanan": sarili. JumpingJack0 (6) kung (args.debug_keyboard at mga key [pygame. K_LEFT]) o item == "left": self. JumpingJack0 (4) kung (args.debug_keyboard at mga key [pygame. K_UP]) o item == " pataas ": self. JumpingJack0 (1) kung (args.debug_keyboard at mga key [pygame. K_DOWN]) o item ==" down ": self. JumpingJack0 (9) kung (args.debug_keyboard at mga key [pygam e. K_0]) o item == "0": self. JumpingJack0 (0) kung (args.debug_keyboard at mga key [pygame. K_1]) o item == "1": self. JumpingJack0 (1) kung (args. debug_keyboard at mga key [pygame. K_2]) o item == "2": self. JumpingJack0 (2) kung (args.debug_keyboard at mga key [pygame. K_3]) o item == "3": self. JumpingJack0 (3) kung (args.debug_keyboard at mga key [pygame. K_4]) o item == "4": self. JumpingJack0 (4) kung (args.debug_keyboard at mga key [pygame. K_5]) o item == "5": sarili. JumpingJack0 (5) kung (args.debug_keyboard at mga key [pygame. K_6]) o item == "6": self. JumpingJack0 (6) kung (args.debug_keyboard at mga key [pygame. K_7]) o item == "7 ": self. JumpingJack0 (7) kung (args.debug_keyboard at mga key [pygame. K_8]) o item ==" 8 ": self. JumpingJack0 (8) kung (args.debug_keyboard at mga key [pygame. K_9]) o item == "9": self. JumpingJack0 (9) kung (args.debug_keyboard at mga key [pygame. K_a]) o item == "d": self. JumpingJack1 () #dancing Jack, sa "next_game" kung (args. debug_keyboard at mga key [pygame. K_j]) o item == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "kung (args.debug_keyboard at mga key [pygame. K_k]) o item ==" k ": self. JumpingJack2 (1) #LED off, sa" swithch off "kung (args.debug_keyboard at mga key [pygame. K_l]) o item == "l": self. JumpingJack2 (1) #LED blink "target" kung (args.debug_keyboard at mga key [pygame. K_r]) o item == "r": self. JumpingJack3 () #random dance oras na "random game". tulog (0.05) self.on_cleanup () kung _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Gamitin ang keyboard upang makontrol ang JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execut (args)

Mayroon ding command config file na "Command_v2_hampelmann.txt". Baguhin ayon sa gusto mo. Listahan lamang ito ng mga kumbinasyon na "utos, susi, (lakas,), batay sa label-file.

posisyon_zero, 0, position_one, 1, position_two, 2, posisyon_three, 3, position_four, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, pataas, go_up, pataas, ilipat_down, down, go_down, pababa, ilipat_ pabalik, kaliwa, ilipat_pasa, kanan, go_backward, kaliwa, go_forward, kanan, 0.8 target, l, pipi, z, oo, y, hindi, n, switch_on, j, switch_off, k, volume_up, pataas, volume_down, pababa, next_game, d, random_game, r, start_game, s, stop_game, ctrl + c,

Hakbang 4: Karagdagang Mga Ideya at Iba Pang Mga Halimbawa

Ito ay lubos na halata na ang setting na ito ay maaari ding magamit upang makontrol ang mga robot o iba pang mga aparato. Talaga lahat ng maaaring kontrolin ng isang Raspberry Pi.

Nagtatrabaho ako sa isang extension ng script upang humimok ng isang MeArm, at inaasahan na maipakita ito sa Oktubre 2019.

Isinasaalang-alang ko rin na gamitin ang Jumping Jack bilang isang semaphore, at gamitin ang program na pagkilala sa posisyon ng "project posenet" bilang isang tool upang basahin ang mga posisyon ng Jumping Jack at isalin ito pabalik sa isang numero. Sa ganitong paraan maaari itong makipag-usap sa teksto, na binigyan ng 2x 8 na posisyon ay maaaring magpahiwatig ng 64 magkakaibang numero, higit sa sapat para sa alpabeto, numero at palatandaan. Maaari nitong paganahin, habang bahagyang nabago, isang pisikal na pagsasakatuparan para sa ipinanukalang IETF na "Ang Paghahatid ng mga IP Datagram sa Semaphore Flag Signaling System (SFSS)" (https://tools.ietf.org/html/rfc4824).

Ngunit ito ay magiging ibang itinuturo. At, tulad ng ipinahiwatig ng mga unang eksperimento na ang jumping jack ay mangangailangan ng makabuluhang mga pagbabago bago ito makilala bilang tao ng AI system ay maaaring mangailangan ng ilang oras.

Nais kong iguhit ang iyong pansin sa sumusunod na itinuturo: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, kung saan ang isang object sa paghahanap ng robot na gumagamit ng isang kombinasyon ng isang Raspberry Pi at Google Coral TPU ay inilarawan.

Inirerekumendang: