ساخت سیستم تشخیص ماسک با فناوری پهپاد و یادگیری عمیق – بخش اول

شیوع بیماری کووید-۱۹ دنیا را غافلگیر کرد و تمام دولت ها، شرکت ها و مردم را تحت تاثیر قرار داد. این بیماری فراگیر با محدودیت های شدیدی که به دنیا تحمیل کرد، اثرات زیان بخشی برای جهان به همراه آورد. کشورهای مختلف، این محدودیت ها را جهت بازدارندگی اثر ویروس کرونا اعمال کردند. بانک جهانی دیدگاه های اقتصادی یک رکود اقتصادی معادل با ۲/۵ درصد را در تولید ناخالص سال ۲۰۲۰ آمریکا ، پیش بینی کرده است که  در چندین ده بی سابقه بوده و عمیق ترین رکود به شمار می رود.

اثرات این بیماری فراگیر، راه کار های متفاوتی را در زمینه های مختلف می طلبد. هدف این راه کار ها تسهیل  مسیر برای راه حل هایی است که از تحلیل های پیشرفته و تکنیک های مبتنی بر هوش مصنوعی بهره می برند. در این مقاله راهکاری معرفی می شود که قدرت تصمیم گیری را تقویت می­کند و به راحتی می توان آن را در زمینه آموزش داده، اعتبارسنجی و آزمودن مدل ها عملیاتی کرد.

 این مقاله، یک مجموعه مقاله کامل است که در سه بخش مختلف، چگونگی ساخت یک سیستم نظارتی با استفاده از پهپاد را  شرح می دهد. هدف این سیستم نظارتی، شناسایی استفاده از ماسک توسط مردم در فضاهای باز است. این سیستم نظارتی از افراد متخلف تصویر برداری می کند و آن ها را در قالب ایمیل های اطلاع رسانی به مسئولین مربوطه ارسال می کند. و در انتها سیستم طراحی شده می تواند ویدیو های زنده را ضبط نماید.

ماسک زدن به همراه اقدامات بازدارنده دیگری نظیر شستن متداول دست ها و رعایت فاصله اجتماعی به کاهش شیوع ویروس کرونا کمک می کند. پهپادی که بر ماسک زدن افراد نظارت می کند می تواند به طور موثری بر کاهش شیوع بیماری کرونا تاثیر گذار باشد.

در انتهای این آموزش، یک سیستم نظارتی با استفاده از پهپاد خواهیم داشت که می تواند در فضا های باز با جمعیت زیاد مستقر شود و افراد فاقد ماسک را شناسایی کند.

در ادامه چگونگی عملکرد سیستم نظارتی با استفاده از پهپاد با جزییات شرح داده خواهد شد. شکل زیر آنچه را که ساخته خواهد شد، به تصویر می کشد.

تشخیص چهره با پهپاد

پیش نیازهای شروع کار با فناوری پهپاد

 جهت درک کامل این آموزش، لازم است پایتون با نسخه ۵/۳ به بالا بر روی سیستم محلی نصب شده باشد. در قسمت اول این سری، درباره نحوه استفاده از فناوری پهپاد و پیکربندی آن صحبت می شود. در بخش دوم، چگونگی ساخت و آموزش یک مدل تشخیص صورت شرح داده می شود و در بخش سوم، به چگونگی قرار دادن بخش های اول و دوم در کنار یکدیگر و استقرار سرویس پرداخته خواهد شد.

معرفی فناوری پهپاد

یک پهپاد ، به زبان ساده یک ربات پرنده است که یا از راه دور کنترل می شود یا مستقلا پرواز می کند. برای داشتن یک پرواز مستقل باید طرح های پروازی که با نرم افزار کنترل می شوند روی سیستم های تعبیه شده در یک پهپاد نصب شوند و تواما با حسگرها و GPS عمل کنند.

انواع پهپاد

برای کار کردن با پهپاد ها در پروژه های مختلف یادگیری ماشین، ابتدا باید انواع پهپاد های موجود را شناخت. در زمینه این مقاله، پهپاد ها بر اساس نوع سیستم پروازی طبقه بندی می شوند و در پنج دسته زیر قرار می گیرند:

  • پهپاد های چند روتور : این نوع پهپاد ها متداول ترین پهپادهای پرنده و در نتیجه ارزانترین آن ها هستند. به دلیل وجود چندین روتور (چرخانه) الکتریکی در شکل ساختاری این نوع پهپاد ها، آن ها را پهپاد های چند روتوری یا چند چرخانه ای می نامند. ترایکوپتر ( سه چرخانه ای )، کوادکوپتر ( چهار چرخانه ای )، هگزاکوپتر ( شش چرخانه ای ) و اکتاکوپتر ( هشت چرخانه ای )، نمونه هایی از زیر طبقه های این دسته محسوب می شوند.  این دسته از پهپاد ها، مدت زمان پرواز، استقامت و سرعت محدودی دارند بنابراین برای پروژه هایی با مقیاس بزرگ مناسب نیستند.

پهپاد چند روتور

  • پهپاد های تک روتور : ساختار این طبقه مشابه با طراحی رایج یک هلیکوپتر است. این نوع از پهپاد ها، با یک روتور الکتریکی در بالا و یک روتور مکمل در دم پهپاد جهت هدایت تجهیز شده اند. در آیرودینامیک یک قانون کلی وجود دارد که هر چه تعداد روتور ها کمتر باشد، استقامت بیشتر خواهد بود. بنابراین می توان گفت که پهپاد های تک روتور نسبت به پهپاد های چند چرخانه ای کاراتر هستند.

پهپاد تک روتور

  • پهپاد با بال ثابت : این طبقه از پهپاد ها با الهام گرفتن از ساختار هواپیما شکل گرفته اند. این نوع از پهپاد ها دارای بال های ثابت هستند و دنباله  یکسانی از دامنه پرواز و فرود دارند. از آنجایی که این نوع از پهپاد از جریان هوا برای پایایی استفاده می کنند، مدت زمان پرواز طولانی تری دارند. پهپاد های این طبقه دو اشکال عمده دارند. اول اینکه ساخت این نوع از پهپاد ها هزینه بر است و دیگر اینکه آموزش آن ها باید حین پرواز انجام گیرد.

پهپاد بال ثابت

  • پهپاد های بالا برنده : این طبقه از پهپاد ها با ترکیب مدل های بال ثابت و چرخانه ای، طراحی می شوند. این دسته از پهپاد ها قادر هستند در راستای عمود از زمین بلند شوند، بر زمین بنشینند و همچنین در پرواز های رو به جلو حرکت کنند. ژیروسکوپ ها و شتاب سنج ها  به پایایی پرواز کمک می کنند.

پهپاد بالا برنده

  • کشتی هوایی : این گروه از پهپاد ها به گونه ای ساخته می شوند که از هوا سبک تر باشند. آن ها با یک نوع گاز شناور نظیر هلیوم یا هیدروژن پر می شوند و معمولا موتور دارند.

کشتی هوایی

این مقاله با توجه به اهدافی که دنبال می کند، پهپاد های چند روتور قابل برنامه ریزی به نام Tello RYZE را به کار می گیرد. پهپاد تلو توسط شرکت Shenzhen Ryze ساخته شده است. این شرکت، فناوری کنترل پرواز DJI و پردازنده های اینتل را ادغام کرده است. Tello RYZE از زبان های سویفت و اسکرچ و همچنین اسکریپت نویسی پیشرفته با زبان پایتون پشتیبانی می کند و امکان برنامه نویسی بلوکی با آن زبان ها را برای کاربرانش فراهم می سازد.

معماری پهپاد

پهپاد تلو، معماری ساده ای دارد. این پهپاد برای تعامل تنها نیازمند یک کیت توسعه نرم افزاری (  SDK) است. SDK در تلو از طریق یک پورتUDP  وای فای به پهپاد متصل می شود و به کاربران اجازه می دهد که پهپاد را با فرمان های متنی یا اسکریپت ها کنترل کند. جریان کار در این پهپاد ها دو طرفه است زیرا هم امکان ارسال دستورات SDK به تلو و هم امکان دریافت اطلاعات از تلو وجود دارد. وای فای برای ایجاد یک اتصال بین تلو با کامپیوتر شخصی، تبلت یا  تلفن هوشمند استفاده می شود و در نتیجه فرمانها می توانند از طریق IP و پورت زیر ارسال و دریافت شوند.

Tello IP: 192.168.10.1
Port: 8889

مولفه های اصلی پهپاد مذکور در شکل زیر نمایش داده شده است.

اجزا پهباد تشحیص ماسک

شرح خلاصه ای از  پهپاد Tello رایز در جدول زیر نشان داده شده است.

اطلاعات پهپاد Tello

همان طور که از جدول بالا پیدا است این پهپاد اساسا برای مقاصدی در فضای بسته طراحی شده است. این پهپاد با توجه به مشخصه هایی که دارد، به شدت عملکرد ها را محدود می کند. این مشخصه ها عبارتند از:

  • حداکثر فاصله پرواز ۱۰۰ متر
  • حداکثر سرعت ۸ متر در ثانیه
  • حداکثر مدت پرواز سیزده دقیقه
  • حداکثر ارتفاع پرواز سی متر

تنظیم محیط برای برنامه نویسی پهپاد ها

پهپاد انتخاب شده با زبان های مختلفی قابل برنامه ریزی است. در این پروژه زبان پایتون انتخاب می شود. زیرا کتابخانه های فوق العاده ای برای بینایی کامپیوتر و یاد گیری عمیق دارد. کتابخانه های متفاوتی برای پایتون وجود دارند. هدف از ایجاد این کتابخانه ها تجهیز کاربران به یک روش ساده برای واسط سازی و ارسال فرمان ها به پهپاد  DJI Tello است. از جمله کتابخانه ها در SDK نسخه دوم DJI Tello می توان به موارد زیر اشاره کرد.

در این آموزش از کتابخانه djitellopy استفاده می شود، زیرا در انجمن، بیشترین امتیاز، فورک ها و درخواست های واکشی فعال به آن تعلق دارد. به بیان کلی تر بیشترین تعاملات در انجمن روی این کتابخانه انجام شده است.

تمامی کد ها، مجموعه داده و دیگر منابعی که در این مقاله استفاده شده اند در Github موجود هستند. این پروژه از سه اسکریپت پایتون تشکیل شده است.

  • اسکریپت پیکربندی پهپاد : drone-config.py
  • اسکریپت تشخیص ماسک صورت بلادرنگ : realtime-detection.py
  • اسکریپت اصلی جهت اجرای پروژه : py

اسکریپت پیکربندی پهپاد

به منظور ایجاد یک اسکریپت پیکربندی برای پهپاد، لازم است کتابخانه های ضروری جهت راه اندازه اولیه عملیات مورد نیاز به پروژه اضافه شوند. دو کتابخانه  djitellopy و openCV  به سادگی از طریق ترمینال و با بسته مدیریتی PyPI  نصب می شوند.

$ pip install djitellopy
$ pip install opencv-python

 بعد از اتمام نصب کتابخانه هایی برای تعامل با پهپاد و عملیات  بینایی کامپیوتر، انجام پروژه مطابق با شرح زیر شروع می شود.

# Importing the Tello Drone Library
from djitellopy import Tello
# Importing OpenCV library
import cv2
# Importing time package
import time
# Importing OS module
import os
# Instantiating the Tello module
pkg = Tello()
# Connecting the drone to the python script after connecting to the Drone's WiFi
pkg.connect()

قطعه کد بالا با استفاده از وای فای، یک اتصال UDP موفق با پهپاد و کامپیوتر شخصی ایجاد می کند. کلاس پهپاد به شکل زیر ایجاد خواهد شد.

class Drone:

  """Wrapper class to setup the tello drone"""

  def __init__(self, width, height):
    	self.StartCounter = 0
    	self.width = width
    	self.height = height
    	self.back_velocity = 0
    	self.left_right_velocity = 0
    	self.up_down_velocity = 0
    	self.yaw_velocity = 0
    	self.speed = 0

کلاس پهپاد با مقادیر پیش فرض برای سرعت حرکت به عقب، طرفین ( چپ /راست)، سرعت در راستای افق و در سرعت انحرافی ایجاد می شود. مقدار پیش فرض هر یک از موارد مذکور برابر با صفر است. به علاوه سرعت اولیه نیز صفر فرض می شود تا تعادل پهپاد قبل از بلند شدن از زمین تضمین شده باشد. اطلاعات بیشتر در مورد بدنه و فیزیک پهپاد منتخب را می توان در اینجا یافت. کلاس های پهپاد همچنین ابعاد مورد نیاز برای فریم را در نظر می گیرند. ابعاد یک فریم با دو مقدار طول و عرض نشان داده می شود.

def get_status(self):
    	battery = pkg.get_battery()
    	fly_time = pkg.get_flight_time()
    	drone_height = pkg.get_height()
    	atmospheric_pressure = pkg.get_barometer()
    	temperature = pkg.get_temperature()
    	yaw_velocity = pkg.get_yaw()
    	speed_x = pkg.get_speed_x()
    	speed_y = pkg.get_speed_y()
    	speed_z = pkg.get_speed_z()
    	acceleration_x = pkg.get_acceleration_x()
    	acceleration_y = pkg.get_acceleration_y()
    	acceleration_z = pkg.get_acceleration_z()

    	#   Function to return a dictionary of the status
    	status_files = {
        	'battery': battery,
        	'fly_time': fly_time,
        	'drone_height': drone_height,
        	'atmospheric_pressure': atmospheric_pressure,
        	'temperature': temperature,
        	'yaw_velocity': yaw_velocity,
        	'speed': (speed_x, speed_y, speed_z),
        	'acceleration':(acceleration_x,acceleration_y,               acceleration_z)
    	}
    	return status_files.items()

کلاس پهپاد تابعی به نام “get_status” دارد که  مقدار بازگشتی آن نوع داده دیکشنری است.  مقادیری که در این دیکشنری نگهداری می شوند عبارتند از:

  • میزان ذخیره باتری بر حسب درصد
  • مدت زمان پرواز بر حسب ثانیه
  • ارتفاع جاری پهپاد بر حسب سانتیمتر
  • فشار جو به شکل ارتفاع سنج بر حسب سانتیمتر
  • دما بر حسب سلسیوس
  • سرعت یام بر حسب سانتیمتر بر ثانیه
  • سرعت در فضای سه بعدی (محورهای y, x و z) بر حسب سانتیمتر بر ثانیه
  • شتاب در فضای سه بعدی (محورهای y, x و z) بر حسب سانتیمتر بر مجذور ثانیه
def get_stream_on(self):
    	pkg.streamon()

def get_stream_off(self):
    	pkg.streamoff()

به علاوه کلاس پهپاد دو تابع به نام های “get_stream_on”  و  “get_stream_off” دارد که به ترتیب برای روشن و خاموش کردن پخش زنده اینترنتی ویدیو استفاده می شوند. همه پهپاد های تلو زمانیکه در مد نقطه دسترسی (Access Point  ) باشند از پخش زنده اینترنتی پشتیبانی می کنند. به بیان دیگر زمانیکه کامپیوتر شخصی به شبکه وای فای تلو متصل باشد، می توان جریان زنده اینترنتی داشت.

def get_frame(self):
    	frame_read = pkg.get_frame_read()
    	return frame_read.frame

کلاس پهپاد تابعی به نام “get_frame” دارد که وظیفه آن ثبت فریم های دریافت شده از دوربین پهپاد است.

def get_video(self):
    	fourcc = cv2.VideoWriter_fourcc(*'XVID')
    	out = cv2.VideoWriter('drone_video.avi', fourcc, 20.0, (640, 480))
    	frame_read = pkg.get_frame_read()
    	while(True):
        	cv2.imshow('Video Stream', frame_read.frame)
        	out.write(frame_read.frame)
        	if cv2.waitKey(1) & 0xFF == ord('q'):
            	break

    	cap.release()
    	out.release()
    	cv2.destroyAllWindows()

    	return 'complete'

تابع”get_video” تابع دیگری از این کلاس است که پخش زنده اینترنتی ویدیویی را که فریم به فریم پردازش شده است، ذخیره می کند. این متد از کلاس OpenCV VideoWriter  برای ذخیره سازی استفاده می کند و پخش زنده اینترنتی ویدیو را در قالب .avi دخیره می کند. هر فریم دارای ابعاد ۶۸۰*۶۴۰ با کدک  FourCC است. 

def advance_movement(self):
    	pkg.takeoff()
    	pkg.move_forward(40)
    	# pkg.rotate_counter_clockwise(90)

def fallback_movement(self):
    	pkg.rotate_counter_clockwise(90)
    	pkg.move_forward(20)
    	pkg.end()

def get_movement(self):
    	# Predefined mapped out movement in my use case
    	pkg.takeoff()
    	pkg.rotate_counter_clockwise(5)
    	pkg.move_up(5)
    	pkg.move_forward(5)
    	pkg.rotate_clockwise(90)
    	time.sleep(20)
    	pkg.rotate_clockwise(90)
    	pkg.move_forward(5)
    	time.sleep(5)
    	pkg.end()

الگوهای مختلفی با واحد فاصله (سانتیمتر) همانند “advance_movement”، “Fallback_movement”  و “get_movement “ایجاد شده اند. الگوهای مذکور حرکات رو به جلو، رو به عقب، چپ، راست، بالا، پایین و همچنین چرخش در جهت عقربه های ساعت و خلاف جهت عقربه های ساعت را در بر می گیرند. جهت شروع پرواز، یک فرمان تیک آف و جهت خاتمه پرواز یک دستور خاتمه وارد می شود.

def get_snap_shots(self, label, frame):
    	count = 0
    	if label.split(':')[0] == 'No Mask':
        	file_name = './snapshots/no mask ' + str(count) + '.jpg'
        	print(file_name)
        	cv2.imwrite(file_name, frame)
        	count += 1
        	time.sleep(5)

در انتها تابعی به نام  “get_snap_shot”  در کلاس پهپاد ایجاد می شود تا تصاویر (اسکرین شاتها) را با برچسب ” بدون ماسک”  و  به صورت فریم هایی درقالب jpeg  بنویسد. در این مقاله، افراد بدون ماسک، افراد متخلف محسوب می شوند. قابلیت اسکرین شات باید هر ۵ ثانیه یکبار دریافت شود.

نتیجه گیری

در این آموزش، صنعت پهپاد به طور خلاصه مرور شد و چگونگی برپایی محیط پهپاد برای این پروژه شرح داده شد. این آموزش اولین بخش از سری آموزش های سیستم نظارتی ماسک صورت بود. در آموزش بعدی درباره ساخت یک مدل تشخیص ماسک صورت بلا درنگ با استفاده از یادگیری عمیق صحبت خواهد شد که در پهپاد تعبیه می شود.

بیشتر بخوانید :

همچنین ببینید

ربات های تویوتا با کپی برداری از انسان ها، انجام کارهای خانه را یاد می گیرند

ربات های تویوتا با یادگیری از انسان ها، کارهای خانه را انجام می دهند

شرکت خودروسازی تویوتا در حال توسعه گونه ای از ربات هاست که با مشاهده نحوه …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *