پیاده سازی یادگیری ماشین بر روی آردوینو

آردوینو ( Arduino ) در راه این است که یادگیری ماشین را به اندازه کافی ساده کند تا هرکسی بتواند از آن استفاده کند. طی همکاری در چند ماه گذشته با تیم TensorFlow Lite آنچه را که در کنار بدان دست یافته ایم را به شما ارائه خواهیم کرد: به کارگیری TensorFlow Lite Micro در Arduino Nano 33 BLE Sense. در این مقاله نحوه نصب و اجرای چندین نمونه جدید TensorFlow Lite Micro را که اکنون در بخش مدیریت کتابخانه آردوینو موجود هستند را به شما نشان خواهیم داد.

اولین بخش آموزشی نحوه نصب شبکه عصبی در برد آردوینو جهت تشخیص دستورات صوتی ساده را به شما نشان می دهد.

بورد آردوینو کنترل صوتی یادگیری ماشین
مثال ۱: اجرای نمونه استنتاج micro_speech از پیش آموزش دیده

در مرحله بعد یک آموزش مفهومی تر را که می توانید برای آموزش مدل تشخیص حرکات دلخواه خود برای آردوینو با استفاده از TensorFlow در Colab استفاده کنید را معرفی خواهیم کرد. این مطالب براساس آن چه که در یک کارگاه عملی که توسط Sandeep Mistry و Don Coleman برگزار شده است گرد آوری شده و نسخه جدید آن اکنون به صورت آنلاین موجود می باشد.

اگر تجربه کار با آردوینو را دارید ممکن است بتوانید طی چند ساعت آن چه که در این آموزش ها آورده شده را یاد بگیرید. اگر در زمینه کار با میکروکنترلرها کاملا تازه کار هستید این کار ممکن است برای شما کمی بیشتر طول بکشد.

آموزش حرکتی آردوینو با یادگیری ماشین
مثال ۲: آموزش مدل طبقه بندی ژست های حرکتی خود

توجه: پروژه های زیر بر اساس TensorFlow Lite برای میکروکنترلرها پایه گذاری شده است که در حال حاضر در TensorFlow repo به صورت آزمایشی به کار گرفته می شوند. کارهای این چنینی یک زمینه جدید و نوظهور به حساب می آیند.

میکروکنترولر ها و TinyML

میکروکنترلرها، مانند آن هایی که در بورد های آردوینو به کار می روند، سیستم های رایانه ای کم هزینه، تک تراشه و کم مصرف هستند. آن ها رایانه های نامرئی هستند که در میلیاردها وسیله کاربردی روزمره مانند لباس های پوشیدنی، پهپاد، پرینتر سه بعدی، اسباب بازی، پلوپز، پلاگین های هوشمند، اسکوترهای الکترونیکی و ماشین های لباسشویی تعبیه شده اند. روند اتصال این دستگاه ها بخشی از آن چیزی است که از آن به عنوان اینترنت اشیاء یاد می شود.

آردوینو یک پلتفرم متن باز با محوریت جامعه استفاده کننده از آن می باشد که در ساخت برنامه کاربردی میکروکنترلر که در دسترس عموم می باشد به کار گرفته می شود. بوردی که ما در اینجا از آن استفاده می کنیم دارای میکروکنترلر Arm Cortex-M4 با سرعت ۶۴ مگاهرتز با حافظه Flash 1MB و ۲۵۶ KB RAM است. این در مقایسه با فضای ابری (cloud)، رایانه شخصی یا موبایل حجم کمی است اما بر طبق استانداردهای میکروکنترلر منطقی به حساب می آید.

بورد آردوینو Arduino Nano 33 BLE Sense
بورد بورد آردوینو Arduino Nano 33 BLE Sense از یک بسته ی آدامس هم کوچکتر است

دلایل عملی وجود دارد که ممکن است بخواهید یادگیری ماشین را روی میکروکنترلرها به کار ببرید از جمله:

  • از لحاظ عملکردی – می خواهید یک دستگاه هوشمند به سرعت و بصورت محلی (مستقل از اینترنت) عمل کند.
  • از لحاظ هزینه – انجام این کار با سخت افزار ساده و کم هزینه.
  • از بعد حریم خصوصی – مایل به اشتراک گذاری تمام داده های حسگر خارجی نیستید.
  • از بعد بهره وری – دستگاه کوچکتر، استخراج انرژی یا عمر باتری طولانی تر.

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

  • یادگیری ماشین می تواند میکروکنترلرها را در دسترس توسعه دهندگانی که پیش زمینه ای در ارتباط با توسعه تعبیه شده ندارند قرار دهد.

در بعد یادگیری ماشین، تکنیک هایی وجود دارد که می توانید از آن ها استفاده کنید تا مدل های شبکه عصبی را در دستگاه های دارای حافظه مانند میکروکنترلرها قرار دهید. یکی از مراحل کلان اندازه گیری وزنه ها از نقطه شناور تا عدد صحیح ۸ بیتی است. این امر همچنین باعث می شود استنتاج برای محاسبه و کاربرد بیشتر در دستگاه های دارای نرخ زمانی پایین سریع تر انجام شود. TinyML یک از عرصه های نو ظهور است و البته هنوز کارهایی برای انجام دادن در این زمینه وجود دارد – اما چیزی که هیجان انگیز است این است که یک فضای برنامه گسترده و کشف نشده در آن وجود دارد. میلیاردها میکروکنترلر با انواع حسگرها در انواع مکان ها ترکیب شده و می تواند منجر به ایجاد برخی برنامه های کاربردی، خلاقانه و ارزشمند TinyML در آینده شود.

آنچه برای شروع کار نیاز دارید:

  • بورد Arduino Nano 33 BLE Sense
  • یک کابل میکرو USB برای اتصال برد آردوینو به دستگاه دسکتاپ خود
  • برای برنامه ریزی بورد خود می توانید از Arduino Web Editor استفاده کرده یا Arduino IDE را نصب کنید.

جزئیات بیشتر در مورد چگونگی تنظیم این موارد را در بخش های بعدی به شما خواهیم گفت.

Arduino Nano 33 BLE Sense دارای سنسورهای مختلف پردازنده به صورت آنبورد (داخلی) است که این بدین معنی می باشد که پتانسیل خوبی برای برخی از برنامه های جالب TinyML را دارد مانند:

  • از لحاظ صوتی-میکروفون دیجیتال صوتی
  • از لحاظ حرکتت – IMU 9 محوره (شتاب سنج ، ژیروسکوپ ، مغناطیس سنج)
  • از لحاظ محیطی- دما ، رطوبت و فشارنور
  • از لحاظ روشنایی- درخشش،رنگ و مجاورت اشیا

بر خلاف Arduino Uno کلاسیک، بورد میکروکنترلر را با سنسورهای پردازنده ترکیب می کند ، این بدان معنی است که شما می توانید بسیاری از موارد استفاده را بدون سخت افزار اضافی یا سیم کشی قابل اجرا کنید. این بورد همچنین به اندازه کافی کوچک است که در موارد کاربردی نهایی مانند لباس های پوشیدنی قابل استفاده است. همانطور که از نام این دستگاه بر می آید این دستگاه از اتصال Bluetooth LE برخوردار است، بنابراین می توانید داده ها (یا نتایج استنتاج) را به یک لپ تاپ، برنامه موبایل یا سایر بوردهای BLE و لوازم جانبی ارسال کنید.

نکته: سنسورها بر روی USB  – اتصال بورد BLE Sense از طریق USB راهی آسان برای ضبط داده ها و اضافه کردن چندین سنسور به رایانه های دارای یک بورد بدون نیاز به سیم کشی اضافی یا سخت افزاری است – به عنوان مثال یک افزودنی خوب برای Raspberry Pi.

مثال هایی از TensorFlow Lite برای میکروکنترلرها

نمونه های استنتاج TensorFlow Lite برای میکروکنترلرها اکنون از طریق مدیر کتابخانه آردوینو بسته بندی شده و در دسترس هستند و امکان دارا بودن و اجرای آن را تنها با چند کلیک در آردوینو فراهم ساخته است.

در این بخش نحوه اجرای آن ها را به شما نشان خواهیم داد. مثال ها عبارتند از:

  • Micro_speech – تشخیص گفتار با استفاده از پردازنده ی میکروفون
  • magic_wand – تشخیص حرکت با استفاده از پردازنده ی IMU
  • person_detection – تشخیص شخص با استفاده از دوربین خارجی ArduCam

برای داشتن پیش زمینه ی بیشتر در مورد نمونه ها می توانید به منبع موجود در مخزن TensorFlow نگاهی بیندازید. مدل های موجود در این مثال ها قبلاً آموزش داده شده بودند. آموزش های زیر نحوه استقرار و اجرای آن ها را در آردوینو نشان می دهد. در بخش بعدی، ما در مورد آموزش صحبت خواهیم کرد.

نحوه اجرای نمونه ها با استفاده از ویرایشگر وب Arduino

پس از اتصال Arduino Nano 33 BLE Sense به دستگاه رومیزی خود با کابل USB ، می توانید نمونه های TensorFlow زیر را با استفاده از ویرایشگر وب آردوینو ایجاد کرده و آن را اجرا کنید:

create-lib
کامپایل کردن مثالی از کتابخانه ی Arduino_TensorFlowLite

روی مثال تشخیص گفتار متمرکز شوید: micro_speech

یکی از اولین قدم ها در استفاده از برد آردوینو روشن کردن LED است. در اینجا ، ما با استفاده از TensorFlow Lite Micro برای تشخیص کلمات کلیدی صوتی، این کار را با یک سری تغییر انجام خواهیم داد. واژگان آن ساده و شامل “بله” و “نه” می باشد. به یاد داشته باشید که این مدل به صورت Local روی یک میکروکنترلر با تنها ۲۵۶KB رم اجرا می شود ، بنابراین نباید انتظار داشت که از دقت تجاری “دستیار صوتی” برخوردار باشد- هیچ ارتباطی به اینترنت ندارد و با دو هزار برابر RAM Local کمتر در دسترس است.

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

کار با کنترل صوتی آردوینو یادگیری ماشین
راه اندازی مثال micro_speech

نحوه اجرای نمونه ها با استفاده از Arduino IDE

روش دیگر با استفاده از برنامه Arduino IDE می توانید نمونه استنتاج مشابه را امتحان کنید. ابتدا دستورالعمل های موجود در بخش بعدی تنظیم Arduino IDE را دنبال کنید.

در Arduino IDE نمونه های موجود از طریق منوی File> Examples> Arduino_TensorFlowLite را در ArduinoIDE مشاهده خواهید کرد.

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

رابط کاربری آردوینو بارگزاری و اجرا

برای کابران پیشرفته که ترجیه می دهند از خطوط دستوری استفاده کنند، Arduino-cli نیز موجود است.

آموزش مدل TensorFlow Lite Micro برای آردوینو

آموزش حرکتی آردوینو با یادگیری ماشین
طبقه بندی حرکت در Arduino Nano 33 BLE Sense ، خروجی به عنوان ایموجی ها

در مرحله بعد از یادگیری ماشین برای فعال کردن صفحه آردوینو برای تشخیص حرکات استفاده خواهیم کرد. ما داده های حرکت را از صفحه Arduino Nano 33 BLE Sense ضبط می کنیم ، برای آموزش یک مدل این داده ها را به TensorFlow وارد می کنیم و ابزار طبقه بندی کننده حاصل را روی بورد مستقر می کنیم. ایده این آموزش مبتنی بر بازی جذاب Street Fighter چارلی جرارد با حرکات بدن با استفاده از آردوینو و Tensorflow.js بود. در مثال چارلی، بورد همه داده های حسگر را از آردوینو به دستگاه دیگری که طبقه بندی حرکات را در Tensorflow.js انجام می داد، منتقل می کرد. ما این کار را با انجام طبقه بندی حالت در بورد آردوینو به صورت  “TinyML-ify” انجام می دهیم. این امر در ارتباط با مورد ما آسان تر می شود زیرا برد Arduino Nano 33 BLE Sense که ما از آن استفاده می کنیم دارای یک پردازنده قدرتمند تر Cortex-M4 و یک پردازنده IMU است.

ما آموزش زیر را تنظیم کرده ایم بنابراین هیچ سخت افزار اضافی لازم نیست – نمونه برداری از تشخیص حرکت بورد شروع می شود. نسخه اصلی این آموزش یک بورد و یک دکمه سخت افزاری برای فشار دادن برای شروع نمونه برداری اضافه می کند. اگر می خواهید اندکی آموزش سخت افزاری ببینید می توانید آن نسخه را دنبال کنید.

تنها چند قدم بیشتر از استفاده از ویرایشگر وب Arduino Create باقی نمانده است، چراکه نیازمند بارگیری و نصب بورد و کتابخانه های خاص در Arduino IDE هستیم.

راه اندازی Arduino IDE

مراحل زیر برای راه اندازی نرم افزار Arduino IDE است که برای بارگذاری مدل های استنتاجی به برد و دانلود داده های آموزش از طریق آن در بخش بعدی بکار می رود. نصب این نرم افزار در مقایسه با استفاده از Arduino Create Web چند مرحله بیشتر دارد چون باید مشخصات بورد و کتابخانه ها را نیز دانلود کنیم.

دانلود نرم افزار رابط کاربری آردوینو

  • Arduino IDE را از اینجا دریافت و نصب کنید: https://arduino.cc/downloads
    • برنامه Arduino را که تازه نصب کرده اید را باز کنید
  • در منوی Arduino IDE Tools> Board> Boards Manager…
    • Nano BLE” ” را جست و جو کرده و نصب روی صفحه را فشار دهید.
    • چند دقیقه طول می کشد تا نصب شود.
    • وقتی این کار تمام شد، پنجره Manager را ببندید.
رابط کاربری آردوینو board Manager
  • اکنون به ابزارهای مدیریت کتابخانه> مدیریت کتابخانه ها بروید …
    • کتابخانه Arduino_TensorFlowLite را جستجو و نصب کنید

در گام بعدی Arduino_LSM9DS1 را جستجو و نصب کنید:

رابط کاربری آردوینو کتابخانه Arduino_LSM9DS1
  • در آخر ، کابل میکرو USB را به برد و رایانه وصل کنید
  • صفحه Tools > Board > Arduino Nano 33 BLE را انتخاب کنید
  • Tools > Port > ( COM5 (Arduino Nano 33 BLE را انتخاب کنید
    • توجه داشته باشید که ممکن است نام درگاه واقعی در رایانه شما متفاوت باشد

در صورت نیاز به راهنمایی، راهنماهای دقیق تر درباره شروع و عیب یابی در سایت آردوینو وجود دارد.

به جریان انداختن داده های حسگر از صفحه آردوینو

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

بوردهای آردوینو برنامه های کوچکی را اجرا می کنند (که به آن ها اسکچ نیز گفته می شود) که از قالب منبع آردوینو با کد .ino کامپایل شده اند و با استفاده از Arduino IDE یا آردوینو روی بورد برنامه ریزی شده اند.

ما از طرح های پیش ساخته IMU_Capture.ino استفاده خواهیم کرد که موارد زیر را انجام می دهد:

  • شتاب سنج و ژیروسکوپ صفحه را کنترل می کنند
  • یک پنجره نمونه را در تشخیص شتاب خطی قابل توجه تابلو ایجاد می کند
  • نمونه ای از یک ثانیه در ۱۱۹ هرتز، داده های فرمت CSV را از طریق USB به دست می آورد
  • این حلقه را تکرار می کند و بر حرکت بعدی نظارت می کند

سنسورهایی که ما می خواهیم از روی بورد ها بخوانیم، میزان نمونه ، آستانه هدف گیری و اینکه آیا ما خروجی داده را به صورت CSV ، JSON ، صفر و یک یا قالب های دیگر جابجا می کنیم، همه در طرح موجود در آردوینو قابل تنظیم هستند.

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

هم اکنون می توانید طرح را بارگذاری کرده و نمونه برداری کنید.

برای برنامه ریزی بورد با این طرح در Arduino IDE:

  • IMU_Capture.ino را دانلود کنید و آن را در Arduino IDE باز کنید
  • در قسمت کامپایل Sketch> upload باز کرده و بر روی بورد بارگزاری کنید.

نمایش زنده ی اطلاعات داده های سنسور از بورد آردوینو

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

  • در Arduino IDE پنجره ی Serial Plotter Tools> Serial Plotter را باز کنید
    • اگر خطایی در مورد عدم دسترسی به صفحه وجود داشت ، دوباره پورت را انتخاب کنید:
    • (Tools > Port > portname (Arduino Nano 33 BLE
  • بورد را انتخاب کنید و حرکات مشت و انعطافی خود را تمرین کنید
    • این نمونه را فقط برای یک پنجره یک ثانیه ای مشاهده خواهید کرد، سپس منتظر حرکت بعدی باشید.
  • باید یک نمودار زنده از ضبط داده ها ی سنسور را ببینید. (به GIF زیر مراجعه کنید)

هنگامی که کار خود را تمام کردید، حتماً پنجره Serial Plotter را ببندید – این کار مهم است زیرا در غیر این صورت مرحله بعد اجرا نخواهد شد.

plot-1
Arduino IDE Serial Plotter نمودار مستقیمی از خروجی داده های CSV از صفحه شما نشان می دهد

هنگامی که کار خود را تمام کردید ، حتماً پنجره Serial Plotter را ببندید – این مهم است زیرا مرحله بعدی در غیر این صورت کار نخواهد کرد.

ضبط داده های حرکتی آموزش

جهت ضبط داده های آموزش حرکت برای بدست آوردن داده به عنوان ورودی CSV برای بارگذاری در TensorFlow می توانید از Arduino IDE> Tools> Serial Monitor برای مشاهده داده ها و ارسال آن به دستگاه دسکتاپ خود استفاده کنید:

  • با فشار دادن دکمه سفید بالای بورد، آن را ریست کنید.
  • بورد را با یک دست بلند کنید (برداشتن بورد در جلو تر نمونه برداری را فعال می کند.)
  • در Arduino IDE ، ابزارهای Serial Monitor> Serial Monitor را باز کنید
    • اگر با خطای در دسترس نبودن بورد مواجه شدید مجدداً پورت را انتخاب کنید:
    • (Tools > Port > portname (Arduino Nano 33 BLE
  • یک حرکت مشت با استفاده از بورد در دست خود بگیرید (در حین انجام این کار مراقب باشید!)
    • مشت را به اندازه کافی سریع بزنید تا باعث ضبط شود
    • به آرامی به حالت خنثی برگردید تا مجدداً ضبط صورت نگیرد
  • برای جمع آوری داده های بیشتر، مرحله ضبط حرکت را ۱۰ بار یا بیشتر تکرار کنید
  • داده های کنسول سریال را در پرونده متنی جدید بنام csv کپی و جایگذاری کنید
  • خروجی پنجره کنسول را پاک کنید و تمام مراحل بالا را تکرار کنید ، این بار با یک حرکت پیچشی در پرونده ای به نام csv
    • حرکت پیچشی درونی را به اندازه کافی سریع انجام دهید تا ضبط آن به دستی اتفاق بیافتد و هر بار به آرامی به حالت اول باز گردید

توجه داشته باشید که خط اول دو پرونده csv شما باید شامل فیلدهای aX، aY، aZ، gX، gY، gZ باشد.

بورد آردوینو نمایشگر سریال

نکته ای برای سیستم عامل لینوکس: اگر بخواهید می توانید خروجی ورود سنسور را از آردوینو مستقیماً به پرونده. csv در خط فرمان هدایت کنید. با استفاده ازSerial Plotter / Serial Monitor ویندوز بسته می شود:

 $ cat /dev/cu.usbmodemociationnnnnnn]> sensorlog.csv

آموزش در TensorFlow

ما می خواهیم با استفاده از داده های جمع آوری شده از صفحه آردوینو در بخش قبلی، از Google Colab برای آموزش مدل یادگیری ماشین خود استفاده کنیم. Colab یک نوت بوک Jupyter را فراهم می کند که به ما امکان می دهد آموزش TensorFlow را در یک مرورگر وب اجرا کنیم.

اسکرین شات4
مجموعه آموزش تشخیص حرکت آردوینو در Colab

colab شما را از طریق موارد زیر پیش می برد :

  • محیط پایتون را راه اندازی کنید
  • داده های csv و flex.csv را بارگذاری کنید
  • داده ها را تجزیه و آماده سازی کنید
  • مدل را بسازید و آن را آموزش دهید
  • مدل آموزش دیده را به TensorFlow Lite تبدیل کنید
  • مدل را در یک پرونده هدر آردوینو رمزگذاری کنید

مرحله آخر مجموعه آموزشی تولید پرونده model.h برای بارگیری و قابل استفاده بودن در پروژه طبقه بندی کننده حرکت های Arduino IDE در بخش بعدی است:

یادگیری ماشین آردوینو هدر

بیایید نوت بوک را در colab باز کنیم و مراحل را در سلول ها ی زیر  طی کنیم – arduino_tinyml_workshop.ipynb

طبقه بندی داده های IMU

در مرحله بعد در پروژه Arduino IDE ما از پرونده model.h که اخیراً از Colab آموزش داده و بارگیری کرده ایم استفاده خواهیم کرد:

  • IMU_Classifier.ino را در Arduino IDE باز کنید.
  • یک برگه جدید در IDE ایجاد کنید. وقتی از شما درباره اسم آن سؤال شد نام آن را h بگذارید.
  • برگه h را باز کنید و در نسخه ای که از Colab بارگیری کرده اید، آن را جایگذاری کنید.
آردوینو ساخت تب جدید
  • طرح را بارگذاری کنید: Sketch > Upload
  • مانیتور سریال را باز کنید: Tools> Serial Monitor
  • برخی از حرکات را انجام دهید
  • میزان اعتماد به نفس هر حرکت بر روی مانیتور سریال چاپ می شود (۰ = اعتماد بنفس کم، ۱ = اعتماد بنفس بالا)

تبریک می گویم شما اولین برنامه یادگیری ماشین خود را برای آردوینو آموزش داده اید!

آردوینو یادگیری ماشین نتایج سریال مانیتور

برای افزودن جنبه سرگرمی برنامه، مثال Emoji_Button.ino نحوه ایجاد یک صفحه کلید USB را نشان می دهد که یک شخصیت ایموجی را در لینوکس و macOS چاپ می کند. سعی کنید نمونه Emoji_Button.ino را با طرح IMU_Classifier.ino ترکیب کنید تا یک صفحه کلید ایموجی کنترل شده با حرکات ایجاد کنید.

نتیجه گیری

اکنون زمان هیجان انگیزی برای یادگیری و اکتشاف در TinyML است. امیدواریم این مقاله دید مناسبی از پتانسیل های TinyML و نقطه ی شروعی برای افزودن آن به پروژه های شما باشد. حتما نظرات و پروژه های خود را با ما در میان بگذارید.

بیشتر بخوانید:
منبع blog.arduino.cc
5/5 (1 نظر)

درباره‌ی علی قلی زاده

همچنین ببینید

یادگیری ماشین در OpenCV k نزدیک ترین همسایه

یادگیری ماشین در OpenCV : جلسه چهارم

در جلسه قبلی از آموزش یادگیری ماشین به بررسی الگوریتم K نزدیک ترین همسایه پرداختیم. …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *