Isi kandungan:

Jack Pendengaran Mendengar, Google Coral TPU Accelerator Versi: 4 Langkah
Jack Pendengaran Mendengar, Google Coral TPU Accelerator Versi: 4 Langkah

Video: Jack Pendengaran Mendengar, Google Coral TPU Accelerator Versi: 4 Langkah

Video: Jack Pendengaran Mendengar, Google Coral TPU Accelerator Versi: 4 Langkah
Video: I Have 5 Senses | Hearing | Jack Hartmann Sense of Hearing 2024, November
Anonim
Jack Lompat Pendengaran, Versi Pemecut TPU Karang Google
Jack Lompat Pendengaran, Versi Pemecut TPU Karang Google
Jack Pendengaran Mendengar, Versi Pemecut TPU Karang Google
Jack Pendengaran Mendengar, Versi Pemecut TPU Karang Google
Jack Pendengaran Mendengar, Versi Pemecut TPU Karang Google
Jack Pendengaran Mendengar, Versi Pemecut TPU Karang Google

Ia menggerakkan anggota badannya, mendengar pesanan anda, didorong oleh teknologi pembelajaran mesin terkini

Jack Pendengaran Mendengar adalah Jack Melompat elektromekanik ringkas, didorong oleh dua servo mikro dan gear yang sangat sederhana, dengan LED sebagai "mata". Ia dikendalikan oleh perintah suara sederhana yang menunjukkan dari sembilan kedudukan yang akan diambil, atau jika LED harus dihidupkan atau dimatikan, atau jika ia akan melakukan "tarian" yang telah ditentukan atau gerakan bergerak secara rawak.

Elemen teras sistem ini adalah pemecut TPU Google Coral, yang memungkinkan untuk menjalankan model Tensorflow Lite di luar talian dengan halaju yang sangat tinggi, bahkan pada komputer "lemah" seperti Raspberry Pi. Ini membolehkan mis. pengenalan dan pengkelasan objek yang cepat menggunakan kamera RPi, tetapi juga untuk menjalankan fungsi pengenalan suara berasaskan pembelajaran mesin secara tempatan.

Setahu saya, ini adalah contoh pertama yang diterbitkan untuk peranti DIY fizikal yang didorong oleh pengesanan suara Coral Accelerator, dan contoh kod yang dilampirkan mungkin juga digunakan untuk projek lain yang lebih kompleks.

Alat kawalan suara didasarkan pada contoh "ular pendengaran" dalam "projek kata kunci spotter" (https://github.com/google-coral/project-keyword-spotter) yang baru-baru ini (September 2019) diletakkan di GitHub. Dalam konfigurasi saya, sistem ini terdiri daripada Raspberry Pi 4 yang dilengkapi dengan bonet servo 16 saluran Adafruit, Google Coral TPU Accelerator dan kamera web, di sini digunakan sebagai mikrofon. Jacking Jack telah dijelaskan sebelumnya dalam instruksi sebelumnya, di mana ia didorong oleh kit Google Voice untuk membaca perintah suara, dilampirkan ke Servo Bonnet dalam versi 2.0 yang dijelaskan berikut.

Versi Kit Suara Google sebelumnya mempunyai tiga batasan pusat: bergantung pada perkhidmatan pengecaman suara berasaskan web Google dan penyediaannya agak rumit, ia perlu menekan beberapa jenis butang sebelum anda dapat memberi arahan, dan terdapat kelewatan serius antara mengatakan arahan dan tindak balas sistem. Menggunakan pemecut Google Coral mengurangkan masa tindak balas kepada beberapa saat, tidak bergantung pada sambungan internet dan selalu mendengar. Dengan beberapa pengubahsuaian, anda boleh menggunakannya untuk mengawal peranti yang jauh lebih kompleks seperti Jumping Jack, sebagai robot atau kereta, atau apa sahaja yang boleh anda bina dan kendalikan dengan Raspberry Pi.

Dalam versi terkini Keyword Spotter memahami sekumpulan kira-kira 140 kata kunci pendek / frasa kunci, yang ditentukan dalam fail model yang menyertainya ("voice_commands_v0.7_egetpu.tflite") dan dijelaskan dalam fail label yang berasingan ("labels_gc2.raw.txt"). Didefinisikan oleh fail yang dapat diubah secara bebas ("Command_v2_hampelmann.txt"), kata kunci yang digunakan secara khusus oleh skrip kami kemudian dipetakan ke penekanan tombol pada papan kekunci maya, mis. untuk huruf, nombor, atas / bawah / kiri / kanan, crtl + c, dan lain-lain.

Kemudian, mis. menggunakan pygame.key, "ketukan kekunci" ini dibaca dan digunakan untuk mengawal tindakan mana yang akan dilakukan oleh peranti, di sini jack jumping. Dalam kes ini, ini bermaksud mendorong kedua servo ke kedudukan yang telah ditentukan, atau menghidupkan atau mematikan LED. Oleh kerana kata kunci spotter berjalan dalam langkah yang berasingan, kata kunci dapat mendengarkan pesanan anda secara kekal.

Versi 21 September 2019

Bekalan

Raspberry Pi 4, melalui Pimoroni

Google Coral TPU Accelerator, melalui Mouser Germany, 72 €

Adafruit 16 Servo Bonnet, melalui Pimoroni, sekitar 10 €

www.adafruit.com/product/3416

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

Header stacker (jika diperlukan)

www.adafruit.com/product/2223

Pek bateri 4x AA (atau sumber kuasa 5-6V lain) untuk Servo Bonnet

Kamera web lama, sebagai mikrofon

Jumping Jack yang didorong oleh servo, seperti yang dijelaskan dalam arahan sebelumnya. Lukisan susun atur dilampirkan ke langkah seterusnya, tetapi mungkin memerlukan penyesuaian.

Bahagian yang diperlukan untuk Jumping Jack:

- Plat Forex 3 mm

- 2 servo mikro

- Skru dan mur 2 dan 3 mm

- 2 LED putih dan perintang

- sedikit kabel

Langkah 1: Menyiapkan Peranti

Menyiapkan Peranti
Menyiapkan Peranti
Menyiapkan Peranti
Menyiapkan Peranti
Menyiapkan Peranti
Menyiapkan Peranti

Untuk membina Jumping Jack, ikuti petunjuk yang diberikan dalam arahan sebelumnya. Saya menggunakan Forex untuk prototaip saya, tetapi anda mungkin menggunakan plat akrilik atau papan lapis potong laser. Anda mungkin perlu mengatur susun atur mengikut ukuran servos anda dll. Uji sama ada anggota badan dan gear boleh bergerak tanpa geseran.

Sediakan Raspberry Pi anda. Di laman Coral Github, terdapat gambar Raspian yang berisi semua yang diperlukan untuk menjalankan pemecut Coral pada Pi dan berisi banyak projek, dengan semua tetapan sudah ada.

Dapatkan penunjuk kata kunci projek dari halaman Google Coral GitHub. Pasang semua perisian yang diperlukan seperti yang ditunjukkan.

Pasang fail yang disediakan. Letakkan skrip jumping jack python dalam folder kata kunci projek dan fail arahan yang sesuai dalam subfolder konfigurasi.

Pasang Adafruit Servo Bonnet ke Pi. Oleh kerana saya menggunakan perumahan RPI dengan kipas, saya perlu menggunakan GPIO stacker (mis. Tersedia dari Pimoroni) untuk membolehkan sambungan. Pasang semua perpustakaan yang diperlukan, seperti yang ditunjukkan pada arahan Adafruit untuk servo bonnet.

Pasang sumber kuasa 5-6V ke bonet servo. Pasang servo dan LED. Bagi kes saya, saya menggunakan port 0 untuk LED dan port 11 dan 15 untuk servos.

Untuk memeriksa semuanya, saya cadangkan untuk mencuba contoh kata kunci projek "pendengaran ular" dan contoh bonet servo Adafruit terlebih dahulu.

Langkah 2: Menjalankan Jack Jumping

Sekiranya semua bahagian dipasang dan berjalan, cuba gunakannya. Anda boleh menjalankan skrip di IDE atau dari baris perintah.

Teriakan "kedudukan 0" ke "kedudukan 9" akan membangkitkan Jumping Jack untuk mengambil salah satu kedudukan yang telah ditentukan. Saya mendefinisikan "1" sebagai kedua lengan ke atas (uu), "3" sebagai kiri atas, kanan bawah (ud), "9" sebagai kedua lengan ke bawah (dd) dan "5" kerana kedua-dua lengan berpusat (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" sama dengan "5". "3" dan "8" tidak dikenali dengan baik oleh kata kunci spotter dan mungkin perlu diulang.

Anda mungkin perlu menyesuaikan nilai minimum dan maksimum untuk setiap servo / sisi supaya servo tidak tersekat dan kemudian menarik terlalu banyak tenaga.

"permainan seterusnya" akan memulakan "tarian", iaitu urutan kedudukan yang ditentukan, sementara "permainan rawak" akan memulakan Jack Jumping untuk melakukan urutan pergerakan secara rawak. Dalam kedua-dua kes itu berjalan selama-lamanya, jadi anda mungkin harus menghentikan pergerakan, mis. dengan arahan "kedudukan sifar".

"stop game" akan membangkitkan "ctrl + c" dan menghentikan prosesnya.

"hidupkan" dan "matikan" dapat digunakan menghidupkan dan mematikan LED.

Dengan pengubahsuaian nilai waktu. Tidur anda dapat menyesuaikan halaju pergerakan.

Langkah 3: Kod dan Fail Perintah

Kod yang disajikan di sini adalah pengubahsuaian kod "ular pendengaran" yang merupakan sebahagian daripada pakej spotter kata kunci projek. Saya baru sahaja membuang apa-apa yang tidak diperlukan untuk permohonan saya, tanpa memahami perincian yang sebenar. Sebarang penambahbaikan dialu-alukan.

Saya kemudian menambahkan bahagian yang diperlukan untuk Adafruit Servo Bonnet, berdasarkan fail contohnya.

Saya ingin mengucapkan terima kasih kepada pengaturcara kedua-dua bahagian.

Kod boleh didapati dilampirkan sebagai fail. Gunakan dengan risiko anda sendiri, ubah suai, perbaiki, bermain dengannya.

# Hak Cipta 2019 Google LLC

# # Berlesen di bawah Lesen Apache, Versi 2.0 ("Lesen"); # anda tidak boleh menggunakan fail ini kecuali mematuhi Lesen. # Anda boleh mendapatkan salinan Lesen di # # https://www.apache.org/licenses/LICENSE-2.0 # # Kecuali diperlukan oleh undang-undang yang berlaku atau dipersetujui secara bertulis, perisian # yang diedarkan di bawah Lesen diedarkan pada ASAS "SEBAGAIMANA ADANYA", # TANPA JAMINAN ATAU SYARAT SETIAP JENIS, sama ada tersurat atau tersirat. # Lihat Lesen untuk bahasa tertentu yang mengatur kebenaran dan # batasan di bawah Lesen. dari _future_ import absolute_import dari _future_ import import dari _future_ import print_function import argparse import os dari randint import rawak dari threading import Thread import time dari edgetpu.basic.basic_engine import BasicEngine model import import pygame dari pygame.locals import * import queue dari import rawak dari adafruit_servokit 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 (saluran = 16) # set nombor saluran # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # atas, tengah dan bawah tetapan untuk lengan kiri dan kanan naik_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # bilangan port servo, servo kiri (0-8)

rgt = 11 # bilangan port servo, servo kanan (0-8) led_channel_0 = hat.channels [0] # LED di port 0 led_channel_0.duty_cycle = 0 #hidupkan LED 100% # senarai tetapan lengan untuk kedudukan sembilan kedudukan = [(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)] # mendefinisikan 9 posisi JumpingJack, ditunjukkan oleh bilangan bulat 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 Pengawal (objek): #Callback function def _init _ (self, q): self._q = q def callback (diri, perintah): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = Return yang benar Def benar on_event (self, event): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (self, keys): # kawalan Jumping Jack, kata kunci: "posisi x" kunci = int (kunci) p = kedudukan [kunci] a = p [0] b = p [1] cetak ("Kedudukan:", kunci, "kiri / kanan: ", a," / ", b," darjah ") # sys.stdout.write (" Kedudukan: ", kunci," kiri / kanan: ", a," / ", b," darjah ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # kawalan Jumping Jack dance, kata kunci: "permainan seterusnya" dnce = dance1 sp = (len (dnce)) untuk r dalam rentang (sp): # urutan kedudukan menari, langkah sp dc = dnce [r] jika (dc tidak dalam jarak (10)): # cetak ("ralat input pada kedudukan", sp) dc = 4 p = kedudukan [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # menetapkan halaju pergerakan def JumpingJack2 (diri, kekunci): # kawalan Jumping Jack LED, kata kunci: "hidupkan / matikan" led = int (kekunci) jika dipimpin == 1: led_channel_0.duty_cycle = 0xffff #hidupkan LED 100% masa. tidur (0.1) jika dipimpin == 0: led_channel_0.duty_cycle = 0 # matikan waktu LED. Tidur (0.1) jika dipimpin == 2: # berkedip led_channel_0.duty_cycle = 0xffff #hidupkan LED 100% masa. Tidur (0.5) led_channel_0.duty_cycle = 0 #hidupkan LED 100% masa. tidur (0.5) led_channel_0.duty_cycle = 0xffff #hidupkan LED 100% masa. tidur (0.5) led_channel_0.duty_cycle = 0 #hidupkan LED 100% masa. tidur (0.5) led_channel_0.duty_cycle = 0xffff #hidupkan LED 100% masa. tidur (0.1) def JumpingJack3 (diri): # kawalan Jumping Jack dance, kata kunci: "permainan rawak" # untuk h dalam jarak (10): dr = randrange (9) p = kedudukan [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # menetapkan kelajuan pergerakan def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic jika args.mic is not other int (args.mic) model.classify_audio (mic, engine, labels_file = "config / labels_gc2.raw.txt", commands_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_execute (diri, args):

jika tidak 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 sambil self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () lain: cuba: new_item = q.get (Betul, 0.1) kecuali barisan. Kosong: new_item = Tiada jika new_item tidak Tiada: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) atau item == "stop": self._running = Salah # jika (args.debug_keyboard dan kunci [pygame. K_SPACE]) atau item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard dan kunci [pygame. K_RIGHT]) atau item == "betul": diri. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_LEFT]) atau item == "left": self. JumpingJack0 (4) if (args.debug_keyboard dan kunci [pygame. K_UP]) atau item == " atas ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) atau item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard dan kekunci [pygam e. K_0]) atau item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) atau item == "1": self. JumpingJack0 (1) if (args. debug_keyboard dan kunci [pygame. K_2]) atau item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) atau item == "3": self. JumpingJack0 (3) if (args.debug_keyboard dan kunci [pygame. K_4]) atau item == "4": self. JumpingJack0 (4) if (args.debug_keyboard dan kunci [pygame. K_5]) atau item == "5": diri. JumpingJack0 (5) if (args.debug_keyboard and keys [pygame. K_6]) atau item == "6": self. JumpingJack0 (6) if (args.debug_keyboard dan kunci [pygame. K_7]) atau item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard and keys [pygame. K_8]) atau item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard dan kunci [pygame. K_9]) atau item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) atau item == "d": self. JumpingJack1 () #dancing Jack, pada "next_game" if (args. debug_keyboard dan kekunci [pygame. K_j]) atau item == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard dan kunci [pygame. K_k]) atau item ==" k ": self. JumpingJack2 (1) #LED off, on" swithch off "if (args.debug_keyboard dan kunci [pygame. K_l]) atau item == "l": self. JumpingJack2 (1) #LED blink "target" if (args.debug_keyboard and keys [pygame. K_r]) atau item == "r": self. JumpingJack3 () #random dance "permainan rawak" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Gunakan papan kekunci untuk mengawal JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Terdapat juga fail config perintah "Command_v2_hampelmann.txt". Ubah suai mengikut keinginan anda. Ini hanyalah senarai kombinasi "perintah, kunci, (kekuatan,)", berdasarkan label-fail.

kedudukan_zero, 0, position_one, 1, position_two, 2, position_three, 3, position_four, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, atas, go_up, atas, move_down, down, go_down, bawah, bergerak_kembali, kiri, bergerak_terus ke depan, kanan, go_backwards, kiri, go_forwards, kanan, 0,8 sasaran, l, bisu, z, ya, y, tidak, n, switch_on, j, switch_off, k, volume_up, atas, volume_down, bawah, next_game, d, random_game, r, start_game, s, stop_game, ctrl + c,

Langkah 4: Idea Lanjut dan Contoh Lain

Cukup jelas bahawa tetapan ini juga dapat digunakan untuk mengendalikan robot atau peranti lain. Pada dasarnya semua yang mungkin dikendalikan oleh Raspberry Pi.

Saya sedang berusaha untuk memanjangkan skrip untuk menggerakkan MeArm, dan berharap dapat membentangkannya pada bulan Oktober 2019.

Saya juga mempertimbangkan untuk menggunakan Jumping Jack sebagai semaphore, dan untuk menggunakan program pengenalan kedudukan anggota badan "projek posenet" sebagai alat untuk membaca kedudukan Jumping Jack dan menerjemahkannya kembali ke nombor. Dengan cara ini bahkan dapat menyampaikan teks, memandangkan kedudukan 2x8 dapat menunjukkan 64 nombor yang berbeza, lebih dari cukup untuk abjad, angka dan tanda. Ini dapat memungkinkan, sementara sedikit diubahsuai, realisasi fizikal untuk IETF yang dicadangkan "Penghantaran Datagram dari IP melalui Sistem Pemberitahuan Bendera Semaphore (SFSS)" (https://tools.ietf.org/html/rfc4824).

Tetapi ini akan menjadi petunjuk lain. Dan, seperti percubaan pertama menunjukkan bahawa jack jumping memerlukan pengubahsuaian yang signifikan sebelum ia dikenali sebagai manusia oleh sistem AI mungkin memerlukan sedikit masa.

Saya ingin menarik perhatian anda kepada instruksi berikut: Objek-Mencari-Peribadi-Pembantu-Robot-Ft-Raspberry, di mana robot mencari objek menggunakan kombinasi Raspberry Pi dan Google Coral TPU dijelaskan.

Disyorkan: