جدول المحتويات:

A Hearing Jumping Jack ، إصدار Google Coral TPU Accelerator: 4 خطوات
A Hearing Jumping Jack ، إصدار Google Coral TPU Accelerator: 4 خطوات

فيديو: A Hearing Jumping Jack ، إصدار Google Coral TPU Accelerator: 4 خطوات

فيديو: A Hearing Jumping Jack ، إصدار Google Coral TPU Accelerator: 4 خطوات
فيديو: Grand Theft Auto VI Trailer 1 2024, يوليو
Anonim
مقبس القفز السمعي ، إصدار Google Coral TPU Accelerator
مقبس القفز السمعي ، إصدار Google Coral TPU Accelerator
مقبس القفز السمعي ، إصدار Google Coral TPU Accelerator
مقبس القفز السمعي ، إصدار Google Coral TPU Accelerator
مقبس القفز السمعي ، إصدار Google Coral TPU Accelerator
مقبس القفز السمعي ، إصدار Google Coral TPU Accelerator

إنها تحرك أطرافها ، وتستمع إلى طلباتك ، مدفوعة بأحدث تقنيات التعلم الآلي

"Hearing Jumping Jack" عبارة عن رافعة قفز كهروميكانيكية بسيطة ، يتم تشغيلها بواسطة مؤازرتين صغيرتين وعتاد بسيط للغاية ، لها مصابيح LED كـ "عيون". يتم التحكم فيه عن طريق أوامر صوتية بسيطة تشير إلى أي من المواضع التسعة المحددة مسبقًا يجب أن يتخذها ، أو ما إذا كان يجب تشغيل أو إيقاف تشغيل LED ، أو إذا كان يجب أن يؤدي "رقصة" محددة مسبقًا أو مجموعة عشوائية من الحركات.

العنصر الأساسي في النظام هو مسرع Google Coral TPU ، والذي يسمح بتشغيل نماذج Tensorflow Lite في وضع عدم الاتصال بسرعة عالية جدًا ، حتى على جهاز كمبيوتر "ضعيف" مثل Raspberry Pi. هذا يسمح على سبيل المثال التعرف السريع على الكائن والتصنيف باستخدام كاميرا RPi ، ولكن أيضًا لتشغيل وظائف التعرف على الصوت القائمة على التعلم الآلي محليًا.

على حد علمي ، هذا هو أول مثال منشور لجهاز DIY المادي الذي يعتمد على اكتشاف الصوت من Coral Accelerator ، ويمكن أيضًا استخدام مثال الكود المرفق لمشاريع أخرى أكثر تعقيدًا.

يعتمد التحكم الصوتي على مثال "ثعبان السمع" في "أداة رصد الكلمات الرئيسية للمشروع" (https://github.com/google-coral/project-keyword-spotter) والذي تم وضعه مؤخرًا (سبتمبر 2019) على GitHub. في تكويني ، يتكون النظام من Raspberry Pi 4 المجهز بغطاء محرك Adafruit 16 قناة ، ومسرع Google Coral TPU وكاميرا ويب ، تستخدم هنا كميكروفون. تم وصف Jumping Jack من قبل في تعليمات سابقة ، حيث تم تشغيله بواسطة مجموعة Google Voice لقراءة الأوامر الصوتية ، وهو متصل بـ Servo Bonnet في الإصدار 2.0 الموصوف في ما يلي.

كان للإصدار السابق من Google Voice Kit ثلاثة قيود مركزية: كان يعتمد على خدمات التعرف على الصوت المستندة إلى الويب من Google وكان الإعداد معقدًا نسبيًا ، وكان يتطلب الضغط على نوع من الأزرار قبل أن تتمكن من إعطاء أمر ، وكان هناك تأخير كبير بين قول الأمر واستجابة النظام. يؤدي استخدام Google Coral Accelerator إلى تقليل وقت الاستجابة إلى ثوانٍ ، وهو مستقل عن اتصال الإنترنت ويستمع طوال الوقت. مع بعض التعديلات ، يمكنك استخدامه للتحكم في الأجهزة الأكثر تعقيدًا مثل Jumping Jack ، مثل الروبوتات أو السيارات ، أو أي شيء يمكنك إنشاؤه والتحكم فيه باستخدام Raspberry Pi.

في نسخته الحالية ، يفهم Keyword Spotter مجموعة من حوالي 140 كلمة رئيسية / عبارة رئيسية ، محددة في ملف النموذج المصاحب ("voice_commands_v0.7_egetpu.tflite") والموضحة في ملف تسمية منفصل ("labels_gc2.raw.txt"). يتم تحديدها من خلال ملف قابل للتعديل بحرية ("commands_v2_hampelmann.txt") ، ثم يتم تعيين الكلمات الرئيسية المستخدمة على وجه التحديد بواسطة البرنامج النصي الخاص بنا إلى ضغطات المفاتيح على لوحة مفاتيح افتراضية ، على سبيل المثال للأحرف والأرقام ، أعلى / أسفل / يسار / يمين ، crtl + c ، وما إلى ذلك.

ثم ، على سبيل المثال باستخدام pygame.key ، تتم قراءة "ضغطات المفاتيح" هذه وتستخدم للتحكم في الإجراءات التي يجب أن يقوم بها الجهاز ، هنا قابس القفز. في حالتنا ، هذا يعني دفع المؤازرتين إلى مواضع محددة مسبقًا ، أو تشغيل أو إيقاف تشغيل مصابيح LED. نظرًا لأن أداة مراقبة الكلمات الرئيسية تعمل في مداس منفصل ، فيمكنها الاستماع بشكل دائم إلى طلباتك.

الإصدار 21 سبتمبر 2019

اللوازم

Raspberry Pi 4 ، عبر Pimoroni

Google Coral TPU Accelerator ، عبر Mouser Germany ، 72 يورو

Adafruit 16 Servo Bonnet ، عبر Pimoroni ، حوالي 10 يورو

www.adafruit.com/product/3416

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

رأس المكدس (إذا لزم الأمر)

www.adafruit.com/product/2223

حزمة بطاريات AA 4x (أو مصدر طاقة آخر 5-6 فولت) لـ Servo Bonnet

كاميرا ويب قديمة ، كميكروفون

جاك القفز المؤازر ، كما هو موضح في التعليمات السابقة. رسومات التخطيط مرفقة بالخطوة التالية ، ولكنها قد تتطلب تعديلات.

الأجزاء المطلوبة لجاك القفز:

- لوحة فوركس 3 مم

- عدد 2 أجهزة ميكرو

- براغي وصواميل 2 و 3 مم

- عدد 2 لمبة بيضاء ومقاوم

- قليلا من الكابل

الخطوة 1: إعداد الجهاز

إعداد الجهاز
إعداد الجهاز
إعداد الجهاز
إعداد الجهاز
إعداد الجهاز
إعداد الجهاز

لبناء جاك القفز ، يرجى اتباع التعليمات الواردة في التعليمات السابقة. لقد استخدمت الفوركس في النموذج الأولي الخاص بي ، ولكن يمكنك استخدام ألواح الأكريليك أو الخشب الرقائقي المقطوعة بالليزر. قد تضطر إلى ضبط التخطيط وفقًا لحجم الماكينات وما إلى ذلك. اختبر ما إذا كانت الأطراف والعتاد يمكن أن يتحرك بدون احتكاك.

قم بإعداد Raspberry Pi الخاص بك. في موقع Coral Github ، توجد صورة Raspian متاحة تحتوي على كل ما هو مطلوب لتشغيل مسرّع Coral على Pi ويحتوي على الكثير من المشاريع ، مع وجود جميع الإعدادات بالفعل.

احصل على أداة تحديد الكلمات الرئيسية للمشروع من صفحة Google Coral GitHub. قم بتثبيت جميع البرامج المطلوبة كما هو محدد.

قم بتثبيت الملفات المتوفرة. ضع نص قفز جاك بيثون في مجلد نصاب الكلمات المفتاحية للمشروع وملف الأوامر المقابلة في مجلد التهيئة الفرعي.

قم بتوصيل Adafruit Servo Bonnet بـ Pi. نظرًا لأنني أستخدم حاوية RPI مع مروحة ، فقد احتجت إلى استخدام وحدات تجميع GPIO (على سبيل المثال متوفرة من Pimoroni) لتمكين الاتصال. قم بتثبيت جميع المكتبات المطلوبة ، كما هو موضح في تعليمات Adafruit الخاصة بغطاء المحرك.

قم بتوصيل مصدر طاقة 5-6 فولت بغطاء المحرك المؤازر. إرفاق الماكينات و LEDs. في حالتي ، استخدمت المنفذ 0 لمصابيح LED والمنافذ 11 و 15 لأجهزة الماكينة.

للتحقق من كل شيء ، أوصي بتجربة مثال "سمع ثعبان" الكلمات الرئيسية للمشروع وأمثلة Adafruit servo bonnet أولاً.

الخطوة 2: تشغيل جاك القفز

إذا تم إعداد جميع الأجزاء وتشغيلها ، فحاول استخدامها. يمكنك تشغيل البرنامج النصي في IDE أو من سطر الأوامر.

الصراخ "الموضع 0" إلى "الموضع 9" سوف يستدعي جاك القفز ليأخذ أحد المواضع المحددة مسبقًا. لقد عرّفت "1" على أنه كلا الذراعين لأعلى (uu) ، و "3" على أنه يسار لأعلى ، ويمين لأسفل (ud) ، و "9" على أنه كلا الذراعين لأسفل (dd) و "5" على أنهما يتم توسيط الذراعين (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" مطابق لـ "5". لم يتم التعرف على الرقمين "3" و "8" جيدًا بواسطة أداة مراقبة الكلمات الرئيسية وقد يلزم تكراره.

قد تضطر إلى ضبط القيم الدنيا والقصوى لكل جهاز / جانب بحيث لا يتم حظر الماكينات ثم سحب الكثير من الطاقة.

ستبدأ "اللعبة التالية" "الرقص" ، أي تسلسل محدد للمواقف ، بينما تبدأ "اللعبة العشوائية" Jumping Jack لأداء تسلسل عشوائي من الحركات. في كلتا الحالتين سوف تعمل إلى الأبد ، لذلك قد تضطر إلى إيقاف الحركات ، على سبيل المثال بأمر "الموضع صفر".

"إيقاف اللعبة" سوف يستحضر "ctrl + c" ويوقف العملية.

يمكن استخدام "التبديل" و "إيقاف التشغيل" ، قم بتشغيل وإيقاف تشغيل المصابيح.

من خلال تعديل قيم time.sleep ، يمكنك ضبط سرعة الحركات.

الخطوة 3: الكود وملف الأوامر

الكود المقدم هنا هو تعديل لرمز "ثعبان السمع" الذي يعد جزءًا من حزمة نصاب الكلمات الرئيسية للمشروع. لقد قمت للتو بإزالة أي شيء لم يكن ضروريًا لطلبي ، دون أي فهم حقيقي للتفاصيل. نرحب بأي تحسينات.

ثم أضفت الأجزاء المطلوبة لـ Adafruit Servo Bonnet ، بناءً على ملفات الأمثلة الخاصة بهم.

أود أن أشكر مبرمجي الجزأين.

يمكن العثور على الكود مرفقًا كملف. استخدمه على مسؤوليتك الخاصة ، وقم بتعديله ، وتحسينه ، واللعب معه.

# حقوق الطبع والنشر لعام 2019 لشركة Google LLC

# # مرخص بموجب ترخيص أباتشي ، الإصدار 2.0 ("الترخيص") ؛ # لا يجوز لك استخدام هذا الملف إلا بما يتوافق مع الترخيص. # يمكنك الحصول على نسخة من الترخيص على # # https://www.apache.org/licenses/LICENSE-2.0 # # ما لم يكن مطلوبًا بموجب القانون المعمول به أو تمت الموافقة عليه كتابةً ، يتم توزيع البرنامج # الموزع بموجب الترخيص على "كما هي" ، # بدون ضمانات أو شروط من أي نوع ، سواء كانت صريحة أو ضمنية. # راجع الترخيص للحصول على أذونات تحكم لغة معينة و # قيود بموجب الترخيص. من _future_ استيراد مطلق_استيراد من _future_ قسم الاستيراد من _future_ استيراد print_function استيراد argparse استيراد نظام التشغيل من راندنت الاستيراد العشوائي من استيراد مؤشر الترابط وقت الاستيراد من edgetpu.basic.basic_engine import BasicEngine استيراد نموذج استيراد pygame من pygame.locals import * استيراد قائمة انتظار من نطاق استيراد عشوائي من adafruit_servokit استيراد لوحة استيراد ServoKit استيراد busio import adafruit_pca9685 وقت الاستيراد i2c = busio. I2C (board. SCL و board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (القنوات = 16) # رقم المجموعة عدد القنوات # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000، 2000) # إعدادات أعلى وأوسط وأسفل للأذرع اليمنى واليسرى up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # عدد منفذ المؤازرة ، المؤازرة اليسرى (0-8)

rgt = 11 # عدد منفذ المؤازرة ، المؤازرة اليمنى (0-8) led_channel_0 = hat.channels [0] # LED مضبوط على المنفذ 0 led_channel_0.duty_cycle = 0 # تشغيل LED 100٪ # قائمة إعدادات الذراع لموضع تسعة مواضع = [(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)] # يحدد 9 مواضع JumpingJack ، يشار إليها بالأعداد الصحيحة 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 (self ، الأمر): self._q.put (أمر) فئة التطبيق: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (self، event): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (self، keys): # controls Jumping Jack، Keywords: "position x" key = int (keys) p = position [مفتاح] a = p [0] b = p [1] طباعة ("Position:"، key، "left / right: "، a،" / "، b،" degree ") # sys.stdout.write (" Position: "، key،" left / right: "، a،" / "، b،" degree ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # controls Jumping Jack dance ، الكلمة الرئيسية: "next game" dnce = dance1 sp = (len (dnce)) لـ r في النطاق (sp): # ترتيب الرقص للمواضع ، sp الخطوات dc = dnce [r] if (dc not in range (10)): # print ("input error at position"، sp) dc = 4 p = الموضع [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # يحدد السرعة عدد الحركات def JumpingJack2 (ذاتي ، مفاتيح): # عناصر تحكم مصابيح LED لمقبس القفز ، الكلمات الرئيسية: "تشغيل / إيقاف" led = int (مفاتيح) إذا كان led == 1: led_channel_0.duty_cycle = 0xffff # تشغيل LED بنسبة 100٪ وقت النوم. (0.1) إذا كان الصمام == 0: led_channel_0.duty_cycle = 0 # إيقاف تشغيل وقت LED.sleep (0.1) إذا كان الصمام == 2: # وميض led_channel_0.duty_cycle = 0xffff # تشغيل LED 100٪ time.sleep (0.5) led_channel_0.duty_cycle = 0 # تشغيل LED 100٪ time.sleep (0.5) led_channel_0.duty_cycle = 0xffff # تشغيل LED 100٪ time.sleep (0.5) led_channel_0.duty_cycle = 0 # تشغيل LED 100٪ time.sleep (0.5) led_channel_0.duty_cycle = 0xffff # تشغيل LED 100٪ time.sleep (0.1) def JumpingJack3 (self): # عناصر تحكم Jumping Jack dance ، الكلمة الرئيسية: "random game" # لـ h في النطاق (10): dr = randrange (9) p = position [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # يحدد سرعة الحركات def spotter (self ، args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic هو لا شيء آخر int (args.mic) model.classify_audio (ميكروفون ، محرك ، 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، args):

إذا لم يكن self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) إن لم يكن args.debug_keyboard: t = Thread (target = self.spotter، args = (args،)) t.daemon = True t.start () item = -1 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: حاول: new_item = q.get (صحيح ، 0.1) باستثناء قائمة الانتظار. فارغ: new_item = لا شيء إذا لم يكن new_item بلا: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) أو item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) أو item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) أو item == "right": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_LEFT]) أو item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_UP]) أو item == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) أو item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) أو item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) أو item == "1": self. JumpingJack0 (1) if (args. debug_keyboard and keys [pygame. K_2]) أو item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) أو item == "3": self. JumpingJack0 (3) if (args.debug_keyboard and keys [pygame. K_4]) أو item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_5]) أو item == "5": self. JumpingJack0 (5) if (args.debug_keyboard and keys [pygame. K_6]) أو item == "6": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_7]) أو item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard and keys [pygame. K_8]) أو item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) أو عنصر == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) أو item == "d": self. JumpingJack1 () #dancing Jack ، في "next_game" if (args. debug_keyboard and keys [pygame. K_j]) أو item == "j": self. JumpingJack2 (0) #LED on، ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) أو item ==" k ": self. JumpingJack2 (1) #LED off ، on" swithch off "if (args.debug_keyboard and keys [pygame. K_l]) أو item == "l": self. JumpingJack2 (1) #LED blink "target" if (args.debug_keyboard and keys [pygame. K_r]) أو item == "r": self. JumpingJack3 () #random dance "لعبة عشوائية" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard'، help = 'استخدم لوحة المفاتيح للتحكم في JumpingJack. '، action =' store_true '، افتراضي = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

يوجد أيضًا ملف تكوين الأوامر "commands_v2_hampelmann.txt". قم بالتعديل كما تريد. إنها مجرد قائمة من مجموعات "الأوامر ، المفتاح ، (القوة)" ، بناءً على ملف التسمية.

position_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 ، up ، go_up ، up ، move_down ، down ، go_down ، أسفل ، تحريك للخلف ، يسار ، يتحرك إلى الأمام ، يمين ، انتقال إلى الخلف ، يسار ، انتقال إلى الأمام ، يمين ، 0.8 هدف ، l ، كتم الصوت ، z ، نعم ، y ، لا ، 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،

الخطوة 4: أفكار أخرى وأمثلة أخرى

من الواضح تمامًا أن هذا الإعداد يمكن استخدامه أيضًا للتحكم في الروبوتات أو الأجهزة الأخرى. في الأساس كل شيء يمكن التحكم فيه بواسطة Raspberry Pi.

أنا أعمل على امتداد للبرنامج النصي لقيادة MeArm ، وآمل أن أتمكن من تقديم ذلك في أكتوبر 2019.

أفكر أيضًا في استخدام Jumping Jack كإشارة ، واستخدام برنامج التعرف على موضع الأطراف "project posenet" كأداة لقراءة مواضع Jumping Jack وترجمتها مرة أخرى إلى رقم. وبهذه الطريقة ، قد ينقل النص أيضًا ، نظرًا لأن مواضع 2 × 8 يمكن أن تشير إلى 64 رقمًا مختلفًا ، وهي أكثر من كافية للأبجدية والأرقام والعلامات. يمكن أن يتيح ذلك ، مع تعديل طفيف ، الإدراك المادي لـ IETF المقترح "نقل مخططات بيانات IP عبر نظام إشارات علم Semaphore (SFSS)" (https://tools.ietf.org/html/rfc4824).

لكن هذا سيكون مفيدًا آخر. وكما أشارت التجارب الأولى إلى أن جاك القفز سيحتاج إلى تعديلات كبيرة قبل أن يتعرف عليه نظام الذكاء الاصطناعي كإنسان ، فقد يتطلب ذلك بعض الوقت.

أود أن ألفت انتباهك إلى التعليمات التالية: العثور على الكائن - المساعد الشخصي - الروبوت - Ft-Raspberry ، حيث يتم وصف كائن يعثر على روبوت باستخدام مزيج من Raspberry Pi و Google Coral TPU.

موصى به: