Skip to content
AI + IoTCompletedMay 2025

Neopark Smart Parking System

AI-powered smart parking system using computer vision to detect vehicle presence in real-time, with edge computing and a live monitoring dashboard.

Role
AI & IoT Developer
Timeline
Jan 2025 – May 2025
Team
3 people
Status
Completed

The problem

Parking facilities waste drivers' time and fuel because slot occupancy is tracked by hand — or not at all. Neopark needed real-time, per-slot availability without the cost of installing a hardware sensor in every bay.

Constraints

  • No per-slot sensors: availability had to come from cameras watching many bays at once
  • Low-cost ESP32-CAM edge devices with very little on-board compute
  • Parking scenes under varied lighting, seen from many different camera angles
  • Occupancy had to update in real time on a live dashboard

Architecture

  1. Step 1, Device

    ESP32-CAM cameras

    Low-cost edge devices stream frames

  2. Step 2, Compute

    Inference service

    Custom YOLOv11, batched on a GPU node

  3. Step 3, Compute

    Occupancy engine

    Per-slot state with temporal smoothing

  4. Step 4, Interface

    Live dashboard

    Next.js, real-time availability

  5. Step 5, Data

    AWS S3 archive

    Images and event logs

ESP32-CAM edge devices stream frames to a centralised inference service running a custom-trained YOLOv11 detector. Slot occupancy is computed server-side and pushed to a live Next.js dashboard, while every image and event log is archived to AWS S3. The whole stack runs in Docker for repeatable deployment.

Engineering decisions

  1. Temporal smoothing over a bigger model

    Context
    Detections flickered between occupied and free across adjacent frames, which made the dashboard hard to trust.
    Decision
    Added a temporal smoothing layer on top of the detector instead of chasing extra mAP with a heavier model.
    Trade-off
    A slot changes state slightly after the raw detection does — in exchange for a stable, believable display.
  2. Calibrate per camera, not globally

    Context
    Lighting and viewing angles differed from camera to camera, so one global threshold misjudged some bays.
    Decision
    Trained on a curated dataset spanning varied lighting and tuned confidence thresholds per camera angle.
    Trade-off
    Every new camera needs a calibration pass before it goes live.
  3. Keep the edge thin, batch on a GPU

    Context
    ESP32-CAM boards are far too constrained to run a modern detector on-device.
    Decision
    Used the edge devices purely as frame sources and batched frames on a GPU-backed inference node.
    Trade-off
    The system depends on the camera-to-server link; batching kept inference latency around 150 ms.

Outcomes

94.2%

Detection Accuracy

~150ms

Inference Latency

99.8%

System Uptime

  • Real-time, per-slot availability from low-cost cameras — no sensor in any bay
  • Accuracy, latency, and uptime above were measured across the pilot deployment
  • Best Project Award and the most-visited booth at the FILKOM UB Technology Exhibition 2025

Reflections

Lessons learned

The biggest lesson was that edge-to-cloud reliability matters more than raw model accuracy. Investing early in temporal smoothing and per-camera calibration paid off far more than chasing the last percentage point of mAP — the difference between an impressive demo and a system people could actually trust came down to engineering, not the model alone.

Proof — verify it yourself

Tech stack

  • Python
  • YOLOv11
  • ESP32-CAM
  • Next.js
  • Node.js
  • AWS S3
  • Docker

Related writing

  • War Story

    Production computer vision is mostly plumbing

    Two deployments — PPE compliance on an industrial CCTV network and camera-based parking occupancy — and why the detector was the easy part.

    4 min read

    • #computer-vision
    • #edge-ai
    • #yolo
    • #reliability

Work with me

Facing a similar challenge?

I build systems like this end to end — from the first architecture sketch to production. Tell me about yours.