در پروژه های قبلی با استفاده از برد 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 کپی و پیست شود.
1 |
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 مورد استفاده ما است. کدی که در پایین مشاهده میکنید کد اصلی برای شروع کار پروژه و درادامه پوینت کردن به دیگر هدر فایل ها است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#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 استفاده کردم، پس در کد این گزینه را از کامنت خارج کردم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#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 از مهم ترین بخش های برنامه هستند، زیرا وظیفه تحلیل و تبدیل تصاویر دریافتی و تطابق دادن موارد دریافتی با مدل های از قبل معرفی شده را دارند، البته این مورد در کل کد ما تراکم دارد اما بخش قابل توجهی در این دو فایل که ذکر شد صورت میگیرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
#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 = { 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x99, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x54, 0x4f, 0x43, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, 0x57, 0x00, 0x00, 0x00, 0xa8, 0x03, 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x34, 0x03, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc6, 0xfd, 0xff, 0xff, 0x80, 0x04, 0x00, 0x00, 0xc0, 0xfd, 0xff, 0xff, 0xd2, 0xfd, 0xff, 0xff, 0xbc, 0x45, 0x00, 0x00, 0xcc, 0xfd, 0xff, 0xff, 0xde, 0xfd, 0xff, 0xff, 0x78, 0x4b, 0x00, 0x00, 0xe6, 0xfd, 0xff, 0xff, 0x68, 0x4e, 0x00, 0x00, 0xee, 0xfd, 0xff, 0xff, 0x60, 0x53, 0x00, 0x00, 0xe8, 0xfd, 0xff, 0xff, 0xec, 0xfd, 0xff, 0xff, 0xf0, 0xfd, 0xff, 0xff, 0xf4, 0xfd, 0xff, 0xff, 0x06, 0xfe, 0xff, 0xff, 0x80, 0x56, 0x00, 0x00, 0x0e, 0xfe, 0xff, 0xff, 0xf8, 0x5a, 0x00, 0x00, 0x08, 0xfe, 0xff, 0xff, 0x0c, 0xfe, 0xff, 0xff, 0x10, 0xfe, 0xff, 0xff, 0x14, 0xfe, 0xff, 0xff, 0x26, 0xfe, 0xff, 0xff, 0x98, 0x5f, 0x00, 0x00, 0x20, 0xfe, 0xff, 0xff, 0x32, 0xfe, 0xff, 0xff, 0xd4, 0x62, 0x00, 0x00, 0x2c, 0xfe, 0xff, 0xff, 0x30, 0xfe, 0xff, 0xff, 0x34, 0xfe, 0xff, 0xff, 0x38, 0xfe, 0xff, 0xff, 0x4a, 0xfe, 0xff, 0xff, 0xcc, 0x66, 0x00, 0x00, 0x44, 0xfe, 0xff, 0xff, 0x48, 0xfe, 0xff, 0xff, 0x4c, 0xfe, 0xff, 0xff, 0x50, 0xfe, 0xff, 0xff, 0x62, 0xfe, 0xff, 0xff, 0xf4, 0x69, 0x00, 0x00, 0x6a, 0xfe, 0xff, 0xff, 0x24, 0x6f, 0x00, 0x00, 0x64, 0xfe, 0xff, 0xff, 0x68, 0xfe, 0xff, 0xff, 0x6c, 0xfe, 0xff, 0xff, 0x70, 0xfe, 0xff, 0xff, 0x74, 0xfe, 0xff, 0xff, 0x78, 0xfe, 0xff, 0xff, 0x7c, 0xfe, 0xff, 0xff, 0x8e, 0xfe, 0xff, 0xff, 0xc8, 0xb3, 0x00, 0x00, 0x88, 0xfe, 0xff, 0xff, 0x8c, 0xfe, 0xff, 0xff, 0x90, 0xfe, 0xff, 0xff, 0x94, 0xfe, 0xff, 0xff, 0xa6, 0xfe, 0xff, 0xff, 0xc8, 0xb6, 0x00, 0x00, 0xae, 0xfe, 0xff, 0xff, 0x98, 0xb7, 0x00, 0x00, 0xb6, 0xfe, 0xff, 0xff, 0x54, 0xb8, 0x00, 0x00, 0xbe, 0xfe, 0xff, 0xff, 0xe8, 0xb8, 0x00, 0x00, 0xc6, 0xfe, 0xff, 0xff, 0xd8, 0xb9, 0x00, 0x00, 0xce, 0xfe, 0xff, 0xff, 0x14, 0xbb, 0x00, 0x00, 0xd6, 0xfe, 0xff, 0xff, 0x88, 0xbd, 0x00, 0x00, 0xde, 0xfe, 0xff, 0xff, 0xb8, 0xbe, 0x00, 0x00, 0xe6, 0xfe, 0xff, 0xff, 0x4c, 0xc0, 0x00, 0x00, 0xee, 0xfe, 0xff, 0xff, 0x40, 0xc1, 0x00, 0x00, 0xf6, 0xfe, 0xff, 0xff, 0x38, 0xc2, 0x00, 0x00, 0xfe, 0xfe, 0xff, 0xff, 0x64, 0xc3, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xd8, 0xcb, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0x50, 0xcd, 0x00, 0x00, 0x16, 0xff, 0xff, 0xff, 0xfc, 0xce, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0x70, 0xdf, 0x00, 0x00, 0x26, 0xff, 0xff, 0xff, 0x20, 0xe1, 0x00, 0x00, 0x2e, 0xff, 0xff, 0xff, 0xd8, 0xe3, 0x00, 0x00, 0x36, 0xff, 0xff, 0xff, 0x84, 0xe5, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xf8, 0x05, 0x01, 0x00, 0x46, 0xff, 0xff, 0xff, 0x70, 0x08, 0x01, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xe4, 0x0a, 0x01, 0x00, 0x56, 0xff, 0xff, 0xff, 0x58, 0x0d, 0x01, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x08, 0x10, 0x01, 0x00, 0x66, 0xff, 0xff, 0xff, 0x00, 0x15, 0x01, 0x00, 0x6e, 0xff, 0xff, 0xff, 0xb0, 0x17, 0x01, 0x00, 0x76, 0xff, 0xff, 0xff, 0x28, 0x58, 0x01, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xd4, 0x5a, 0x01, 0x00, 0x86, 0xff, 0xff, 0xff, 0x48, 0x9b, 0x01, 0x00, 0x8e, 0xff, 0xff, 0xff, 0xf8, 0x9d, 0x01, 0x00, 0x96, 0xff, 0xff, 0xff, 0xf0, 0xa2, 0x01, 0x00, 0x9e, 0xff, 0xff, 0xff, 0x68, 0xa5, 0x01, 0x00, 0xa6, 0xff, 0xff, 0xff, 0x18, 0xa8, 0x01, 0x00, 0xae, 0xff, 0xff, 0xff, 0x90, 0xe8, 0x01, 0x00, 0xb6, 0xff, 0xff, 0xff, 0x40, 0xeb, 0x01, 0x00, 0xbe, 0xff, 0xff, 0xff, 0x70, 0xf0, 0x01, 0x00, 0xc6, 0xff, 0xff, 0xff, 0xe8, 0x70, 0x02, 0x00, 0xce, 0xff, 0xff, 0xff, 0x98, 0x75, 0x02, 0x00, 0xd6, 0xff, 0xff, 0xff, 0x10, 0x7f, 0x02, 0x00, 0xde, 0xff, 0xff, 0xff, 0xc0, 0x83, 0x02, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x34, 0x84, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xe8, 0x88, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7c, 0x77, 0xfc, 0xff, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x64, 0x8c, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x00, 0x00, 0xf0, 0x5b, 0x00, 0x00, 0x2c, 0x64, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x70, 0x09, 0x01, 0x00, 0x84, 0x9c, 0x01, 0x00, 0xb8, 0xa1, 0x01, 0x00, 0x84, 0x63, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x94, 0x65, 0x00, 0x00, 0x28, 0xa4, 0x01, 0x00, 0x3c, 0x67, 0x00, 0x00, 0x58, 0xe7, 0x01, 0x00, 0x24, 0xad, 0x00, 0x00, 0x98, 0xa6, 0x01, 0x00, 0x44, 0x62, 0x00, 0x00, 0x10, 0x58, 0x00, 0x00, 0xc4, 0xe9, 0x01, 0x00, 0xb0, 0x6f, 0x02, 0x00, 0x3c, 0x5f, 0x00, 0x00, 0xf0, 0xee, 0x01, 0x00, 0x04, 0x51, 0x00, 0x00, 0xd8, 0x7d, 0x02, 0x00, 0x1c, 0x74, 0x02, 0x00, 0x08, 0x83, 0x03, 0x00, 0xcc, 0xb3, 0x00, 0x00, 0x48, 0x82, 0x02, 0x00, 0xf4, 0x5a, 0x00, 0x00, 0xe8, 0xb5, 0x00, 0x00, 0xe4, 0xb4, 0x00, 0x00, 0x7c, 0xb6, 0x00, 0x00, 0x74, 0x61, 0x00, 0x00, 0xe8, 0xb0, 0x00, 0x00, 0xf4, 0xad, 0x00, 0x00, 0x10, 0x50, 0x00, 0x00, 0x24, 0xb7, 0x00, 0x00, 0x1c, 0xbb, 0x00, 0x00, 0x3c, 0x5a, 0x00, 0x00, 0x60, 0xb8, 0x00, 0x00, 0x6c, 0x52, 0x00, 0x00, 0xe0, 0xbd, 0x00, 0x00, 0x04, 0xbc, 0x00, 0x00, 0xd4, 0xbe, 0x00, 0x00, 0x64, 0x62, 0x00, 0x00, 0xe8, 0x52, 0x00, 0x00, 0xc4, 0x51, 0x00, 0x00, 0xc0, 0xbf, 0x00, 0x00, 0x5c, 0x5f, 0x00, 0x00, 0x6c, 0xc9, 0x00, 0x00, 0x64, 0x64, 0x00, 0x00, 0xb0, 0xc0, 0x00, 0x00, 0xac, 0x5b, 0x00, 0x00, 0xd8, 0xca, 0x00, 0x00, 0x94, 0x47, 0x00, 0x00, 0x04, 0xdd, 0x00, 0x00, 0x0c, 0xad, 0x00, 0x00, 0x48, 0xcc, 0x00, 0x00, 0x04, 0x51, 0x00, 0x00, 0x68, 0xe1, 0x00, 0x00, 0x6c, 0xde, 0x00, 0x00, 0x94, 0x03, 0x01, 0x00, 0x3c, 0xb2, 0x00, 0x00, 0xd8, 0xe2, 0x00, 0x00, 0xdc, 0x65, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x5c, 0x4a, 0x00, 0x00, 0xf4, 0x0a, 0x01, 0x00, 0xcc, 0xaf, 0x00, 0x00, 0x90, 0x6b, 0x00, 0x00, 0x34, 0x65, 0x00, 0x00, 0x98, 0x12, 0x01, 0x00, 0x5c, 0x0d, 0x01, 0x00, 0xec, 0x5b, 0x00, 0x00, 0xb4, 0x46, 0x00, 0x00, 0x08, 0x15, 0x01, 0x00, 0xdc, 0xad, 0x00, 0x00, 0xb8, 0x55, 0x01, 0x00, 0x6c, 0x41, 0x00, 0x00, 0xe4, 0x98, 0x01, 0x00, 0x0c, 0xaf, 0x00, 0x00, 0x28, 0x58, 0x01, 0x00, 0x5c, 0xb1, 0x00, 0x00, 0x70, 0x8a, 0x03, 0x00, 0x50, 0xae, 0x00, 0x00, 0x94, 0x86, 0x03, 0x00, 0x6c, 0xb2, 0x00, 0x00, 0xae, 0x75, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x6e, 0x65, 0x74, 0x56, 0x31, 0x2f, 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x30, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x77, 0x69, 0x73, 0x65, 0x2f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x2f, 0x46, 0x61, 0x6b, 0x65, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x56, 0x61, 0x72, 0x73, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x74, 0x79, 0xfc, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x7c, 0x81, 0x3b, 0x01, 0x00, 0x00, 0x00, 0xca, 0x8f, 0x02, 0x3f, 0x01, 0x00, 0x00, 0x00, 0xa7, 0xc5, 0xfc, 0xbe, 0x00, 0x40, 0x00, 0x00, 0x72, 0x6a, 0x61, 0x78, 0x80, 0x96, 0x73, 0x8f, 0xb2, 0xce, 0xaf, 0xab, 0x82, 0x56, 0x5c, 0x87, 0x70, 0x7d, 0x85, 0x7e, 0x77, 0x77, 0x62, 0x8a, 0x6d, 0x7a, 0x82, 0x79, 0x59, 0x54, 0x7a, 0xa4, 0x49, 0x83, 0x80, 0xbe, 0x98, 0x65, 0x93, 0x84, 0xb1, 0x74, 0x81, 0x94, 0x70, 0x5c, 0xad, 0x82, 0x5d, 0x6c, 0x5c, 0x74, 0x8e, 0x66, 0x5c, 0xb6, 0x8b, 0x86, 0x71, 0x7a, 0x63, 0x77, 0x6e, 0x83, 0x82, 0x82, 0x7d, 0x5b, 0x54, 0x89, 0x38, 0x4d, 0x72, 0x65, 0x77, 0x94, 0x66, 0x55, 0x97, 0x8b, 0x7b, 0x80, 0x6f, 0x82, 0x9c, 0x51, 0x75, 0x96, 0x8b, 0x81, 0x82, 0x62, 0x5e, 0xa7, 0x5b, 0x5c, 0x78, 0x78, 0x74, 0x7f, 0x89, 0xa1, 0x5f, 0x9b, 0x84, 0x74, 0x9a, 0x71, 0x4f, 0xb7, 0x66, 0x78, 0x7f, 0x75, 0x74, 0xa0, 0x89, 0x99, 0x65, 0x5a, 0x8d, 0x86, 0x88, 0x6b, 0x69, 0xaa, 0x81, 0x8f, 0x80, 0x70, 0x9e, 0x75, 0x90, 0x6f, 0x8b, 0x76, 0x71, 0x7f, 0x5c, 0x74, 0x98, 0x4c, 0x8d, 0x89, 0x85, 0x68, 0x88, 0x55, 0x8d, 0x85, 0x5e, 0x72, 0x74, 0xad, 0x85, 0x56, 0x29, 0x4d, 0x69, 0x7e, 0x9c, 0x60, 0x96, 0xa2, 0x80, 0x72, 0x8a, 0x91, 0x80, 0x96, 0x64, 0x83, 0x66, 0x77, 0x9f, 0x4f, 0xa6, 0x90, 0x69, 0x68, 0x6b, 0xb7, 0x74, 0x56, 0xad, 0x79, 0x61, 0x86, 0x71, 0x95, 0x80, 0x8c, 0x82, 0x5d, 0x71, 0x66, 0xa4, 0x7b, 0x6d, 0x89, 0xb3, 0x77, 0x78, 0x71, 0x96, 0xa0, 0x7e, 0x95, 0xb4, 0x96, 0x88, 0x88, 0x51, 0x75, 0x70, 0x41, 0x72, 0x95, 0x88, 0x77, 0x81, 0x53, 0x58, 0x8b, 0x89, 0x92, 0x45, 0x49, 0x74, 0x5f, 0x7a, 0x84, 0x91, 0x89, 0x58, 0x8a, 0x78, 0x70, 0x87, 0x82, 0x93, 0x6b, 0x63, 0x8a, 0x8f, 0x9b, 0x65, 0xdc, 0x8a, 0x93, 0x9c, 0xa5, 0x6e, 0xa2, 0x59, 0xa2, 0x6a, 0x59, 0x6d, 0x73, 0x51, 0x76, 0x80, 0x93, 0x8f, 0x73, 0x80, 0x5c, 0x71, 0x81, 0x88, 0xbe, 0x8a, 0x68, 0x9c, 0x7c, 0x68, 0x8c, 0x66, 0x9a, 0x5d, 0x8b, 0x70, 0x7c, 0x5f, 0x7f, 0x9a, 0x86, 0x47, 0xb7, 0x73, 0x50, 0x72, 0x77, 0x69, 0x5d, 0x59, 0x8e, 0x6d, 0x92, 0xa8, 0x92, 0x74, 0x95, 0x86, 0xab, 0x68, 0x97, 0x83, 0x72, 0x4a, 0x81, 0x7a, 0x83, 0x6d, 0x62, 0x9d, 0xa7, 0x50, 0xb1, 0x50, 0x55, 0x8d, 0x51, 0x89, 0x6a, 0x75, 0x78, 0x62, 0xa2, 0xa3, 0x44, 0xa0, 0x84, 0x6d, 0x86, 0x71, 0x83, 0x3f, 0x95, 0x6e, 0x8e, 0x71, 0x84, 0x87, 0x86, 0x4c, 0x6a, 0x53, 0x60, 0x80, 0xa7, 0x85, 0x79, 0x67, 0x47, 0x4f, 0x6c, 0x7e, 0x70, 0x6f, 0x45, 0x64, 0x99, 0x9c, 0x63, 0x97, 0x75, 0x5f, 0x7f, 0x7d, 0x83, 0x76, 0x9b, 0xb8, 0x70, 0x73, 0x68, 0xbc, 0x52, 0x86, 0x5f, 0x60, 0x85, 0x5c, 0x8f, 0xa4, 0x71, 0x94, 0x65, 0x8d, 0x82, 0x7c, 0x64, 0x92, 0x61, 0x61, 0x4e, 0x81, 0x76, 0x68, 0x69, 0x49, 0x89, 0x9f, 0x68, 0x7b, 0x6d, 0x64, 0x78, 0x79, 0x8c, 0x67, 0x84, 0x90, 0x83, 0x8e, 0x6f, 0x6d, 0x50, 0x81, 0x5b, 0x98, 0x91, 0x88, 0xa7, 0xb1, 0x70, 0x8f, 0x7c, 0x7f, 0x54, 0x53, 0xa6, 0xa2, 0xa7, 0x41, 0x7b, 0x6c, 0x8e, 0x57, 0x86, 0x61, 0x5f, 0x84, 0x85, 0x94, 0x7e, 0x80, 0x90, 0x83, 0x8d, 0x7a, 0x5c, 0x6b, 0x85, 0x74, 0x79, 0xab, 0xc9, 0x42, 0x79, 0xaf, 0x89, 0x55, 0xbc, 0x91, 0x81, 0xbb, 0x5d, 0x82, 0x8a, 0x71, 0x7a, 0x98, 0x5a, 0x6f, 0x7f, 0x50, 0x8c, 0x9c, 0x62, 0x65, 0xb9, 0x52, 0x80, 0x65, 0x8c, 0x4f, 0x81, 0x8a, 0x91, 0xc1, 0x92, 0x4d, 0x8a, 0x58, 0x6a, 0x85, 0x90, 0x70, 0x3c, 0x92, 0x9e, 0xa2, 0x6e, 0x72, 0x77, 0x76, 0x77, 0x9b, 0x7b, 0x5d, 0x5f, 0x7a, 0xa5, 0x5e, 0x75, 0x71, 0x99, 0xc0, 0x73, 0x72, 0x86, 0x6c, 0x83, 0x90, 0xc2, 0x6e, 0x7d, 0xab, 0x8c, 0x87, 0x7f, 0x8b, 0x5c, 0x8c, 0x7a, 0x81, 0x5f, 0x73, 0x81, 0x7a, 0x7e, 0x9f, 0x62, 0x79, 0x61, 0x92, 0x78, 0x44, 0x84, 0x71, 0x80, 0x8c, 0x98, 0x66, 0xae, 0x43, 0x63, 0x99, 0xa8, 0x6b, 0x59, 0xa0, 0x72, 0x8e, 0x97, 0x8d, 0x51, 0xa3, 0x85, 0x88, 0x74, 0xba, 0x97, 0x8f, 0x82, 0x9d, 0x92, 0xa8, 0x57, 0x85, 0x88, 0x5f, 0x91, 0x61, 0x82, 0x85, 0x6d, 0x76, 0x64, 0x99, 0x75, 0x7b, 0x8e, 0x79, 0x7c, 0x68, 0x75, 0x94, 0x83, 0x8e, 0x88, 0x8a, 0xa0, 0x84, 0x6a, 0x6a, 0x86, 0x57, 0x77, 0x72, 0x92, 0x9c, 0xab, 0x7f, 0x7f, 0x82, 0x4f, 0x84, 0x6d, 0x7e, 0x87, 0x5b, 0x72, 0x95, 0x82, 0x95, 0x80, 0x71, 0x7a, 0x9a, 0x6e, 0x84, 0xaa, 0x81, 0x79, 0x76, 0x88, 0x88, 0x83, 0x61, 0x70, 0x8f, 0x7b, 0x49, 0x47, 0xc0, 0x69, 0x82, 0x81, 0x75, 0x9b, 0x80, 0x71, 0x8c, 0x99, 0x5a, 0x84, 0x89, 0xb1, 0xa2, 0x6a, 0x85, 0x70, 0x9c, 0x6a, 0x8e, 0x70, 0xa7, 0x42, 0x68, 0x68, 0xa4, 0x6b, 0x7c, 0x7d, 0x9f, 0x98, 0x6a, 0x5e, 0x59, 0x8a, 0x68, 0x64, 0xa0, 0x56, 0x68, 0xa9, 0x69, 0x98, 0x83, 0x9f, 0xac, 0x65, 0x8d, 0x71, 0x92, 0x62, 0x70, 0x5e, 0x79, 0x5f, 0x5a, 0x67, 0x82, 0x9d, 0x58, 0x93, 0x89, 0x77, 0xc0, 0x66, 0x4a, 0x6a, 0x78, 0x47, 0x7e, 0x63, 0x94, 0x9d, 0xac, 0x79, 0x9c, 0x57, 0x7b, 0x9c, 0x74, 0x69, 0xbc, 0x6c, 0x56, 0x6d, 0x54, 0x6b, 0x6e, 0x6d, 0x86, 0x9b, 0x86, 0x7e, 0xb7, 0xa8, 0x82, 0x7b, 0x6c, 0x4f, 0x6d, 0x6c, 0x6d, 0x81, 0x86, 0x69, 0x8d, 0x87, 0x82, 0x68, 0x81, 0x6e, 0x8b, 0x63, 0x5c, 0x97, 0x83, 0x80, 0x7f, 0x8c, 0x84, 0x47, 0x7f, 0x54, 0x9f, 0x63, 0x55, 0x82, 0x8f, 0x5f, 0x93, 0x39, 0x77, 0x7b, 0x8c, 0x78, 0xa1, 0x86, 0x90, 0x66, 0x9f, 0x98, 0xba, 0x6a, 0x7a, 0x74, 0x7c, 0x61, 0x91, 0x66, 0xa8, 0x89, 0x47, 0x5c, 0x7e, 0x98, 0x87, 0x6b, 0x72, 0x4d, 0x37, 0xac, 0xa3, 0x63, 0x7d, 0xa1, 0x7b, 0x84, 0x89, 0xb6, 0x6a, 0x6e, 0x66, 0x91, 0xaf, 0x8a, 0x8a, 0x87, 0x52, 0x79, 0xac, 0x4f, 0x7b, 0x64, 0x7c, 0x6a, 0x9a, 0x90, 0x92, 0x4e, 0x77, 0xa2, 0x8b, 0x99, 0x5e, 0x59, 0x9d, 0x5d, 0x8c, 0x5a, 0x9e, 0x66, 0xbc, 0x93, 0x59, 0xa3, 0x6d, 0x3f, 0xa3, 0x6a, 0x8d, 0x88, 0x6e, 0x8c, 0x6d, 0x6a, 0x8c, 0x7c, 0x71, 0x8b, 0x70, 0x82, 0x64, 0x83, 0x6f, 0x6b, 0x88, 0x5b, 0x6f, 0x7c, 0x6b, 0x8d, 0xc9, 0x86, 0x52, 0x7a, 0x89, 0x9e, 0xa5, 0x90, 0x5c, 0x63, 0x62, 0x71, 0xac, 0x65, 0x8f, 0x8a, 0x86, 0x4f, 0x7e, 0x5b, 0xb5, 0x85, 0x54, 0x77, 0x6b, 0xa9, 0x5e, 0xa0, 0x80, 0x73, 0x4c, 0x88, 0x42, 0x5d, 0x93, 0x85, 0x72, 0x98, 0xc5, 0x61, 0x5f, 0x54, 0x75, 0x95, 0x75, 0x55, 0x8b, 0x87, 0x94, 0x5f, 0x85, 0x6c, 0x9a, 0x62, 0x62, 0x80, 0x91, 0x9b, 0x87, 0x6a, 0x9b, 0x84, 0xa1, 0x6b, 0x90, 0xbf, 0xab, 0x44, 0x48, 0x9e, 0xbc, 0x75, 0x81, 0x6f, 0x69, 0xa8, 0x6b, 0x78, 0x9c, 0x8e, 0x68, 0x72, 0x6d, 0x67, 0x7a, 0x7d, 0x92, 0x87, 0x5d, 0x65, 0x84, 0x7d, 0x5e, 0x7e, 0x9d, 0x96, 0x2e, 0xaf, 0x89, 0x59, 0x8c, 0x69, 0x78, 0x7d, 0x6d, 0xa6, 0xb3, 0x68, 0x84, 0x92, 0x92, 0x55, 0x46, 0x6d, 0x93, 0x74, 0x73, 0x91, 0x7a, 0x98, 0x74, 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 پردازش و اجرا شد. با تعریف مدل های بیشتر این قابلیت وجود دارد که مقادیر مد نظر ما تحلیل شوند و در پردازش نهایی برای ما نمایش داده شوند.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.