تشخیص گفتار هوش مصنوعی با TensorFlow Lite برای میکروکنترلرها و SparkFun Edge

۱. مقدمه

آنچه خواهید ساخت

در این آزمایشگاه کد، یاد خواهیم گرفت که از TensorFlow Lite برای میکروکنترلرها برای اجرای یک مدل یادگیری عمیق روی برد توسعه SparkFun Edge استفاده کنیم. ما با مدل تشخیص گفتار داخلی برد کار خواهیم کرد که از یک شبکه عصبی کانولوشن برای تشخیص کلمات "بله" و "خیر" که از طریق دو میکروفون برد گفته می‌شوند، استفاده می‌کند.

bf256d403a1821af.gif

یادگیری ماشین در میکروکنترلرها

یادگیری ماشینی می‌تواند برای ایجاد ابزارهای هوشمندی مانند دستیار گوگل که زندگی کاربران را آسان‌تر می‌کنند، مورد استفاده قرار گیرد. اما اغلب، این تجربیات نیاز به محاسبات یا منابع زیادی دارند که می‌تواند شامل یک سرور ابری قدرتمند یا یک دسکتاپ باشد. با این حال، اکنون می‌توان استنتاج یادگیری ماشینی را روی سخت‌افزارهای کوچک و کم‌مصرف مانند میکروکنترلرها اجرا کرد.

میکروکنترلرها بسیار رایج، ارزان، با مصرف انرژی بسیار کم و بسیار قابل اعتماد هستند. آنها بخشی از انواع دستگاه‌های خانگی هستند: به لوازم خانگی، اتومبیل‌ها و اسباب‌بازی‌ها فکر کنید. در واقع، سالانه حدود 30 میلیارد دستگاه مجهز به میکروکنترلر تولید می‌شود.

۱۳۶۰b61fbfa33657.jpeg

با آوردن یادگیری ماشینی به میکروکنترلرهای کوچک، می‌توانیم هوش میلیاردها دستگاهی را که در زندگی خود استفاده می‌کنیم، بدون تکیه بر سخت‌افزارهای گران‌قیمت یا اتصالات اینترنتی قابل اعتماد، افزایش دهیم. لوازم خانگی هوشمندی را تصور کنید که می‌توانند با روال روزانه شما سازگار شوند، حسگرهای صنعتی هوشمندی که تفاوت بین مشکلات و عملکرد عادی را درک می‌کنند و اسباب‌بازی‌های جادویی که می‌توانند به کودکان کمک کنند تا به روش‌های سرگرم‌کننده و لذت‌بخش یاد بگیرند.

TensorFlow Lite برای میکروکنترلرها (نرم‌افزار)

358ffdb9eb758b90.png

TensorFlow چارچوب یادگیری ماشین متن‌باز گوگل برای آموزش و اجرای مدل‌ها است. TensorFlow Lite یک چارچوب نرم‌افزاری و نسخه‌ای بهینه‌شده از TensorFlow است که برای اجرای مدل‌های Tensorflow روی دستگاه‌های کوچک و نسبتاً کم‌مصرف مانند تلفن‌های همراه طراحی شده است.

TensorFlow Lite برای میکروکنترلرها یک چارچوب نرم‌افزاری، نسخه‌ای بهینه‌شده از TensorFlow است که برای اجرای مدل‌های Tensorflow روی سخت‌افزارهای کوچک و کم‌مصرف مانند میکروکنترلرها طراحی شده است. این چارچوب به محدودیت‌های مورد نیاز در این محیط‌های تعبیه‌شده پایبند است، یعنی اندازه دودویی کوچکی دارد، به پشتیبانی سیستم عامل، هیچ کتابخانه استاندارد C یا C++ یا تخصیص حافظه پویا و غیره نیاز ندارد.

اسپارک‌فان اج (سخت‌افزار)

SparkFun Edge یک پلتفرم مبتنی بر میکروکنترلر است: یک کامپیوتر کوچک روی یک برد مدار چاپی. این دستگاه دارای یک پردازنده، حافظه و سخت‌افزار ورودی/خروجی است که به آن امکان ارسال و دریافت سیگنال‌های دیجیتال به دستگاه‌های دیگر را می‌دهد. این دستگاه دارای چهار LED قابل کنترل توسط نرم‌افزار، در رنگ‌های مورد علاقه گوگل شما است.

aa4493835a2338c6.png

برخلاف کامپیوتر، میکروکنترلر سیستم عاملی را اجرا نمی‌کند. در عوض، برنامه‌هایی که می‌نویسید مستقیماً روی سخت‌افزار اجرا می‌شوند. شما کد خود را روی کامپیوتر می‌نویسید و آن را از طریق دستگاهی به نام پروگرامر به میکروکنترلر دانلود می‌کنید.

میکروکنترلرها کامپیوترهای قدرتمندی نیستند. آنها پردازنده‌های کوچکی دارند و حافظه زیادی هم ندارند. اما از آنجا که تا حد امکان ساده طراحی شده‌اند، یک میکروکنترلر می‌تواند انرژی بسیار کمی مصرف کند. بسته به اینکه برنامه شما چه کاری انجام می‌دهد، SparkFun Edge می‌تواند هفته‌ها با یک باتری سکه‌ای کار کند!

آنچه یاد خواهید گرفت

  • برنامه نمونه برای SparkFun Edge را روی رایانه خود کامپایل کنید
  • برنامه را روی دستگاه خود نصب کنید
  • تغییراتی در برنامه ایجاد کنید و دوباره آن را اجرا کنید

آنچه نیاز دارید

شما به سخت‌افزار زیر نیاز خواهید داشت:

شما به نرم‌افزارهای زیر نیاز خواهید داشت:

  • گیت (با اجرای git در خط فرمان، نصب بودن آن را بررسی کنید)
  • پایتون ۳ (با اجرای python3 یا python --version در خط فرمان، نصب بودن آن را بررسی کنید)
  • پیپ برای پایتون ۳ ( پاسخ مفید StackOverflow )
  • نسخه ۴.۲.۱ یا بالاتر را نصب کنید (با اجرای make --version در خط فرمان، نصب بودن آن را بررسی کنید)
  • درایورهای سریال بیسیک SparkFun

۲. سخت‌افزار خود را تنظیم کنید

میکروکنترلر SparkFun Edge با یک فایل باینری از پیش نصب شده ارائه می‌شود که می‌تواند مدل گفتار را اجرا کند. قبل از اینکه این فایل را با نسخه خودمان بازنویسی کنیم، ابتدا این مدل را اجرا می‌کنیم.

برد خود را با موارد زیر روشن کنید:

  1. قرار دادن یک باتری سکه‌ای در کانکتور باتری در پشت برد (به طوری که سمت "+" باتری رو به بالا باشد. اگر برد شما با باتری از قبل قرار داده شده عرضه می‌شود، زبانه پلاستیکی را بیرون بکشید و باتری را فشار دهید تا مطمئن شوید که کاملاً قرار گرفته است)

25a6cc6b208e8a4e.png

  1. اگر باتری سکه‌ای ندارید، می‌توانید از دستگاه پروگرامر SparkFun USB-C Serial Basic برای تغذیه برد استفاده کنید. برای اتصال این دستگاه به برد خود، مراحل زیر را انجام دهید:
  • هدر شش پین را در کنار SparkFun Edge پیدا کنید.
  • کابل سریال بیسیک USB-C اسپارک‌فان را به این پین‌ها وصل کنید و مطمئن شوید پین‌های با برچسب «BLK» و «GRN» روی هر دستگاه به درستی در یک راستا قرار گرفته‌اند.
  • یک کابل USB-C را بین SparkFun USB-C Serial Basic و رایانه خود وصل کنید.

b140822f0019f92a.png

وقتی برد خود را با قرار دادن باتری یا اتصال پروگرامر USB تغذیه کردید، برد بیدار می‌شود و با میکروفون‌هایش شروع به گوش دادن می‌کند. چراغ آبی باید شروع به چشمک زدن کند.

مدل یادگیری ماشینی روی برد طوری آموزش دیده است که کلمات "بله" و "خیر" را تشخیص دهد و وجود و عدم وجود گفتار را تشخیص دهد. این مدل نتایج خود را با روشن کردن LED های رنگی ارائه می‌دهد. جدول زیر معنی هر رنگ LED را نشان می‌دهد:

نتیجه تشخیص

رنگ ال ای دی

«بله»

زرد

«نه»

قرمز

گفتار ناشناخته

سبز

هیچ گفتاری شناسایی نشد

هیچ LED روشن نیست

امتحانش کن.

برد را جلوی دهانتان بگیرید و چند بار «بله» بگویید. خواهید دید که چراغ LED زرد چشمک می‌زند. اگر با گفتن «بله» اتفاقی نیفتاد، می‌توانید این کارها را امتحان کنید:

  • تخته را در فاصله حدود ۲۵ سانتی‌متری از دهان خود نگه دارید.
  • از سر و صدای زیاد پس‌زمینه جلوگیری کنید
  • چندین بار پشت سر هم «بله» را تکرار کنید (سعی کنید بگویید «بله بله بله»)

۳. نرم‌افزار خود را راه‌اندازی کنید

اکنون قصد داریم مدل گفتار را خودمان روی میکروکنترلر دانلود، نصب و اجرا کنیم. برای این کار، ابتدا کد منبع این برنامه و وابستگی‌های مورد نیاز برای ساخت آن را دانلود می‌کنیم. این برنامه به زبان ++C نوشته شده است که قبل از دانلود روی برد، باید به یک فایل باینری کامپایل شود. فایل باینری فایلی است که شامل برنامه به شکلی است که می‌تواند مستقیماً توسط سخت‌افزار SparkFun Edge اجرا شود.

دستورالعمل‌های زیر برای لینوکس یا مک او اس نوشته شده‌اند.

مخزن 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

دانلود وابستگی‌های پایتون

ما از پایتون ۳ برای آماده‌سازی فایل باینری و فلش کردن آن به دستگاه استفاده خواهیم کرد. اسکریپت‌های پایتون به کتابخانه‌های خاصی که در دسترس هستند بستگی دارند. دستور زیر را برای نصب این وابستگی‌ها اجرا کنید:

pip3 install pycrypto pyserial --user

۴. ساخت و آماده‌سازی فایل باینری

ما قصد داریم فایل باینری را بسازیم و دستوراتی را اجرا کنیم که آن را برای دانلود روی دستگاه آماده می‌کند.

ساخت فایل باینری

برای دانلود تمام وابستگی‌های مورد نیاز و ایجاد فایل باینری، دستور زیر را اجرا کنید:

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 در دایرکتوری که دستورات را اجرا کرده‌اید، داشته باشید. این فایلی است که ما آن را روی دستگاه فلش خواهیم کرد.

۵. برای فلش کردن فایل باینری آماده شوید

فلش کردن چیست؟

برد SparkFun Edge برنامه‌ای را که در حال حاضر در حال اجرا است در حافظه فلش ۵۱۲ کیلوبایتی خود ذخیره می‌کند. اگر بخواهیم برد برنامه جدیدی را اجرا کند، باید آن را به برد ارسال کنیم که آن را در حافظه فلش ذخیره می‌کند و هر برنامه‌ای را که قبلاً ذخیره شده بود، بازنویسی می‌کند.

این فرآیند «فلش کردن» نام دارد و ما از آن برای ارسال برنامه خود به برد استفاده خواهیم کرد.

پروگرامر را به برد وصل کنید

برای دانلود برنامه‌های جدید روی برد، از پروگرامر سریال SparkFun USB-C Serial Basic استفاده خواهیم کرد. این دستگاه به کامپیوتر شما اجازه می‌دهد تا از طریق USB با میکروکنترلر ارتباط برقرار کند.

برای اتصال این دستگاه به برد خود، مراحل زیر را انجام دهید:

  1. هدر شش پین را در کنار SparkFun Edge پیدا کنید.
  2. کابل سریال بیسیک USB-C اسپارک‌فان را به این پین‌ها وصل کنید و مطمئن شوید پین‌های با برچسب «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

در مرحله بعد، یک متغیر محیطی برای مشخص کردن نرخ باود (baud rate) ایجاد خواهیم کرد، که سرعت ارسال داده‌ها به دستگاه است:

export BAUD_RATE=921600

۶. فلش کردن فایل باینری

اسکریپت را اجرا کنید تا برد شما فلش شود

برای فلش کردن برد، باید آن را در حالت «بوت‌لودر» ویژه‌ای قرار دهیم که آن را برای دریافت فایل باینری جدید آماده می‌کند. سپس اسکریپتی را اجرا می‌کنیم تا فایل باینری را به برد ارسال کند.

بیایید با دکمه‌های زیر روی برد آشنا شویم:

64c620570b9d2f83.png

برای ریست کردن و فلش کردن برد، مراحل زیر را انجام دهید:

  1. مطمئن شوید که برد شما به پروگرامر متصل است و کل تنظیمات از طریق USB به کامپیوتر شما متصل است.
  2. دکمه‌ای که با شماره 14 روی برد مشخص شده را نگه دارید. آن را تا مرحله ۶ نگه دارید.
  3. در حالی که همچنان دکمه‌ی شماره 14 را نگه داشته‌اید تا برد به حالت بوت‌لودر خود بازگردد، روی دکمه‌ی RST کلیک کنید تا برد ریست شود.
  4. همچنان که دکمه‌ی شماره 14 را نگه داشته‌اید، دستور زیر را در ترمینال خود پیست کنید و برای اجرا، اینتر را بزنید (برای راحتی، می‌توانید این دستور را قبل از شروع به نگه داشتن دکمه در ترمینال خود پیست کنید، اما تا رسیدن به این مرحله، اینتر را فشار ندهید).
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. بعد از دیدن Sending Data Packet of length 8180 دیگر دکمه‌ی با علامت 14 روی برد را نگه ندارید (اما اگر همچنان آن را نگه دارید مشکلی نیست). برنامه به چاپ خطوط روی ترمینال ادامه خواهد داد. در نهایت چیزی شبیه به تصویر زیر خواهد بود:
[...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 چاپ شده است یا خیر. در این صورت، احتمالاً فلش کردن با وجود خطا موفقیت‌آمیز بوده است.

در یک دستگاه لینوکس، ممکن است با NoResponse Error مواجه شوید. این به این دلیل است که درایور سریال ch34x در کنار درایور سریال موجود نصب شده است که می‌توان آن را به صورت زیر برطرف کرد:

مرحله ۱ : نسخه صحیح کتابخانه ch34x را دوباره نصب کنید. مطمئن شوید که دستگاه در حین نصب از رایانه جدا شده است.

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

مرحله ۲ : برد را به پورت 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" است.

۷. نسخه آزمایشی

برنامه را امتحان کنید

وقتی برد شما با موفقیت فلش شد، دکمه‌ی مشخص شده را بزنید.

RST برای راه‌اندازی مجدد برد و شروع برنامه فشار دهید. اگر LED آبی شروع به چشمک زدن کرد، چشمک زدن موفقیت‌آمیز بوده است. در غیر این صورت، به بخش « اگر کار نکرد چه؟» در زیر بروید.

bf256d403a1821af.gif

مدل یادگیری ماشینی روی برد طوری آموزش دیده است که کلمات "بله" و "خیر" را تشخیص دهد و وجود و عدم وجود گفتار را تشخیص دهد. این مدل نتایج خود را با روشن کردن LED های رنگی ارائه می‌دهد. جدول زیر معنی هر رنگ LED را نشان می‌دهد:

نتیجه تشخیص

رنگ ال ای دی

«بله»

زرد

«نه»

قرمز

گفتار ناشناخته

سبز

هیچ گفتاری شناسایی نشد

هیچ LED روشن نیست

امتحانش کن.

برد را جلوی دهانتان بگیرید و چند بار «بله» بگویید. خواهید دید که چراغ LED زرد چشمک می‌زند. اگر با گفتن «بله» اتفاقی نیفتاد، می‌توانید این کارها را امتحان کنید:

  • تخته را در فاصله حدود ۲۵ سانتی‌متری از دهان خود نگه دارید.
  • از سر و صدای زیاد پس‌زمینه جلوگیری کنید
  • چندین بار پشت سر هم «بله» را تکرار کنید (سعی کنید بگویید «بله بله بله»)

اگر کار نکرد چه؟

در اینجا به برخی از مشکلات احتمالی و نحوه رفع آنها اشاره می‌کنیم:

مشکل: بعد از چشمک زدن، هیچ یک از LED ها روشن نمی شوند.

راه حل: سعی کنید دکمه RST را بزنید، یا برد را از پروگرامر جدا و دوباره وصل کنید. اگر هیچ کدام از این کارها جواب نداد، دوباره برد را فلش کنید.

مشکل: چراغ LED آبی روشن می‌شود، اما خیلی کم‌نور است.

راه حل: باتری را تعویض کنید زیرا باتری در حال خالی شدن است. به عنوان یک روش جایگزین، می‌توان برد را با استفاده از پروگرامر و کابل به کامپیوتر متصل کرد.

۸. خروجی اشکال‌زدایی را بخوانید (اختیاری)

اگر با مشکلی مواجه شدید و نیاز به اشکال‌زدایی دقیق کد خود دارید، این بخش را مرور کنید . برای اینکه بفهمید هنگام اجرای کد در میکروکنترلر چه اتفاقی می‌افتد، می‌توانید اطلاعات اشکال‌زدایی را از طریق اتصال سریال برد چاپ کنید. شما از کامپیوتر خود برای اتصال به برد و نمایش داده‌هایی که برد ارسال می‌کند استفاده می‌کنید.

باز کردن یک اتصال سریال

به طور پیش‌فرض، کد نمونه SparkFun Edge ما هر دستور صوتی را به همراه میزان اطمینان آنها ثبت می‌کند. برای مشاهده خروجی برد، می‌توانید دستور زیر را اجرا کنید:

screen ${DEVICENAME} 115200

ممکن است در ابتدا خروجی‌ای شبیه به زیر ببینید: (این خروجی فقط در صورتی ظاهر می‌شود که برد پس از اتصال ریست شود، در غیر این صورت ممکن است اطلاعات اشکال‌زدایی را مشاهده کنید)

Apollo3 Burst Mode is Available

                               Apollo3 operating in Burst Mode (96MHz)

با گفتن «بله» یا «خیر» سعی کنید چند دستور صادر کنید. باید اطلاعات اشکال‌زدایی چاپ برد را برای هر دستور مشاهده کنید:

 Heard yes (202) @65536ms

در گزارش بالا، yes به دستور اشاره دارد. عدد 202 به سطح اطمینان شنیده شدن دستور اشاره دارد (با حداقل ۲۰۰). در نهایت، 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);

این روش باید زمانی مفید باشد که در بخش بعدی، تغییرات دلخواه خود را در کد اعمال می‌کنید.

۹. کد را گسترش دهید (اختیاری)

حالا که می‌دانید چگونه SparkFun Edge خود را بسازید و فلش کنید، می‌توانید با کد بازی کنید و آن را روی دستگاه خود مستقر کنید تا نتایج را ببینید.

کد را بخوانید

یک جای خوب برای شروع خواندن کد، فایل زیر است، command_responder.cc.

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

می‌توانید فایل موجود در گیت‌هاب را اینجا ببینید.

متد موجود در این فایل، 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 یک عدد صحیح از ۰ تا ۲۵۵ است که احتمال شناسایی یک دستور را نشان می‌دهد. کد نمونه فقط در صورتی یک دستور را معتبر می‌داند که امتیاز آن بیشتر از ۲۰۰ باشد. بر اساس آزمایش ما، اکثر دستورات معتبر در محدوده ۲۰۰ تا ۲۱۰ قرار می‌گیرند.

کد را اصلاح کنید

برد 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 قرمز به جای آبی، مدام چشمک بزند. 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 دوباره آنها را روشن می‌کنیم.

بازسازی و فلش

پس از اعمال تغییرات در کد، آن را با اجرای تمام مراحل از Build و آماده‌سازی فایل باینری، آزمایش کنید.

۱۰. مراحل بعدی

تبریک می‌گویم، شما با موفقیت اولین آشکارساز گفتار خود را روی یک میکروکنترلر ساختید!

امیدواریم از این مقدمه کوتاه در مورد توسعه با TensorFlow Lite برای میکروکنترلرها لذت برده باشید. ایده یادگیری عمیق در میکروکنترلرها جدید و هیجان‌انگیز است و ما شما را تشویق می‌کنیم که بیرون بروید و آزمایش کنید!

اسناد مرجع

۲۶۶۹۹b۱۸f۲b۱۹۹f.png

متشکرم، و از ساختن لذت ببرید!