التعرّف على الكلام باستخدام الذكاء الاصطناعي مع TensorFlow Lite لوحدات التحكّم الدقيقة وSparkFun Edge

1. مقدمة

ما الذي ستنشئه

في هذا الدرس التطبيقي حول الترميز، سنتعلّم كيفية استخدام TensorFlow Lite For Microcontrollers لتشغيل نموذج تعلُّم متعمق على SparkFun Edge Development Board. سنعمل على نموذج الكشف عن الكلام المدمج في اللوحة، والذي يستخدم شبكة عصبية التفافية لاكتشاف الكلمات "نعم" و"لا" يتم التحدث بها عبر الميكروفونين في اللوحة.

bf256d403a1821af.gif

تعلُّم الآلة على وحدات التحكّم الدقيقة

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

تُعد وحدات التحكم الدقيقة شائعة للغاية، ورخيصة، وتتطلب القليل من الطاقة، وموثوقة جدًا. وهي تشكّل جزءًا من جميع أنواع الأجهزة المنزلية، مثل الأجهزة المنزلية والسيارات والألعاب. وفي الواقع، يتم إنتاج حوالي 30 مليار جهاز يعمل بوحدة تحكم دقيقة كل عام.

1360b61fbfa33657.jpeg

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

TensorFlow Lite لأجهزة التحكّم الدقيقة (البرامج)

358ffdb9eb758b90.png

TensorFlow هو إطار عمل مفتوح المصدر من Google لتعلُّم الآلة يهدف إلى تدريب النماذج وتشغيلها. TensorFlow Lite هو إطار عمل برمجي، وهو إصدار مُحسَّن من TensorFlow يستهدف تشغيل نماذج TensorFlow على الأجهزة الصغيرة منخفضة الطاقة نسبيًا، مثل الهواتف الجوّالة.

TensorFlow Lite لوحدات التحكّم الدقيقة هو إطار عمل برمجي، وهو إصدار محسّن من TensorFlow يستهدف تشغيل نماذج TensorFlow على أجهزة صغيرة منخفضة الطاقة، مثل وحدات التحكّم الدقيقة. كما أنها تلتزم بالقيود المطلوبة في هذه البيئات المضمنة، أي أنها ذات حجم ثنائي صغير، ولا تتطلب دعم نظام التشغيل، أو أي مكتبات C أو C++ قياسية، أو تخصيص ذاكرة ديناميكي، وما إلى ذلك.

SparkFun Edge (الأجهزة)

SparkFun Edge هي منصة تستند إلى وحدة تحكُّم دقيقة: وهي عبارة عن جهاز كمبيوتر صغير على لوحة دائرة كهربائية واحدة. فهو يضم معالجًا وذاكرة وأجهزة إدخال وإخراج ما تسمح له بإرسال إشارات رقمية واستقبالها إلى أجهزة أخرى. ويتضمن أربعة مصابيح LED يمكن التحكم فيها باستخدام البرامج، بألوان Google المفضلة.

aa4493835a2338c6.png

على عكس الكمبيوتر، لا تقوم وحدة التحكم الدقيقة بتشغيل نظام التشغيل. بدلاً من ذلك، يتم تشغيل البرامج التي تكتبها مباشرةً على الأجهزة. أنت تكتب الرمز على جهاز كمبيوتر وتنزّله على وحدة التحكم الدقيقة عبر جهاز يسمى المبرمج.

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

المعلومات التي ستطّلع عليها

  • قم بتجميع نموذج البرنامج الخاص بـ SparkFun Edge على جهاز الكمبيوتر الخاص بك
  • نشر البرنامج على جهازك
  • إجراء التغييرات على البرنامج ونشره مرة أخرى

المتطلبات

ستحتاج إلى الأجهزة التالية:

ستحتاج إلى البرامج التالية:

  • Git (تحقَّق مما إذا كان مثبّتًا من خلال تشغيل git في سطر الأوامر)
  • Python 3 (التحقق مما إذا كان مثبّتًا من خلال تشغيل python3 أو python --version في سطر الأوامر)
  • Pip للغة Python 3 ( إجابة مفيدة من StackOverflow)
  • إنشاء الإصدار 4.2.1 أو إصدار أحدث (التحقّق مما إذا كان مثبتًا من خلال تشغيل make --version في سطر الأوامر)
  • برامج تشغيل SparkFun Serial Basic

2. إعداد الأجهزة

تأتي وحدة التحكم الدقيقة SparkFun Edge مزودة ببرنامج ثنائي مثبت مسبقًا يمكنه تشغيل نموذج الكلام. قبل أن نستبدل هذا بإصدارنا الخاص، لنقم أولاً بتشغيل هذا النموذج.

تعزيز قوة اللوحة من خلال:

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

25a6cc6b208e8a4e.png

  1. إذا لم يكن لديك بطارية معدنية، يمكنك استخدام جهاز المبرمج SparkFun USB-C Serial Basic لتشغيل اللوحة. لتوصيل هذا الجهاز باللوح، عليك اتّباع الخطوات التالية:
  • حدِّد موقع رأس الدبوس على جانب SparkFun Edge.
  • يُرجى توصيل SparkFun USB-C Serial Basic بهذه الدبابيس، مع الحرص على تثبيت الدبابيس التي تحمل التصنيف "BLK". و"GRN" الموجودة على كل جهاز بشكل صحيح.
  • وصِّل كابل USB-C بين جهاز SparkFun USB-C Serial Basic وجهاز الكمبيوتر.

b140822f0019f92a.png

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

إن نموذج التعلم الآلي الموجود على اللوحة مدرب على التعرف على كلمات "نعم" و"لا"، ولرصد وجود وغياب الكلام. كما أنه ينقل نتائجه عن طريق إضاءة مصابيح LED ملونة. يوضّح الجدول التالي معنى كل لون LED:

نتيجة الرصد

لون مصباح LED

"نعم"

أصفر

"لا"

أحمر

كلام غير معروف

أخضر

لم يتم اكتشاف أي حديث

لا تتوفّر مصابيح LED

التجربة الآن

ضَع السبورة على فمك وقل "نعم" بضع مرات. سيظهر لك وميض مصباح LED أصفر. إذا لم يحدث شيء عند قول "نعم"، إليك بعض الإجراءات التي يمكنك تجربتها:

  • احمل السبورة مقاس 10 بوصات تقريبًا من فمك
  • تجنُّب الضوضاء في الخلفية
  • تكرار بـ "نعم" عدة مرات بتتابع سريع (جرِّب قول "نعم نعم نعم")

3- إعداد البرنامج

سنتولى الآن تنزيل نموذج الكلام وتثبيته على وحدة التحكم الدقيقة بأنفسنا. لهذا، نقوم أولاً بتنزيل رمز المصدر لهذا البرنامج والتبعيات التي نحتاجها لإنشائها. البرنامج مكتوب بلغة C++، والذي يجب تجميعه في برنامج ثنائي قبل تنزيله على اللوحة. البرنامج الثنائي هو ملف يحتوي على البرنامج في شكل يمكن تشغيله مباشرة بواسطة جهاز SparkFun Edge.

تمت كتابة التعليمات التالية لنظام التشغيل Linux أو MacOS.

تنزيل مستودع TensorFlow

يتوفر الرمز في مستودع TensorFlow على GitHub، في الموقع التالي:

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro

افتح وحدة طرفية على جهاز الكمبيوتر، وانتقل إلى دليل تخزن فيه عادةً مشاريع الترميز، ونزِّل مستودع TensorFlow وأدخِل الدليل الذي تم إنشاؤه، كما هو موضّح أدناه:

cd ~  # change into your home (or any other) directory
git clone --depth 1 https://github.com/tensorflow/tensorflow.git
cd tensorflow

تنزيل اعتماديات بايثون

سوف نستخدم بايثون 3 لإعداد البرنامج الثنائي وتحميله على الجهاز. تعتمد نصوص بايثون البرمجية على توفر مكتبات معينة. شغِّل الأمر التالي لتثبيت هذه التبعيات:

pip3 install pycrypto pyserial --user

4. أنشِئ البرنامج الثنائي وحضِّره

سننشئ البرنامج الثنائي ونشغِّل الأوامر التي تعدّه للتنزيل على الجهاز.

إنشاء البرنامج الثنائي

لتنزيل جميع التبعيات المطلوبة وإنشاء البرنامج الثنائي، شغِّل الأمر التالي:

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge micro_speech_bin

إذا كان الإصدار يعمل بنجاح، من المفترض أن يظهر السطر الأخير من النتائج على النحو التالي:

arm-none-eabi-objcopy tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin -O binary

للتأكّد من إنشاء البرنامج الثنائي بنجاح، شغِّل الأمر التالي:

test -f \
tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin && \
 echo "Binary was successfully created" || echo "Binary is missing"

من المفترض أن تتم طباعة "Binary was successfully created" على وحدة التحكّم. إذا ظهر لك الإصدار Binary is missing، يعني هذا أنّ هناك مشكلة في عملية الإصدار تتطلّب تصحيح الأخطاء.

تحضير البرنامج الثنائي

ويجب توقيع البرنامج الثنائي باستخدام مفاتيح تشفير لنشره على الجهاز. سنشغل الآن بعض الأوامر التي ستوقِّع البرنامج الثنائي لكي يمكن تنزيله إلى SparkFun Edge.

أدخل الأمر التالي لإعداد بعض مفاتيح التشفير الوهمية التي يمكننا استخدامها في التطوير:

cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py

قم الآن بتشغيل الأمر التالي لإنشاء برنامج ثنائي بعلامة:

python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \
--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \
--load-address 0xC000 \
--magic-num 0xCB \
-o main_nonsecure_ota \
--version 0x0

سيؤدي هذا إلى إنشاء الملف main_nonsecure_ota.bin. سنشغِّل الآن أمرًا آخر لإنشاء نسخة نهائية من الملف يمكن استخدامها لتثبيت نص برنامج الإقلاع على جهازنا باستخدام النص البرمجي لبرنامج الإقلاع في الخطوة التالية:

python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \
--load-address 0x20000 \
--bin main_nonsecure_ota.bin \
-i 6 \
-o main_nonsecure_wire \
--options 0x1

يُفترض أن يكون لديك الآن ملف باسم main_nonsecure_wire.bin في الدليل الذي تم فيه تنفيذ الأوامر. هذا هو الملف الذي سنضيفه إلى الجهاز.

5- استعِدّ وميض البرنامج الثنائي

ما هي الإعلانات الوامضة؟

يخزن SparkFun Edge البرنامج قيد التشغيل حاليًا في ذاكرة الفلاش بسعة 512 كيلوبايت. إذا أردنا أن تقوم اللوحة بتشغيل برنامج جديد، فيجب علينا إرساله إلى اللوحة، والذي سيخزنه في ذاكرة الفلاش، ويستبدل أي برنامج تم حفظه مسبقًا.

تسمى هذه العملية "وميض"، وسنستخدمها لإرسال برنامجنا إلى اللوحة.

تركيب المبرمج باللوحة

لتنزيل برامج جديدة إلى اللوحة، سنستخدم المبرمج التسلسلي SparkFun USB-C Serial Basic. يتيح هذا الجهاز لجهاز الكمبيوتر الاتصال بوحدة التحكم الدقيقة عبر USB.

لتوصيل هذا الجهاز باللوح، عليك اتّباع الخطوات التالية:

  1. حدِّد موقع رأس الدبوس على جانب SparkFun Edge.
  2. يُرجى توصيل SparkFun USB-C Serial Basic بهذه الدبابيس، مع الحرص على تثبيت الدبابيس التي تحمل التصنيف "BLK". و"GRN" الموجودة على كل جهاز بشكل صحيح.

b140822f0019f92a.png

إرفاق البرنامج بجهاز الكمبيوتر

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

قبل توصيل الجهاز عبر USB، شغِّل الأمر التالي:

If you are using Linux: ls /dev/tty*
If you are using MacOS: ls /dev/cu*

من المفترض أن يؤدي ذلك إلى إخراج قائمة بالأجهزة المتصلة والتي تبدو كما يلي:

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC

والآن، عليك توصيل البرنامج بمنفذ USB في جهاز الكمبيوتر. أدخِل الأمر التالي مرة أخرى:

If you are using Linux: ls /dev/tty*
If you are using MacOS: ls /dev/cu*

ومن المفترض أن يظهر لك عنصر إضافي في الناتج، كما في المثال أدناه. قد يكون للعنصر الجديد اسم مختلف. هذا العنصر الجديد هو اسم الجهاز.

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC
/dev/cu.wchusbserial-1450

أولاً، سنقوم بإنشاء متغير بيئة لتحديد اسم الجهاز:

export DEVICENAME=put your device name here

بعد ذلك، سننشئ متغيّر بيئة لتحديد معدّل الباود، وهو السرعة التي سيتم بها إرسال البيانات إلى الجهاز:

export BAUD_RATE=921600

6- وميض البرنامج الثنائي

تنفيذ النص البرمجي وميض

ومضغتها في "برنامج تحميل تشغيل" خاص التي تُعِدّها لتلقي البرنامج الثنائي الجديد. سنقوم بعد ذلك بتشغيل نص برمجي لإرسال البرنامج الثنائي إلى اللوحة.

دعنا نتعرف على الأزرار التالية على اللوحة:

64c620570b9d2f83.png

نفذ الخطوات التالية لإعادة تعيين اللوحة ومضغها:

  1. تأكد من توصيل اللوحة بالمبرمج، وتوصيل الإعداد بالكامل بالكمبيوتر عبر USB.
  2. البدء بالضغط على الزر الذي يحمل علامة 14 على اللوحة. واصِل الضغط على الزر حتى الخطوة 6.
  3. الاستمرار في الضغط على الزر الذي تم وضع علامة 14 عليه لإعادة ضبط اللوحة على حالة برنامج الإقلاع، انقر على الزر الذي يحمل علامة RST لإعادة ضبطها.
  4. مع الاستمرار في الضغط على الزر الذي تم وضع علامة 14 عليه، الصق الأمر التالي في الوحدة الطرفية واضغط على Enter لتشغيله (لتسهيل الأمر، يمكنك لصق هذا الأمر في الوحدة الطرفية قبل بدء الضغط على الزر، ولكن لا تضغط على مفتاح enter حتى تصل إلى هذه الخطوة)
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py -b ${BAUD_RATE} ${DEVICENAME} -r 1 -f main_nonsecure_wire.bin -i 6
  1. مع الاستمرار في الضغط على الزر الذي تم وضع علامة 14 عليه، من المفترض أن يظهر لك الآن على الشاشة شيئًا كالتالي:
Connecting with Corvette over serial port /dev/cu.usbserial-1440...
Sending Hello.
Received response for Hello
Received Status
length =  0x58
version =  0x3
Max Storage =  0x4ffa0
Status =  0x2
State =  0x7
AMInfo =
0x1
0xff2da3ff
0x55fff
0x1
0x49f40003
0xffffffff
[...lots more 0xffffffff...]
Sending OTA Descriptor =  0xfe000
Sending Update Command.
number of updates needed =  1
Sending block of size  0x158b0  from  0x0  to  0x158b0
Sending Data Packet of length  8180
Sending Data Packet of length  8180
[...lots more Sending Data Packet of length  8180...]
  1. توقف عن الضغط على الزر الذي يحمل علامة 14 على اللوحة بعد رؤية Sending Data Packet of length 8180 (ولكن لا بأس إذا استمررت في الضغط عليه). سيستمر البرنامج في طباعة الأسطر على الوحدة الطرفية. وسيبدو في النهاية كما يلي:
[...lots more Sending Data Packet of length  8180...]
Sending Data Packet of length  8180
Sending Data Packet of length  6440
Sending Reset Command.
Done.

إذا ظهرت لك السمة Done، يعني ذلك أنّ وميض ناجح. إذا انتهت نتيجة البرنامج بخطأ، تحقّق مما إذا تمت طباعة Sending Reset Command. إذا كان الأمر كذلك، فمن المحتمل أن يكون الوميض ناجحًا على الرغم من الخطأ.

على جهاز Linux، قد تواجه NoResponse Error. ويرجع ذلك إلى أنّه تم تثبيت برنامج التشغيل التسلسلي ch34x إلى جانب برنامج التشغيل التسلسلي الحالي، والذي يمكن حله على النحو التالي:

الخطوة 1: إعادة تثبيت الإصدار الصحيح من مكتبة ch34x تأكَّد من فصل الجهاز عن الكمبيوتر أثناء التثبيت.

git clone https://github.com/juliagoda/CH341SER.git
cd CH341SER/
make
sudo insmod ch34x.ko
sudo rmmod ch341

الخطوة 2: وصِّل لوحة USB وشغِّل:

dmesg | grep "ch34x"

من المفترض أن تظهر لك رسالة مثل هذه:

[ 1299.444724]  ch34x_attach+0x1af/0x280 [ch34x]
[ 1299.445386] usb 2-13.1: ch34x converter now attached to ttyUSB0

إذا لم يكن برنامج التشغيل المستخدَم "ch34x" (على سبيل المثال: ch341)، جرب تعطيل برنامج التشغيل الآخر من خلال تشغيل:

rmmod <non-ch34x driver name>

يُرجى فصل الجهاز ثم إعادة توصيله والتأكّد من أنّ برنامج التشغيل المُستخدَم "ch34x".

7. عرض توضيحي

تجربة البرنامج

بعد وميض لوحك بنجاح، اضغط على الزر الذي يحمل علامة .

RST لإعادة تشغيل اللوحة وبدء البرنامج. إذا بدأ ضوء LED الأزرق في الوميض، يعني ذلك أنّ وميضًا ناجحًا. إذا لم ينجح الأمر، انتقِل للأسفل إلى القسم "ماذا لو لم يعمل التطبيق؟" أدناه.

bf256d403a1821af.gif

إن نموذج التعلم الآلي الموجود على اللوحة مدرب على التعرف على كلمات "نعم" و"لا"، ولرصد وجود وغياب الكلام. كما أنه ينقل نتائجه عن طريق إضاءة مصابيح LED ملونة. يوضّح الجدول التالي معنى كل لون LED:

نتيجة الرصد

لون مصباح LED

"نعم"

أصفر

"لا"

أحمر

كلام غير معروف

أخضر

لم يتم اكتشاف أي حديث

لا تتوفّر مصابيح LED

التجربة الآن

ضَع السبورة على فمك وقل "نعم" بضع مرات. سيظهر لك وميض مصباح LED أصفر. إذا لم يحدث شيء عند قول "نعم"، إليك بعض الإجراءات التي يمكنك تجربتها:

  • احمل السبورة مقاس 10 بوصات تقريبًا من فمك
  • تجنُّب الضوضاء في الخلفية
  • تكرار بـ "نعم" عدة مرات بتتابع سريع (جرِّب قول "نعم نعم نعم")

ماذا لو لم ينجح الأمر؟

في ما يلي بعض المشاكل المحتملة وكيفية تصحيحها:

المشكلة: بعد الوميض، لا تظهر أي من مصابيح LED.

الحل: جرِّب الضغط على الزر RST، أو فصل اللوحة من المبرمج وإعادة توصيلها. إذا لم ينجح أي من ذلك، فحاول وميض السبورة مرة أخرى.

المشكلة: مصباح LED الأزرق يُضاء، ولكنه خافت للغاية.

الحل:عليك استبدال البطارية لأنّها منخفضة الطاقة. وبدلاً من ذلك، يمكن تشغيل اللوحة بواسطة الكمبيوتر باستخدام المبرمج والكابل.

8. قراءة نتائج تصحيح الأخطاء (اختياري)

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

فتح اتصال تسلسلي

وفقًا للإعدادات التلقائية، يسجّل الرمز النموذجي SparkFun Edge أي أوامر منطوقة حسب مستوى الثقة الخاصة بها. للاطّلاع على مخرجات اللوحة، يمكنك تشغيل الأمر التالي:

screen ${DEVICENAME} 115200

قد تظهر لك في البداية نتيجة تبدو كما يلي: (لا تظهر هذه الرسالة إلا إذا تمت إعادة ضبط اللوحة بعد اتصالها، وقد تبدأ في الاطّلاع على معلومات تصحيح الأخطاء).

Apollo3 Burst Mode is Available

                               Apollo3 operating in Burst Mode (96MHz)

يمكنك تجربة إصدار بعض الطلبات من خلال قول "نعم". أو "لا". من المفترض أن تظهر لك معلومات تصحيح أخطاء الطباعة board لكل أمر:

 Heard yes (202) @65536ms

في السجلّ أعلاه، تشير السمة yes إلى الأمر. يشير الرقم 202 إلى مستوى الثقة في سماع الأمر (الحد الأدنى هو 200). وأخيرًا، يشير 65536ms إلى مقدار الوقت المنقضي منذ آخر مرة تمت فيها إعادة ضبط وحدة التحكّم الدقيقة.

لإيقاف عرض نتائج تصحيح الأخطاء، اضغط على Ctrl+A، ثم اضغط على المفتاح K مباشرةً، ثم اضغط على مفتاح Y.

كتابة سجلات تصحيح الأخطاء

يمكنك رؤية التعليمة البرمجية التي تسجل هذه المعلومات في ملفcom_monitorer.cc الذي كنت تعمل معه للتو:

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

لتسجيل البيانات، يمكنك استدعاء الطريقة error_reporter->Report(). ويتيح هذا التنسيق رموز printf المميّزة الخاصة باستيفاء السلاسل، والتي يمكنك استخدامها لتضمين معلومات مهمة في سجلّاتك:

error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);

يجب أن تكون هذه الطريقة مفيدة عند إجراء تغييرات خاصة بك على التعليمة البرمجية في القسم التالي.

9. تمديد الرمز (اختياري)

الآن، بعد أن تعرفت على كيفية إنشاء SparkFun Edge وتلميعه، يمكنك بدء استخدام الرمز ونشره على جهازك لرؤية النتائج.

قراءة الرمز

يُعدّ الملف التالي بعنوان "command_responder.cc." مكانًا جيدًا لبدء قراءة الرمز.

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

يمكنك الاطّلاع على الملف على GitHub هنا.

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

if (found_command[0] == 'y') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
if (found_command[0] == 'n') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
}
if (found_command[0] == 'u') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}

تحتوي الوسيطة found_command على اسم الأمر الذي تم رصده. من خلال وضع علامة في المربّع بجانب الحرف الأول، تحدِّد هذه المجموعة من عبارات if مصباح LED الذي يجب أن يضيء.

يتم استدعاء الطريقة ResponseToCommand باستخدام عدة وسيطات:

void RespondToCommand(tflite::ErrorReporter* error_reporter,
    int32_t current_time, const char* found_command,
    uint8_t score, bool is_new_command) {
  • يُستخدَم error_reporter لتسجيل معلومات تصحيح الأخطاء (سنتناول المزيد من التفاصيل لاحقًا).
  • وتمثِّل السمة current_time الوقت الذي تم فيه رصد الأمر.
  • يخبرنا found_command بالأمر الذي تم رصده.
  • يخبرنا التطبيق score بمدى ثقتنا في رصد أحد الأوامر.
  • يتيح لنا is_new_command معرفة ما إذا كانت هذه هي المرة الأولى التي يتم فيها سماع الطلب.

score هو عدد صحيح من 0 إلى 255 يمثّل احتمالية رصد أحد الأوامر. يعتبر الرمز النموذجي الأمر صالحًا فقط إذا كانت الدرجة أكبر من 200. استنادًا إلى اختباراتنا، تندرج معظم الأوامر الصالحة ضمن النطاق بين 200 و210.

تعديل الرمز

تتضمّن لوح SparkFun Edge أربعة مصابيح LED. وفي الوقت الحالي، يومض ضوء LED أزرق للإشارة إلى حدوث التعرّف على الجهاز. يمكنك رؤية هذا في ملف command_responder.cc:

static int count = 0;

// Toggle the blue LED every time an inference is performed.
++count;
if (count & 1) {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
} else {
  am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
}

بما أنّ لدينا أربعة مصابيح LED، سنعدّل البرنامج لاستخدامها كمؤشر مرئي لـ score لطلب معيّن. وتستحق النتيجة المنخفضة ضوء LED واحد، وتؤدي النتيجة العالية إلى ظهور أضواء متعددة.

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

لإجراء هذا التغيير، استبدل كل الرمز البرمجي في ملف command_responder.cc باستخدام المقتطف التالي:

#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h"

#include "am_bsp.h"

// This implementation will light up the LEDs on the board in response to different commands.
void RespondToCommand(tflite::ErrorReporter* error_reporter,
                      int32_t current_time, const char* found_command,
                      uint8_t score, bool is_new_command) {
  static bool is_initialized = false;
  if (!is_initialized) {
    // Setup LEDs as outputs
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_RED, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_BLUE, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_GREEN, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_YELLOW, g_AM_HAL_GPIO_OUTPUT_12);
    // Ensure all pins are cleared
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
    is_initialized = true;
  }
  static int count = 0;

   // Toggle the red LED every time an inference is performed.
   ++count;
   if (count & 1) {
     am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
   } else {
     am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
   }

  if (is_new_command) {
    // Clear the last three LEDs
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
    error_reporter->Report("Heard %s (%d) @%dms", found_command, score,
                           current_time);
    // Only indicate a 'yes'
    if (found_command[0] == 'y') {
      // Always light the blue LED
      am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
      // Light the other LEDs depending on score
      if (score >= 205) {
        am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
      }
      if(score >= 210) {
        am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
      }
    }
  }
}

وفي حال رصد أمر جديد، سيكون is_new_command true. ستتمّ إزالة مصابيح LED باللون الأزرق والأخضر والأصفر، ثم إشعالها مرة أخرى حسب قيم found_command وscore.

إعادة الإنشاء والتحديث

بعد إجراء تغييرات على الرمز، اختبِره من خلال تنفيذ كل الخطوات الواردة في مقالة إنشاء البرنامج الثنائي وإعداده.

10. الخطوات التالية

تهانينا، لقد نجحت في إنشاء أول أداة رصد الكلام على وحدة تحكُّم دقيقة.

نأمل أن تكون قد استفدت من هذه المقدمة الموجزة حول عملية تطوير البرامج باستخدام TensorFlow Lite لوحدات التحكّم الدقيقة. إنّ فكرة التعليم المعمّق باستخدام وحدات التحكم الدقيقة هي فكرة جديدة ومشوّقة، وننصحك بتجربتها.

المستندات المرجعية

26699b18f2b199f.png

مع أطيب التحيات،