در آموزش های اولیه از سری ESP32-CAM مشاهده کردیم که با استفاده از کد اصلی قادر به پردازش تصویر چهره از تشخیص تا تفکیک چهره ها خواهیم بود، اما در مواردی که نیاز به تشخیص اشیا متفاوتی داریم باید مدل های مختلفی به کد ما معرفی شود تا با خودآموزی قادر باشد اشیا مورد نظر ما را تشخیص دهید. اما هرچقدر هم قدرت پردازش در تراشه های ESP بالا باشد نمی توانیم تمام این پردازش پیچیده را بر عهده این تراشه کوچک بگذاریم، بنابراین ما از Tensorflow.JS برای ترکیب کردن آن با ویدیویی که از ESP32-CAM ارسال میشود، استفاده خواهیم کرد. باید توجه داشته باشید که در این آموزش، Tensorflow.JS در مرورگر کامپیوتر اجرا می شود و بنابراین مدل یادگیری ماشین در داخل مرورگر شما اجرا می شود. در این آموزش از مدل COCO-SSD برای تشخیص اشیا در یک استریم ویدئویی از ESP32-CAM استفاده خواهیم کرد.
نرم افزار Tensorflow
TensorFlow به توسعه دهندگان اجازه می دهد نمودار جریان داده را ایجاد کنند، ساختارهایی که نحوه حرکت داده ها از طریق نمودار یا یک سری از گره های پردازشی را توصیف می کنند. هر گره در نمودار یک عمل ریاضی را نشان می دهد و هر اتصال یا لبه بین گره ها یک آرایه داده ای چند بعدی یا کششی است. TensorFlow همه این فرآیند را از طریق زبان پایتون فراهم می کند. یادگیری و کار با پایتون آسان است و روش های مناسبی را برای بیان نحوه انتزاع های سطح بالا با هم فراهم می کند. اما عملیات ریاضی واقعی در پایتون انجام نمی شود. کتابخانه هایی که برای TensorFlow در دسترس هستند، به صورت باینری C با عملکرد بالا نوشته می شوند. پایتون فقط ترافیک بین قطعات را هدایت می کند و انتزاعات برنامه نویسی سطح بالا را برای اتصال آنها به هم فراهم می کند.
یادگیری ماشینی pre-trained models
در یادگیری ماشین مبحثی به نام model وجود دارد که در واقع اشیا و مواردی هست که ما قصد تشخیص دادن آن هارا داریم، برای مثال تشخیص صورت انسان، خب برای این مورد باید به ماشین خود آموزش دهیم که ظاهر یک انسان، زن یا مرد، کوچک یا بزرگ، پیر یا جوان به چه شکل است. برای این مورد باید تصاویر مختلفی را به ماشین خود معرفی کنیم که توانایی تشخیص ماشین ما بالا تر برود. به این نتیجه این فرآیند مدل میگویند که مشخصه تشخیص ماشین ما است و در ادامه همه این مدل ها باید لیبل بندی شده تا نتیجه برای کاربر از نظر نمایشی قابل فهم باشد.
شناخت برد ESP32-CAM
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
از دیگر امکانات ماژول ESP32-cam میتوان به دوربین OV2640 با قابلیت ثبت تصویر با فرمت JPEG, BMP, grayscale اشاره کرد. همچنین با LED flash مونتاژ شده بر روی این ماژول قادر به تصویر برداری در مکانهای تاریک نیز خواهید بود. یکی از ویژگیهای کاربردی این ماژول ورودی micro SD با قابلیت ارتقا تا ۴GB است که به کاربر اجازه ذخیره تصاویر را هم میدهد.
نحوه کار تشخیص اشیا با دوربین
در این پروژه از با استریم تصاویر به کمک برد ESP32-CAM و دریافت و نمایش آن ها در مرورگر، همچنین با استفاده Tensorflow.JS اقدام به پردازش تصاویر با استفاده از مدل های پیشفرض اعمال شده خواهیم کرد. تصویر به محض دریافت توسط وب سرور اجرا شده در مرورگر، قدام به تشخیص و تحلیل موارد موجود در تصویر خواهد کرد. در این پروژه تنها اشیا پیفرض قابل تشخیص هستند. ممکن است بدانید، Tensorflow چندین مدل از قبل آموزش دیده دارد که ما می توانیم با استفاده از آنها یادگیری ماشین را به راحتی شروع کنیم. COCO-SSD یک مدل ML است که برای بومی سازی و شناسایی اشیا در تصویر استفاده می شود. که در این آموزش نیز از همین مدل استفاده شده.
وسایل مورد نیاز
نصب افزونه 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 به یکدیگر متصل هستند و پس از کامپایل موفق کد، برای اجرا شدن پروژه باید این اتصال را جدا کنید.
- اتصالات به شرح زیر میباشد.
راهاندازی و اجرای پروژه
- در این قسمت از کد اقدام معرفی Tensorflow.js برای اقدام به تحلیل تصاویر دریافتی در مرورگر خواهیم کرد. همچنین در خط بعدی مدل های COCO-SSD را نیز همرا با Tensorflow.js وارد خواهیم کرد.
<script src="https:\/\/ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> <script src="https:\/\/cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.3.1/dist/tf.min.js"> </script> <script src="https:\/\/cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd@2.1.0"> </script>
- در بخش بعدی مدل های معرفی شده Load خواهیم کرد تا درنتیجه پردازش تصویر دریافتی برای ماشین ما قابل تشخیص باشند.
function ObjectDetect() { result.innerHTML = "Please wait for loading model."; cocoSsd.load().then(cocoSsd_Model => { Model = cocoSsd_Model; result.innerHTML = ""; getStill.style.display = "block"; }); }
- پس از تشخیص شئی در تصویر توسط ماشین ما، حالا باید به شکل برای کاربر این موارد قابل نمایش شود، که در پردازش تصویر معمولا از مربع هایی اطراف مورد تشخیص داده شده استفاده میشود، کد زیر برای همین مورد است.
if (Predictions.length>0) { result.innerHTML = ""; for (var i=0;i<Predictions.length;i++) { const x = Predictions[i].bbox[0]; const y = Predictions[i].bbox[1]; const width = Predictions[i].bbox[2]; const height = Predictions[i].bbox[3]; context.lineWidth = Math.round(s/200); context.strokeStyle = "#00FFFF"; context.beginPath(); context.rect(x, y, width, height); context.stroke(); context.lineWidth = "2"; context.fillStyle = "red"; context.font = Math.round(s/30) + "px Arial"; context.fillText(Predictions[i].class, x, y);
کد کامل پروژه طراحی سیستم Object Detection با ESP32-CAM
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
نتیجه نهایی
پس از آپلود کد مورد نظر با ریست کردم برد در سریال مانیتور ip وب سرور برای ما نمایش داده خواهد شد مانند ۱۹۲٫۱۶۸٫۱٫۱۰۳ که با جستجو آن در مرورگر به صفحه وب سرور وارد خواهیم شد، برای لحظاتی باید صبر کنیم تا مدل های مربوط Load شوند، سپس با کلیک بر روی آیکون StartDetect اقدام به نمایش تصاویر و تشخیص موارد تعریف شده خواهد کرد. همچنین اگر مشکلی در پردازش تصویر یا بخش های دیگری باشد کلیک بر روی گزینه Restart فرآیند استریم و پردازش از ابتدا صورت میگیرد.
در وب سرور این امکان این مورد فراهم شده که با مشخص کردن مورد مدنظر اقدام به شمارش آن کنیم.
با انتخاب object مورد نظر تعداد موارد تشخیص داده شده در جلوی آن نمایش داده خواهند شد.
در این قسمت تنظیمات ویدئوی خروجی را تنظیم میکنید. برای مثال تغییر رزولوشن و یا miror کردن تصویر در این قسما امکان پذیر است.
در این قسمت کانتراست، کیفیت و روشنایی تصویر دریافتی قابل تنظیم است.
در صورت تشخیص object در این قسمت نام آن نمایش داده خواهد شد و همچنین درصد احتمال درست بودن تحلیل ماشین ما، همچنین مختصات و تعداد object هایی که تشخیص داده شده اند نیز در این بخش قابل نمایش است.
در نهایت تصویر دریافتی را داریم که در صورت تشخیص object با یک مربع و همچنین درج نام آن به کاربر اطلاع خواهند داد.
جمع بندی
ما نحوه پیاده سازی تشخیص شی در ESP32-CAM را با استفاده از Tensorflow.js شرح دادیم. این آموزش نحوه اجرای استریم ویدئو از ESP32-CAM و استفاده از کتابخانه Javascript Tensorflow برای شناسایی و طبقه بندی اشیا را معرفی می کند. فراموش نکنید که فرایند استنتاج در داخل مرورگر اجرا می شود و در ESP32-CAM نیست. و با مدل های Tensorflow از قبل آموزش دیده به عنوان COCO-SSD قادر به شناسایی اشیا هستیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام مهندس
یک سوال دارم البته به این اموزش مربوط نیست
مهندس میشه اموزشی بزارید که بشه با برد esp32 cam تصاویر را به ایمیل ارسال کرد
یعنی که یک دستور با استفاده از ایمیل ارسال کنیم به برد و برد هم یه عکس برامون به ایمیل بفرسته
یا اینکه همین کار را میشه با ThingSpek انجام داد ؟؟
با سلام، بله این امکان وجود دارد و در این مورد پروژه ای هم اجرا شده که تنها تفاوت های کوچک در اجرا با مورد ذکر شده شما دارد، کاربرد های Thingspeak در این موارد متفاوت است.
سلام مهندس میشه برای ح پروژه خروجی رله گذاشت تا مثلاً اگر یک ساعت روبرو esp32cam گرفتیم رله را فعال کنه؟
سلام بله این امکان وجود دارد ولی نیاز به تغییر کد هست.
سلام مهندس من پروژه را اجرا کردم و جالب بود
فقط تا گوشی موبایل را جلوش میگرفتم تشخیص میداد ولی چند ثانیه بعدش یهو ماژول خودش ریست میشد چند بار هم تست کردم ولی تو این چند بار تست بازم ماژول خودش ریست میشد
به نظر تون مشکل از کجاست که ماژول خودشو ریست میکنه
و اگه میشه پروژه دوربین کلاود را هم سریع تر منتشر کنید و اگه میشه پروژه درب بازکن تشخیص چهره با esp32cam را هم درست کنید
با سلام، این مشکل از کمبود جریان در مدار هست. آموزش ها منتشر شده و حتما سعی میکنم در این مورد هم آموزشی بنویسم.
سلام مهندس من ولتاژ ۵ ولت و ۲ امپر به ماژول esp32 cam دادم
شما چند امپر به ورودی ماژول دادید ؟
سلام، من از خود مبدل سریال برای تغذیه برد استفاده میکنم.
سلام و درود
آرزوی موفقیت
یه سوال در همین ویدئو ساعت را جلوی دوربثین گرفتید آیا امکان تشخیص ساعت و برگرداندن ساعت و زمان را دارد؟
مثلا بگه ساعت ۶:۳۰ هست
آری؟
با تشکر
سلام، ممنونم. با استفاده از همین کد پروژه خیر اما با استفاده از tensorflow، امکان انجام این مورد وجود دارد.
سلام
من می خوام TensorFlow روی رزبری پای نصب کنم
میزنم pip install TensorFlow ارور میده
سلام، ارور های متفاوتی وجود داره برای این مورد، بهتره ارور رو سرچ کنید تا جواب بهتری بگیرید.
سلام سایفر. آموزشی که دادی خوبه. اما اینطوری لپتاپ یا کامپیوتر برای تشخیص اشیا باید همیشه روشن باشه.
نمیشه کاری کرد که خود esp32cam به صورت اتوماتیک تشخیص بده؟
منظورم اینه که نمی شه کد opencv یا tensorflow.js رو روش آپلود کنیم؟
با سلام
بله این مورد هم امکان پذیر هست. کافیست که از API برای tensorflow استفاده کنید.
سلام سایفر
چجوری اشیاع جدیدی بهش اضافه کنیم؟
با سلام
باید پترن جدید را تعریف کنید.
چجوری؟