İçindekiler:

Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Versiyon: 4 Adım
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Versiyon: 4 Adım

Video: Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Versiyon: 4 Adım

Video: Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Versiyon: 4 Adım
Video: Part 01 - Moby Dick Audiobook by Herman Melville (Chs 001-009) 2024, Temmuz
Anonim
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Sürümü
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Sürümü
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Sürümü
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Sürümü
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Sürümü
Bir İşitme Atlama Jack, Google Coral TPU Hızlandırıcı Sürümü

Uzuvlarını hareket ettirir, emirlerinizi dinler, en son makine öğrenimi teknolojisiyle hareket eder

"İşitme Atlama Krikosu", iki mikro servo ve çok basit bir dişli tarafından çalıştırılan, "göz" olarak LED'lere sahip, basit bir elektromekanik Atlama Krikosudur. Önceden tanımlanmış dokuz konumdan hangisini alacağını veya LED'in açılıp kapanması gerektiğini veya önceden tanımlanmış bir "dans" mı yoksa rastgele bir dizi hareket mi yapacağını gösteren basit sesli komutlarla kontrol edilir.

Sistemin temel öğesi, Raspberry Pi gibi "zayıf" bir bilgisayarda bile Tensorflow Lite modellerinin çevrimdışı olarak çok yüksek hızda çalıştırılmasına izin veren Google Coral TPU hızlandırıcısıdır. Bu, örn. RPi kamerayı kullanarak hızlı nesne tanımlama ve sınıflandırma, aynı zamanda yerel olarak makine öğrenimi tabanlı ses tanıma işlevlerini çalıştırmak için.

Bildiğim kadarıyla bu, Coral Accelerator ses algılamaya dayalı fiziksel DIY cihazı için yayınlanan ilk örnektir ve ekteki kod örneği daha karmaşık projeler için de kullanılabilir.

Ses kontrolü, yakın zamanda (Eylül 2019) GitHub'a yerleştirilen "project keyword spotter" (https://github.com/google-coral/project-keyword-spotter) içindeki "işiten yılan" örneğine dayanmaktadır. Benim konfigürasyonumda sistem, Adafruit 16 kanal servo kaputu, bir Google Coral TPU Hızlandırıcısı ve burada mikrofon olarak kullanılan bir web kamerası ile donatılmış bir Raspberry Pi 4'ten oluşuyor. Jumping Jack, daha önce sesli komutları okumak için Google Voice kiti tarafından çalıştırıldığı bir önceki talimatta anlatılmıştı, aşağıda açıklanan sürüm 2.0'da Servo Bonnet'e eklenmiştir.

Önceki Google Voice Kit sürümünün üç temel sınırlaması vardı: Google web tabanlı ses tanıma hizmetlerine bağlıydı ve kurulum nispeten karmaşıktı, komut vermeden önce bir tür düğmeye basılması gerekiyordu ve ciddi bir gecikme yaşandı. komutu söylemekle sistemin yanıtı arasında. Google Coral hızlandırıcıyı kullanmak, yanıt süresini saniyelere indirir, internet bağlantısından bağımsızdır ve her zaman dinliyor. Bazı modifikasyonlarla, onu Jumping Jack, robotlar veya arabalar gibi çok daha karmaşık cihazları veya bir Raspberry Pi ile inşa edip kontrol edebileceğiniz her şeyi kontrol etmek için kullanabilirsiniz.

Mevcut sürümünde Anahtar Kelime Bulucu, beraberindeki model dosyasında (“voice_commands_v0.7_egetpu.tflite”) tanımlanan ve ayrı bir etiket dosyasında (“labels_gc2.raw.txt”) açıklanan yaklaşık 140 kısa anahtar kelime/anahtar kelime grubunu anlar.. Serbestçe değiştirilebilen bir dosya (“commands_v2_hampelmann.txt”) tarafından tanımlanan, özellikle betiğimiz tarafından kullanılan anahtar kelimeler daha sonra sanal bir klavyedeki tuş vuruşlarıyla eşleştirilir, örn. harfler, sayılar, yukarı/aşağı/sol/sağ, crtl+c vb. için.

Ardından, ör. pygame.key kullanılarak, bu "tuş vuruşları" okunur ve bir aygıtın, burada atlama jakının hangi eylemleri gerçekleştireceğini kontrol etmek için kullanılır. Bizim durumumuzda bu, iki servoyu önceden tanımlanmış konumlara sürmek veya LED'leri açıp kapatmak anlamına gelir. Anahtar kelime gözlemcisi ayrı bir basamakta çalıştığından, siparişlerinizi kalıcı olarak dinleyebilir.

Sürüm 21 Eylül 2019

Gereçler

Raspberry Pi 4, Pimoroni aracılığıyla

Google Coral TPU Hızlandırıcı, Mouser Almanya aracılığıyla, 72€

Adafruit 16 Servo Kaput, Pimoroni üzerinden, yaklaşık 10 €

www.adafruit.com/product/3416

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

İstifleyici başlığı (gerekirse)

www.adafruit.com/product/2223

Servo Bonnet için 4x AA pil takımı (veya diğer 5-6V güç kaynağı)

Mikrofon olarak eski web kamerası

Bir önceki talimatta açıklandığı gibi, servo tahrikli Jumping Jack. Yerleşim çizimleri bir sonraki adıma eklenmiştir, ancak ayarlamalar gerektirebilir.

Jumping Jack için gerekli parçalar:

- 3 mm Forex plakası

- 2 mikro servo

- 2 ve 3 mm vida ve somunlar

- 2 beyaz LED ve bir direnç

- biraz kablo

Adım 1: Cihazı Ayarlama

Cihazı Ayarlama
Cihazı Ayarlama
Cihazı Ayarlama
Cihazı Ayarlama
Cihazı Ayarlama
Cihazı Ayarlama

Jumping Jack'i oluşturmak için lütfen önceki talimatta verilen talimatları izleyin. Prototipim için Forex kullandım, ancak lazerle kesilmiş akrilik veya kontrplak plakalar kullanabilirsiniz. Servolarınızın boyutuna vs. göre yerleşimi ayarlamanız gerekebilir. Kolların ve dişlilerin sürtünmesiz hareket edip etmediğini test edin.

Raspberry Pi'nizi kurun. Coral Github sitesinde, Coral hızlandırıcıyı Pi'de çalıştırmak için gereken her şeyi içeren ve tüm ayarları yapılmış birçok projeyi içeren bir Raspian görüntüsü mevcuttur.

Google Coral GitHub sayfasından proje anahtar kelime belirleyicisini edinin. Gerekli tüm yazılımları belirtildiği gibi yükleyin.

Sağlanan dosyaları yükleyin. Jumping jack python betiğini proje anahtar sözcüğü gözcü klasörüne ve karşılık gelen komutlar dosyasını config alt klasörüne yerleştirin.

Adafruit Servo Kaputunu Pi'ye takın. Fanlı bir RPI muhafazası kullandığım için, bağlantıyı etkinleştirmek için GPIO istifleyicileri (örneğin Pimoroni'den temin edilebilir) kullanmam gerekiyordu. Servo kaputu için Adafruit talimatlarında belirtildiği gibi gerekli tüm kitaplıkları kurun.

Servo kaputa 5-6V'luk bir güç kaynağı takın. Servoları ve LED'leri takın. Benim durumumda, LED'ler için 0 numaralı bağlantı noktasını ve servolar için 11 ve 15 numaralı bağlantı noktalarını kullandım.

Her şeyi kontrol etmek için, önce proje anahtar kelimesi gözcü "işitme yılanı" örneğini ve Adafruit servo kaput örneklerini denemenizi tavsiye ederim.

Adım 2: Zıplayan Krikoyu Çalıştırmak

Tüm parçalar kurulu ve çalışıyorsa, kullanmayı deneyin. Komut dosyasını IDE'de veya komut satırından çalıştırabilirsiniz.

"Pozisyon 0" ila "konum 9" diye bağırmak, Zıplayan Jack'i önceden tanımlanmış pozisyonlardan birini almaya çağıracaktır. "1"i iki kol yukarı (uu), "3"ü sol yukarı, sağ aşağı (ud), "9"u iki kol aşağı (dd) ve "5"i her iki kol ortalanmış (cc) olarak tanımladım.

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0", "5" ile aynıdır. "3" ve "8" anahtar kelime gözlemcisi tarafından çok iyi tanınmazlar ve tekrar edilmeleri gerekebilir.

Servoların bloke olmaması ve çok fazla güç çekmemesi için her bir servo/taraf için minimum ve maksimum değerleri ayarlamanız gerekebilir.

"sonraki oyun" "dansı", yani tanımlı bir pozisyon dizisini başlatacak, "rastgele oyun" ise rastgele bir hamle dizisini gerçekleştirmek için Jumping Jack'i başlatacaktır. Her iki durumda da sonsuza kadar çalışacaklar, bu nedenle hareketleri durdurmanız gerekebilir, örn. "sıfır konumu" komutuyla.

"stop game" bir "ctrl + c" uyandırır ve işlemi durdurur.

LED'leri açıp kapatmak için "açma" ve "kapatma" kullanılabilir.

time.sleep değerlerini değiştirerek hareketlerin hızını ayarlayabilirsiniz.

Adım 3: Kod ve Komutlar Dosyası

Burada sunulan kod, proje anahtar sözcüğü gözcü paketinin parçası olan "işitme yılanı" kodunun bir modifikasyonudur. Ayrıntıları tam olarak anlamadan, başvurum için gerekli olmayan her şeyi kaldırdım. Herhangi bir iyileştirme açığız.

Daha sonra Adafruit Servo Kaput için gerekli parçaları örnek dosyalarından yola çıkarak ekledim.

Her iki bölümün programcılarına teşekkür etmek istiyorum.

Kodu dosya olarak ekte bulabilirsiniz. Kendi riskleriniz üzerine kullanın, değiştirin, geliştirin, onunla oynayın.

# Telif Hakkı 2019 Google LLC

# # Apache Lisansı, Sürüm 2.0 ("Lisans"); # bu dosyayı Lisansa uygun olmadıkça kullanamazsınız. # Lisansın bir kopyasını # # https://www.apache.org/licenses/LICENSE-2.0 adresinden edinebilirsiniz # # Yürürlükteki yasa tarafından gerekli görülmedikçe veya yazılı olarak kabul edilmedikçe, Lisans kapsamında dağıtılan yazılım # bir "OLDUĞU GİBİ" TEMEL, # açık veya zımni HİÇBİR GARANTİ VEYA KOŞUL OLMAKSIZIN. # Belirli bir dili yöneten izinler ve # Lisans kapsamındaki sınırlamalar için Lisansa bakın. _future_'dan mutlak_import'u _future_'den içe aktar bölümü _future_'den içe aktar print_function içe aktar argparse içe aktar rasgele içe aktar randint'i iş parçacığından içe aktar içe aktar Edgetpu.basic.basic_engine'den iş parçacığı içe aktarma süresi BasicEngine içe aktarma modeli pygame.locals'tan içe aktar pygame. adafruit_servokit'ten import ServoKit import board import busio import adafruit_pca9685 import time i2c = busio. I2C(board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685(i2c) hat.frequency = 60 kit = ServoKit(channels=16) # set numarası kanal sayısı #kit.servo[0].actuation_range = 160 #kit.servo[0].set_pulse_width_range(1000, 2000) # sol ve sağ kollar için yukarı, orta ve aşağı ayarları up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

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

rgt= 11 # servo bağlantı noktası sayısı, sağ servo (0-8) led_channel_0 = hat.channels[0] # bağlantı noktası 0'daki LED seti led_channel_0.duty_cycle = 0 #LED'i aç 100% #dokuz konum konumu için kol ayarları listesi = [(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 tamsayılarla gösterilen 9 JumpingJack pozisyonunu tanımlar dance1 =(0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dans" sınıfı Controler(nesne): #Callback function def _init_(self, q): self._q = q def callback(self), komut): self._q.put(command) class Uygulama: def _init_(self): self._running = Gerçek def on_init(self): pygame.init() self.game_started = Gerçek self._running = Gerçek dönüş Gerçek def on_event(self, event): if event.type == pygame. QUIT: self._running = Yanlış tanım JumpingJack0(self, tuşlar): # kontroller Jumping Jack, anahtar kelimeler: "konum x" tuşu = int(anahtarlar) p = pozisyon [anahtar] a = p[0] b = p[1] yazdır ("Konum: ", anahtar, " sol /sağ: ", a, "/", b, "derece") # sys.stdout.write("Konum: ", anahtar, " sol/sağ: ", a, "/", b, "derece") kit.servo[lft].angle = a kit.servo[rgt].angle = b time.sleep(0.1) def JumpingJack1(self): # kontroller Jumping Jack dance, anahtar kelime: "sonraki oyun" dnce = dance1 sp=(len(dnce)) r aralığında (sp): #konumların dans sırası, sp adımları dc = dnce[r] if (dc aralıkta değil(10)): # print ("giriş hatası ", sp) dc=4 p = konum[dc] a = p[0] b = p[1] kit.servo[lft].angle = a kit.servo[rgt].angle = b time.sleep(0.25) # hızı ayarlar hareketlerin sayısı def JumpingJack2(self, tuşlar): # kontroller Jumping Jack LED'ler, anahtar kelimeler: "aç/kapat" led = int(tuşlar) eğer led == 1: led_channel_0.duty_cycle = 0xffff #LED'i aç 100% time.sleep (0,1) eğer led == 0: led_channel_0.duty_cycle = 0 # led'i kapat zaman.uyku (0,1) eğer led == 2: # yanıp sönen led_channel_0.duty_cycle = 0xffff #LED'i aç 100% time.sleep (0,5) led_channel_0.duty_cycle = 0 #LED'i aç 100% time.sleep (0,5) led_channel_0.duty_cycle = 0xffff #LED'i aç 100% time.sleep (0,5) led_channel_0.duty_cycle = 0 #LED'i aç 100% time.sleep (0,5) led_channel_0.duty_cycle = 0xffff #LED'i aç 100% time.sleep (0,1) def JumpingJack3(kendi kendine): # kontroller Zıplama Jack dansı, anahtar kelime: "rastgele oyun" # aralığında h için (10): dr= randrange (9) p = konum[dr] a = p[0] b = p[1] kit.servo [lft].angle = a kit.servo[rgt].angle = b time.sleep(0.25) # hareketlerin hızını ayarlar def gözcü(self, args): motor = BasicEngine(args.model_file) mic = args.mic ise args.mic başka bir şey değil int(args.mic) model.classify_audio(mic, engine, 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(self, argümanlar):

self.on_init() değilse: self._running = False q = model.get_queue() self._controler = Controler(q) değilse args.debug_keyboard: t = Thread(target=self.spotter, args=(args,)) t.daemon = True t.start() item = self._running: pygame.event.pump() ise args.debug_keyboard: anahtarlar = pygame.key.get_pressed() başka: deneyin: new_item = q.get (Doğru, 0.1) sıra hariç. Empty: new_item = new_item değilse None: item = new_item if (args.debug_keyboard and keys[pygame. K_ESCAPE]) veya item == "stop": self._running = False # if (args.debug_keyboard ve anahtarlar[pygame. K_SPACE]) veya item == "git": # self. JumpingJack0(7) # if (args.debug_keyboard ve anahtarlar[pygame. K_RIGHT]) veya item == "doğru": self. JumpingJack0(6) if (args.debug_keyboard ve anahtarlar[pygame. K_LEFT]) veya item == "left": self. JumpingJack0(4) if (args.debug_keyboard ve anahtarlar[pygame. K_UP]) veya item == " up": self. JumpingJack0(1) if (args.debug_keyboard ve anahtarlar[pygame. K_DOWN]) veya item == "down": self. JumpingJack0(9) if (args.debug_keyboard ve anahtarlar[pygam] e. K_0]) veya item == "0": self. JumpingJack0(0) if (args.debug_keyboard and keys[pygame. K_1]) veya item == "1": self. JumpingJack0(1) if (args. debug_keyboard ve anahtarlar[pygame. K_2]) veya item == "2": self. JumpingJack0(2) if (args.debug_keyboard ve anahtarlar[pygame. K_3]) veya item == "3": self. JumpingJack0(3) if (args.debug_keyboard ve anahtarlar[pygame. K_4]) veya item == "4": self. JumpingJack0(4) if (args.debug_keyboard ve anahtarlar[pygame. K_5]) veya item == "5": self. JumpingJack0(5) if (args.debug_keyboard ve anahtarlar[pygame. K_6]) veya item == "6": self. JumpingJack0(6) if (args.debug_keyboard ve anahtarlar[pygame. K_7]) veya item == "7 ": self. JumpingJack0(7) if (args.debug_keyboard ve anahtarlar[pygame. K_8]) veya item == "8": self. JumpingJack0(8) if (args.debug_keyboard ve anahtarlar[pygame. K_9]) veya item == "9": self. JumpingJack0(9) if (args.debug_keyboard ve anahtarlar[pygame. K_a]) veya item == "d": self. JumpingJack1() #dancing Jack, "next_game" if (args. debug_keyboard ve anahtarlar[pygame. K_j]) veya item == "j": self. JumpingJack2(0) #LED açık, AÇIK " switch_on" if (args.debug_keyboard ve anahtarlar[pygame. K_k]) veya item == "k": self. JumpingJack2(1) #LED kapalı, açık "switch off" if (args.debug_keyboard ve tuşlar[pygame. K_l]) veya item == "l": self. JumpingJack2(1) #LED yanıp sönen "hedef" if (args.debug_keyboard ve anahtarlar[pygame. K_r]) veya item == "r": self. JumpingJack3() #rastgele dans "rastgele oyun" time.sleep(0.05) self.on_cleanup() if _name_ == '_main_': parser = argparse. ArgumentParser() parser.add_argument('--debug_keyboard', help='JumpingJack'i kontrol etmek için klavyeyi kullanın.', action='store_true', default=Yanlış) model.add_model_flags(parser) args = parser.parse_args() the_app = App() the_app.on_execute(args)

Ayrıca "commands_v2_hampelmann.txt" komut yapılandırma dosyası da vardır. İstediğiniz gibi değiştirin. Bu sadece etiket dosyasına dayalı "komut, anahtar, (güç,)" kombinasyonlarının bir listesidir.

pozisyon_sıfır, 0, konum_bir, 1, konum_iki, 2, konum_üç, 3, konum_dört, 4, konum_beş, 5, konum_altı, 6, konum_seven, 7, konum_sekiz, 8, konum_nine, 9, hareket_yukarı, yukarı, yukarı_yukarı, yukarı, hareket_aşağı, aşağı, aşağı_aşağı, aşağı, move_backwards, sol, move_forwards, sağ, go_backwards, sol, go_forwards, sağ, 0,8 hedef, l, mute, z, evet, y, hayır, n, switch_on, j, switch_off, k, volume_up, up, volume_down, down, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Adım 4: Diğer Fikirler ve Diğer Örnekler

Bu ayarın robotları veya diğer cihazları kontrol etmek için de kullanılabileceği oldukça açıktır. Temel olarak bir Raspberry Pi tarafından kontrol edilebilecek her şey.

Bir MeArm sürmek için betiğin bir uzantısı üzerinde çalışıyorum ve bunu Ekim 2019'da sunabilmeyi umuyorum.

Ayrıca Jumping Jack'i bir semafor olarak kullanmayı ve Jumping Jack'in pozisyonlarını okumak ve onu bir sayıya geri çevirmek için "project posenet" uzuv pozisyonu tanıma programını bir araç olarak kullanmayı düşünüyorum. Bu şekilde metni bile iletebilir, verilen 2x 8 pozisyon 64 farklı sayıyı belirtebilir, alfabe, sayılar ve işaretler için fazlasıyla yeterli. Bu, biraz değiştirilmiş olsa da, önerilen IETF "IP Datagramlarının Semafor Bayrak Sinyalleme Sistemi (SFSS) Üzerinden İletimi" (https://tools.ietf.org/html/rfc4824) için fiziksel bir gerçekleştirmeyi mümkün kılabilir.

Ancak bu başka bir öğretilebilir olacak. Ve ilk deneylerin gösterdiği gibi, atlama jakının AI sistemi tarafından insan olarak tanınması için önemli değişikliklere ihtiyaç duyacağını biraz zaman gerektirebilir.

Aşağıdaki talimata dikkatinizi çekmek isterim: Nesne Bulma-Kişisel-Asistan-Robot-Ft-Raspberry, burada Raspberry Pi ve Google Coral TPU kombinasyonunu kullanan bir nesne bulma robotu anlatılıyor.

Önerilen: