زبان / Language: English · فارسی
- TinyML چیست و چرا مهم است؟
- تفاوت TinyML با ML معمولی و Edge AI
- معماری ذهنی پایپلاین
- سختافزار: میکروکنترلر و سنسور
- نرمافزار و کتابخانهها
- جمعآوری و آمادهسازی داده
- معماری مدلهای Tiny (بهویژه CNN)
- آموزش مدل از صفر
- Quantization — قلب استقرار
- تبدیل به C و ریختن روی میکرو
- Runtime: TensorFlow Lite Micro
- اندازهگیری موفقیت
- پروژههای کلاسیک
- اشتباهات رایج
- منابع عمیق
TinyML یعنی اجرای مدلهای یادگیری ماشین روی دستگاههای بسیار محدود:
- RAM اغلب ۱۶ تا ۵۱۲ کیلوبایت (نه گیگابایت)
- Flash اغلب ۲۵۶ کیلوبایت تا چند مگابایت
- توان در حد میلیوات
- بدون فن، بدون GPU، بدون اینترنت اجباری
| مزیت | معنی واقعی |
|---|---|
| حریم خصوصی | صدا/تصویر از دستگاه بیرون نمیرود |
| تأخیر کم | تصمیم در چند میلیثانیه روی خود دستگاه |
| هزینه پایین | برد ۵ تا ۳۵ دلاری در تیراژ |
| باتری طولانی | ماهها کار با باتری کوچک |
| Offline | کارخانه، مزرعه، زیرزمین — بدون Wi‑Fi |
- تشخیص کلمهٔ بیدارباش («هی سیری» ولی خیلی سادهتر)
- تشخیص حضور انسان در تصویر ۹۶×۹۶
- تشخیص حرکت/ژست با IMU
- تشخیص ناهنجاری لرزش موتور
- شمارش ضربه / ضربه در برابر سقوط
- ChatGPT روی میکرو
- تشخیص هزار کلاس ImageNet روی Cortex‑M0
- ویدیوی Full HD با YOLO بزرگ
قانون طلایی: یک مسئلهٔ حسگری باریک را عالی حل کن، نه همهٔ دنیا را.
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 موتور | شتابسنج روی بدنه |
| کلید لمسی هوشمند | خازنی / شتاب |
| ابزار | نقش |
|---|---|
| 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 |
- TFLM خام — کنترل کامل (این کیت)
- Edge Impulse — سریع برای دمو و دیتاست
- Arduino_TensorFlowLite — راحتی برای Nano 33
- ESP-IDF + TFLM — تولید جدی روی ESP32
requirements.txt این کیت لایههای آموزش را نصب میکند.
مدل فقط به اندازهٔ دادهاش خوب است — در TinyML حتی بیشتر، چون ظرفیت مدل کم است.
- داده را از همان سنسور نهایی بگیر (اگر ممکن است)
میکروفون لپتاپ ≠ میکروفون ESP32 - کلاس منفی / پسزمینه داشته باش
مثلاً «silence / unknown / noise» - تنوع شرایط: نور، فاصله، جهت، نویز محیط، افراد مختلف
- تعادل کلاسها را حفظ کن
- تقسیم استاندارد: ~۷۰–۸۰٪ train، ۱۰–۱۵٪ val، ۱۰–۱۵٪ test
| حوزه | ویژگی |
|---|---|
| صدا | MFCC، Mel Spectrogram، log-mel |
| تصویر | resize به ۹۶×۹۶ یا ۳۲×۳۲، خاکستری یا RGB |
| IMU | پنجره ۲۰۰–۵۰۰ms، فیلتر، نرمالسازی |
نکته حیاتی: همان پیشپردازشی که در آموزش استفاده میکنی باید بایتبهبایت روی میکرو تکرار شود. اختلاف اینجا = دقت کاذب روی PC و شکست روی دستگاه.
| مدل | کاربرد | اندازه تقریبی |
|---|---|---|
| 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 سبک اشیاء | متوسط |
Conv معمولی گران است. Depthwise + Pointwise پارامتر و FLOPs را کم میکند — دقیقاً همان چیزی که میکرو لازم دارد.
- ورودی کوچک نگه دار (مثلاً ۹۶×۹۶ نه ۲۲۴×۲۲۴)
- تعداد کانال را محدود کن (۸، ۱۶، ۳۲…)
- از لایههای پشتیبانینشده TFLM پرهیز کن (قبل از deploy چک کن)
- Softmax بزرگ روی هزار کلاس نساز
- BatchNorm را در inference fold کن (Keras معمولاً مدیریت میکند)
خیر. برای مدل Tiny:
- MNIST CNN کوچک: چند دقیقه روی i3-12100
- Keyword spotting سبک: دهها دقیقه تا یکی دو ساعت
- Person detection کوچک: بسته به دیتاست، اغلب روی CPU قابل تحمل است
GPU شما:
- Intel Xe / UHD 730: اگر بخواهی میتوانی بعداً با OpenVINO یا DirectML آزمایش کنی، ولی برای مسیر استاندارد Keras→TFLite لازم نیست
- GT 610: برای این کار هیچ نقشی ندارد — نادیده بگیر
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")- EarlyStopping روی val_loss
- Augmentation سبک (نه سنگین مثل ImageNet)
- Class weights اگر داده نامتعادل است
- شروع از مدل آماده (transfer) فقط وقتی ورودی سازگار است و مدل هنوز «tiny» میماند
اسکریپتهای آماده در پوشه python/.
میکروکنترلر عاشق عدد صحیح ۸بیتی است، نه float32.
| نوع | اندازه | سرعت روی MCU | نیاز |
|---|---|---|---|
| Dynamic range | ~۴× کوچکتر | متوسط | آسان |
| Float16 | ~۲× | نه برای اکثر MCUها | — |
| Full INT8 | ~۴× + سریع | بهترین برای TFLM | representative dataset |
برای میکرو تقریباً همیشه: Full integer quantization (INT8).
۱۰۰–۳۰۰ نمونهٔ واقعی از ورودی مدل که به Converter میگویی تا scaleهای activation را کالیبره کند.
بدون آن، full INT8 درست ساخته نمیشود یا دقت میریزد.
فایل .tflite که:
- وزنها int8
- فعالسازیها int8
- (ایدهآل) ورودی/خروجی هم int8 برای MCU بدون FPU قوی
اسکریپت: python/03_quantize_to_tflite.py
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)
- نصب برد در Board Manager
- نصب کتابخانه TensorFlow Lite / یا کتابخانه Edge Impulse
- قرار دادن
model_data.hکنار sketch - تنظیم
tensor_arena(مثلاً ۶۰–۲۰۰ KB) - Upload
- Serial Monitor برای دیدن امتیاز کلاسها
جزئیات بردبهبرد: 04-Microcontroller-Deploy-FA.md
مفهومهای کلیدی:
FlatBuffer خواندهشده از آرایه بایت.
فقط اپراتورهایی که مدل واقعاً لازم دارد را ثبت کن
(MicroMutableOpResolver) تا Flash هدر نرود.
AllOpsResolver برای شروع راحت است ولی بزرگتر است.
یک بافر استاتیک RAM برای ورودی، خروجی و فعالسازیهای میانی.
constexpr int kArenaSize = 80 * 1024;
uint8_t tensor_arena[kArenaSize];اگر کم باشد → AllocateTensors شکست میخورد.
اگر زیاد بگیری → RAM تمام میشود.
بعد از اولین Invoke() با arena_used_bytes() اندازه واقعی را ببین.
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)
ریپوهای حیاتی:
- https://github.com/tensorflow/tflite-micro
- https://github.com/mlcommons/tiny
- https://docs.edgeimpulse.com
02-Hardware-Your-GPUs-FA.md— استراتژی دقیق با کارتهای خودت- اجرای
python/tools/check_system.py python/01_hello_tinyml_sine.py