Skip to content

Latest commit

 

History

History
469 lines (348 loc) · 20.5 KB

File metadata and controls

469 lines (348 loc) · 20.5 KB

راهنمای فوق‌کامل TinyML

از ایده تا مدل روی میکروکنترلر — روان، عملی، بدون کمبود

زبان / Language: English · فارسی


فهرست

  1. TinyML چیست و چرا مهم است؟
  2. تفاوت TinyML با ML معمولی و Edge AI
  3. معماری ذهنی پایپ‌لاین
  4. سخت‌افزار: میکروکنترلر و سنسور
  5. نرم‌افزار و کتابخانه‌ها
  6. جمع‌آوری و آماده‌سازی داده
  7. معماری مدل‌های Tiny (به‌ویژه CNN)
  8. آموزش مدل از صفر
  9. Quantization — قلب استقرار
  10. تبدیل به C و ریختن روی میکرو
  11. Runtime: TensorFlow Lite Micro
  12. اندازه‌گیری موفقیت
  13. پروژه‌های کلاسیک
  14. اشتباهات رایج
  15. منابع عمیق

۱) TinyML چیست و چرا مهم است؟

TinyML یعنی اجرای مدل‌های یادگیری ماشین روی دستگاه‌های بسیار محدود:

  • RAM اغلب ۱۶ تا ۵۱۲ کیلوبایت (نه گیگابایت)
  • Flash اغلب ۲۵۶ کیلوبایت تا چند مگابایت
  • توان در حد میلی‌وات
  • بدون فن، بدون GPU، بدون اینترنت اجباری

چرا جذاب است؟

مزیت معنی واقعی
حریم خصوصی صدا/تصویر از دستگاه بیرون نمی‌رود
تأخیر کم تصمیم در چند میلی‌ثانیه روی خود دستگاه
هزینه پایین برد ۵ تا ۳۵ دلاری در تیراژ
باتری طولانی ماه‌ها کار با باتری کوچک
Offline کارخانه، مزرعه، زیرزمین — بدون Wi‑Fi

چه کارهایی «Tiny» هستند؟

  • تشخیص کلمهٔ بیدارباش («هی سیری» ولی خیلی ساده‌تر)
  • تشخیص حضور انسان در تصویر ۹۶×۹۶
  • تشخیص حرکت/ژست با IMU
  • تشخیص ناهنجاری لرزش موتور
  • شمارش ضربه / ضربه در برابر سقوط

چه کارهایی Tiny نیستند؟

  • ChatGPT روی میکرو
  • تشخیص هزار کلاس ImageNet روی Cortex‑M0
  • ویدیوی Full HD با YOLO بزرگ

قانون طلایی: یک مسئلهٔ حسگری باریک را عالی حل کن، نه همهٔ دنیا را.


۲) تفاوت TinyML با ML معمولی و Edge AI

Cloud ML     → GPU/TPU، گیگابایت RAM، اینترنت
Edge AI      → گوشی / Raspberry Pi / Jetson (صدها MB تا چند GB)
TinyML       → میکروکنترلر (KB تا چند MB)
Cloud Edge (Pi/Phone) TinyML
RAM GB–TB ۱۰۰MB–۱۶GB ۱۰–۵۱۲ KB
توان ۱۰۰W+ ۱–۱۵W <۱۰۰ mW
مدل بزرگ متوسط خیلی کوچک
آموزش بله گاهی تقریباً همیشه روی PC
inference بله بله بله

روی میکرو معمولاً فقط inference اجرا می‌شود. آموزش روی PC شما (یا Colab/Kaggle رایگان) انجام می‌شود.


۳) معماری ذهنی پایپ‌لاین (۰ تا ۱۰۰)

┌─────────────────────────────────────────────────────────┐
│  A. مسئله را تعریف کن                                    │
│     «آیا شخص در فریم هست؟» / «آیا کلمه yes گفته شد؟»     │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  B. داده جمع کن                                          │
│     سنسور خام → برچسب → train / val / test               │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  C. پیش‌پردازش                                           │
│     MFCC / Spectrogram / نرمال‌سازی / پنجره زمانی        │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  D. مدل کوچک طراحی/انتخاب کن                             │
│     DS-CNN، MobileNetV1 کوچک، MLP، Depthwise Conv        │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  E. آموزش روی PC (CPU کافی است)                          │
│     Keras / TensorFlow                                   │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  F. Quantize به INT8 + ساخت .tflite                      │
│     representative dataset الزامی برای MCU               │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  G. تبدیل به آرایه C (model_data.h)                      │
│     یا خروجی Edge Impulse به صورت Arduino library        │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  H. Firmware با TFLM                                     │
│     arena، OpResolver، Invoke()، خروجی به LED/سریال     │
└───────────────────────────┬─────────────────────────────┘
                            ▼
┌─────────────────────────────────────────────────────────┐
│  I. اندازه‌گیری                                           │
│     دقت، latency، RAM arena، جریان مصرف                  │
└─────────────────────────────────────────────────────────┘

این کیت مراحل D تا H را با کد آماده پوشش می‌دهد.


۴) سخت‌افزار: میکروکنترلر و سنسور

بردهای پیشنهادی (از ارزان به حرفه‌ای)

برد تقریبی RAM مناسب برای سطح
ESP32-S3 ۵–۱۰$ ۵۱۲KB + PSRAM صدا، تصویر سبک، Wi‑Fi ★★★★★ شروع قوی
Raspberry Pi Pico / Pico 2 ۴–۷$ ۲۶۴–۵۲۰KB IMU، صدا ساده ★★★★ ارزان
Arduino Nano 33 BLE Sense ۲۵–۳۵$ ۲۵۶KB سنسورهای داخلی زیاد ★★★★ آموزشی
STM32 Nucleo (M4/M7) ۱۰–۲۵$ متغیر صنعتی، CMSIS-NN ★★★★
ESP32-CAM ۵–۸$ محدودتر دوربین ارزان ★★★

پیشنهاد بدون پول الان:
همه چیز را روی PC کامل یاد بگیر و شبیه‌سازی کن. وقتی توانستی، ESP32-S3 بخر — بهترین نسبت قیمت/قدرت برای TinyML ۲۰۲۵–۲۰۲۶.

سنسورها بر اساس پروژه

پروژه سنسور
Keyword spotting میکروفون I2S / PDM
Person detection دوربین OV2640 / Himax / OV7675
Gesture IMU (MPU6050 / BMI160)
Anomaly موتور شتاب‌سنج روی بدنه
کلید لمسی هوشمند خازنی / شتاب

۵) نرم‌افزار و کتابخانه‌ها (اکوسیستم)

لایه آموزش (روی PC)

ابزار نقش
Python 3.10–3.11 زبان اصلی
TensorFlow / Keras ساخت و آموزش مدل
NumPy / Matplotlib داده و نمودار
TensorFlow Lite Converter ساخت .tflite
(اختیاری) MediaPipe Model Maker مدل‌های آماده
(اختیاری) Edge Impulse مسیر وب‌محور

لایه استقرار (روی میکرو)

ابزار نقش
TensorFlow Lite for Microcontrollers (TFLM) runtime inference
CMSIS-NN کرنل‌های سریع ARM
ESP-NN بهینه‌سازی Espressif
Arduino IDE / PlatformIO فلش کردن firmware
STM32Cube.AI / Edge Impulse EON ابزارهای vendor

مسیرهای محصول‌محور

  1. TFLM خام — کنترل کامل (این کیت)
  2. Edge Impulse — سریع برای دمو و دیتاست
  3. Arduino_TensorFlowLite — راحتی برای Nano 33
  4. ESP-IDF + TFLM — تولید جدی روی ESP32

requirements.txt این کیت لایه‌های آموزش را نصب می‌کند.


۶) جمع‌آوری و آماده‌سازی داده

مدل فقط به اندازهٔ داده‌اش خوب است — در TinyML حتی بیشتر، چون ظرفیت مدل کم است.

اصول طلایی داده

  1. داده را از همان سنسور نهایی بگیر (اگر ممکن است)
    میکروفون لپ‌تاپ ≠ میکروفون ESP32
  2. کلاس منفی / پس‌زمینه داشته باش
    مثلاً «silence / unknown / noise»
  3. تنوع شرایط: نور، فاصله، جهت، نویز محیط، افراد مختلف
  4. تعادل کلاس‌ها را حفظ کن
  5. تقسیم استاندارد: ~۷۰–۸۰٪ train، ۱۰–۱۵٪ val، ۱۰–۱۵٪ test

پیش‌پردازش رایج

حوزه ویژگی
صدا MFCC، Mel Spectrogram، log-mel
تصویر resize به ۹۶×۹۶ یا ۳۲×۳۲، خاکستری یا RGB
IMU پنجره ۲۰۰–۵۰۰ms، فیلتر، نرمال‌سازی

نکته حیاتی: همان پیش‌پردازشی که در آموزش استفاده می‌کنی باید بایت‌به‌بایت روی میکرو تکرار شود. اختلاف اینجا = دقت کاذب روی PC و شکست روی دستگاه.


۷) معماری مدل‌های Tiny (به‌ویژه CNN)

خانواده مدل‌های محبوب TinyML

مدل کاربرد اندازه تقریبی
DS-CNN Keyword spotting ~۲۰–۵۰ KB
MobileNetV1 (α کوچک، ۹۶×۹۶) Person / Visual Wake Words ~۲۰۰–۳۰۰ KB
Depthwise Separable CNN تصویر/صدا سبک متغیر
MLP کوچک IMU / جدول ویژگی چند KB
Autoencoder کوچک anomaly detection ده‌ها KB
FOMO (Edge Impulse) localization سبک اشیاء متوسط

چرا Depthwise Separable؟

Conv معمولی گران است. Depthwise + Pointwise پارامتر و FLOPs را کم می‌کند — دقیقاً همان چیزی که میکرو لازم دارد.

قوانین طراحی برای MCU

  • ورودی کوچک نگه دار (مثلاً ۹۶×۹۶ نه ۲۲۴×۲۲۴)
  • تعداد کانال را محدود کن (۸، ۱۶، ۳۲…)
  • از لایه‌های پشتیبانی‌نشده TFLM پرهیز کن (قبل از deploy چک کن)
  • Softmax بزرگ روی هزار کلاس نساز
  • BatchNorm را در inference fold کن (Keras معمولاً مدیریت می‌کند)

۸) آموزش مدل از صفر (روی همین PC)

آیا GPU لازم است؟

خیر. برای مدل Tiny:

  • MNIST CNN کوچک: چند دقیقه روی i3-12100
  • Keyword spotting سبک: ده‌ها دقیقه تا یکی دو ساعت
  • Person detection کوچک: بسته به دیتاست، اغلب روی CPU قابل تحمل است

GPU شما:

  • Intel Xe / UHD 730: اگر بخواهی می‌توانی بعداً با OpenVINO یا DirectML آزمایش کنی، ولی برای مسیر استاندارد Keras→TFLite لازم نیست
  • GT 610: برای این کار هیچ نقشی ندارد — نادیده بگیر

حلقه آموزش استاندارد Keras

model = build_tiny_cnn(...)
model.compile(optimizer="adam",
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])
model.fit(x_train, y_train,
          validation_data=(x_val, y_val),
          epochs=20,
          batch_size=64)
model.save("models/my_model.keras")

تکنیک‌های مفید Tiny

  • EarlyStopping روی val_loss
  • Augmentation سبک (نه سنگین مثل ImageNet)
  • Class weights اگر داده نامتعادل است
  • شروع از مدل آماده (transfer) فقط وقتی ورودی سازگار است و مدل هنوز «tiny» می‌ماند

اسکریپت‌های آماده در پوشه python/.


۹) Quantization — قلب استقرار روی میکرو

میکروکنترلر عاشق عدد صحیح ۸بیتی است، نه float32.

انواع quantize (خلاصه)

نوع اندازه سرعت روی MCU نیاز
Dynamic range ~۴× کوچکتر متوسط آسان
Float16 ~۲× نه برای اکثر MCUها —
Full INT8 ~۴× + سریع بهترین برای TFLM representative dataset

برای میکرو تقریباً همیشه: Full integer quantization (INT8).

representative dataset چیست؟

۱۰۰–۳۰۰ نمونهٔ واقعی از ورودی مدل که به Converter می‌گویی تا scaleهای activation را کالیبره کند.

بدون آن، full INT8 درست ساخته نمی‌شود یا دقت می‌ریزد.

خروجی

فایل .tflite که:

  • وزن‌ها int8
  • فعال‌سازی‌ها int8
  • (ایده‌آل) ورودی/خروجی هم int8 برای MCU بدون FPU قوی

اسکریپت: python/03_quantize_to_tflite.py


۱۰) تبدیل به C و ریختن روی میکرو

TFLM مدل را از فایل سیستم نمی‌خواند (فایل سیستم نداریم!).
مدل را به صورت آرایه بایت در Flash می‌گذاری:

alignas(16) const unsigned char g_model[] = { 0x1c, 0x00, ... };
const unsigned int g_model_len = 12345;

ابزار این کیت: python/04_tflite_to_c_array.py
(معادل کلاسیک لینوکس: xxd -i model.tflite > model.h)

مراحل فلش (Arduino مثال)

  1. نصب برد در Board Manager
  2. نصب کتابخانه TensorFlow Lite / یا کتابخانه Edge Impulse
  3. قرار دادن model_data.h کنار sketch
  4. تنظیم tensor_arena (مثلاً ۶۰–۲۰۰ KB)
  5. Upload
  6. Serial Monitor برای دیدن امتیاز کلاس‌ها

جزئیات بردبه‌برد: 04-Microcontroller-Deploy-FA.md


۱۱) Runtime: TensorFlow Lite Micro چطور کار می‌کند؟

مفهوم‌های کلیدی:

Model

FlatBuffer خوانده‌شده از آرایه بایت.

OpResolver

فقط اپراتورهایی که مدل واقعاً لازم دارد را ثبت کن
(MicroMutableOpResolver) تا Flash هدر نرود.
AllOpsResolver برای شروع راحت است ولی بزرگ‌تر است.

Tensor Arena

یک بافر استاتیک RAM برای ورودی، خروجی و فعال‌سازی‌های میانی.

constexpr int kArenaSize = 80 * 1024;
uint8_t tensor_arena[kArenaSize];

اگر کم باشد → AllocateTensors شکست می‌خورد.
اگر زیاد بگیری → RAM تمام می‌شود.
بعد از اولین Invoke() با arena_used_bytes() اندازه واقعی را ببین.

Interpreter

interpreter.AllocateTensors();
// پر کردن input
interpreter.Invoke();
// خواندن output

بهینه‌سازها

  • ARM: CMSIS-NN
  • ESP32-S3: ESP-NN / vector instructions

۱۲) اندازه‌گیری موفقیت

قبل از «تمام شد» این‌ها را ثبت کن:

متریک هدف نمونه
Accuracy / F1 روی test بسته به پروژه (مثلاً >۹۰٪ KWS)
حجم .tflite جا شدن در Flash باقی‌مانده
Peak RAM (arena) کمتر از RAM آزاد برد
Latency هر inference مثلاً <۵۰ms برای KWS
جریان متوسط مناسب باتری

MLPerf Tiny معیارهای استاندارد دارد: KWS، VWW، IC، AD.


۱۳) پروژه‌های کلاسیک برای یادگیری

# پروژه سطح خروجی ملموس
۱ Sine / Hello TinyML مبتدی LED نفس‌کش با مدل
۲ MNIST digits روی PC→TFLite مبتدی فهم CNN + quantize
۳ ژست با IMU متوسط چپ/راست/ضربه
۴ Yes/No keyword متوسط روشن‌کردن رله
۵ Person detection ۹۶×۹۶ پیشرفته زنگ در هوشمند ساده
۶ Anomaly موتور پیشرفته هشدار لرزش

مسیر کامل پروژه۱ و۲ در اسکریپت‌های python/ آماده است.


۱۴) اشتباهات رایج (و درمان)

اشتباه درمان
مدل float روی MCU Full INT8
پیش‌پردازش PC ≠ MCU یک تابع مشخص، دو جا یکسان
Arena خیلی کوچک افزایش تدریجی + اندازه‌گیری
AllOpsResolver در محصول OpResolver انتخابی
دیتاست فقط در سکوت آزمایشگاه نویز واقعی اضافه کن
انتظار YOLO بزرگ روی Nano مدل را Tiny نگه دار
وابستگی به GT 610 CPU را محور کن
آموزش روی خود میکرو آموزش روی PC

۱۵) منابع عمیق

لیست لینک‌های زنده و مرتب: ../resources/links.md

کتاب کلاسیک:

  • Pete Warden & Daniel Situnayake — TinyML (O’Reilly)

ریپوهای حیاتی:


قدم بعدی

  1. 02-Hardware-Your-GPUs-FA.md — استراتژی دقیق با کارت‌های خودت
  2. اجرای python/tools/check_system.py
  3. python/01_hello_tinyml_sine.py