Wasting time searching for a spot and low turnover are typical pain points solved by a computer vision parking monitoring system. Compared to ultrasonic sensors that need installation per spot and often fail, video analytics uses one camera to cover up to 50 spots, with occupancy detection accuracy reaching 99%. The system runs 24/7 with IR illumination and low-light enhancement; models trained on night footage maintain up to 97% accuracy in the dark. We have 5+ years of experience and 30+ implemented projects. We guarantee stable operation and provide a free pilot on one camera to demonstrate accuracy. Annual savings on a 500-spot parking lot can reach 2 million rubles, and 100 thousand rubles on electricity thanks to using GPUs with 250W TDP. For a standard 100-space parking lot, the project cost including hardware and software starts at 500,000 rubles (approx $5,500). Contact us for a project assessment—our engineers will reach out within a day.
Problems Solved by Parking Video Analytics
Visitors spend 10–20 minutes searching for a free spot, reducing loyalty and throughput. Real-time video analytics shows available spots on each floor, guiding drivers to the nearest one. Ultrasonic and magnetic sensors fail every 2–3 years, requiring replacement and calibration. Cameras last 5–7 years, and software updates are remote. Video analytics captures license plates, entry/exit times, repeat visits—this data helps optimize pricing and plan occupancy.
Video Analytics vs Ultrasonic Sensors: Comparison
| Parameter | Video Analytics | Ultrasonic Sensors |
|---|---|---|
| Installation cost | Low (one camera per 10–50 spots) | High (sensor per spot) |
| Maintenance | Remote, software updates | Sensor replacement on failure |
| Functionality | License plate detection, tracking, violation recording | Occupancy only |
| Accuracy | 96–99% | 95–98% |
Video analytics is not only cheaper but provides more data: license plates, speed, dwell time. This enables parking optimization and revenue increase. In fact, video analytics is up to 10 times more cost-effective than ultrasonic sensors due to lower installation and maintenance costs. Annual savings on a 500-spot lot can reach 2 million rubles from reduced maintenance costs and increased turnover. Maintenance costs are cut by up to 80% compared to ultrasonic sensors. Detection speed is 2 times faster, enabling real-time updates. > Ultralytics: YOLOv8 demonstrates high detection accuracy across various scenes.
Achieving 99% Occupancy Detection Accuracy
We use computer vision algorithms based on YOLOv8 (vehicle detection) and the Ultralytics library. The model is trained on 50,000 labeled frames including night, rainy, and snowy scenes. In production, we apply post-processing: center check and bounding box overlap with the parking polygon. A time filter (vehicle stationary for over 5 seconds) eliminates false positives from passing cars. Inference runs on NVIDIA GPUs with TensorRT, with p99 latency under 150 ms per frame.
ParkingMonitor Class Code (Python, PyTorch)
from ultralytics import YOLO
import numpy as np
import cv2
import json
class ParkingMonitor:
def __init__(self, model_path: str, parking_config_path: str):
self.detector = YOLO(model_path) # vehicle detection
self.parking_spaces = self._load_parking_config(parking_config_path)
def _load_parking_config(self, config_path: str) -> list[dict]:
"""Load parking space configuration (polygons)"""
with open(config_path) as f:
config = json.load(f)
spaces = []
for space in config['spaces']:
spaces.append({
'id': space['id'],
'polygon': np.array(space['polygon'], dtype=np.int32),
'zone': space.get('zone', 'default')
})
return spaces
def analyze(self, frame: np.ndarray) -> dict:
"""Determine occupancy of all parking spaces"""
detections = self.detector(frame, conf=0.4,
classes=[2, 5, 7]) # car, bus, truck
# Extract vehicle centers
vehicle_centers = []
for box in detections[0].boxes.xyxy:
x1, y1, x2, y2 = map(int, box)
cx, cy = (x1 + x2) // 2, (y1 + y2) // 2
vehicle_centers.append((cx, cy))
# Check each parking space
occupied_spaces = []
free_spaces = []
for space in self.parking_spaces:
occupied = self._is_space_occupied(space['polygon'],
vehicle_centers,
detections[0].boxes.xyxy)
space_status = {
'id': space['id'],
'zone': space['zone'],
'occupied': occupied
}
if occupied:
occupied_spaces.append(space_status)
else:
free_spaces.append(space_status)
return {
'total_spaces': len(self.parking_spaces),
'occupied': len(occupied_spaces),
'free': len(free_spaces),
'occupancy_rate': len(occupied_spaces) / max(len(self.parking_spaces), 1),
'spaces': occupied_spaces + free_spaces
}
def _is_space_occupied(self, polygon: np.ndarray,
vehicle_centers: list,
vehicle_boxes: list) -> bool:
"""Check if a vehicle is in the parking space"""
# Method 1: vehicle center inside polygon
for cx, cy in vehicle_centers:
result = cv2.pointPolygonTest(polygon, (float(cx), float(cy)), False)
if result >= 0:
return True
# Method 2: bounding box overlap with polygon > 40%
space_mask = np.zeros((720, 1280), dtype=np.uint8)
cv2.fillPoly(space_mask, [polygon], 255)
space_area = cv2.contourArea(polygon)
for box in vehicle_boxes:
x1, y1, x2, y2 = map(int, box)
vehicle_mask = np.zeros_like(space_mask)
cv2.rectangle(vehicle_mask, (x1, y1), (x2, y2), 255, -1)
intersection = cv2.bitwise_and(space_mask, vehicle_mask)
overlap = intersection.sum() / 255
if overlap / space_area > 0.4:
return True
return False
Labeling Parking Spaces
Initial labeling of parking space zones is done once via a web interface. Labeling a typical parking lot takes about 2 hours.
class ParkingSpaceLabeler:
"""Interactive labeling of parking spaces on a frame"""
def __init__(self, image_path: str):
self.image = cv2.imread(image_path)
self.spaces = []
self.current_polygon = []
def interactive_label(self):
"""Start interactive labeling (for manual use)"""
cv2.namedWindow('Label Parking Spaces')
cv2.setMouseCallback('Label Parking Spaces', self._on_click)
while True:
display = self.image.copy()
for space in self.spaces:
cv2.polylines(display, [space['polygon']], True, (0, 255, 0), 2)
if self.current_polygon:
cv2.polylines(display,
[np.array(self.current_polygon)], False, (0, 0, 255), 2)
cv2.imshow('Label Parking Spaces', display)
key = cv2.waitKey(1)
if key == ord('s') and len(self.current_polygon) >= 4:
self.spaces.append({
'id': f'space_{len(self.spaces)+1}',
'polygon': self.current_polygon.copy()
})
self.current_polygon = []
elif key == ord('q'):
break
return self.spaces
Integration with Navigation Systems
What capabilities does navigation integration unlock?
Our solution easily integrates into existing infrastructure:
- Digital signage: screens with a parking map, real-time updates.
- Mobile app: space booking, navigation to free spots.
- Smart traffic lights: green/red indicator above each row.
- ANPR integration: automatic entry/exit by plate, payment calculation.
Can automatic entry/exit be configured?
We provide an API for integration with any system. Data is transmitted in JSON via WebSocket or REST. For more on YOLO—the detection algorithm at the core.
Implementation Stages
- Parking audit—on-site engineer visit, layout assessment, accuracy requirements.
- Design—camera selection, viewing angle calculation, specification preparation.
- Installation and configuration—camera mounting, model training on your parking lot frames.
- Integration—connection to navigation, mobile app, access control systems.
- Testing—accuracy verification (A/B test with real data), stress test.
- Deployment and support—go-live, 99.9% SLA, remote monitoring.
What's Included
We deliver a turnkey project:
- Configured video analytics system with 99% accuracy.
- Source code of models and configurations.
- REST API and documentation.
- Web interface for viewing statistics and management.
- Staff training (2 hours).
- Warranty on equipment and software—12 months.
Timelines and Cost
| System Scale | Timeline |
|---|---|
| 1–4 cameras, 50–200 spots | 3–4 weeks |
| 10–20 cameras, multi-level | 6–9 weeks |
| Enterprise, navigation + API | 10–16 weeks |
Cost is determined individually after an audit. We offer a free pilot on one camera to demonstrate accuracy. Contact us for a project assessment—our engineers will reach out within a day. Get a consultation: reach out to us to discuss your task.







