0

تشخیص فضای پر یا خالی برای پارک خودرو با پایتون

مقدمه

برای تشخیص فضای پر یا خالی برای پارک خودرو با پایتون، می‌توانید از دوربین‌های مداربسته و یا سنسور‌های اندازه‌گیری فاصله استفاده کنید. در ادامه یک راه حل ساده برای تشخیص فضای پر یا خالی برای پارک خودرو با استفاده از دوربین‌های مداربسته پیشنهاد می‌دهیم.

نصب OpenCV

  1. یک کتابخانه پردازش تصویر است که در پایتون وجود دارد. برای نصب آن می‌توانید از دستور زیر استفاده کنید:

نصب OpenCV

pip install opencv-python

ضبط ویدیو

برای ضبط ویدیو با دوربین مداربسته، می‌توانید از تابع VideoCapture در OpenCV استفاده کنید. مثال زیر نحوه ضبط ویدیو را با دوربین ۰ نشان می‌دهد:

ضبط ویدیو

import cv2

 

cap = cv2.VideoCapture(0)

 

while True:

    ret, frame = cap.read()

    cv2.imshow(‘frame’, frame)

    if cv2.waitKey(1) & 0xFF == ord(‘q’):

        break

 

cap.release()

cv2.destroyAllWindows()

تشخیص ماشین‌ها

برای تشخیص ماشین‌ها، می‌توانید از الگوریتم‌های پردازش تصویری مانند Cascade Classifier و یا YOLO (You Only Look Once) استفاده کنید. YOLO یک الگوریتم پیشرفته برای تشخیص اشیاء در تصاویر است که در OpenCV پیاده‌سازی شده است.

تحلیل نتایج

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

مراحل ۱ تا ۳ که در پاسخ قبلی ذکر شد، برای ضبط ویدیو با دوربین مداربسته و تشخیص ماشین‌ها با الگوریتم YOLO در OpenCV می‌باشد. در این مراحل، تصاویر فیلم‌برداری شده توسط دوربین مداربسته از طریق الگوریتم‌های پردازش تصویری مانند YOLO پردازش می‌شوند تا ماشین‌ها شناسایی شوند.

 

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

 

برای مثال، کد زیر میانگین تعداد ماشین‌ها را در ۵۰ فریم محاسبه می‌کند و اگر مقدار میانگین کمتر از حداکثر ظرفیت پارکینگ باشد، فضای پارک خالی است:

 

نصب OpenCV

import cv2

 

cap = cv2.VideoCapture(0)

max_capacity = 10  # Maximum capacity of the parking lot

frames = []

n_frames = 50  # Number of frames to average over

 

while True:

    ret, frame = cap.read()

    frames.append(frame)

    if len(frames) > n_frames:

        frames.pop(0)

    if len(frames) == n_frames:

        # Process frames

        # …

        # Count number of cars in each frame

        counts = []

        for frame in frames:

            count = detect_cars(frame)  # A function that detects cars in a frame

            counts.append(count)

        # Calculate the average number of cars

        avg_count = sum(counts) / len(counts)

        if avg_count < max_capacity:

            print(‘Parking lot is available’)

        else:

            print(‘Parking lot is full’)

           

    cv2.imshow(‘frame’, frame)

    if cv2.waitKey(1) & 0xFF == ord(‘q’):

        break

 

cap.release()

cv2.destroyAllWindows()

کد این برنامه با PyTorch

ابتدا باید PyTorch را نصب کنید. برای نصب آن به لینک زیر مراجعه کنید:

بعد از نصب کتابخانه کد زیر را اجرا کنید:

کد شناسایی فضاها در پارکینگ خودروها

import argparse
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import transforms

 

parser = argparse.ArgumentParser(“Set parking lot occupancy detection project parameters”, add_help=False)

parser.add_argument(‘–epochs’, type=int, default=18, help=”rounds of training”)
parser.add_argument(‘–imshow’, type=bool, default=False, help=”show some training dataset”)
parser.add_argument(‘–model’, type=str, default=’mAlexNet’, help=’model name’)
parser.add_argument(‘–path’, type=str, default=”, help=’trained model path’)
parser.add_argument(‘–train_img’, type=str, default=’CNRPark-Patches-150×150/’, help=”path to training set images”)
parser.add_argument(‘–train_lab’, type=str, default=’splits/CNRParkAB/even.txt’, help=”path to training set labels”)
parser.add_argument(‘–test_img’, type=str, default=’CNRPark-Patches-150×150/’, help=”path to test set images”)
parser.add_argument(‘–test_lab’, type=str, default=’splits/CNRParkAB/odd.txt’, help=”path to test set labels”)

parser.add_argument(“–device”, default=”cuda”, help=”device used”)
args = parser.parse_args()

 

def train(epoch, img_path, target_path, transform, net, criterion, device):
train_dataset = Data(img_path, target_path, transform)
train_loader = DataLoader(train_dataset, batch_size=64, \
shuffle=True, num_workers=0,drop_last=False, collate_fn=collate_fn)
for ep in range(epoch):
if ep >= 12:
learning_rate = 0.0025
elif ep >= 6:
learning_rate = 0.005
else:
learning_rate = 0.01
running_loss = 0.0
print(“Epoch {}.”.format(ep+1))
for i, data in enumerate(train_loader,1):
inputs, labels = data
labels = list(map(int, labels))
labels = torch.Tensor(labels)
inputs = inputs.to(device)
labels = labels.to(device)

optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9, weight_decay=0.0005)
optimizer.zero_grad()
outputs = net(inputs)

loss = criterion(outputs, labels.long())
loss.backward()
optimizer.step()
running_loss += loss.item()
print(“Epoch {}.\tBatch {}.\tLoss = {:.3f}.”.format(ep+1, i+1, running_loss))
if i % 2000 == 1999: # 2000 mini-batches
print(‘[%d, %5d] loss: %.3f’ %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print(‘Finished Training.’)

آموزش کتابخانه Numpy

رایگان
01:04ساعت
254

آموزش کتابخانه Pandas

رایگان
01:20ساعت
193

آموزش کتابخانه Matplotlib

رایگان
01:10ساعت
344
ارسال دیدگاه