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

1. مقدمه

چیزی که خواهی ساخت

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

bf256d403a1821af.gif

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

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

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

1360b61fbfa33657.jpeg

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

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

358ffdb9eb758b90.png

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

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

SparkFun Edge (سخت افزار)

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

aa4493835a2338c6.png

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

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

چیزی که یاد خواهید گرفت

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

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

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

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

  • Git (با اجرای git در خط فرمان، نصب بودن آن را بررسی کنید)
  • پایتون 3 (با اجرای python3 یا python --version در خط فرمان بررسی کنید که آیا نصب شده است)
  • Pip برای Python 3 ( پاسخ مفید StackOverflow )
  • نسخه 4.2.1 یا بالاتر را بسازید (با اجرای make --version در خط فرمان، نصب بودن آن را بررسی کنید)
  • درایورهای اولیه سریال SparkFun

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

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 را نگه داشته اید، دستور زیر را در ترمینال خود قرار دهید و اینتر را بزنید تا اجرا شود (برای راحتی کار، می توانید قبل از شروع به نگه داشتن دکمه، این دستور را در ترمینال خود قرار دهید، اما تا زمانی که به این مرحله نرسیده اید اینتر را فشار ندهید. )
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 در کنار درایور سریال موجود نصب شده است که به صورت زیر قابل حل است:

مرحله 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)

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

 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 دوباره آنها را روشن می کنیم.

بازسازی و فلش

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

10. مراحل بعدی

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

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

اسناد مرجع

26699b18f2b199f.png

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