آموزش رزبری پایپروژه رزبری پای

تشخیص زدن ماسک با رزبری پای و OpenCV

بیماری ویروس کرونا (COVID-19) به طور جدی جهان را تحت تأثیر قرار داده و پایان آن هنوز معلوم نیست. برای محدود کردن شیوع ویروس ، استفاده از ماسک در مکان های عمومی تبدیل به قانون شده است. علاوه بر این ، بسیاری از فروشگاه های خرده فروشی و سایر ارائه دهندگان خدمات عمومی به مشتریان میگویند باید از ماسک استفاده کنید.

در آموزش امروز ، ما یاد خواهیم گرفت که چگونه می توانیم با استفاده از Raspberry Pi سیستم تشخیص ماسک صورت بسازیم.

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

قطعات مورد نیاز

  • رزبری پای
  • ماژول دوربین Pi
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

در اینجا ، ما فقط به ماژول دوربین Pi و رزبری پای 4 با OpenCV و Tensorflow نصب شده روی آن نیاز داریم. OpenCV در اینجا برای پردازش تصویر دیجیتال استفاده می شود. رایج ترین کاربردهای پردازش تصویر دیجیتال ، تشخیص شی ، تشخیص چهره و شمارش افراد است.

برای یادگیری آردوینو (برنامه نویسی، ساخت ربات، ارتباط با اندروید) روی دوره آموزش آردوینو کلیک کنید.
برای یادگیری کامل الکترونیک روی دوره آموزش الکترونیک کلیک کنید.

نصب OpenCV و سایز پکیج های مورد نیاز

قبل از نصب OpenCV در رزبری پای و سایر وابستگی ها Raspberry Pi باید کاملاً به روز شود. از دستورات زیر برای به روزرسانی Raspberry Pi به آخرین نسخه آن استفاده کنید:

sudo apt-get update

سپس از دستورات زیر برای نصب وابستگی های مورد نیاز برای نصب OpenCV در Raspberry Pi خود استفاده کنید.

sudo apt-get install libhdf5-dev -y 
sudo apt-get install libhdf5-serial-dev –y 
sudo apt-get install libatlas-base-dev –y 
sudo apt-get install libjasper-dev -y 
sudo apt-get install libqtgui4 –y
sudo apt-get install libqt4-test –y

پس از آن ، از دستور زیر استفاده کنید تا OpenCV را روی Raspberry Pi خود نصب کنید.

pip3 install opencv-contrib-python==4.1.0.25

نصب imutils: بسته imutils برای سهولت کارکردهای پردازش تصویر مانند ترجمه ، چرخش ، تغییر اندازه ، اسکلت بندی و نمایش تصاویر Matplotlib با OpenCV استفاده می شود. برای نصب imutils از دستور زیر استفاده کنید:

pip3 install imutils

نصب Tensorflow: برای نصب Tensorflow از دستور زیر استفاده کنید:

sudo pip3 install https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.1.0/tensorflow-2.1.0-cp37-none-linux_armv7l.whl

برای نصب sklearn در Raspberry Pi از دستور زیر استفاده کنید.

pip3 install sklearn

برنامه نویسی Raspberry Pi برای تشخیص ماسک صورت

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

  • Dataset: این پوشه شامل تصاویر صورت ماسک با و بدون ماسک است
  • Collect_images.py: این یک اسکریپت ساده برای پایتون است که می تواند تصویر یک چهره را جمع آوری کند.
  • training.py: این مجموعه داده ورودی را می پذیرد و MobileNetV2 را روی آن تنظیم می کند تا مدل تشخیص ماسک (MaskDetector.h5) ما را ایجاد کند.
  • Detect_mask.py: این کد پایتون تشخیص ماسک از داده های مربی برای طبقه بندی هر صورت به عنوان ماسک یا بدون ماسک استفاده می کند.

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

1. جمع آوری داده ها

در مرحله اول پروژه ، ما قصد داریم یک Dataset برای ذخیره تصاویر چهره با ماسک و بدون ماسک ایجاد کنیم. Collect_image.py یک اسکریپت پایتون ساده است که از OpenCV برای جمع آوری تصاویر صورت استفاده می کند. برنامه جمع آوری تصویر در زیر توضیح داده شده است:

این دو خط کد استدلال های سیستم را تنظیم میکنند. خط اول مربوط به نام برچسب و خط دوم مربوط به تعداد تصویری است که می خواهید جمع آوری کنید. به عنوان مثال ، اگر می خواهید 250 تصویر را با ماسک جمع کنید ، دستور زیر را صادر کنید: python3 Collect_images.py with_mask 250 و برای جمع آوری تصاویر بدون استفاده از ماسک ، از python3 gather_images.py without_mask 250 استفاده کنید.

label_name = sys.argv[1]
num_samples = int(sys.argv[2])

در اینجا مسیر دایرکتوری تصویر و کلاسهای تصویر ، یعنی با ماسک و بدون ماسک ارائه می شود.

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید
IMG_SAVE_PATH = 'image_data'
IMG_CLASS_PATH = os.path.join(IMG_SAVE_PATH, label_name)

خطوط زیر پوشه تصویر و پوشه کلاس های تصویر را بر اساس نام برچسب ایجاد می کند.

try:
    os.mkdir(IMG_SAVE_PATH)
except FileExistsError:
    pass
try:
    os.mkdir(IMG_CLASS_PATH)

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

ret, frame = cap.read()
    if not ret:
        continue
    if count == num_samples:
        break

تمام تصاویر را در یک مسیر مشخص ذخیره کنید. تمام تصاویر با توجه به تعداد نامگذاری می شوند.

save_path = os.path.join(IMG_CLASS_PATH, '{}.jpg'.format(count + 1))
        cv2.imwrite(save_path, frame)
        count += 1

2. آموزش مدل

اکنون که نمونه های صورت را جمع آوری کردیم ، می توانیم آنها را به برنامه منتقل کنیم و مراحل آموزش را شروع کنیم تا به صورت خودکار تشخیص دهد ماسک روی صورت وجود دارد یا خیر. بنابراین فایل train.py را در پوشه mask detector باز کرده و کد داده شده را در آن جای گذاری کنید. سپس با استفاده از دستور زیر فرایند آموزش را شروع کنید:

python3 training.py

اسکریپت پایتون برای آموزش Recognizer در زیر توضیح داده شده است:

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

INIT_LR = 1e-4
EPOCHS = 20
BS = 32

در خطوط بعدی ، مسیر دایرکتوری را که تصاویر در آن ذخیره می شود وارد کنید و داده ها را پیکربندی اولیه کنید.

imagePaths = "dataset"
data = []
labels = []

حالا همه تصاویر را در اسکریپت پایتون بارگذاری کنید تا بتوانیم آموزش را شروع کنیم. مراحل پیش پردازش شامل تغییر اندازه تصاویر به 224 × 224 پیکسل ، تبدیل به قالب آرایه ای و استفاده از تابع preprocess_input convenience برای مقیاس بندی شدت پیکسل در تصویر ورودی به محدوده [-1 ، 1] است.

for directory in os.listdir(imagePaths):
        label = os.path.join(imagePaths, directory)
        if not os.path.isdir(label):
                continue
        for item in os.listdir(label):
                if item.startswith("."):
                    continue
                image = load_img(os.path.join(label, item), target_size=(224, 224))
                image = img_to_array(image)
                image = preprocess_input(image)
                data.append(image)
                labels.append(label)

سپس در خطوط بعدی ، کدگذاری برچسب ها را انجام دهید. از این کدگذاری ها برای نشان دادن متغیرهای دسته ای به عنوان بردارهای باینری استفاده می شود.

lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)

سپس داده ها را به مجموعه های آموزشی و آزمایشی تقسیم کنید. 80٪ از داده ها برای آموزش و 20٪ باقیمانده برای آزمایش استفاده می شود.

(trainX, testX, trainY, testY) = train_test_split(data, labels,
            test_size=0.20, stratify=labels, random_state=42)

سپس مدل MobileNet را با ImageNet بارگیری کنید و قسمت اصلی شبکه را خالی بگذارید.

baseModel = MobileNetV2(weights="imagenet", include_top=False,
            input_tensor=Input(shape=(224, 224, 3)))

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

تست سیستم تشخیص ماسک صورت

برای تست سیستم تشخیص استفاده از ماسک با رزبری پای، کافیست دوربین را به برد رزبری پای متصل کنید. (مانند تصویر زیر)

تشخیص زدن ماسک با رزبری پای

اسکریپت Detect_mask.py را اجرا کنید. پس از چند ثانیه ، باید پنجره تصویر زنده دوربین خود را ببینید. اگر ماسک شناسایی شود ، یک مربع سبز با برچسب “Mask Detected” و یک مربع قرمز با برچسب “No Mask Detected” در صورت عدم شناسایی ماسک مشاهده خواهید کرد.

موارد موجود در فایل : سورس کامل

دانلود فایل های پروژه

برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید.

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.

تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید) سعی میکنم تمام نظرات را پاسخ دهم.

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

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