Skip to content

Latest commit

 

History

History
215 lines (148 loc) · 7.16 KB

File metadata and controls

215 lines (148 loc) · 7.16 KB

ریختن مدل روی میکروکنترلر — راهنمای عملی کامل

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

این سند مرحلهٔ Deploy را از فایل .tflite تا LED چشمک‌زن توضیح می‌دهد.


تصویر کلی

models/xxx_int8.tflite
        │
        ▼  python/04_tflite_to_c_array.py
firmware/.../model_data.h   (آرایه بایت در Flash)
        │
        ▼  Arduino IDE / PlatformIO / ESP-IDF
میکروکنترلر → TFLM Interpreter → Invoke() → تصمیم

پیش‌نیاز روی PC (رایگان)

  1. Arduino IDE 2.x یا PlatformIO
  2. کابل USB مناسب برد
  3. درایور سریال (برای بعضی بردهای CH340/CP2102)

تا وقتی برد نداری، مراحل ۱–۴ را کامل روی PC انجام بده و firmware را آماده نگه دار.


مسیر ۱ — کنترل کامل با TFLM (پیشنهاد یادگیری)

گام ۱: مدل INT8 بساز

python python\02_train_mnist_tiny_cnn.py
python python\03_quantize_to_tflite.py --model models\mnist_tiny_cnn.keras

گام ۲: تبدیل به هدر C

python python\04_tflite_to_c_array.py `
  --tflite models\mnist_tiny_cnn_int8.tflite `
  --out firmware\hello_sine_arduino\model_data.h `
  --var g_model

گام ۳: اسکلت firmware

مفهوم کد (ساده‌شده):

#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
#include "model_data.h"

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

void setup() {
  const tflite::Model* model = tflite::GetModel(g_model);
  static tflite::MicroMutableOpResolver<6> resolver;
  // resolver.AddConv2D(); resolver.AddFullyConnected(); ...
  static tflite::MicroInterpreter interpreter(
      model, resolver, tensor_arena, kArenaSize);
  interpreter.AllocateTensors();
}

void loop() {
  // 1) سنسور → buffer
  // 2) پیش‌پردازش عین آموزش
  // 3) کپی به interpreter.input(0)
  // 4) interpreter.Invoke()
  // 5) خواندن interpreter.output(0) → LED / سریال
}

قالب آماده: firmware/hello_sine_arduino/ و firmware/esp32_tflm_template/

گام ۴: اندازه Arena

  • خیلی کم → Allocate/Invoke fail
  • خیلی زیاد → کل RAM پر می‌شود

روش عملی: از ۶۰KB شروع کن، بالا ببر تا پایدار شود، سپس با arena_used_bytes() کم کن.

گام ۵: فقط اپراتورهای لازم

برای محصول از MicroMutableOpResolver استفاده کن.
لیست ops مدل را با ابزار تحلیل TFLite یا Netron ببین:

https://netron.app


مسیر ۲ — Edge Impulse (سریع‌ترین تا برد)

  1. برو به https://studio.edgeimpulse.com و اکانت رایگان بساز
  2. Create project → نوع داده (Audio / Accel / Image)
  3. داده آپلود یا با CLI از برد بگیر
  4. Impulse design: Processing block + Learning block
  5. Generate features → Train
  6. Model testing
  7. Deployment → Arduino library → Build
  8. در Arduino IDE: Sketch → Include Library → Add .ZIP Library
  9. مثال آمادهٔ کتابخانه را Upload کن

مستند رسمی:

https://docs.edgeimpulse.com/hardware/deployments/run-arduino-2-0

مزیت: پیش‌پردازش + مدل + SDK یکجا.
عیب: کمتر «زیر پوست» را می‌بینی — برای یادگیری عمیق مسیر ۱ را هم برو.


مسیر ۳ — بردبه‌برد

ESP32 / ESP32-S3 (بهترین خرید اول)

  1. Arduino IDE → Preferences → Additional Boards URL:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  1. Boards Manager → esp32 نصب
  2. Board: ESP32S3 Dev Module (یا مدل بردت)
  3. اگر تصویر داری: PSRAM = Enabled
  4. کتابخانه TFLM / مثال رسمی Espressif یا Edge Impulse

نکات تولیدی:

  • Wi‑Fi همزمان با inference سنگین می‌تواند RAM/CPU را فشار دهد
  • برای صدا از I2S استفاده کن
  • ESP-NN سرعت را بالا می‌برد

Arduino Nano 33 BLE Sense

  • سنسورهای داخلی: IMU، میکروفون، …
  • کتابخانهٔ رسمی Arduino TensorFlow Lite (نسخه را با برد هماهنگ کن)
  • مثال‌های Edge Impulse برای Nano آماده است

Raspberry Pi Pico (RP2040 / RP2350)

  • ارزان و محبوب
  • TFLM پشتیبانی دارد؛ اکوسیستم کمی دستی‌تر از Arduino Sense
  • عالی برای IMU و پروژه‌های آموزشی

STM32

  • STM32Cube.AI برای تبدیل مدل
  • CMSIS-NN عملکرد خوب روی Cortex-M
  • مسیر صنعتی‌تر

چک‌لیست قبل از Upload

  • مدل Full INT8 است
  • شکل ورودی firmware = شکل آموزش
  • مقیاس ورودی (۰–۱، ۱–۱، int8 scale) یکسان است
  • Arena کافی است
  • سریال ۱۲۵۲۰۰ یا ۱۱۵۲۰۰ درست باز می‌شود
  • یک تست طلایی داری (نمونهٔ معلوم که باید کلاس X بدهد)

الگوی پیش‌پردازش روی دستگاه (مثال تصویر)

آموزش: تصویر ۹۶×۹۶، خاکستری، نرمال ۰..۱ سپس quantize به int8.

روی MCU:

  1. گرفتن فریم دوربین
  2. Resize به ۹۶×۹۶
  3. RGB→Gray (اگر لازم)
  4. تبدیل به int8 با همان scale/zero_point مدل
  5. memcpy به input->data.int8
  6. Invoke()
  7. argmax روی خروجی

اگر یکی از این‌ها فرق کند، دقت از بین می‌رود حتی اگر مدل عالی باشد.


دیباگ وقتی «کار نمی‌کند»

علامت احتمال
AllocateTensors fail Arena کم / مدل بزرگ
خروجی همیشه یک کلاس ورودی خراب / scale غلط
ریست شدن برد سرریز استک / مصرف RAM
دقت خوب روی PC بد روی برد پیش‌پردازش ناهمسان / نویز سنسور
کامپایل error در TFLM نسخه کتابخانه ناسازگار

تاکتیک طلایی: ابتدا بردار ویژگی از پیش محاسبه‌شده را از PC به سریال بفرست و روی MCU فقط Invoke کن. اگر درست بود، مشکل از سنسور/پیش‌پردازش است نه مدل.


بدون برد چه کنی؟

  1. کل پایپ‌لاین را تا .tflite و model_data.h کامل کن
  2. با TFLite Interpreter روی PC inference را اندازه بگیر
  3. در Edge Impulse پروژه بساز و در Studio تست کن
  4. firmware را بنویس و کامنت بگذار کجا سنسور وصل می‌شود

وقتی برد رسیدی، فقط کابل بزن و Upload کن.


قدم بعدی: 05-Roadmap-0-to-100-FA.md