مقدمه
برای تشخیص فضای پر یا خالی برای پارک خودرو با پایتون، میتوانید از دوربینهای مداربسته و یا سنسورهای اندازهگیری فاصله استفاده کنید. در ادامه یک راه حل ساده برای تشخیص فضای پر یا خالی برای پارک خودرو با استفاده از دوربینهای مداربسته پیشنهاد میدهیم.
نصب OpenCV
- یک کتابخانه پردازش تصویر است که در پایتون وجود دارد. برای نصب آن میتوانید از دستور زیر استفاده کنید:
نصب 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 پیادهسازی شده است.
تحلیل نتایج
- پس از تشخیص ماشینها، میتوانید با تحلیل تعداد و موقعیت ماشینها، فضای پارک خالی و یا پر را تشخیص دهید.
مراحل ۱ تا ۳ که در پاسخ قبلی ذکر شد، برای ضبط ویدیو با دوربین مداربسته و تشخیص ماشینها با الگوریتم 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.’)
برای نوشتن دیدگاه باید وارد بشوید.