1. مقدمة
ما الذي ستنشئه
في هذا الدرس التطبيقي حول الترميز، سنتعلّم كيفية استخدام TensorFlow Lite For Microcontrollers لتشغيل نموذج تعلُّم متعمق على SparkFun Edge Development Board. سنعمل على نموذج الكشف عن الكلام المدمج في اللوحة، والذي يستخدم شبكة عصبية التفافية لاكتشاف الكلمات "نعم" و"لا" يتم التحدث بها عبر الميكروفونين في اللوحة.
تعلُّم الآلة على وحدات التحكّم الدقيقة
ويمكن استخدام التعلم الآلي لإنشاء أدوات ذكية تجعل المستخدمين أسهل، تمامًا مثل مساعد Google. ولكن غالبًا ما تتطلب هذه التجارب الكثير من العمليات الحسابية أو الموارد التي يمكن أن تشمل خادمًا سحابيًا قويًا أو جهاز كمبيوتر مكتبي. ومع ذلك، أصبح من الممكن الآن تنفيذ استنتاج التعلم الآلي على أجهزة صغيرة ومنخفضة الطاقة، مثل وحدات التحكم الدقيقة.
تُعد وحدات التحكم الدقيقة شائعة للغاية، ورخيصة، وتتطلب القليل من الطاقة، وموثوقة جدًا. وهي تشكّل جزءًا من جميع أنواع الأجهزة المنزلية، مثل الأجهزة المنزلية والسيارات والألعاب. وفي الواقع، يتم إنتاج حوالي 30 مليار جهاز يعمل بوحدة تحكم دقيقة كل عام.
من خلال الاستعانة بأدوات تعلُّم الآلة لوحدات التحكّم الدقيقة الصغيرة، يمكننا تعزيز الذكاء في مليارات الأجهزة التي نستخدمها في حياتنا، بدون الاعتماد على أجهزة باهظة الثمن أو اتصالات إنترنت موثوقة. تخيَّل أنّ أجهزة ذكية يمكنها التكيّف مع روتينك اليومي، وأجهزة استشعار صناعية ذكية يمكنها فهم الفرق بين المشاكل والتشغيل العادي، وألعاب سحرية تساعد الأطفال على التعلّم بطرق مرحة وممتعة.
TensorFlow Lite لأجهزة التحكّم الدقيقة (البرامج)
TensorFlow هو إطار عمل مفتوح المصدر من Google لتعلُّم الآلة يهدف إلى تدريب النماذج وتشغيلها. TensorFlow Lite هو إطار عمل برمجي، وهو إصدار مُحسَّن من TensorFlow يستهدف تشغيل نماذج TensorFlow على الأجهزة الصغيرة منخفضة الطاقة نسبيًا، مثل الهواتف الجوّالة.
TensorFlow Lite لوحدات التحكّم الدقيقة هو إطار عمل برمجي، وهو إصدار محسّن من 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 للغة 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 أصفر. إذا لم يحدث شيء عند قول "نعم"، إليك بعض الإجراءات التي يمكنك تجربتها:
- احمل السبورة مقاس 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.
لتوصيل هذا الجهاز باللوح، عليك اتّباع الخطوات التالية:
- حدِّد موقع رأس الدبوس على جانب 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- وميض البرنامج الثنائي
تنفيذ النص البرمجي وميض
ومضغتها في "برنامج تحميل تشغيل" خاص التي تُعِدّها لتلقي البرنامج الثنائي الجديد. سنقوم بعد ذلك بتشغيل نص برمجي لإرسال البرنامج الثنائي إلى اللوحة.
دعنا نتعرف على الأزرار التالية على اللوحة:
نفذ الخطوات التالية لإعادة تعيين اللوحة ومضغها:
- تأكد من توصيل اللوحة بالمبرمج، وتوصيل الإعداد بالكامل بالكمبيوتر عبر 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 أصفر. إذا لم يحدث شيء عند قول "نعم"، إليك بعض الإجراءات التي يمكنك تجربتها:
- احمل السبورة مقاس 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 لوحدات التحكّم الدقيقة. إنّ فكرة التعليم المعمّق باستخدام وحدات التحكم الدقيقة هي فكرة جديدة ومشوّقة، وننصحك بتجربتها.
المستندات المرجعية
- يمكنك تدريب نموذجك الخاص لفهم الأوامر المختلفة، بعد أن أصبحت لديك خبرة في التعامل مع البرنامج الأساسي. ملاحظة: سيستغرق التدريب بضع ساعات.
- يمكنك الاطّلاع على مزيد من المعلومات حول TensorFlow Lite لوحدات التحكّم الدقيقة ( الموقع الإلكتروني وGitHub).
- جرِّب أمثلة أخرى وجرِّب تشغيلها على SparkFun Edge، إذا كانت متوافقة.
- يمكنك الرجوع إلى كتاب O'Reilly بعنوان TinyML: Machine Learning with TensorFlow على Arduino وأجهزة التحكّم الصغيرة جدًا التي تتميز بالطاقة القصوى، الذي يتناول تعلّم الآلة على الأجهزة الصغيرة ويستعرض العديد من المشاريع الممتعة. يستند هذا الدرس التطبيقي حول الترميز إلى الفصلَين 7 و8 من الكتاب.
مع أطيب التحيات،