پروژه های رزبری پای

محاسبه فاصله اجتماعی با OpenCV و رزبری پای

محاسبه فاصله اجتماعی با استفاده از OpenCV و رزبری پای

محاسبه فاصله اجتماعی با استفاده از OpenCV و رزبری پای

محاسبه فاصله اجتماعی با استفاده از OpenCV و رزبری پای

در زمان Covid-19 ، فاصله اجتماعی یک روش موثر برای کاهش سرعت انتقال ویروس عفونی است.

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

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

بنابراین در ادامه پروژه های ایمنی قبلی کرونا مانند دستگاه ضد عفونی کننده اتوماتیک و نظارت بر دمای بدون تماس ، در اینجا قصد داریم یک سیستم آشکارساز فاصله اجتماعی با استفاده از OpenCV و Raspberry Pi بسازیم.

ما از وزنه های الگوریتم تشخیص شیO YOLO v3 با ماژول شبکه عصبی عمیق استفاده خواهیم کرد.

رزبری پای همیشه انتخاب خوبی برای پروژه های پردازش تصویر است

زیرا حافظه و سرعت بیشتری نسبت به کنترل کننده های دیگر دارد.

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

لوازم مورد نیاز

محاسبه فاصله اجتماعی با OpenCV

در اینجا ما فقط به RPi 4 با OpenCV نصب شده نیاز داریم.

OpenCV در اینجا برای پردازش تصویر دیجیتال استفاده می شود.

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

یولو YOLO

(شما فقط یک بار نگاه می کنید) یک شبکه عصبی Convolution هوشمند (CNN) برای تشخیص شی در زمان واقعی است.

YOLOv3 ، آخرین نوع الگوریتم تشخیص شی ، YOLO می تواند 80 شی مختلف را در تصاویر و فیلم ها تشخیص دهد ، و بسیار سریع و دارای دقت عالی است.

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

مدل Base YOLO می تواند تصاویر را در زمان واقعی با سرعت 45 فریم در ثانیه پردازش کند.

مدل YOLO از سایر روشهای تشخیص مانند SSD و R-CNN بهتر عمل می کند.

مدل YOLOV3 را که می خواهیم در این پروژه استفاده کنیم ، می توانید از اینجا بارگیری کنید.

نصب 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

نصب سایر بسته های مورد نیاز در Raspberry Pi

قبل از برنامه نویسی ، بیایید سایر بسته های مورد نیاز را نصب کنیم.

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

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

pip3 install imutils

توضیحات برنامه


کد کامل در انتهای صفحه آورده شده است.

در اینجا ما برای توضیح بهتر بخشهای مهم کد را توضیح می دهیم.

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

import numpy as np
import cv2
import imutils
import os
import time

از تابع Check برای محاسبه فاصله بین دو شی objects یا دو نقطه در یک قاب فیلم استفاده می شود.

نقاط a و b نشانگر دو جسم در کادر است.

از این دو نقطه برای محاسبه فاصله اقلیدسی بین اجسام استفاده می شود.

def Check(a,  b):
    dist = ((a[0] - b[0]) ** 2 + 550 / ((a[1] + b[1]) / 2) * (a[1] - b[1]) ** 2) ** 0.5
    calibration = (a[1] + b[1]) / 2     
    if 0 < dist < 0.25 * calibration:
        return True
    else:
        return False

از تابع setup برای تنظیم مسیرهای وزن های YOLO ، پرونده cfg ، پرونده نام COCO استفاده می شود.

ماژول os.path برای دستکاری نام و نام خانوادگی مشترک استفاده می شود

. os.path.join ماژول یک زیر ماژول از os.path است و برای پیوستن هوشمندانه یک یا چند م moreلفه مسیر استفاده می شود.

از روش () cv2.dnn.readNetFromDarknet برای بارگذاری وزنهای ذخیره شده در شبکه استفاده می شود.

پس از بارگیری اوزان ، لیست تمام لایه های مورد استفاده در شبکه را با استفاده از مدل net.getLayerNames استخراج کنید.

def Setup(yolo):
    global neural_net, ln, LABELS
    weights = os.path.sep.join([yolo, "yolov3.weights"])
    config = os.path.sep.join([yolo, "yolov3.cfg"])
    labelsPath = os.path.sep.join([yolo, "coco.names"])
    LABELS = open(labelsPath).read().strip().split("\n") 
    neural_net = cv2.dnn.readNetFromDarknet(config, weights)
    ln = neural_net.getLayerNames()
    ln = [ln[i[0] - 1] for i in neural_net.getUnconnectedOutLayers()]

در داخل عملکرد پردازش تصویر ، پروژه پرادزش تصویر با OpenCV

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

در دو خط اول عملکرد ، ما در ابتدا ابعاد قاب فیلم (W ، H) را به صورت (None ، None) تنظیم می کنیم.

در خط بعدی ، از روش cv2.dnn.blobFromImage برای بارگذاری فریم ها به صورت دسته ای و اجرای آنها از طریق شبکه استفاده کردیم.

عملکرد blob تفریق ، پوسته پوسته شدن و تغییر کانال روی یک قاب را انجام می دهد.

(H, W) = (None, None)
    frame = image.copy()
    if W is None or H is None:
        (H, W) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416), swapRB=True, crop=False)
    neural_net.setInput(blob)
    starttime = time.time()
    layerOutputs = neural_net.forward(ln)

لایه های خروجی از YOLO از مجموعه ای از مقادیر تشکیل شده است.

این مقادیر به ما کمک می کند تا مشخص کنیم کدام شی متعلق به کدام کلاس است.

ما بر روی هر خروجی در layerOutput حلقه می زنیم و همانطور که افراد را ردیابی می کنیم ، برچسب کلاس را “person” قرار می دهیم.

از هر تشخیص ، یک جعبه محدود می گیریم که مرکز X ، مرکز Y ، عرض و ارتفاع جعبه را برای تشخیص در خروجی به ما می دهد

scores = detection[5:]
            maxi_class = np.argmax(scores)
            confidence = scores[maxi_class]
            if LABELS[maxi_class] == "person":
                if confidence > 0.5:
                    box = detection[0:4] * np.array([W, H, W, H])
                    (centerX, centerY, width, height) = box.astype("int")
                    x = int(centerX - (width / 2))
                    y = int(centerY - (height / 2))
                    outline.append([x, y, int(width), int(height)])
                    confidences.append(float(confidence))

پس از آن ، فاصله مرکز جعبه فعلی را با سایر جعبه های شناسایی شده محاسبه کنید.

اگر جعبه های اتصال نزدیک هستند ، وضعیت را به true تغییر دهید

for i in range(len(center)):
            for j in range(len(center)):
                close = Check(center[i], center[j])
                if close:
                    pairs.append([center[i], center[j]])
                    status[i] = True
                    status[j] = True
        index = 0

در خطوط بعدی ، پروژه پرادزش تصویر با OpenCV

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

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

(x, y) = (outline[i][0], outline[i][1])
            (w, h) = (outline[i][2], outline[i][3])
            if status[index] == True:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 150), 2)
            elif status[index] == False:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

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

ret, frame = cap.read()
    if not ret:
        break
    current_img = frame.copy()
    current_img = imutils.resize(current_img, width=480)
    video = current_img.shape
    frameno += 1
    if(frameno%2 == 0 or frameno == 1):
        Setup(yolo)
        ImageProcess(current_img)
        Frame = processedImg

در خطوط بعدی ، پروژه پرادزش OpenCV

از تابع cv2.VideoWriter  برای ذخیره فیلم خروجی در مکانی که توسط opname مشخص شده و قبلاً تعریف کردیم ، استفاده کنید.

if create is None:
            fourcc = cv2.VideoWriter_fourcc(*'XVID')
            create = cv2.VideoWriter(opname, fourcc, 30, (Frame.shape[1], Frame.shape[0]), True)
    create.write(Frame)

آزمایش پروژه پرادزش تصویر با OpenCV

پس از آماده شدن کد ، یک ترمینال Pi را باز کنید و به فهرست پروژه بروید.

کد ، مدل Yolo و فیلم نمایشی باید در همان پوشه ای باشد که در زیر نشان داده شده است.

می توانید فهرست YoloV3 را از اینجا ، فیلم ها را از Pexels بارگیری کرده و کد پایتون را که در زیر آورده شده کپی کنید و در همان دایرکتوری که در بالا نشان داده شده قرار دهید

پس از ورود به فهرست پروژه ، دستور زیر را برای شروع کد اجرا کنید:

python3 detector.py

من این کد را روی نمونه ویدیویی که از Pexels بدست آمده ام امتحان کردم.

برای من سرعت FPS بسیار کند بود و پردازش کل فیلم 10 تا 11 دقیقه طول کشید. OpenCV و رزبری پای

به جای استفاده از فیلم ، حتی می توانید با جایگزینی cv2.VideoCapture (ورودی) با cv2.VideoCapture 0 در خط 98 کد ، این کد را با دوربین Raspberry Pi Camera تست کنید.

این پروژه توسط گروه وی تات انجام شده wetat.ir

کپی با ذکر منبع بلامانع است

نوشته های مشابه

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

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