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

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

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

TensorFlow هو إطار عمل مفتوح المصدر من Google لتعلُّم الآلة يُستخدم في تدريب النماذج وتشغيلها. TensorFlow Lite هو إطار عمل برمجي، وهو إصدار محسّن من TensorFlow، يستهدف تشغيل نماذج TensorFlow على أجهزة صغيرة ومنخفضة الطاقة نسبيًا، مثل الهواتف الجوّالة.
TensorFlow Lite For Microcontrollers هو إطار عمل برمجي، وهو إصدار محسّن من TensorFlow، يستهدف تشغيل نماذج TensorFlow على أجهزة صغيرة منخفضة الطاقة، مثل المتحكّمات الدقيقة. وهي تلتزم بالقيود المطلوبة في هذه البيئات المضمّنة، أي أنّ حجمها الثنائي صغير، ولا تتطلّب دعم نظام التشغيل أو أي مكتبات C أو C++ عادية أو تخصيص الذاكرة الديناميكية وما إلى ذلك.
SparkFun Edge (الأجهزة)
SparkFun Edge هي منصة تستند إلى وحدة تحكّم دقيقة: جهاز كمبيوتر صغير على لوحة دوائر واحدة. ويحتوي على معالج وذاكرة وأجهزة إدخال/إخراج تتيح له إرسال الإشارات الرقمية وتلقّيها من الأجهزة الأخرى. يحتوي على أربعة مصابيح LED يمكن التحكّم فيها من خلال البرامج، وبألوان Google المفضّلة لديك.

على عكس الكمبيوتر، لا يعمل المتحكّم الدقيق بنظام تشغيل. بدلاً من ذلك، يتم تشغيل البرامج التي تكتبها مباشرةً على الأجهزة. تكتب الرمز على جهاز كمبيوتر وتنزّله إلى وحدة التحكّم الدقيقة من خلال جهاز يُعرف باسم المبرمِج.
وحدات التحكّم الدقيقة ليست أجهزة كمبيوتر قوية. وتتضمّن معالِجات صغيرة وذاكرة محدودة. ولكن بما أنّها مصمَّمة لتكون بسيطة قدر الإمكان، يمكن أن تستخدم وحدة التحكّم الدقيق قدرًا ضئيلاً جدًا من الطاقة. استنادًا إلى ما يفعله برنامجك، يمكن أن يعمل SparkFun Edge لأسابيع على بطارية واحدة من نوع "خلية معدنية".
ما ستتعلمه
- تجميع البرنامج النموذجي لجهاز SparkFun Edge على الكمبيوتر
- نشر البرنامج على جهازك
- إجراء تغييرات على البرنامج وإعادة نشره
المتطلبات
ستحتاج إلى الأجهزة التالية:
- كمبيوتر Linux أو MacOS
- لوحة SparkFun Edge
- أداة برمجة SparkFun USB-C Serial Basic
- كابل USB-C إلى USB-A (إذا كنت تستخدم جهاز كمبيوتر مزوّدًا بمنفذ USB-C، احصل على كابل USB-C إلى USB-C بدلاً من ذلك)
- (اختياري) بطارية ليثيوم دائرية بجهد 3 فولت وقطر 20 ملم (CR2032) لتشغيل الاستدلال بدون مبرمج وكابل
ستحتاج إلى البرامج التالية:
- Git (تحقَّق مما إذا كان مثبّتًا عن طريق تنفيذ
gitفي سطر الأوامر) - Python 3 (تحقَّق مما إذا كان مثبّتًا من خلال تنفيذ
python3أوpython --versionفي سطر الأوامر) - Pip for Python 3 ( إجابة مفيدة على StackOverflow)
- الإصدار 4.2.1 أو إصدار أحدث (تحقَّق من تثبيته من خلال تنفيذ
make --versionعلى سطر الأوامر) - برامج تشغيل SparkFun Serial Basic
2. إعداد الجهاز
يأتي جهاز التحكّم الدقيق SparkFun Edge مزوّدًا ببرنامج ثنائي مثبَّت مسبقًا يمكنه تشغيل نموذج التعرّف على الكلام. قبل أن نستبدل هذا النموذج بنسختنا الخاصة، لنشغّله أولاً.
يمكنك تعزيز لوحة العرض من خلال:
- إدخال بطارية زر في موصل البطارية في الجزء الخلفي من اللوحة (مع توجيه الجانب "+" من البطارية للأعلى) إذا كانت اللوحة مزوّدة ببطارية مُدرَجة، اسحب الشريط البلاستيكي وأدخِل البطارية بالكامل.

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

بعد تشغيل اللوحة من خلال إدخال البطارية أو توصيل مبرمِج USB، سيتم تنشيط اللوحة وستبدأ في الاستماع باستخدام الميكروفونات. من المفترض أن يبدأ الضوء الأزرق في الوميض.
يتم تدريب نموذج تعلُّم الآلة على اللوحة للتعرّف على الكلمتَين "نعم" و "لا"، ولرصد وجود الكلام وعدم وجوده. ويتم إبلاغك بالنتائج من خلال إضاءة مصابيح LED الملونة. يوضّح الجدول التالي معنى كل لون من ألوان مؤشر LED:
نتيجة الرصد | لون مؤشر LED |
"نعم" | أصفر |
"لا" | أحمر |
كلام غير معروف | أخضر |
لم يتم اكتشاف أي حديث | عدم إضاءة مصابيح LED |
لنجرِّب هذه الميزة
ارفع اللوحة إلى فمك وقُل "نعم" بضع مرات. سيومض مصباح LED الأصفر. إذا لم يحدث أي شيء عند قول "نعم"، إليك بعض الإجراءات التي يمكنك تجربتها:
- امسك اللوحة على بُعد 25 سم تقريبًا من فمك
- تجنُّب الضوضاء المفرطة في الخلفية
- كرِّر كلمة "نعم" عدة مرات متتالية بسرعة (جرِّب قول "نعم نعم نعم")
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
تنزيل حِزم Python التابعة
سنستخدم الإصدار 3 من لغة Python لإعداد الملف الثنائي وتثبيته على الجهاز. تعتمد نصوص Python البرمجية على توفّر مكتبات معيّنة. نفِّذ الأمر التالي لتثبيت هذه الاعتماديات:
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. سننفّذ الآن أمرًا آخر لإنشاء نسخة نهائية من الملف يمكن استخدامها لتثبيت ذاكرة ROM على جهازنا باستخدام النص البرمجي لبرنامج الإقلاع الذي سنستخدمه في الخطوة التالية:
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.
لربط هذا الجهاز بلوحتك، اتّبِع الخطوات التالية:
- ابحث عن رأس الموصل المكوّن من ستة دبابيس على جانب SparkFun Edge.
- وصِّل جهاز SparkFun USB-C Serial Basic بهذه الدبابيس، وتأكَّد من محاذاة الدبابيس التي تحمل التصنيف "BLK" و "GRN" على كل جهاز بشكل صحيح.

توصيل المبرمِج بجهاز الكمبيوتر
سنربط اللوحة بجهاز الكمبيوتر من خلال منفذ 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. تثبيت ذاكرة ROM للبرنامج الثنائي
تشغيل النص البرمجي لتثبيت ذاكرة ROM على اللوحة
لتثبيت ذاكرة ROM على اللوحة، علينا وضعها في حالة خاصة تُعرف باسم "برنامج إقلاع"، وهي حالة تُعدّها لتلقّي البرنامج الثنائي الجديد. بعد ذلك، سنشغّل برنامجًا نصيًا لإرسال الرمز الثنائي إلى اللوحة.
لنتعرّف على الأزرار التالية في اللوحة:

اتّبِع الخطوات التالية لإعادة ضبط اللوحة وتثبيت ذاكرة ROM عليها:
- تأكَّد من ربط اللوحة بجهاز البرمجة، ومن ربط الإعداد الكامل بجهاز الكمبيوتر عبر USB.
- ابدأ بالضغط مع الاستمرار على الزرّ الذي يحمل العلامة
14على اللوحة. استمِرّ في الضغط عليه حتى الخطوة 6. - مع الاستمرار في الضغط على الزر الذي يحمل العلامة
14، انقر على الزر الذي يحمل العلامةRSTلإعادة ضبط اللوحة، وذلك لإعادة ضبطها إلى حالة برنامج إقلاع. - مع الاستمرار في الضغط على الزر الذي يحمل العلامة
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
- مع الاستمرار في الضغط على الزر الذي يحمل الرمز
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...]
- توقَّف عن الضغط باستمرار على الزرّ الذي يحمل العلامة
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 الأزرق بالوميض، يعني ذلك أنّ عملية التحديث قد نجحت. إذا لم يكن كذلك، انتقِل إلى قسم ماذا لو لم ينجح ذلك؟ أدناه.

يتم تدريب نموذج تعلُّم الآلة على اللوحة للتعرّف على الكلمتَين "نعم" و "لا"، ولرصد وجود الكلام وعدم وجوده. ويتم إبلاغك بالنتائج من خلال إضاءة مصابيح LED الملونة. يوضّح الجدول التالي معنى كل لون من ألوان مؤشر LED:
نتيجة الرصد | لون مؤشر LED |
"نعم" | أصفر |
"لا" | أحمر |
كلام غير معروف | أخضر |
لم يتم اكتشاف أي حديث | عدم إضاءة مصابيح LED |
لنجرِّب هذه الميزة
ارفع اللوحة إلى فمك وقُل "نعم" بضع مرات. سيومض مصباح LED الأصفر. إذا لم يحدث أي شيء عند قول "نعم"، إليك بعض الإجراءات التي يمكنك تجربتها:
- امسك اللوحة على بُعد 25 سم تقريبًا من فمك
- تجنُّب الضوضاء المفرطة في الخلفية
- كرِّر كلمة "نعم" عدة مرات متتالية بسرعة (جرِّب قول "نعم نعم نعم")
ماذا يحدث إذا لم تنجح هذه الطريقة؟
في ما يلي بعض المشاكل المحتملة وكيفية تصحيح الأخطاء فيها:
المشكلة: بعد التحديث، لا تضيء أي من مؤشرات LED.
الحل: جرِّب الضغط على الزر RST أو إلغاء توصيل اللوحة بجهاز البرمجة ثم إعادة توصيلها. إذا لم ينجح أي من هذه الحلول، جرِّب إعادة برمجة اللوحة.
المشكلة: يضيء مؤشر LED الأزرق، ولكنّه خافت جدًا.
الحل: استبدِل البطارية لأنّها أوشكت على النفاد. بدلاً من ذلك، يمكن تشغيل اللوحة من خلال الكمبيوتر باستخدام المبرمِج والكابل.
8. قراءة نتائج تصحيح الأخطاء (اختياري)
راجِع هذا القسم إذا واجهت مشاكل وكنت بحاجة إلى تصحيح رمزك بالتفصيل. لفهم ما يحدث في وحدة التحكّم الدقيقة عند تشغيل الرمز البرمجي، يمكنك طباعة معلومات تصحيح الأخطاء من خلال الاتصال التسلسلي للوحة. يمكنك استخدام الكمبيوتر للاتصال باللوحة وعرض البيانات التي ترسلها اللوحة.
فتح اتصال تسلسلي
بشكلٍ تلقائي، يسجّل الرمز النموذجي في SparkFun Edge أي أوامر منطوقة، بالإضافة إلى مستوى الثقة. للاطّلاع على ناتج اللوحة، يمكنك تنفيذ الأمر التالي:
screen ${DEVICENAME} 115200
قد يظهر لك في البداية ناتج يشبه ما يلي: (يظهر هذا الناتج فقط إذا تمت إعادة ضبط اللوحة بعد ربطها، وإلا قد تبدأ في رؤية معلومات تصحيح الأخطاء)
Apollo3 Burst Mode is Available
Apollo3 operating in Burst Mode (96MHz)
جرِّب إصدار بعض الأوامر من خلال قول "نعم" أو "لا". يجب أن تظهر لك معلومات تصحيح أخطاء طباعة اللوحة لكل أمر:
Heard yes (202) @65536ms
في السجلّ أعلاه، يشير yes إلى الأمر. يشير الرقم 202 إلى مستوى الثقة في سماع الأمر (مع العلم أنّ 200 هو الحدّ الأدنى). أخيرًا، يشير 65536ms إلى مقدار الوقت الذي انقضى منذ آخر إعادة ضبط لوحدة التحكّم الدقيقة.
لإيقاف عرض ناتج تصحيح الأخطاء، اضغط على Ctrl+A، ثم على المفتاح K مباشرةً، ثم على المفتاح Y.
كتابة سجلات تصحيح الأخطاء
يمكنك الاطّلاع على الرمز الذي يسجّل هذه المعلومات في ملف command_responder.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 الذي يجب إضاءته.
يتم استدعاء الطريقة RespondToCommand مع عدة وسيطات:
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 صحيحة. سنوقف إضاءة مصابيح LED الزرقاء والخضراء والصفراء، ثم نعيد إضاءتها مرة أخرى استنادًا إلى قيمتَي found_command وscore.
إعادة الإنشاء وتثبيت ذاكرة ROM
بعد إجراء تغييرات على الرمز، اختبِره من خلال تنفيذ جميع الخطوات الواردة في إنشاء الملف الثنائي وإعداده.
10. الخطوات التالية
تهانينا، لقد أنشأت بنجاح أول أداة للتعرّف على الكلام على وحدة تحكّم دقيقة.
نأمل أن تكون قد استفدت من هذه المقدّمة الموجزة حول التطوير باستخدام TensorFlow Lite for Microcontrollers. إنّ فكرة التعلّم العميق على وحدات التحكّم الدقيقة جديدة ومثيرة، وننصحك بتجربتها.
المستندات المرجعية
- تدريب نموذجك الخاص لفهم الأوامر المختلفة، بعد أن اكتسبت خبرة في العمل مع البرنامج الأساسي ملاحظة: سيستغرق التدريب بضع ساعات.
- يمكنك الاطّلاع على مزيد من المعلومات حول TensorFlow Lite for Microcontrollers ( الموقع الإلكتروني وGitHub).
- جرِّب أمثلة أخرى وحاول تشغيلها على SparkFun Edge، إذا كان ذلك متاحًا.
- يمكنك الرجوع إلى كتاب O'Reilly بعنوان TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Micro-Controllers الذي يعرّف بتعلُّم الآلة على الأجهزة الصغيرة ويشرح عدة مشاريع ممتعة. يستند هذا الدرس التطبيقي حول الترميز إلى الفصلَين 7 و8 من الكتاب.

شكرًا لك، ونتمنى لك الاستمتاع بالبناء.