در پروژه های قبلی با استفاده از برد ESP32-cam و ساخت یک وب سرور با فراخوانی TensoeFlow.js توانستیم پردازش تصویر و یادگیری ماشین را مبتنی بر وب سرور اجرا کنیم اما در این پروژه تنها با استفاده از برد ESP32-CAM این مورد را عملی خواهیم کرد، به این صورت که با دوربین موجود در برد مربوط، تصاویر در لحظه تحلیل میشوند و در سریال مانیتور میزان درصد تطابق تصویر موجود با یک انسان نمایش داده میشود. در این پزوژه از کتابخانه TensorFlowLite_ESP32 کردیم که در سال ۲۰۱۹ توسط توسعه دهندگان Tensorflow منتشر شده است. این کتابخانه مدل های یادگیری ماشین TensorFlow را روی میکروکنترلرها اجرا می کند و به شما امکان می دهد برنامه های AI / ML را با استفاده از شبکه های عصبی و یادگیری عمیق ایجاد کنید. با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
TensorFlow Lite for Microcontrollers
TensorFlow Lite برای میکروکنترلرها برای اجرای مدلهای یادگیری ماشین در میکروکنترلرها و سایر دستگاهها با فقط چند کیلوبایت حافظه طراحی شده است. زمان اجرای هسته فقط ۱۶ کیلوبایت بر روی Arm Cortex M3 قرار دارد و می تواند بسیاری از مدل های اصلی را اجرا کند. نیازی به پشتیبانی سیستم عامل ، هیچ کتابخانه استاندارد C یا C یا تخصیص حافظه پویا ندارد.
میکروکنترلرها معمولاً دستگاه های محاسباتی کوچک و کم نیرو هستند که درون سخت افزاری تعبیه شده اند و به محاسبات اساسی احتیاج دارند. با آوردن یادگیری ماشینی به میکروکنترلرهای کوچک ، می توانیم هوش میلیاردها دستگاهی را که در زندگی خود استفاده می کنیم ، از جمله لوازم خانگی و دستگاه های اینترنت اشیا، بدون اتکا به سخت افزار گران قیمت یا اتصالات اینترنتی قابل اعتماد ، که اغلب تحت پهنای باند و محدودیت های قدرت و منجر به تأخیر زیاد است. این امر همچنین می تواند به حفظ حریم خصوصی شما کمک کند ، زیرا هیچ داده ای از دستگاه خارج نمی شود. وسایل هوشمند را تصور کنید که می توانند با برنامه روزمره شما سازگار شوند ، سنسورهای هوشمند صنعتی که تفاوت بین مشکلات و عملکرد طبیعی را درک می کنند و اسباب بازی های جادویی که می توانند به بچه ها کمک کنند تا از راه های سرگرم کننده و لذت بخشی یاد بگیرند.
شناخت برد ESP32-CAM
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
از دیگر امکانات ماژول ESP32-cam میتوان به دوربین OV2640 با قابلیت ثبت تصویر با فرمت JPEG, BMP, grayscale اشاره کرد. همچنین با LED flash مونتاژ شده بر روی این ماژول قادر به تصویر برداری در مکانهای تاریک نیز خواهید بود. یکی از ویژگیهای کاربردی این ماژول ورودی micro SD با قابلیت ارتقا تا ۴GB است که به کاربر اجازه ذخیره تصاویر را هم میدهد.
نحوه کار پروژه
در پروژه سیستم تشخیص انسان مدل های یادگیری ماشین را به صورت محلی روی دستگاه ESP32 خود اجرا کردیم. با استفاده از کتابخانه TensorFlowLite_ESP32 که این کتابخانه مدل های یادگیری ماشین TensorFlow را روی میکروکنترلرها اجرا می کند و به شما امکان می دهد هوش مصنوعی بسازیم. در این پروژه بر خلاف پروژه های پیشین که تمام پردازش در وبسرور ایجاد شده توسط ما انجام میشد، در این پروژه تمام پردازش به گردن خود میکروکنترلر قرار داد و نتیجه بصورت تصاویر فریم به فریم با کد های ASCII در سریال مانیتور Arduino IDE نمایش داده میشود. همچنین درصد شباهت سوژه به مدل مدنظر ما یعنی انسان در همین طریق اطلاع رسانی میشود.
وسایل مورد نیاز
نصب افزونه ESP32
برای شروع باید کتابخانه مربوط به این ماژول در نرم افزار Arduino IDE نصب گردد. ابتدا باید لینک زیر در محل ذکر شده File> Preferences کپی و پیست شود.
https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
سپس با مراجعه به بخش برد ها در Tools > Board > Boards Manager و جسجوی ESP32 قادر به دانلود کتابخانه مربوط خواهید بود.
پروگرام کردن ESP32-cam
برای پروگرام کردن برد ESP-CAM در پرورژه سیستم تشخیص انسان نیاز به نرم افزار Arduino-IDE داریم و البته دانلود برد مربوط در محیط نرم افزار و همچنین نصب کتابخانه های مورد نیاز، برای اطلاع از این موارد می توانید به این آموزش مراجعه کنید. اتصالات را مطابق شماتیک زیر متناسب با USB TO TTL استفاده شده برقرار کنید. دقت داشته باشد که در زمان پروگرام شدن کد یعنی پس از کامپایل کردن کد، دو پین GPIO 0 و GND به یکدیگر متصل هستند و پس از کامپایل موفق کد، برای اجرا شدن پروژه باید این اتصال را جدا کنید.
- اتصالات به شرح زیر میباشد.
راهاندازی و اجرای پروژه
این پروژه شامل چندین هدر فایل است که توسط توسعه دهندگان منتشر شده، که مدل مدنظر را تعریف میکند، خروجی را تعریف میکند و تمام فانکشن های برنامه را تحلیل و تنظیم میکند. از خروجی در سریال مانیتور تا تحلیل مدل، همگی این پردازش ها برعهده خود تراشه ESP32 مورد استفاده ما است. کدی که در پایین مشاهده میکنید کد اصلی برای شروع کار پروژه و درادامه پوینت کردن به دیگر هدر فایل ها است.
#include <TensorFlowLite_ESP32.h> #include "main_functions.h" #include "detection_responder.h" #include "image_provider.h" #include "model_settings.h" #include "person_detect_model_data.h" #include "tensorflow/lite/experimental/micro/kernels/micro_ops.h" #include "tensorflow/lite/experimental/micro/micro_error_reporter.h" #include "tensorflow/lite/experimental/micro/micro_interpreter.h" #include "tensorflow/lite/experimental/micro/micro_mutable_op_resolver.h" #include "tensorflow/lite/schema/schema_generated.h" #include "tensorflow/lite/version.h" namespace { tflite::ErrorReporter* error_reporter = nullptr; const tflite::Model* model = nullptr; tflite::MicroInterpreter* interpreter = nullptr; TfLiteTensor* input = nullptr; constexpr int kTensorArenaSize = 70 * 1024; static uint8_t tensor_arena[kTensorArenaSize]; } void setup() { static tflite::MicroErrorReporter micro_error_reporter; error_reporter = µ_error_reporter; model = tflite::GetModel(g_person_detect_model_data); if (model->version() != TFLITE_SCHEMA_VERSION) { error_reporter->Report( "Model provided is schema version %d not equal " "to supported version %d.", model->version(), TFLITE_SCHEMA_VERSION); return; } static tflite::MicroMutableOpResolver micro_mutable_op_resolver; micro_mutable_op_resolver.AddBuiltin( tflite::BuiltinOperator_DEPTHWISE_CONV_2D, tflite::ops::micro::Register_DEPTHWISE_CONV_2D()); micro_mutable_op_resolver.AddBuiltin(tflite::BuiltinOperator_CONV_2D, tflite::ops::micro::Register_CONV_2D()); micro_mutable_op_resolver.AddBuiltin( tflite::BuiltinOperator_AVERAGE_POOL_2D, tflite::ops::micro::Register_AVERAGE_POOL_2D()); static tflite::MicroInterpreter static_interpreter( model, micro_mutable_op_resolver, tensor_arena, kTensorArenaSize, error_reporter); interpreter = &static_interpreter; TfLiteStatus allocate_status = interpreter->AllocateTensors(); if (allocate_status != kTfLiteOk) { error_reporter->Report("AllocateTensors() failed"); return; } input = interpreter->input(0); } void loop() { if (kTfLiteOk != GetImage(error_reporter, kNumCols, kNumRows, kNumChannels, input->data.uint8)) { error_reporter->Report("Image capture failed."); } if (kTfLiteOk != interpreter->Invoke()) { error_reporter->Report("Invoke failed."); } TfLiteTensor* output = interpreter->output(0); uint8_t person_score = output->data.uint8[kPersonIndex]; uint8_t no_person_score = output->data.uint8[kNotAPersonIndex]; RespondToDetection(error_reporter, person_score, no_person_score); }
در کد های این پروژه تمام هدر فایل ها بصورت منظم و سلسه مراتبی به یکدیگر متصل هستند پس اگر تمام هدر فایل ها در کد اول فراخوانی نشده، به این دلیل است که در فایلی دیگر مورد نظر فراخوانی و اجرا شده. در کد پایین مطابق روال پروژه های گذشته باید نوع ماژول مورد استفاده را انتخاب کنیم، در غیر این صورت هنگام آپلود و کامپایل کد با ارور مواجه خواهید شد. برای در این مورد من از تراشه Ai-Thinker استفاده کردم، پس در کد این گزینه را از کامنت خارج کردم.
#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_CONFIG_H_ #define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_CONFIG_H_ // VFlip //#define CONFIG_CAMERA_VFLIP 1 // Select device //#define CONFIG_CAMERA_MODEL_WROVER_KIT 1 //#define CONFIG_CAMERA_MODEL_ESP_EYE 1 //#define CONFIG_CAMERA_MODEL_M5STACK_PSRAM 1 //#define CONFIG_CAMERA_MODEL_M5STACK_WIDE 1 #define CONFIG_CAMERA_MODEL_AI_THINKER 1 //#define CONFIG_CAMERA_MODEL_CUSTOM 1 // Other Camera setting #ifdef CONFIG_CAMERA_MODEL_CUSTOM #define CONFIG_CAMERA_PIN_PWDN 26 #define CONFIG_CAMERA_PIN_RESET -1 #define CONFIG_CAMERA_PIN_XCLK 32 #define CONFIG_CAMERA_PIN_SIOD 13 #define CONFIG_CAMERA_PIN_SIOC 12 #define CONFIG_CAMERA_PIN_Y9 39 #define CONFIG_CAMERA_PIN_Y8 36 #define CONFIG_CAMERA_PIN_Y7 23 #define CONFIG_CAMERA_PIN_Y6 18 #define CONFIG_CAMERA_PIN_Y5 15 #define CONFIG_CAMERA_PIN_Y4 4 #define CONFIG_CAMERA_PIN_Y3 14 #define CONFIG_CAMERA_PIN_Y2 5 #define CONFIG_CAMERA_PIN_VSYNC 27 #define CONFIG_CAMERA_PIN_HREF 25 #define CONFIG_CAMERA_PIN_PCLK 19 #endif #endif
این فایل یعنی person_detect_model_data.h و person_detect_model_data.cpp از مهم ترین بخش های برنامه هستند، زیرا وظیفه تحلیل و تبدیل تصاویر دریافتی و تطابق دادن موارد دریافتی با مدل های از قبل معرفی شده را دارند، البته این مورد در کل کد ما تراکم دارد اما بخش قابل توجهی در این دو فایل که ذکر شد صورت میگیرد.
#include "person_detect_model_data.h" #ifdef __has_attribute #define HAVE_ATTRIBUTE(x) __has_attribute(x) #else #define HAVE_ATTRIBUTE(x) 0 #endif #if HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__)) #define DATA_ALIGN_ATTRIBUTE __attribute__((aligned(4))) #else #define DATA_ALIGN_ATTRIBUTE #endif const unsigned char g_person_detect_model_data[] DATA_ALIGN_ATTRIBUTE = { ۰x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00, ۰x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, ۰x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, ۰x04, 0x99, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, ۰x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, ۰x0f, 0x00, 0x00, 0x00, 0x54, 0x4f, 0x43, 0x4f, 0x20, 0x43, 0x6f, 0x6e, ۰x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, 0x57, 0x00, 0x00, 0x00, ۰xa8, 0x03, 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, ۰x70, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, ۰x4c, 0x03, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x34, 0x03, 0x00, 0x00, ۰x28, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, ۰x04, 0x03, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, ۰xe0, 0x02, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, ۰xbc, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, ۰x98, 0x02, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, ۰x74, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, ۰x50, 0x02, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, ۰x2c, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, ۰x08, 0x02, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, ۰xe4, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, ۰xc0, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, ۰x9c, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, ۰x80, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, ۰x64, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, ۰x4c, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, ۰x34, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, ۰x14, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, ۰xfc, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, ۰xe0, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, ۰xc8, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, ۰xa8, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, ۰x90, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, ۰x70, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, ۰x58, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, ۰x38, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, ۰x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ۰xc6, 0xfd, 0xff, 0xff, 0x80, 0x04, 0x00, 0x00, 0xc0, 0xfd, 0xff, 0xff, ۰xd2, 0xfd, 0xff, 0xff, 0xbc, 0x45, 0x00, 0x00, 0xcc, 0xfd, 0xff, 0xff, ۰xde, 0xfd, 0xff, 0xff, 0x78, 0x4b, 0x00, 0x00, 0xe6, 0xfd, 0xff, 0xff, ۰x68, 0x4e, 0x00, 0x00, 0xee, 0xfd, 0xff, 0xff, 0x60, 0x53, 0x00, 0x00, ۰xe8, 0xfd, 0xff, 0xff, 0xec, 0xfd, 0xff, 0xff, 0xf0, 0xfd, 0xff, 0xff, ۰xf4, 0xfd, 0xff, 0xff, 0x06, 0xfe, 0xff, 0xff, 0x80, 0x56, 0x00, 0x00, ۰x0e, 0xfe, 0xff, 0xff, 0xf8, 0x5a, 0x00, 0x00, 0x08, 0xfe, 0xff, 0xff, ۰x0c, 0xfe, 0xff, 0xff, 0x10, 0xfe, 0xff, 0xff, 0x14, 0xfe, 0xff, 0xff, ۰x26, 0xfe, 0xff, 0xff, 0x98, 0x5f, 0x00, 0x00, 0x20, 0xfe, 0xff, 0xff, ۰x32, 0xfe, 0xff, 0xff, 0xd4, 0x62, 0x00, 0x00, 0x2c, 0xfe, 0xff, 0xff, ۰x30, 0xfe, 0xff, 0xff, 0x34, 0xfe, 0xff, 0xff, 0x38, 0xfe, 0xff, 0xff, ۰x4a, 0xfe, 0xff, 0xff, 0xcc, 0x66, 0x00, 0x00, 0x44, 0xfe, 0xff, 0xff, ۰x48, 0xfe, 0xff, 0xff, 0x4c, 0xfe, 0xff, 0xff, 0x50, 0xfe, 0xff, 0xff, ۰x62, 0xfe, 0xff, 0xff, 0xf4, 0x69, 0x00, 0x00, 0x6a, 0xfe, 0xff, 0xff, ۰x24, 0x6f, 0x00, 0x00, 0x64, 0xfe, 0xff, 0xff, 0x68, 0xfe, 0xff, 0xff, ۰x6c, 0xfe, 0xff, 0xff, 0x70, 0xfe, 0xff, 0xff, 0x74, 0xfe, 0xff, 0xff, ۰x78, 0xfe, 0xff, 0xff, 0x7c, 0xfe, 0xff, 0xff, 0x8e, 0xfe, 0xff, 0xff, ۰xc8, 0xb3, 0x00, 0x00, 0x88, 0xfe, 0xff, 0xff, 0x8c, 0xfe, 0xff, 0xff, ۰x90, 0xfe, 0xff, 0xff, 0x94, 0xfe, 0xff, 0xff, 0xa6, 0xfe, 0xff, 0xff, ۰xc8, 0xb6, 0x00, 0x00, 0xae, 0xfe, 0xff, 0xff, 0x98, 0xb7, 0x00, 0x00, ۰xb6, 0xfe, 0xff, 0xff, 0x54, 0xb8, 0x00, 0x00, 0xbe, 0xfe, 0xff, 0xff, ۰xe8, 0xb8, 0x00, 0x00, 0xc6, 0xfe, 0xff, 0xff, 0xd8, 0xb9, 0x00, 0x00, ۰xce, 0xfe, 0xff, 0xff, 0x14, 0xbb, 0x00, 0x00, 0xd6, 0xfe, 0xff, 0xff, ۰x88, 0xbd, 0x00, 0x00, 0xde, 0xfe, 0xff, 0xff, 0xb8, 0xbe, 0x00, 0x00, ۰xe6, 0xfe, 0xff, 0xff, 0x4c, 0xc0, 0x00, 0x00, 0xee, 0xfe, 0xff, 0xff, ۰x40, 0xc1, 0x00, 0x00, 0xf6, 0xfe, 0xff, 0xff, 0x38, 0xc2, 0x00, 0x00, ۰xfe, 0xfe, 0xff, 0xff, 0x64, 0xc3, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, ۰xd8, 0xcb, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0x50, 0xcd, 0x00, 0x00, ۰x16, 0xff, 0xff, 0xff, 0xfc, 0xce, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, ۰x70, 0xdf, 0x00, 0x00, 0x26, 0xff, 0xff, 0xff, 0x20, 0xe1, 0x00, 0x00, ۰x2e, 0xff, 0xff, 0xff, 0xd8, 0xe3, 0x00, 0x00, 0x36, 0xff, 0xff, 0xff, ۰x84, 0xe5, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xf8, 0x05, 0x01, 0x00, ۰x46, 0xff, 0xff, 0xff, 0x70, 0x08, 0x01, 0x00, 0x4e, 0xff, 0xff, 0xff, ۰xe4, 0x0a, 0x01, 0x00, 0x56, 0xff, 0xff, 0xff, 0x58, 0x0d, 0x01, 0x00, ۰x5e, 0xff, 0xff, 0xff, 0x08, 0x10, 0x01, 0x00, 0x66, 0xff, 0xff, 0xff, ۰x00, 0x15, 0x01, 0x00, 0x6e, 0xff, 0xff, 0xff, 0xb0, 0x17, 0x01, 0x00, ۰x76, 0xff, 0xff, 0xff, 0x28, 0x58, 0x01, 0x00, 0x7e, 0xff, 0xff, 0xff, ۰xd4, 0x5a, 0x01, 0x00, 0x86, 0xff, 0xff, 0xff, 0x48, 0x9b, 0x01, 0x00, ۰x8e, 0xff, 0xff, 0xff, 0xf8, 0x9d, 0x01, 0x00, 0x96, 0xff, 0xff, 0xff, ۰xf0, 0xa2, 0x01, 0x00, 0x9e, 0xff, 0xff, 0xff, 0x68, 0xa5, 0x01, 0x00, ۰xa6, 0xff, 0xff, 0xff, 0x18, 0xa8, 0x01, 0x00, 0xae, 0xff, 0xff, 0xff, ۰x90, 0xe8, 0x01, 0x00, 0xb6, 0xff, 0xff, 0xff, 0x40, 0xeb, 0x01, 0x00, ۰xbe, 0xff, 0xff, 0xff, 0x70, 0xf0, 0x01, 0x00, 0xc6, 0xff, 0xff, 0xff, ۰xe8, 0x70, 0x02, 0x00, 0xce, 0xff, 0xff, 0xff, 0x98, 0x75, 0x02, 0x00, ۰xd6, 0xff, 0xff, 0xff, 0x10, 0x7f, 0x02, 0x00, 0xde, 0xff, 0xff, 0xff, ۰xc0, 0x83, 0x02, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x34, 0x84, 0x03, 0x00, ۰x00, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, ۰xe8, 0x88, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, ۰x06, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, ۰x04, 0x00, 0x00, 0x00, 0x7c, 0x77, 0xfc, 0xff, 0x20, 0x00, 0x00, 0x00, ۰x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x64, 0x8c, 0x03, 0x00, ۰x01, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, ۰x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x00, 0x00, ۰xf0, 0x5b, 0x00, 0x00, 0x2c, 0x64, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, ۰x70, 0x09, 0x01, 0x00, 0x84, 0x9c, 0x01, 0x00, 0xb8, 0xa1, 0x01, 0x00, ۰x84, 0x63, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x94, 0x65, 0x00, 0x00, ۰x28, 0xa4, 0x01, 0x00, 0x3c, 0x67, 0x00, 0x00, 0x58, 0xe7, 0x01, 0x00, ۰x24, 0xad, 0x00, 0x00, 0x98, 0xa6, 0x01, 0x00, 0x44, 0x62, 0x00, 0x00, ۰x10, 0x58, 0x00, 0x00, 0xc4, 0xe9, 0x01, 0x00, 0xb0, 0x6f, 0x02, 0x00, ۰x3c, 0x5f, 0x00, 0x00, 0xf0, 0xee, 0x01, 0x00, 0x04, 0x51, 0x00, 0x00, ۰xd8, 0x7d, 0x02, 0x00, 0x1c, 0x74, 0x02, 0x00, 0x08, 0x83, 0x03, 0x00, ۰xcc, 0xb3, 0x00, 0x00, 0x48, 0x82, 0x02, 0x00, 0xf4, 0x5a, 0x00, 0x00, ۰xe8, 0xb5, 0x00, 0x00, 0xe4, 0xb4, 0x00, 0x00, 0x7c, 0xb6, 0x00, 0x00, ۰x74, 0x61, 0x00, 0x00, 0xe8, 0xb0, 0x00, 0x00, 0xf4, 0xad, 0x00, 0x00, ۰x10, 0x50, 0x00, 0x00, 0x24, 0xb7, 0x00, 0x00, 0x1c, 0xbb, 0x00, 0x00, ۰x3c, 0x5a, 0x00, 0x00, 0x60, 0xb8, 0x00, 0x00, 0x6c, 0x52, 0x00, 0x00, ۰xe0, 0xbd, 0x00, 0x00, 0x04, 0xbc, 0x00, 0x00, 0xd4, 0xbe, 0x00, 0x00, ۰x64, 0x62, 0x00, 0x00, 0xe8, 0x52, 0x00, 0x00, 0xc4, 0x51, 0x00, 0x00, ۰xc0, 0xbf, 0x00, 0x00, 0x5c, 0x5f, 0x00, 0x00, 0x6c, 0xc9, 0x00, 0x00, ۰x64, 0x64, 0x00, 0x00, 0xb0, 0xc0, 0x00, 0x00, 0xac, 0x5b, 0x00, 0x00, ۰xd8, 0xca, 0x00, 0x00, 0x94, 0x47, 0x00, 0x00, 0x04, 0xdd, 0x00, 0x00, ۰x0c, 0xad, 0x00, 0x00, 0x48, 0xcc, 0x00, 0x00, 0x04, 0x51, 0x00, 0x00, ۰x68, 0xe1, 0x00, 0x00, 0x6c, 0xde, 0x00, 0x00, 0x94, 0x03, 0x01, 0x00, ۰x3c, 0xb2, 0x00, 0x00, 0xd8, 0xe2, 0x00, 0x00, 0xdc, 0x65, 0x00, 0x00, ۰x00, 0x06, 0x01, 0x00, 0x5c, 0x4a, 0x00, 0x00, 0xf4, 0x0a, 0x01, 0x00, ۰xcc, 0xaf, 0x00, 0x00, 0x90, 0x6b, 0x00, 0x00, 0x34, 0x65, 0x00, 0x00, ۰x98, 0x12, 0x01, 0x00, 0x5c, 0x0d, 0x01, 0x00, 0xec, 0x5b, 0x00, 0x00, ۰xb4, 0x46, 0x00, 0x00, 0x08, 0x15, 0x01, 0x00, 0xdc, 0xad, 0x00, 0x00, ۰xb8, 0x55, 0x01, 0x00, 0x6c, 0x41, 0x00, 0x00, 0xe4, 0x98, 0x01, 0x00, ۰x0c, 0xaf, 0x00, 0x00, 0x28, 0x58, 0x01, 0x00, 0x5c, 0xb1, 0x00, 0x00, ۰x70, 0x8a, 0x03, 0x00, 0x50, 0xae, 0x00, 0x00, 0x94, 0x86, 0x03, 0x00, ۰x6c, 0xb2, 0x00, 0x00, 0xae, 0x75, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x03, ۰x5c, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, ۰x64, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x62, 0x69, ۰x6c, 0x65, 0x6e, 0x65, 0x74, 0x56, 0x31, 0x2f, 0x43, 0x6f, 0x6e, 0x76, ۰x32, 0x64, 0x5f, 0x31, 0x30, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x77, ۰x69, 0x73, 0x65, 0x2f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5f, ۰x71, 0x75, 0x61, 0x6e, 0x74, 0x2f, 0x46, 0x61, 0x6b, 0x65, 0x51, 0x75, ۰x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x4d, 0x61, ۰x78, 0x56, 0x61, 0x72, 0x73, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ۰x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, ۰x80, 0x00, 0x00, 0x00, 0x74, 0x79, 0xfc, 0xff, 0x30, 0x00, 0x00, 0x00, ۰x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ۰x01, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ۰x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x7c, 0x81, 0x3b, ۰x01, 0x00, 0x00, 0x00, 0xca, 0x8f, 0x02, 0x3f, 0x01, 0x00, 0x00, 0x00, ۰xa7, 0xc5, 0xfc, 0xbe, 0x00, 0x40, 0x00, 0x00, 0x72, 0x6a, 0x61, 0x78, ۰x80, 0x96, 0x73, 0x8f, 0xb2, 0xce, 0xaf, 0xab, 0x82, 0x56, 0x5c, 0x87, ۰x70, 0x7d, 0x85, 0x7e, 0x77, 0x77, 0x62, 0x8a, 0x6d, 0x7a, 0x82, 0x79, ۰x59, 0x54, 0x7a, 0xa4, 0x49, 0x83, 0x80, 0xbe, 0x98, 0x65, 0x93, 0x84, ۰xb1, 0x74, 0x81, 0x94, 0x70, 0x5c, 0xad, 0x82, 0x5d, 0x6c, 0x5c, 0x74, ۰x8e, 0x66, 0x5c, 0xb6, 0x8b, 0x86, 0x71, 0x7a, 0x63, 0x77, 0x6e, 0x83, ۰x82, 0x82, 0x7d, 0x5b, 0x54, 0x89, 0x38, 0x4d, 0x72, 0x65, 0x77, 0x94, ۰x66, 0x55, 0x97, 0x8b, 0x7b, 0x80, 0x6f, 0x82, 0x9c, 0x51, 0x75, 0x96, ۰x8b, 0x81, 0x82, 0x62, 0x5e, 0xa7, 0x5b, 0x5c, 0x78, 0x78, 0x74, 0x7f, ۰x89, 0xa1, 0x5f, 0x9b, 0x84, 0x74, 0x9a, 0x71, 0x4f, 0xb7, 0x66, 0x78, ۰x7f, 0x75, 0x74, 0xa0, 0x89, 0x99, 0x65, 0x5a, 0x8d, 0x86, 0x88, 0x6b, ۰x69, 0xaa, 0x81, 0x8f, 0x80, 0x70, 0x9e, 0x75, 0x90, 0x6f, 0x8b, 0x76, ۰x71, 0x7f, 0x5c, 0x74, 0x98, 0x4c, 0x8d, 0x89, 0x85, 0x68, 0x88, 0x55, ۰x8d, 0x85, 0x5e, 0x72, 0x74, 0xad, 0x85, 0x56, 0x29, 0x4d, 0x69, 0x7e, ۰x9c, 0x60, 0x96, 0xa2, 0x80, 0x72, 0x8a, 0x91, 0x80, 0x96, 0x64, 0x83, ۰x66, 0x77, 0x9f, 0x4f, 0xa6, 0x90, 0x69, 0x68, 0x6b, 0xb7, 0x74, 0x56, ۰xad, 0x79, 0x61, 0x86, 0x71, 0x95, 0x80, 0x8c, 0x82, 0x5d, 0x71, 0x66, ۰xa4, 0x7b, 0x6d, 0x89, 0xb3, 0x77, 0x78, 0x71, 0x96, 0xa0, 0x7e, 0x95, ۰xb4, 0x96, 0x88, 0x88, 0x51, 0x75, 0x70, 0x41, 0x72, 0x95, 0x88, 0x77, ۰x81, 0x53, 0x58, 0x8b, 0x89, 0x92, 0x45, 0x49, 0x74, 0x5f, 0x7a, 0x84, ۰x91, 0x89, 0x58, 0x8a, 0x78, 0x70, 0x87, 0x82, 0x93, 0x6b, 0x63, 0x8a, ۰x8f, 0x9b, 0x65, 0xdc, 0x8a, 0x93, 0x9c, 0xa5, 0x6e, 0xa2, 0x59, 0xa2, ۰x6a, 0x59, 0x6d, 0x73, 0x51, 0x76, 0x80, 0x93, 0x8f, 0x73, 0x80, 0x5c, ۰x71, 0x81, 0x88, 0xbe, 0x8a, 0x68, 0x9c, 0x7c, 0x68, 0x8c, 0x66, 0x9a, ۰x5d, 0x8b, 0x70, 0x7c, 0x5f, 0x7f, 0x9a, 0x86, 0x47, 0xb7, 0x73, 0x50, ۰x72, 0x77, 0x69, 0x5d, 0x59, 0x8e, 0x6d, 0x92, 0xa8, 0x92, 0x74, 0x95, ۰x86, 0xab, 0x68, 0x97, 0x83, 0x72, 0x4a, 0x81, 0x7a, 0x83, 0x6d, 0x62, ۰x9d, 0xa7, 0x50, 0xb1, 0x50, 0x55, 0x8d, 0x51, 0x89, 0x6a, 0x75, 0x78, ۰x62, 0xa2, 0xa3, 0x44, 0xa0, 0x84, 0x6d, 0x86, 0x71, 0x83, 0x3f, 0x95, ۰x6e, 0x8e, 0x71, 0x84, 0x87, 0x86, 0x4c, 0x6a, 0x53, 0x60, 0x80, 0xa7, ۰x85, 0x79, 0x67, 0x47, 0x4f, 0x6c, 0x7e, 0x70, 0x6f, 0x45, 0x64, 0x99, ۰x9c, 0x63, 0x97, 0x75, 0x5f, 0x7f, 0x7d, 0x83, 0x76, 0x9b, 0xb8, 0x70, ۰x73, 0x68, 0xbc, 0x52, 0x86, 0x5f, 0x60, 0x85, 0x5c, 0x8f, 0xa4, 0x71, ۰x94, 0x65, 0x8d, 0x82, 0x7c, 0x64, 0x92, 0x61, 0x61, 0x4e, 0x81, 0x76, ۰x68, 0x69, 0x49, 0x89, 0x9f, 0x68, 0x7b, 0x6d, 0x64, 0x78, 0x79, 0x8c, ۰x67, 0x84, 0x90, 0x83, 0x8e, 0x6f, 0x6d, 0x50, 0x81, 0x5b, 0x98, 0x91, ۰x88, 0xa7, 0xb1, 0x70, 0x8f, 0x7c, 0x7f, 0x54, 0x53, 0xa6, 0xa2, 0xa7, ۰x41, 0x7b, 0x6c, 0x8e, 0x57, 0x86, 0x61, 0x5f, 0x84, 0x85, 0x94, 0x7e, ۰x80, 0x90, 0x83, 0x8d, 0x7a, 0x5c, 0x6b, 0x85, 0x74, 0x79, 0xab, 0xc9, ۰x42, 0x79, 0xaf, 0x89, 0x55, 0xbc, 0x91, 0x81, 0xbb, 0x5d, 0x82, 0x8a, ۰x71, 0x7a, 0x98, 0x5a, 0x6f, 0x7f, 0x50, 0x8c, 0x9c, 0x62, 0x65, 0xb9, ۰x52, 0x80, 0x65, 0x8c, 0x4f, 0x81, 0x8a, 0x91, 0xc1, 0x92, 0x4d, 0x8a, ۰x58, 0x6a, 0x85, 0x90, 0x70, 0x3c, 0x92, 0x9e, 0xa2, 0x6e, 0x72, 0x77, ۰x76, 0x77, 0x9b, 0x7b, 0x5d, 0x5f, 0x7a, 0xa5, 0x5e, 0x75, 0x71, 0x99, ۰xc0, 0x73, 0x72, 0x86, 0x6c, 0x83, 0x90, 0xc2, 0x6e, 0x7d, 0xab, 0x8c, ۰x87, 0x7f, 0x8b, 0x5c, 0x8c, 0x7a, 0x81, 0x5f, 0x73, 0x81, 0x7a, 0x7e, ۰x9f, 0x62, 0x79, 0x61, 0x92, 0x78, 0x44, 0x84, 0x71, 0x80, 0x8c, 0x98, ۰x66, 0xae, 0x43, 0x63, 0x99, 0xa8, 0x6b, 0x59, 0xa0, 0x72, 0x8e, 0x97, ۰x8d, 0x51, 0xa3, 0x85, 0x88, 0x74, 0xba, 0x97, 0x8f, 0x82, 0x9d, 0x92, ۰xa8, 0x57, 0x85, 0x88, 0x5f, 0x91, 0x61, 0x82, 0x85, 0x6d, 0x76, 0x64, ۰x99, 0x75, 0x7b, 0x8e, 0x79, 0x7c, 0x68, 0x75, 0x94, 0x83, 0x8e, 0x88, ۰x8a, 0xa0, 0x84, 0x6a, 0x6a, 0x86, 0x57, 0x77, 0x72, 0x92, 0x9c, 0xab, ۰x7f, 0x7f, 0x82, 0x4f, 0x84, 0x6d, 0x7e, 0x87, 0x5b, 0x72, 0x95, 0x82, ۰x95, 0x80, 0x71, 0x7a, 0x9a, 0x6e, 0x84, 0xaa, 0x81, 0x79, 0x76, 0x88, ۰x88, 0x83, 0x61, 0x70, 0x8f, 0x7b, 0x49, 0x47, 0xc0, 0x69, 0x82, 0x81, ۰x75, 0x9b, 0x80, 0x71, 0x8c, 0x99, 0x5a, 0x84, 0x89, 0xb1, 0xa2, 0x6a, ۰x85, 0x70, 0x9c, 0x6a, 0x8e, 0x70, 0xa7, 0x42, 0x68, 0x68, 0xa4, 0x6b, ۰x7c, 0x7d, 0x9f, 0x98, 0x6a, 0x5e, 0x59, 0x8a, 0x68, 0x64, 0xa0, 0x56, ۰x68, 0xa9, 0x69, 0x98, 0x83, 0x9f, 0xac, 0x65, 0x8d, 0x71, 0x92, 0x62, ۰x70, 0x5e, 0x79, 0x5f, 0x5a, 0x67, 0x82, 0x9d, 0x58, 0x93, 0x89, 0x77, ۰xc0, 0x66, 0x4a, 0x6a, 0x78, 0x47, 0x7e, 0x63, 0x94, 0x9d, 0xac, 0x79, ۰x9c, 0x57, 0x7b, 0x9c, 0x74, 0x69, 0xbc, 0x6c, 0x56, 0x6d, 0x54, 0x6b, ۰x6e, 0x6d, 0x86, 0x9b, 0x86, 0x7e, 0xb7, 0xa8, 0x82, 0x7b, 0x6c, 0x4f, ۰x6d, 0x6c, 0x6d, 0x81, 0x86, 0x69, 0x8d, 0x87, 0x82, 0x68, 0x81, 0x6e, ۰x8b, 0x63, 0x5c, 0x97, 0x83, 0x80, 0x7f, 0x8c, 0x84, 0x47, 0x7f, 0x54, ۰x9f, 0x63, 0x55, 0x82, 0x8f, 0x5f, 0x93, 0x39, 0x77, 0x7b, 0x8c, 0x78, ۰xa1, 0x86, 0x90, 0x66, 0x9f, 0x98, 0xba, 0x6a, 0x7a, 0x74, 0x7c, 0x61, ۰x91, 0x66, 0xa8, 0x89, 0x47, 0x5c, 0x7e, 0x98, 0x87, 0x6b, 0x72, 0x4d, ۰x37, 0xac, 0xa3, 0x63, 0x7d, 0xa1, 0x7b, 0x84, 0x89, 0xb6, 0x6a, 0x6e, ۰x66, 0x91, 0xaf, 0x8a, 0x8a, 0x87, 0x52, 0x79, 0xac, 0x4f, 0x7b, 0x64, ۰x7c, 0x6a, 0x9a, 0x90, 0x92, 0x4e, 0x77, 0xa2, 0x8b, 0x99, 0x5e, 0x59, ۰x9d, 0x5d, 0x8c, 0x5a, 0x9e, 0x66, 0xbc, 0x93, 0x59, 0xa3, 0x6d, 0x3f, ۰xa3, 0x6a, 0x8d, 0x88, 0x6e, 0x8c, 0x6d, 0x6a, 0x8c, 0x7c, 0x71, 0x8b, ۰x70, 0x82, 0x64, 0x83, 0x6f, 0x6b, 0x88, 0x5b, 0x6f, 0x7c, 0x6b, 0x8d, ۰xc9, 0x86, 0x52, 0x7a, 0x89, 0x9e, 0xa5, 0x90, 0x5c, 0x63, 0x62, 0x71, ۰xac, 0x65, 0x8f, 0x8a, 0x86, 0x4f, 0x7e, 0x5b, 0xb5, 0x85, 0x54, 0x77, ۰x6b, 0xa9, 0x5e, 0xa0, 0x80, 0x73, 0x4c, 0x88, 0x42, 0x5d, 0x93, 0x85, ۰x72, 0x98, 0xc5, 0x61, 0x5f, 0x54, 0x75, 0x95, 0x75, 0x55, 0x8b, 0x87, ۰x94, 0x5f, 0x85, 0x6c, 0x9a, 0x62, 0x62, 0x80, 0x91, 0x9b, 0x87, 0x6a, ۰x9b, 0x84, 0xa1, 0x6b, 0x90, 0xbf, 0xab, 0x44, 0x48, 0x9e, 0xbc, 0x75, ۰x81, 0x6f, 0x69, 0xa8, 0x6b, 0x78, 0x9c, 0x8e, 0x68, 0x72, 0x6d, 0x67, ۰x7a, 0x7d, 0x92, 0x87, 0x5d, 0x65, 0x84, 0x7d, 0x5e, 0x7e, 0x9d, 0x96, ۰x2e, 0xaf, 0x89, 0x59, 0x8c, 0x69, 0x78, 0x7d, 0x6d, 0xa6, 0xb3, 0x68, ۰x84, 0x92, 0x92, 0x55, 0x46, 0x6d, 0x93, 0x74, 0x73, 0x91, 0x7a, 0x98, ۰x74, 0x7b, 0xbf, 0x7e, 0x66, 0x72, 0x66, 0x82, 0x35, 0x84, 0x79, 0x6f, . . . . }; const int g_person_detect_model_data_len = 236072;
از آنجایی که کد های پروژه از بخش های مختلفی تشکیل شده است، فایل کامل پروژه را از گیت هاب من از این لینک، میتوانید دریافت کنید.
نتیجه نهایی
پس از آپلود کد و باز کردن سریال مانیتور در پورت مدنظر، برد ESP32-CAM همزمان با دریافت تصاویر مقادیر تبدیل به تصاویر ASCII که تا حدودی مشخص هستند که چه تصویری را نمایش میدهند با تاخیر چند ثانیه نمایش داده میشوند. در همین زمان مقادیر تطابق تصویر دریافت شده با انسان با توجه به مدل های از قبل تعریف شده نمایش داده خواهد شد.
جمع بندی
در این پروژه با استفاده از Tensorflow Lite اقدام به پردازش تصویر دریافتی از ESP32-CAM کردیم و مقادیر را با مدل های تعریف شده تطابق دادیم. همچنین تصاویر برای درک بهتر به صورت مقادیر ASCII نمایش داده شدند، این پروژه وابستگی به اینترنت وبسرور نداشت و تنها با استفاده خود برد ESP پردازش و اجرا شد. با تعریف مدل های بیشتر این قابلیت وجود دارد که مقادیر مد نظر ما تحلیل شوند و در پردازش نهایی برای ما نمایش داده شوند.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام تشکر بابت این آموزش.
لطفاً لینک دانلود را اصلاح کنید ممنون
با سلام
سپاس از همراهی شما، لینک چه مشکلی دارد؟