زبان / 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() → تصمیم
- Arduino IDE 2.x یا PlatformIO
- کابل USB مناسب برد
- درایور سریال (برای بعضی بردهای CH340/CP2102)
تا وقتی برد نداری، مراحل ۱–۴ را کامل روی PC انجام بده و firmware را آماده نگه دار.
python python\02_train_mnist_tiny_cnn.py
python python\03_quantize_to_tflite.py --model models\mnist_tiny_cnn.keraspython 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مفهوم کد (سادهشده):
#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/
- خیلی کم → Allocate/Invoke fail
- خیلی زیاد → کل RAM پر میشود
روش عملی: از ۶۰KB شروع کن، بالا ببر تا پایدار شود، سپس با arena_used_bytes() کم کن.
برای محصول از MicroMutableOpResolver استفاده کن.
لیست ops مدل را با ابزار تحلیل TFLite یا Netron ببین:
- برو به https://studio.edgeimpulse.com و اکانت رایگان بساز
- Create project → نوع داده (Audio / Accel / Image)
- داده آپلود یا با CLI از برد بگیر
- Impulse design: Processing block + Learning block
- Generate features → Train
- Model testing
- Deployment → Arduino library → Build
- در Arduino IDE: Sketch → Include Library → Add .ZIP Library
- مثال آمادهٔ کتابخانه را Upload کن
مستند رسمی:
https://docs.edgeimpulse.com/hardware/deployments/run-arduino-2-0
مزیت: پیشپردازش + مدل + SDK یکجا.
عیب: کمتر «زیر پوست» را میبینی — برای یادگیری عمیق مسیر ۱ را هم برو.
- Arduino IDE → Preferences → Additional Boards URL:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- Boards Manager →
esp32نصب - Board: ESP32S3 Dev Module (یا مدل بردت)
- اگر تصویر داری: PSRAM = Enabled
- کتابخانه TFLM / مثال رسمی Espressif یا Edge Impulse
نکات تولیدی:
- Wi‑Fi همزمان با inference سنگین میتواند RAM/CPU را فشار دهد
- برای صدا از I2S استفاده کن
- ESP-NN سرعت را بالا میبرد
- سنسورهای داخلی: IMU، میکروفون، …
- کتابخانهٔ رسمی Arduino TensorFlow Lite (نسخه را با برد هماهنگ کن)
- مثالهای Edge Impulse برای Nano آماده است
- ارزان و محبوب
- TFLM پشتیبانی دارد؛ اکوسیستم کمی دستیتر از Arduino Sense
- عالی برای IMU و پروژههای آموزشی
- STM32Cube.AI برای تبدیل مدل
- CMSIS-NN عملکرد خوب روی Cortex-M
- مسیر صنعتیتر
- مدل Full INT8 است
- شکل ورودی firmware = شکل آموزش
- مقیاس ورودی (۰–۱، ۱–۱، int8 scale) یکسان است
- Arena کافی است
- سریال ۱۲۵۲۰۰ یا ۱۱۵۲۰۰ درست باز میشود
- یک تست طلایی داری (نمونهٔ معلوم که باید کلاس X بدهد)
آموزش: تصویر ۹۶×۹۶، خاکستری، نرمال ۰..۱ سپس quantize به int8.
روی MCU:
- گرفتن فریم دوربین
- Resize به ۹۶×۹۶
- RGB→Gray (اگر لازم)
- تبدیل به int8 با همان scale/zero_point مدل
memcpyبهinput->data.int8Invoke()- argmax روی خروجی
اگر یکی از اینها فرق کند، دقت از بین میرود حتی اگر مدل عالی باشد.
| علامت | احتمال |
|---|---|
| AllocateTensors fail | Arena کم / مدل بزرگ |
| خروجی همیشه یک کلاس | ورودی خراب / scale غلط |
| ریست شدن برد | سرریز استک / مصرف RAM |
| دقت خوب روی PC بد روی برد | پیشپردازش ناهمسان / نویز سنسور |
| کامپایل error در TFLM | نسخه کتابخانه ناسازگار |
تاکتیک طلایی: ابتدا بردار ویژگی از پیش محاسبهشده را از PC به سریال بفرست و روی MCU فقط Invoke کن. اگر درست بود، مشکل از سنسور/پیشپردازش است نه مدل.
- کل پایپلاین را تا
.tfliteوmodel_data.hکامل کن - با TFLite Interpreter روی PC inference را اندازه بگیر
- در Edge Impulse پروژه بساز و در Studio تست کن
- firmware را بنویس و کامنت بگذار کجا سنسور وصل میشود
وقتی برد رسیدی، فقط کابل بزن و Upload کن.
قدم بعدی: 05-Roadmap-0-to-100-FA.md