<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matthew Hill</title>
    <description>The latest articles on DEV Community by Matthew Hill (@matthill).</description>
    <link>https://dev.to/matthill</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112503%2F13746eb8-e827-4fe6-ae1c-92fe73898938.jpg</url>
      <title>DEV Community: Matthew Hill</title>
      <link>https://dev.to/matthill</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matthill"/>
    <language>en</language>
    <item>
      <title>Show Dev: I built an on-prem AI parking spot monitor to replace $400 in-ground sensors</title>
      <dc:creator>Matthew Hill</dc:creator>
      <pubDate>Sun, 06 Sep 2026 15:37:04 +0000</pubDate>
      <link>https://dev.to/matthill/show-dev-i-built-an-on-prem-ai-parking-spot-monitor-to-replace-400-in-ground-sensors-59i3</link>
      <guid>https://dev.to/matthill/show-dev-i-built-an-on-prem-ai-parking-spot-monitor-to-replace-400-in-ground-sensors-59i3</guid>
      <description>&lt;p&gt;If you've ever looked into tracking parking lot or driveway occupancy, the hardware solutions out there are surprisingly primitive and expensive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In-ground magnetic sensors:&lt;/strong&gt; Cost $200–$500 &lt;em&gt;per space&lt;/em&gt;, require drilling into asphalt, run on batteries that die, and frequently get torn apart by snowplows and resurfacing crews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proprietary overhead indicators:&lt;/strong&gt; Cost thousands per lane and lock you into a single vendor's proprietary cameras.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a clean, &lt;strong&gt;software-defined alternative&lt;/strong&gt; that runs directly on hardware people already have: standard IP security cameras and RTSP streams.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Lot Vulture&lt;/strong&gt; -- an on-premises, edge-accelerated parking lot intelligence system.&lt;/p&gt;




&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connect Existing Cameras:&lt;/strong&gt; Hook up any RTSP, ONVIF, or snapshot IP camera (Hikvision, Dahua, Axis, Ubiquiti, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Draw Parking Zones:&lt;/strong&gt; Use an interactive visual polygon canvas to map the four corners of each space in seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Edge Inference:&lt;/strong&gt; An on-device C++ ONNX engine tracks occupancy and streams live status over WebSockets to a dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger Automations:&lt;/strong&gt; Stream occupancy to Home Assistant, digital signage, or relays via MQTT and Webhooks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a 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"&gt;&lt;img 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" width="600" height="360"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vue 3, Vuetify, and Vue-Konva (for high-precision polygon drawing on live camera frames).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python 3.12, FastAPI, SQLAlchemy, SQLite + LMDB blob storage for historical video snapshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference Engine (&lt;code&gt;vulturevision&lt;/code&gt;):&lt;/strong&gt; C++ ONNX Runtime with native DirectML on Windows and CUDA on Linux, with optimized CPU fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Standalone Windows native installer (&lt;code&gt;.exe&lt;/code&gt;) + Docker / Docker Compose.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Vision Pipeline: Single-Pass FPN vs. Naive YOLO
&lt;/h3&gt;

&lt;p&gt;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:    &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Overlap Problem:&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perspective Distortion:&lt;/strong&gt; Real-world security cameras shoot at steep, oblique angles. Real parking spots are skewed quadrilaterals, not neat axis-aligned bounding boxes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference Overhead:&lt;/strong&gt; Cropping and running 50 to 100 individual space crops per frame crushes CPU performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of cropping or relying on loose bounding boxes, Lot Vulture runs a &lt;strong&gt;single-pass Feature Pyramid Network (FPN)&lt;/strong&gt; over the full image. &lt;/p&gt;

&lt;p&gt;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). &lt;/p&gt;

&lt;p&gt;This means &lt;strong&gt;inference time stays virtually flat&lt;/strong&gt; whether a camera is monitoring 5 spaces or 150 spaces, while remaining immune to adjacent-vehicle bounding box bleed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eliminating False Flickers (Hysteresis)
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;To solve this, Lot Vulture implements &lt;strong&gt;dual-threshold hysteresis&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A space must exceed a high confidence threshold (e.g., &amp;gt;85%) to transition from &lt;em&gt;Vacant&lt;/em&gt; to &lt;em&gt;Occupied&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;It must drop below a separate low threshold (e.g., &amp;lt;20%) to transition back to &lt;em&gt;Vacant&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures rock-solid, sticky transitions even during dusk, downpours, or snow.&lt;/p&gt;




&lt;h3&gt;
  
  
  Visual Timeline Scrubbing
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;




&lt;h3&gt;
  
  
  Try It / Star It
&lt;/h3&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/lotvulture/lotvulture" rel="noopener noreferrer"&gt;https://github.com/lotvulture/lotvulture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website &amp;amp; Windows Installer:&lt;/strong&gt; &lt;a href="https://www.lotvulture.com" rel="noopener noreferrer"&gt;lotvulture.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear feedback from other developers on the architecture, hysteresis logic, or features you'd like to see added!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>computervision</category>
      <category>vue</category>
    </item>
  </channel>
</rss>
