[{"data":1,"prerenderedAt":39},["ShallowReactive",2],{"4588811":3},{"type_of":4,"id":5,"title":6,"description":7,"readable_publish_date":8,"slug":9,"path":10,"url":11,"comments_count":12,"public_reactions_count":12,"collection_id":13,"published_timestamp":14,"language":15,"subforem_id":16,"ai_disclosure_level":17,"ai_disclosure_label":18,"positive_reactions_count":12,"cover_image":13,"social_image":19,"canonical_url":11,"created_at":20,"edited_at":13,"crossposted_at":13,"published_at":14,"last_comment_at":14,"reading_time_minutes":21,"tag_list":22,"tags":23,"body_html":28,"body_markdown":29,"user":30,"flare_tag":36},"article",4588811,"Show Dev: I built an on-prem AI parking spot monitor to replace $400 in-ground sensors","If you've ever looked into tracking parking lot or driveway occupancy, the hardware solutions out...","Sep 6","show-dev-i-built-an-on-prem-ai-parking-spot-monitor-to-replace-400-in-ground-sensors-59i3","/matthill/show-dev-i-built-an-on-prem-ai-parking-spot-monitor-to-replace-400-in-ground-sensors-59i3","https://dev.to/matthill/show-dev-i-built-an-on-prem-ai-parking-spot-monitor-to-replace-400-in-ground-sensors-59i3",0,null,"2026-09-06T15:37:04Z","en",1,"not_disclosed","Not Disclosed","https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl970ciq259n3oeolcmp9.png","2026-09-06T15:36:10Z",3,"showdev, python, computervision, vue",[24,25,26,27],"showdev","python","computervision","vue","\u003Cp>If you've ever looked into tracking parking lot or driveway occupancy, the hardware solutions out there are surprisingly primitive and expensive:\u003C/p>\n\n\u003Cul>\n\u003Cli>\n\u003Cstrong>In-ground magnetic sensors:\u003C/strong> Cost $200–$500 \u003Cem>per space\u003C/em>, require drilling into asphalt, run on batteries that die, and frequently get torn apart by snowplows and resurfacing crews.\u003C/li>\n\u003Cli>\n\u003Cstrong>Proprietary overhead indicators:\u003C/strong> Cost thousands per lane and lock you into a single vendor's proprietary cameras.\u003C/li>\n\u003C/ul>\n\n\u003Cp>I wanted a clean, \u003Cstrong>software-defined alternative\u003C/strong> that runs directly on hardware people already have: standard IP security cameras and RTSP streams.\u003C/p>\n\n\u003Cp>So I built \u003Cstrong>Lot Vulture\u003C/strong> -- an on-premises, edge-accelerated parking lot intelligence system.\u003C/p>\n\n\n\u003Chr>\n\n\u003Ch3>\n  \u003Ca name=\"how-it-works\" href=\"#how-it-works\">\n  \u003C/a>\n  How It Works\n\u003C/h3>\n\n\u003Col>\n\u003Cli>\n\u003Cstrong>Connect Existing Cameras:\u003C/strong> Hook up any RTSP, ONVIF, or snapshot IP camera (Hikvision, Dahua, Axis, Ubiquiti, etc.).\u003C/li>\n\u003Cli>\n\u003Cstrong>Draw Parking Zones:\u003C/strong> Use an interactive visual polygon canvas to map the four corners of each space in seconds.\u003C/li>\n\u003Cli>\n\u003Cstrong>Real-Time Edge Inference:\u003C/strong> An on-device C++ ONNX engine tracks occupancy and streams live status over WebSockets to a dashboard.\u003C/li>\n\u003Cli>\n\u003Cstrong>Trigger Automations:\u003C/strong> Stream occupancy to Home Assistant, digital signage, or relays via MQTT and Webhooks.\u003C/li>\n\u003C/ol>\n\n\u003Cp>\u003Ca href=\"https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1mpfcduzvwqhwkpehjqn.gif\" class=\"article-body-image-wrapper\">\u003Cimg src=\"https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1mpfcduzvwqhwkpehjqn.gif\" alt=\"Lot Vulture Demo\" loading=\"lazy\" width=\"600\" height=\"360\">\u003C/a>\u003C/p>\n\n\n\u003Chr>\n\n\u003Ch3>\n  \u003Ca name=\"the-tech-stack\" href=\"#the-tech-stack\">\n  \u003C/a>\n  The Tech Stack\n\u003C/h3>\n\n\u003Cul>\n\u003Cli>\n\u003Cstrong>Frontend:\u003C/strong> Vue 3, Vuetify, and Vue-Konva (for high-precision polygon drawing on live camera frames).\u003C/li>\n\u003Cli>\n\u003Cstrong>Backend:\u003C/strong> Python 3.12, FastAPI, SQLAlchemy, SQLite + LMDB blob storage for historical video snapshots.\u003C/li>\n\u003Cli>\n\u003Cstrong>Inference Engine (\u003Ccode>vulturevision\u003C/code>):\u003C/strong> C++ ONNX Runtime with native DirectML on Windows and CUDA on Linux, with optimized CPU fallback.\u003C/li>\n\u003Cli>\n\u003Cstrong>Deployment:\u003C/strong> Standalone Windows native installer (\u003Ccode>.exe\u003C/code>) + Docker / Docker Compose.\u003C/li>\n\u003C/ul>\n\n\n\u003Chr>\n\n\u003Ch3>\n  \u003Ca name=\"the-vision-pipeline-singlepass-fpn-vs-naive-yolo\" href=\"#the-vision-pipeline-singlepass-fpn-vs-naive-yolo\">\n  \u003C/a>\n  The Vision Pipeline: Single-Pass FPN vs. Naive YOLO\n\u003C/h3>\n\n\u003Cp>When people think about parking detection, the instinctive approach is to grab YOLO or crop every parking space and run 50 separate classifications. In production, that falls apart quickly:    \u003C/p>\n\n\u003Col>\n\u003Cli>\n\u003Cstrong>The Overlap Problem:\u003C/strong> A tall truck or SUV parked in spot #1 casts a bounding box that overlaps spot #2, tricking standard object detectors into marking the adjacent empty spot as occupied.\u003C/li>\n\u003Cli>\n\u003Cstrong>Perspective Distortion:\u003C/strong> Real-world security cameras shoot at steep, oblique angles. Real parking spots are skewed quadrilaterals, not neat axis-aligned bounding boxes.\u003C/li>\n\u003Cli>\n\u003Cstrong>Inference Overhead:\u003C/strong> Cropping and running 50 to 100 individual space crops per frame crushes CPU performance.\u003C/li>\n\u003C/ol>\n\n\u003Cp>Instead of cropping or relying on loose bounding boxes, Lot Vulture runs a \u003Cstrong>single-pass Feature Pyramid Network (FPN)\u003C/strong> over the full image. \u003C/p>\n\n\u003Cp>The network extracts multi-scale feature maps across the entire scene in one forward pass. The engine then samples features directly within your custom user-drawn polygon ROIs (Regions of Interest). \u003C/p>\n\n\u003Cp>This means \u003Cstrong>inference time stays virtually flat\u003C/strong> whether a camera is monitoring 5 spaces or 150 spaces, while remaining immune to adjacent-vehicle bounding box bleed.\u003C/p>\n\n\u003Ch3>\n  \u003Ca name=\"eliminating-false-flickers-hysteresis\" href=\"#eliminating-false-flickers-hysteresis\">\n  \u003C/a>\n  Eliminating False Flickers (Hysteresis)\n\u003C/h3>\n\n\u003Cp>One of the biggest issues with naive computer vision in outdoor surveillance is lighting shifts: passing tree shadows, rain, or transient car headlights will make a parking space \"flicker\" between occupied and vacant every few seconds.\u003C/p>\n\n\u003Cp>To solve this, Lot Vulture implements \u003Cstrong>dual-threshold hysteresis\u003C/strong>:\u003C/p>\n\n\u003Cul>\n\u003Cli>A space must exceed a high confidence threshold (e.g., &gt;85%) to transition from \u003Cem>Vacant\u003C/em> to \u003Cem>Occupied\u003C/em>.\u003C/li>\n\u003Cli>It must drop below a separate low threshold (e.g., &lt;20%) to transition back to \u003Cem>Vacant\u003C/em>.\u003C/li>\n\u003C/ul>\n\n\u003Cp>This ensures rock-solid, sticky transitions even during dusk, downpours, or snow.\u003C/p>\n\n\n\u003Chr>\n\n\u003Ch3>\n  \u003Ca name=\"visual-timeline-scrubbing\" href=\"#visual-timeline-scrubbing\">\n  \u003C/a>\n  Visual Timeline Scrubbing\n\u003C/h3>\n\n\u003Cp>Instead of just spitting out binary logs, Lot Vulture keeps a visual history. You can scrub back through every minute of the day with second-by-second precision to see the exact snapshot when a vehicle arrived or vacated a space—making parking dispute resolution trivial.\u003C/p>\n\n\n\u003Chr>\n\n\u003Ch3>\n  \u003Ca name=\"try-it-star-it\" href=\"#try-it-star-it\">\n  \u003C/a>\n  Try It / Star It\n\u003C/h3>\n\n\u003Cp>The Community Edition is free and source-available for on-prem CPU monitoring. A commercial tier is available for facilities needing GPU acceleration and high-accuracy models. \u003C/p>\n\n\u003Cul>\n\u003Cli>⭐ \u003Cstrong>GitHub Repository:\u003C/strong> \u003Ca href=\"https://github.com/lotvulture/lotvulture\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/lotvulture/lotvulture\u003C/a>\n\u003C/li>\n\u003Cli>🌐 \u003Cstrong>Website &amp; Windows Installer:\u003C/strong> \u003Ca href=\"https://www.lotvulture.com\" target=\"_blank\" rel=\"noopener noreferrer\">lotvulture.com\u003C/a>\n\u003C/li>\n\u003C/ul>\n\n\u003Cp>I'd love to hear feedback from other developers on the architecture, hysteresis logic, or features you'd like to see added!\u003C/p>\n\n","If you've ever looked into tracking parking lot or driveway occupancy, the hardware solutions out there are surprisingly primitive and expensive:\n\n* **In-ground magnetic sensors:** Cost $200–$500 *per space*, require drilling into asphalt, run on batteries that die, and frequently get torn apart by snowplows and resurfacing crews.\n* **Proprietary overhead indicators:** Cost thousands per lane and lock you into a single vendor's proprietary cameras.\n\nI wanted a clean, **software-defined alternative** that runs directly on hardware people already have: standard IP security cameras and RTSP streams.\n\nSo I built **Lot Vulture** -- an on-premises, edge-accelerated parking lot intelligence system.\n\n---\n\n### How It Works\n\n1. **Connect Existing Cameras:** Hook up any RTSP, ONVIF, or snapshot IP camera (Hikvision, Dahua, Axis, Ubiquiti, etc.).\n2. **Draw Parking Zones:** Use an interactive visual polygon canvas to map the four corners of each space in seconds.\n3. **Real-Time Edge Inference:** An on-device C++ ONNX engine tracks occupancy and streams live status over WebSockets to a dashboard.\n4. **Trigger Automations:** Stream occupancy to Home Assistant, digital signage, or relays via MQTT and Webhooks.\n\n![Lot Vulture Demo](https://raw.githubusercontent.com/lotvulture/lotvulture/master/docs/ui_demo.gif)\n\n---\n\n### The Tech Stack\n\n* **Frontend:** Vue 3, Vuetify, and Vue-Konva (for high-precision polygon drawing on live camera frames).\n* **Backend:** Python 3.12, FastAPI, SQLAlchemy, SQLite + LMDB blob storage for historical video snapshots.\n* **Inference Engine (`vulturevision`):** C++ ONNX Runtime with native DirectML on Windows and CUDA on Linux, with optimized CPU fallback.\n* **Deployment:** Standalone Windows native installer (`.exe`) + Docker / Docker Compose.\n\n---\n\n### The Vision Pipeline: Single-Pass FPN vs. Naive YOLO\n\nWhen people think about parking detection, the instinctive approach is to grab YOLO or crop every parking space and run 50 separate classifications. In production, that falls apart quickly:    \n\n1. **The Overlap Problem:** A tall truck or SUV parked in spot #1 casts a bounding box that overlaps spot #2, tricking standard object detectors into marking the adjacent empty spot as occupied.\n2. **Perspective Distortion:** Real-world security cameras shoot at steep, oblique angles. Real parking spots are skewed quadrilaterals, not neat axis-aligned bounding boxes.\n3. **Inference Overhead:** Cropping and running 50 to 100 individual space crops per frame crushes CPU performance.\n\nInstead of cropping or relying on loose bounding boxes, Lot Vulture runs a **single-pass Feature Pyramid Network (FPN)** over the full image. \n\nThe network extracts multi-scale feature maps across the entire scene in one forward pass. The engine then samples features directly within your custom user-drawn polygon ROIs (Regions of Interest). \n\nThis means **inference time stays virtually flat** whether a camera is monitoring 5 spaces or 150 spaces, while remaining immune to adjacent-vehicle bounding box bleed.\n\n\n### Eliminating False Flickers (Hysteresis)\n\nOne of the biggest issues with naive computer vision in outdoor surveillance is lighting shifts: passing tree shadows, rain, or transient car headlights will make a parking space \"flicker\" between occupied and vacant every few seconds.\n\nTo solve this, Lot Vulture implements **dual-threshold hysteresis**:\n* A space must exceed a high confidence threshold (e.g., >85%) to transition from *Vacant* to *Occupied*.\n* It must drop below a separate low threshold (e.g., \u003C20%) to transition back to *Vacant*.\n\nThis ensures rock-solid, sticky transitions even during dusk, downpours, or snow.\n\n---\n\n### Visual Timeline Scrubbing\n\nInstead of just spitting out binary logs, Lot Vulture keeps a visual history. You can scrub back through every minute of the day with second-by-second precision to see the exact snapshot when a vehicle arrived or vacated a space—making parking dispute resolution trivial.\n\n---\n\n### Try It / Star It\n\n\nThe Community Edition is free and source-available for on-prem CPU monitoring. A commercial tier is available for facilities needing GPU acceleration and high-accuracy models. \n\n* ⭐ **GitHub Repository:** https://github.com/lotvulture/lotvulture\n* 🌐 **Website & Windows Installer:** [lotvulture.com](https://www.lotvulture.com)\n\nI'd love to hear feedback from other developers on the architecture, hysteresis logic, or features you'd like to see added!",{"name":31,"username":32,"twitter_username":13,"github_username":32,"user_id":33,"website_url":13,"profile_image":34,"profile_image_90":35},"Matthew Hill","matthill",4112503,"https://media2.dev.to/dynamic/image/width=640,height=640,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112503%2F13746eb8-e827-4fe6-ae1c-92fe73898938.jpg","https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112503%2F13746eb8-e827-4fe6-ae1c-92fe73898938.jpg",{"name":24,"bg_color_hex":37,"text_color_hex":38},"#091b47","#b2ffe1",1788921586535]