{"id":1378,"date":"2026-09-18T10:41:19","date_gmt":"2026-09-18T06:41:19","guid":{"rendered":"https:\/\/www.buildingtheitguy.com\/?p=1378"},"modified":"2026-09-18T10:42:22","modified_gmt":"2026-09-18T06:42:22","slug":"how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras","status":"publish","type":"post","link":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/","title":{"rendered":"How we measure peak-time campus parking from one still photo &#8211; without plates, cameras"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<article class=\"btig-cvl\" style=\"max-width:740px;margin:0 auto;color:#20242b;font-family:Georgia,'Iowan Old Style','Times New Roman',serif;line-height:1.7;font-size:18.5px;\">\n\n<style>\n\/* Building THE IT GUY \u00b7 Campus Vision Lab post. Scoped to .btig-cvl so it cannot leak into your theme. *\/\n.btig-cvl *{box-sizing:border-box;}\n.btig-cvl h2{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:1.42rem;line-height:1.25;letter-spacing:-.02em;margin:2.6rem 0 .5rem;color:#0b0f14;}\n.btig-cvl h2 .num{color:#0b7a6e;font-size:.8em;margin-right:.45rem;}\n.btig-cvl h3{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:1.08rem;margin:1.7rem 0 .45rem;color:#0b0f14;}\n.btig-cvl h4{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.95rem;margin:1.2rem 0 .35rem;color:#0b0f14;}\n.btig-cvl p{margin:0 0 1.05rem;}\n.btig-cvl .sans{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;}\n.btig-cvl .meta{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.8rem;letter-spacing:.06em;text-transform:uppercase;color:#5b6570;margin:0 0 1.1rem;}\n.btig-cvl .lede{font-size:1.14rem;color:#2a3139;}\n.btig-cvl .subhead{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.78rem;letter-spacing:.09em;text-transform:uppercase;color:#5b6570;margin:0 0 .5rem;font-weight:700;}\n.btig-cvl a{color:#0a6b60;text-underline-offset:2px;}\n.btig-cvl a:hover{color:#084f47;}\n.btig-cvl strong{color:#0b0f14;}\n\/* Boxes *\/\n.btig-cvl .tldr{border:1px solid #cfdad8;border-top:4px solid #0b7a6e;background:#f4f8f7;padding:1.15rem 1.2rem;margin:0 0 1.7rem;}\n.btig-cvl .tldr ul{margin:.5rem 0 0;padding-left:1.15rem;}\n.btig-cvl .tldr li{margin:.3rem 0;}\n.btig-cvl .callout{border-left:4px solid #0b7a6e;background:#f3f7f6;padding:1rem 1.15rem;margin:1.5rem 0;}\n.btig-cvl .warn{border-left:4px solid #c58a1a;background:#fff8ea;padding:1rem 1.15rem;margin:1.5rem 0;}\n.btig-cvl .plain{border-left:4px solid #4a6fa5;background:#f4f7fc;padding:1rem 1.15rem;margin:1.5rem 0;}\n.btig-cvl .plain .subhead{color:#3c5c8a;}\n.btig-cvl .callout p:last-child,.btig-cvl .warn p:last-child,.btig-cvl .plain p:last-child,.btig-cvl .tldr p:last-child{margin-bottom:0;}\n\/* Fact strip *\/\n.btig-cvl .kpi{display:grid;grid-template-columns:1fr 1fr;gap:.7rem;margin:1.3rem 0 1.7rem;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.9rem;}\n.btig-cvl .kpi div{border:1px solid #d8dee6;background:#fafbfc;padding:.8rem .9rem;}\n.btig-cvl .kpi strong{display:block;font-size:.68rem;letter-spacing:.07em;text-transform:uppercase;color:#5b6570;margin-bottom:.22rem;}\n\/* Contents *\/\n.btig-cvl .toc{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.92rem;border:1px solid #d8dee6;padding:1rem 1.15rem;margin:0 0 1.8rem;background:#fff;}\n.btig-cvl .toc ol{margin:.35rem 0 0;padding-left:1.3rem;}\n.btig-cvl .toc li{margin:.22rem 0;}\n\/* Steps *\/\n.btig-cvl .steps{list-style:none;margin:1.3rem 0;padding:0;counter-reset:btigstep;}\n.btig-cvl .steps>li{counter-increment:btigstep;position:relative;border:1px solid #d8dee6;background:#fff;padding:.95rem 1.05rem .95rem 3.3rem;margin:0 0 .7rem;}\n.btig-cvl .steps>li:before{content:counter(btigstep);position:absolute;left:.9rem;top:.95rem;width:1.65rem;height:1.65rem;border-radius:50%;background:#0b7a6e;color:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.85rem;font-weight:700;display:flex;align-items:center;justify-content:center;}\n.btig-cvl .steps h4{margin:0 0 .25rem;}\n.btig-cvl .steps p{margin:0;font-size:.97rem;}\n\/* Figures *\/\n.btig-cvl figure{margin:1.7rem 0;padding:0;}\n.btig-cvl figure img{width:100%;height:auto;display:block;border:1px solid #d8dee6;background:#000;}\n.btig-cvl figcaption{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.83rem;color:#5b6570;margin-top:.5rem;line-height:1.5;}\n.btig-cvl figcaption b{color:#0b0f14;}\n\/* Code *\/\n.btig-cvl pre,.btig-cvl code{font-family:ui-monospace,'SF Mono',Consolas,'Courier New',monospace;}\n.btig-cvl pre{background:#0d1117;color:#e6edf3;padding:1rem 1.05rem;overflow-x:auto;border-radius:5px;font-size:.83rem;line-height:1.6;margin:.9rem 0 1.2rem;}\n.btig-cvl :not(pre)>code{background:#eef1f4;color:#0f3d37;padding:.1em .35em;border-radius:3px;font-size:.86em;}\n.btig-cvl pre .cmt{color:#8b949e;}\n\/* Lists *\/\n.btig-cvl ol,.btig-cvl ul{padding-left:1.3rem;margin:.6rem 0 1.15rem;}\n.btig-cvl li{margin:.4rem 0;}\n\/* Tables *\/\n.btig-cvl .tw{overflow-x:auto;margin:1.1rem 0 1.5rem;}\n.btig-cvl table{width:100%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.89rem;}\n.btig-cvl th{text-align:left;border-bottom:2px solid #0b0f14;padding:.5rem .45rem;vertical-align:bottom;}\n.btig-cvl td{border-bottom:1px solid #e1e6ec;padding:.55rem .45rem;vertical-align:top;}\n.btig-cvl tbody tr:nth-child(odd){background:#fbfcfd;}\n\/* Flag chips *\/\n.btig-cvl .chip{display:inline-block;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:.16rem .5rem;border-radius:3px;color:#fff;white-space:nowrap;}\n.btig-cvl .c-quiet{background:#2c4a6e;}\n.btig-cvl .c-mixed{background:#3d5a45;}\n.btig-cvl .c-peak{background:#c4a056;color:#241c00;}\n.btig-cvl .c-stress{background:#8b2e2e;}\n\/* Glossary + FAQ *\/\n.btig-cvl details{border:1px solid #d8dee6;background:#fff;padding:.7rem .95rem;margin:0 0 .55rem;}\n.btig-cvl details[open]{background:#fbfcfd;}\n.btig-cvl summary{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.97rem;font-weight:600;cursor:pointer;color:#0b0f14;}\n.btig-cvl details p{margin:.55rem 0 0;font-size:.97rem;}\n.btig-cvl .endnote{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;font-size:.85rem;color:#5b6570;margin-top:2.2rem;padding-top:1rem;border-top:1px solid #d8dee6;}\n@media (max-width:640px){\n  .btig-cvl{font-size:17.5px;}\n  .btig-cvl .kpi{grid-template-columns:1fr;}\n  .btig-cvl h2{font-size:1.28rem;}\n}\n<\/style>\n\n<p class=\"meta\">Research walkthrough \u00b7 AI Lab \u00b7 Experiment CVL-PK-001<\/p>\n\n<p class=\"lede\"><strong>Every morning between 07:30 and 09:00, our campus car parks fill up.<\/strong> You can feel it as a student circling for a bay. But nobody at the University could put a <em>number<\/em> on it \u2014 and buying a licence-plate camera system to find that number would be expensive, invasive, and slow.<\/p>\n\n<p>So we built the smallest honest version instead: <strong>take one photograph of a car park, count the vehicles in it, and divide by how many bays that car park has.<\/strong> That is the whole measurement. It runs on a student laptop with an 8&nbsp;GB graphics card, it never reads a licence plate, and the full protocol is published so anyone can repeat it.<\/p>\n\n<p>This post is the walkthrough. I have written it the way a research lab briefs a stakeholder \u2014 but explained so that a first-year student who has never touched machine learning can follow every step. Jargon gets unpacked the first time it appears.<\/p>\n\n<div class=\"tldr\">\n  <p class=\"subhead\">The 60-second version<\/p>\n  <ul>\n    <li><strong>The question:<\/strong> from one photo, how full is this car park?<\/li>\n    <li><strong>The method:<\/strong> an object detector counts cars; you divide by the number of bays you counted yourself.<\/li>\n    <li><strong>The kit:<\/strong> a gaming laptop (RTX 5070, 8&nbsp;GB), free open-source models, no cloud bill.<\/li>\n    <li><strong>The guardrail:<\/strong> no plates, no faces, no live cameras, no enforcement. Plate areas are blacked out <em>before<\/em> anything else reads the image.<\/li>\n    <li><strong>The proof it is real work:<\/strong> Ultralytics, Hugging Face and Voxel51 ship the same building blocks, and three published datasets (PKLot, CNRPark-EXT, ACPDS) study exactly this problem. Links in <a href=\"#cvl-priorwork\">section 4<\/a>.<\/li>\n    <li><strong>Try it:<\/strong> <a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\" target=\"_blank\" rel=\"noopener\">Campus Vision Lab on Hugging Face<\/a><\/li>\n  <\/ul>\n<\/div>\n\n<div class=\"kpi\">\n  <div><strong>What it sees<\/strong>One still photo, or a webcam frame \u2014 never a live camera feed<\/div>\n  <div><strong>What counts the cars<\/strong>YOLOv8 object detector, vehicle classes only<\/div>\n  <div><strong>What describes the scene<\/strong>SmolVLM-500M \u2014 a sanity check, not a second score<\/div>\n  <div><strong>Where it runs<\/strong>RTX 5070 8 GB teaching laptop, fully offline after setup<\/div>\n<\/div>\n\n<nav class=\"toc\" aria-label=\"Contents\">\n  <p class=\"subhead\">What is in this walkthrough<\/p>\n  <ol>\n    <li><a href=\"#cvl-shape\">How a research walkthrough is structured (and why that matters)<\/a><\/li>\n    <li><a href=\"#cvl-question\">The question, in plain English<\/a><\/li>\n    <li><a href=\"#cvl-jargon\">Jargon decoder: YOLO, VLM, GPU, inference<\/a><\/li>\n    <li><a href=\"#cvl-priorwork\">Who already proved the idea \u2014 companies, then papers<\/a><\/li>\n    <li><a href=\"#cvl-build\">What we built, and where we deliberately differ<\/a><\/li>\n    <li><a href=\"#cvl-field\">The field walkthrough: photo to percentage<\/a><\/li>\n    <li><a href=\"#cvl-privacy\">Privacy: how to mask a plate without ever reading it<\/a><\/li>\n    <li><a href=\"#cvl-repro\">Run it yourself (copy-paste)<\/a><\/li>\n    <li><a href=\"#cvl-limits\">Limits, failures, and what we test next<\/a><\/li>\n    <li><a href=\"#cvl-faq\">Freshman FAQ<\/a><\/li>\n  <\/ol>\n<\/nav>\n\n<h2 id=\"cvl-shape\"><span class=\"num\">01<\/span>How a research walkthrough is structured<\/h2>\n\n<p>Before the technical part, a word on <em>format<\/em> \u2014 because this is the bit students most often get wrong when they write up a project.<\/p>\n\n<p>A tutorial says \u201cinstall this, then run that.\u201d A research walkthrough does something different. It defends a number. Read enough engineering write-ups from applied labs \u2014 Ultralytics&#8217; solution guides, Hugging Face model cards, NVIDIA&#8217;s edge deployment notes \u2014 and the same five-part spine appears every time:<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <h4>Name the thing you are measuring<\/h4>\n    <p>One sentence. If you cannot say what number you are claiming, you do not have an experiment \u2014 you have a demo.<\/p>\n  <\/li>\n  <li>\n    <h4>Show who measured something similar first<\/h4>\n    <p>Both the people shipping working code and the people who published data. Then say plainly where you differ. Standing on other work is normal; pretending you invented it is not.<\/p>\n  <\/li>\n  <li>\n    <h4>Publish a protocol somebody else can run<\/h4>\n    <p>Not \u201cit works on my laptop.\u201d Real steps, real dependency versions, a real download link.<\/p>\n  <\/li>\n  <li>\n    <h4>Show a figure you are legally and ethically allowed to show<\/h4>\n    <p>Privacy is an engineering step you build, not a sentence you add to a caption.<\/p>\n  <\/li>\n  <li>\n    <h4>Report a failure<\/h4>\n    <p>The tiny detector boxing a shade structure as a &#8220;table&#8221; is not embarrassing. It is the finding. Hiding it is the actual failure.<\/p>\n  <\/li>\n<\/ol>\n\n<div class=\"plain\">\n  <p class=\"subhead\">Why this matters to you<\/p>\n  <p>If you are writing a final-year project, this spine is your marking scheme in disguise. Examiners are looking for a defined measurement, honest positioning against prior work, reproducibility, and known limits. A pretty demo with none of those scores badly.<\/p>\n<\/div>\n\n<h2 id=\"cvl-question\"><span class=\"num\">02<\/span>The question, in plain English<\/h2>\n\n<p>University of Dubai&#8217;s car parks at Academic City tighten sharply during morning arrival and again at class-change time. The tempting project here is &#8220;build smart parking for the campus.&#8221; That is too big, needs infrastructure we do not have, and raises privacy problems immediately.<\/p>\n\n<p>So we shrank the question until it fit on one line:<\/p>\n\n<p class=\"lede\"><em>From one photograph I took, how many vehicles are visible, and what fraction is that of the number of bays I assigned to that car park?<\/em><\/p>\n\n<p>Written as arithmetic, this is the entire method:<\/p>\n\n<pre><code>occupancy_pct = min(100, 100 * vehicle_count \/ stall_capacity)<\/code><\/pre>\n\n<h3>Worked example \u2014 follow the numbers<\/h3>\n\n<p>Say you photograph the student car park at 07:45. The detector finds <strong>7 vehicles<\/strong>. You walked that section yesterday and counted <strong>40 bays<\/strong>, so you type 40.<\/p>\n\n<pre><code>7 vehicles \u00f7 40 bays = 0.175\n0.175 \u00d7 100        = 17.5\nrounded            = <b>18% occupancy<\/b>  \u2192  flag: QUIET<\/code><\/pre>\n\n<p>Come back at 09:10 and the same car park reads 28 vehicles: <code>28 \u00f7 40 = 70%<\/code>, which the lab flags as <span class=\"chip c-mixed\">Mixed<\/span>. Two photos, same place, two times of day \u2014 that contrast <em>is<\/em> the experiment. A single photo tells you almost nothing.<\/p>\n\n<h3>The two things you must understand about this formula<\/h3>\n\n<ul>\n  <li><strong><code>vehicle_count<\/code> comes from the model.<\/strong> Specifically, it is the number of boxes the detector drew that were labelled car, truck, bus, or motorcycle. Anything else it spots \u2014 a person, a tree, a bench \u2014 is thrown away before counting.<\/li>\n  <li><strong><code>stall_capacity<\/code> comes from you, the human.<\/strong> The model does <em>not<\/em> know how many bays exist. You count them by walking the lot or reading the posted figure, and you write down which method you used. Get this wrong and your percentage is wrong \u2014 and that is a mistake in your method, not a bug in the AI.<\/li>\n<\/ul>\n\n<p>The <code>min(100, \u2026)<\/code> exists because reality is messier than arithmetic: cars park across lines, or you photograph a subsection while typing the whole-lot capacity. We cap the answer at 100% rather than printing an absurd 130%.<\/p>\n\n<h3>The four flags, and what they actually mean<\/h3>\n\n<div class=\"tw\">\n<table>\n  <caption class=\"sans\" style=\"caption-side:top;text-align:left;font-size:.83rem;color:#5b6570;padding-bottom:.4rem;\">Teaching heuristics used in this lab. These are <em>not<\/em> University parking policy.<\/caption>\n  <thead>\n    <tr><th>Occupancy<\/th><th>Flag<\/th><th>What you would tell someone<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td>Below 40%<\/td><td><span class=\"chip c-quiet\">Quiet<\/span><\/td><td>Plenty of space. Arrival has not started, or you missed the rush.<\/td><\/tr>\n    <tr><td>40\u201374%<\/td><td><span class=\"chip c-mixed\">Mixed<\/span><\/td><td>Normal working use. Open bays still easy to find.<\/td><\/tr>\n    <tr><td>75\u201389%<\/td><td><span class=\"chip c-peak\">Peak<\/span><\/td><td>Few bays left. This is the window the lab exists to study.<\/td><\/tr>\n    <tr><td>90% and above<\/td><td><span class=\"chip c-stress\">Stress<\/span><\/td><td>Treat as full; overflow elsewhere. Still a teaching flag, not an instruction to Facilities.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<div class=\"warn\">\n  <p class=\"subhead\">What this project is not<\/p>\n  <p>Not a live camera network. Not number-plate recognition. Not face recognition. Not parking enforcement. Not self-driving car research. It is a still-photo measurement for campus operations and teaching, and every design decision below exists to keep it inside that boundary.<\/p>\n<\/div>\n\n<h2 id=\"cvl-jargon\"><span class=\"num\">03<\/span>Jargon decoder<\/h2>\n\n<p>Four terms carry almost all the weight in this post. If you already know them, skip ahead. If not, these are the plain versions \u2014 open each one.<\/p>\n\n<details>\n  <summary>What is an \u201cobject detector\u201d? What is YOLO?<\/summary>\n  <p>An object detector looks at an image and returns a list of boxes: <em>\u201cthere is a car here, a car there, a motorcycle in the corner.\u201d<\/em> Each box has coordinates, a label, and a confidence score between 0 and 1.<\/p>\n  <p><strong>YOLO<\/strong> (&#8220;You Only Look Once&#8221;) is a well-known family of fast detectors, maintained commercially by <a href=\"https:\/\/docs.ultralytics.com\/\" target=\"_blank\" rel=\"noopener\">Ultralytics<\/a>. Out of the box it recognises 80 everyday object types from a standard list called COCO \u2014 including <code>car<\/code>, <code>truck<\/code>, <code>bus<\/code> and <code>motorcycle<\/code>. We use it untrained: no custom dataset, no labelling weekend. That is deliberate, so students can see the detector as a component rather than a mystery.<\/p>\n  <p>Model sizes are named by letter: <code>n<\/code> for nano (smallest, fastest, least accurate), then <code>s<\/code> for small, and upwards. Our published <code>app.py<\/code> defaults to <code>yolov8n<\/code> so it starts on almost any machine; the lab protocol moved counting runs to <code>yolov8s<\/code> at higher resolution once we saw nano missing distant cars.<\/p>\n<\/details>\n\n<details>\n  <summary>What is a VLM, and what is SmolVLM doing here?<\/summary>\n  <p>A <strong>vision-language model<\/strong> takes an image plus a text question and answers in words. Ask &#8220;is this car park empty, mixed, or packed?&#8221; and you get two sentences of description.<\/p>\n  <p>We use <a href=\"https:\/\/huggingface.co\/HuggingFaceTB\/SmolVLM-500M-Instruct\" target=\"_blank\" rel=\"noopener\">SmolVLM-500M-Instruct<\/a> from Hugging Face \u2014 deliberately tiny, around 1.2&nbsp;GB of graphics memory for a single image, which is why it fits alongside YOLO on a student laptop.<\/p>\n  <p><strong>Critically, its answer is not the measurement.<\/strong> It is a second opinion. If the detector says 7 cars but the caption says &#8220;the lot appears packed&#8221;, something is wrong \u2014 probably cars hidden behind other cars \u2014 and that disagreement goes in your notebook. Using a chatty model&#8217;s guess <em>as<\/em> your occupancy figure would be bad science.<\/p>\n<\/details>\n\n<details>\n  <summary>GPU, VRAM, and why \u201c8 GB\u201d keeps appearing<\/summary>\n  <p>A <strong>GPU<\/strong> (graphics card) does the parallel arithmetic these models need. <strong>VRAM<\/strong> is the memory on that card, and it is the hard ceiling: if a model does not fit in VRAM, it simply will not load.<\/p>\n  <p>Our reference machine is an RTX 5070 laptop with 8&nbsp;GB. Plenty of published computer-vision work assumes 24&nbsp;GB data-centre cards. Stating the real envelope is part of being honest \u2014 and it is why we chose small models rather than impressive ones.<\/p>\n<\/details>\n\n<details>\n  <summary>\u201cInference\u201d, \u201cocclusion\u201d, \u201cconfidence\u201d, \u201cimgsz\u201d<\/summary>\n  <p><strong>Inference<\/strong> = running a trained model to get an answer (as opposed to <em>training<\/em>, which is teaching it in the first place). We only ever do inference. We train nothing.<\/p>\n  <p><strong>Occlusion<\/strong> = one object hiding another. A car tucked behind a 4&#215;4 may never be counted. This is the single biggest source of error in the whole project.<\/p>\n  <p><strong>Confidence threshold<\/strong> = how sure the detector must be before it reports a box. Lower it and you catch faint distant cars but also invent things that are not there. We use 0.12 for counting runs, which is low, because missing real cars distorts occupancy more than the occasional false box.<\/p>\n  <p><strong>imgsz<\/strong> = the resolution the image is shrunk to before the model sees it. The default 640 pixels loses small distant cars in a wide car park shot; 1280 keeps them. This single setting changed our results more than any clever idea.<\/p>\n<\/details>\n\n<h2 id=\"cvl-priorwork\"><span class=\"num\">04<\/span>Who already proved the idea<\/h2>\n\n<p>Counting parked cars from a photo is not a new idea, and I want to be explicit about that. Our contribution is narrow: scoping it to Academic City, to an 8&nbsp;GB laptop, and to a privacy path that lets us publish the pictures.<\/p>\n\n<p>Below are the sources we genuinely learned from. I have deliberately led with <strong>people shipping working code<\/strong> \u2014 companies and open-source maintainers \u2014 and then the research datasets underneath them. For a student, this ordering is useful: you can run the first group this afternoon.<\/p>\n\n<h3>Group A \u2014 engineers shipping it (you can run these today)<\/h3>\n\n<ul>\n  <li>\n    <strong>Ultralytics \u2014 Parking Management solution.<\/strong> The maintainers of YOLO ship a parking feature: you draw polygons over each bay once, saved as JSON, and it reports occupied versus available by testing whether a detected vehicle&#8217;s centre falls inside a bay.<br>\n    <a href=\"https:\/\/docs.ultralytics.com\/guides\/parking-management\/\" target=\"_blank\" rel=\"noopener\">Guide<\/a> \u00b7 <a href=\"https:\/\/github.com\/ultralytics\/ultralytics\/blob\/main\/ultralytics\/solutions\/parking_management.py\" target=\"_blank\" rel=\"noopener\">Source code<\/a><br>\n    <em>Learned:<\/em> occupancy is geometry plus a detector \u2014 unglamorous and solid. <em>Differed:<\/em> we do not require a mapped bay layout on day one. Students type a capacity number instead. That is weaker as facilities software and better as a teaching tool, because the entire calculation stays visible in one line.\n  <\/li>\n  <li>\n    <strong>Ultralytics \u2014 YOLO on NVIDIA Jetson.<\/strong> <a href=\"https:\/\/docs.ultralytics.com\/guides\/nvidia-jetson\/\" target=\"_blank\" rel=\"noopener\">Deployment guide<\/a><br>\n    <em>Learned:<\/em> credible vision work names the hardware it actually runs on, with benchmarks. That is why &#8220;RTX 5070, 8&nbsp;GB, CUDA 12.8&#8221; appears in our write-up rather than a vague &#8220;we used AI.&#8221;\n  <\/li>\n  <li>\n    <strong>Hugging Face \u2014 SmolVLM.<\/strong> <a href=\"https:\/\/huggingface.co\/HuggingFaceTB\/SmolVLM-500M-Instruct\" target=\"_blank\" rel=\"noopener\">Model card<\/a> \u00b7 technical report <a href=\"https:\/\/arxiv.org\/abs\/2504.05299\" target=\"_blank\" rel=\"noopener\">arXiv:2504.05299<\/a><br>\n    <em>Learned:<\/em> a 500-million-parameter captioner is small enough to sit beside a detector on one laptop. Also \u2014 read their model card \u2014 Hugging Face explicitly lists unauthorised surveillance as misuse. We treated that as a design constraint, not a legal footnote.\n  <\/li>\n  <li>\n    <strong>Voxel51 \u2014 PKLot republished on the Hub.<\/strong> <a href=\"https:\/\/huggingface.co\/datasets\/Voxel51\/PKLot\" target=\"_blank\" rel=\"noopener\">Dataset card<\/a><br>\n    A computer-vision tooling company rehosted the classic parking dataset: 12,416 photos, three car parks, sunny\/cloudy\/rainy, roughly 695,000 labelled bays. <em>Learned:<\/em> weather and camera angle are the real test, not one nice sunny frame. We did not train on it \u2014 we used it as proof that photo-based occupancy is a properly studied, properly labelled problem.\n  <\/li>\n  <li>\n    <strong>Community models and Spaces.<\/strong> <a href=\"https:\/\/huggingface.co\/simahanyan\/parking-lot-yolo26m\" target=\"_blank\" rel=\"noopener\">parking-lot-yolo26m<\/a> detects <code>space-empty<\/code> \/ <code>space-occupied<\/code> directly, and its card admits production sites still want mapped bay polygons. <a href=\"https:\/\/huggingface.co\/spaces\/sowmyasreevs\/drone-parking-occupancy\" target=\"_blank\" rel=\"noopener\">drone-parking-occupancy<\/a> is a live demo from overhead.<br>\n    <em>Learned:<\/em> detecting bays is the <em>next<\/em> lab. Counting vehicles is the first one.\n  <\/li>\n<\/ul>\n\n<h3>Group B \u2014 the published datasets and papers underneath<\/h3>\n\n<ul>\n  <li>\n    <strong>PKLot<\/strong> \u2014 Almeida, Oliveira, Silva Jr., Britto Jr. &amp; Koerich, <em>Expert Systems with Applications<\/em>, 2015. <a href=\"https:\/\/doi.org\/10.1016\/j.eswa.2015.02.009\" target=\"_blank\" rel=\"noopener\">DOI<\/a> \u00b7 <a href=\"https:\/\/www.inf.ufpr.br\/lesoliveira\/download\/ESWA2015.pdf\" target=\"_blank\" rel=\"noopener\">free PDF<\/a><br>\n    Their classifier scored above 99% when tested on the same camera view it trained on \u2014 and fell to about 89% on a car park it had never seen.<br>\n    <em>Learned:<\/em> this is the most important lesson in the whole post. A model that has only seen one angle of one campus will look brilliant and then fail on the next site. So our protocol repeats <strong>the same UD car park at two different times<\/strong> and requires students to state a limitation, instead of claiming a universal parking AI.\n  <\/li>\n  <li>\n    <strong>CNRPark-EXT<\/strong> \u2014 Amato, Carrara, Falchi, Gennaro, Meghini &amp; Vairo, <em>Expert Systems with Applications<\/em>, 2017. <a href=\"https:\/\/doi.org\/10.1016\/j.eswa.2016.10.055\" target=\"_blank\" rel=\"noopener\">DOI<\/a> \u00b7 <a href=\"https:\/\/openportal.isti.cnr.it\/data\/2017\/366883\/2017_366883.preprint.pdf\" target=\"_blank\" rel=\"noopener\">preprint<\/a> \u00b7 <a href=\"http:\/\/cnrpark.it\/\" target=\"_blank\" rel=\"noopener\">dataset<\/a> \u00b7 <a href=\"https:\/\/github.com\/fabiocarrara\/deep-parking\" target=\"_blank\" rel=\"noopener\">code<\/a><br>\n    They ran occupancy detection <em>on the camera itself<\/em> with a network small enough for embedded hardware, and released ~150,000 labelled bay images covering occlusion, seasons and nine viewpoints.<br>\n    <em>Learned:<\/em> &#8220;decentralised&#8221; means the heavy pixels never leave the device. That directly shaped our architecture \u2014 the Hugging Face page is a static document, while the models run on the lab laptop.\n  <\/li>\n  <li>\n    <strong>ACPDS<\/strong> \u2014 Marek, 2021. <a href=\"https:\/\/arxiv.org\/abs\/2107.12207\" target=\"_blank\" rel=\"noopener\">arXiv:2107.12207<\/a> \u00b7 <a href=\"https:\/\/github.com\/martin-marek\/parking-space-occupancy\" target=\"_blank\" rel=\"noopener\">MIT-licensed code<\/a> \u00b7 applied fork: <a href=\"https:\/\/github.com\/thebkht\/smart-parking-system\" target=\"_blank\" rel=\"noopener\">thebkht\/smart-parking-system<\/a><br>\n    Every image from a unique viewpoint, and train\/test car parks deliberately kept separate \u2014 reaching ~98% on unseen sites by classifying <em>known bay patches<\/em> rather than counting cars.<br>\n    <em>Learned:<\/em> if you already know where the bays are, classify the bay; do not count cars and hope. We do not have Academic City&#8217;s bay polygons on day one of a teaching module, so we count vehicles and make capacity an explicit, stated assumption. Mapping bays and comparing the two methods on identical photos is our planned follow-up.\n  <\/li>\n<\/ul>\n\n<h3>Side by side: what we borrowed, what we refused<\/h3>\n\n<div class=\"tw\">\n<table>\n  <thead>\n    <tr><th>Source<\/th><th>What they measure<\/th><th>What we took<\/th><th>What we refused<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td>Ultralytics Parking Management<\/td><td>Vehicle inside a mapped bay<\/td><td>Detector plus an explicit occupancy readout<\/td><td>Requiring a bay map on day one<\/td><\/tr>\n    <tr><td>PKLot \/ Voxel51<\/td><td>Bay occupied vs empty, across weather<\/td><td>Photos are enough; weather will break you<\/td><td>Training on their car parks and calling it UD<\/td><\/tr>\n    <tr><td>CNRPark-EXT<\/td><td>Bay occupancy computed on-camera<\/td><td>Keep inference local, make the protocol public<\/td><td>A permanent camera network on campus<\/td><\/tr>\n    <tr><td>ACPDS + edge forks<\/td><td>Unseen-site bay classification<\/td><td>The obvious next experiment<\/td><td>Pretending a car count equals bay classification<\/td><\/tr>\n    <tr><td>SmolVLM-500M<\/td><td>Short description of an image<\/td><td>A two-sentence cross-check<\/td><td>Using a caption as the occupancy figure<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<h2 id=\"cvl-build\"><span class=\"num\">05<\/span>What we built, and where we differ<\/h2>\n\n<p>Two surfaces, one experiment. The split is the single most useful design decision in the project, and it comes straight from the CNRPark lesson above.<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <h4>A public protocol page (static, free, no compute)<\/h4>\n    <p><a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\" target=\"_blank\" rel=\"noopener\">huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab<\/a> \u2014 the briefing, materials, procedure, ethics rules, report checklist and redacted figures. These are the canonical files. Students clone this; nobody copies a folder path off one lab PC.<\/p>\n  <\/li>\n  <li>\n    <h4>A local estimator app (where the models actually run)<\/h4>\n    <p><code>app.py<\/code> on the teaching laptop: pick car park, time window and capacity \u2192 upload a photo or use the webcam \u2192 detect vehicles \u2192 mask plate zones and people \u2192 print the occupancy report \u2192 optionally caption the <em>already redacted<\/em> frame.<\/p>\n  <\/li>\n<\/ol>\n\n<p>Why separate them? A free static page can serve the handout to every student on the course, forever, with no GPU bill. Model weights stay on hardware that can actually load them. Publish the protocol; keep the heavy inference controlled.<\/p>\n\n<figure>\n  <img decoding=\"async\" src=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\/resolve\/main\/figures\/fig1-experiment-window.png\" alt=\"The local Campus Vision Lab app: dropdowns for car park and time window, a stall capacity field, the original lot photo on the left, the same photo with green and yellow detection boxes on the right, and an occupancy report reading 7 vehicles, 40 capacity, 18 percent, QUIET.\" loading=\"lazy\" \/>\n  <figcaption><b>Figure 1.<\/b> The local app window. Top row: which car park, which time window, how many bays. Left: your photo. Right: the same photo with a box around each vehicle the detector found. Bottom: the report \u2014 7 vehicles out of 40 bays is 18%, flagged <span class=\"chip c-quiet\">Quiet<\/span>. Note the footer, which records the exact models and device used; you want that line in your notebook.<\/figcaption>\n<\/figure>\n\n<h2 id=\"cvl-field\"><span class=\"num\">06<\/span>The field walkthrough: photo to percentage<\/h2>\n\n<p>This is the part a student actually performs. It takes about twenty minutes per car park, twice in a day.<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <h4>Choose the car park and the time window first<\/h4>\n    <p>Decide before you leave: morning arrival, class change, lunch, evening departure, or weekend. Writing the plan down first stops you retro-fitting a story to whatever photo you happened to take.<\/p>\n  <\/li>\n  <li>\n    <h4>Establish capacity, and record how<\/h4>\n    <p>Walk the lot and count bays, or use the posted figure. Note which \u2014 &#8220;walked count, 40 bays, north section only&#8221; is a methods sentence. &#8220;About 40&#8221; is not.<\/p>\n  <\/li>\n  <li>\n    <h4>Photograph so that cars <em>and<\/em> empty bays are both visible<\/h4>\n    <p>Elevated positions work: a walkway, a stairwell, an upper-floor window. A phone held at bumper height fails, because the nearest car hides everything behind it. This one choice dominates your error.<\/p>\n  <\/li>\n  <li>\n    <h4>Run the estimate<\/h4>\n    <p>Read four things: the count by class, the occupancy percentage, the flag, and the two-sentence scene note.<\/p>\n  <\/li>\n  <li>\n    <h4>When the count and the caption disagree, record both<\/h4>\n    <p>Detector says 7, caption says &#8220;packed&#8221;? Do not pick a winner and move on. Write both down plus your explanation. This is the most valuable line in the notebook.<\/p>\n  <\/li>\n  <li>\n    <h4>Log the row, then repeat at a second time window<\/h4>\n    <p>Date and time, car park, window, capacity and method, counts, occupancy %, flag, caption, occlusion notes. Then go back to the <em>same<\/em> car park later. Peak only means anything as a contrast against quiet.<\/p>\n  <\/li>\n<\/ol>\n\n<figure>\n  <img decoding=\"async\" src=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\/resolve\/main\/figures\/fig3-campus-masked-detections.png\" alt=\"A real University of Dubai car park photographed from an elevated walkway. Parked cars carry detection boxes, and the number-plate area of each car is covered by a solid black bar.\" loading=\"lazy\" \/>\n  <figcaption><b>Figure 2.<\/b> A real Academic City capture after privacy masking. Vehicle boxes are drawn; plate zones are blacked out. This class of image is safe to publish. The unmasked original never leaves the lab.<\/figcaption>\n<\/figure>\n\n<div class=\"callout\">\n  <p class=\"subhead\">Failure report from the lab floor<\/p>\n  <p>Our first runs used the nano detector at 640 pixels. It missed a pale car parked far from the camera, and confidently boxed a shade structure as a <em>table<\/em>. We moved counting runs to YOLOv8s at 1280 pixels with a 0.12 confidence threshold and vehicle-class filtering.<\/p>\n  <p>Two published findings say the same thing from different directions: PKLot&#8217;s accuracy collapse on unseen car parks, and Ultralytics&#8217; own advice to raise resolution for densely packed bays. Resolution and class filters are <strong>method choices you must report<\/strong>, not cosmetic settings. Our published <code>app.py<\/code> still defaults to nano so it starts anywhere \u2014 if you use it for real measurements, change the weights and say so.<\/p>\n<\/div>\n\n<h2 id=\"cvl-privacy\"><span class=\"num\">07<\/span>Privacy: mask without reading<\/h2>\n\n<p>Here is the problem that stops most campus vision projects from ever being publishable. A photo of a real car park contains number plates, and sometimes people. You cannot put that on the public internet, and you should not want to.<\/p>\n\n<p>CNRPark&#8217;s answer was to keep pixels on the camera. The ACPDS edge fork sends a few hundred bytes of JSON instead of video. We needed a third answer: a still image we are actually allowed to publish. The order of operations is the whole trick.<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <h4>Detect vehicles \u2014 and people, for masking only<\/h4>\n    <p>People are detected purely so they can be removed. They never enter the occupancy count.<\/p>\n  <\/li>\n  <li>\n    <h4>Black out the lower band of every vehicle box<\/h4>\n    <p>That band is where plates live. We do not run character recognition. We never produce plate text, so there is no plate text to leak, store, or subpoena. <strong>We mask a region, we do not read it.<\/strong><\/p>\n  <\/li>\n  <li>\n    <h4>Black out person boxes entirely<\/h4>\n  <\/li>\n  <li>\n    <h4>Draw the vehicle boxes on the redacted frame<\/h4>\n  <\/li>\n  <li>\n    <h4>Only now show the image to the captioning model<\/h4>\n    <p>SmolVLM sees the redacted frame, never the original. The prompt reinforces it: two sentences on empty, mixed or packed; do not read plates; do not describe faces.<\/p>\n  <\/li>\n<\/ol>\n\n<p>The ethics rules students agree to are equally short: use photos you took yourself of UD car parks; do not import third-party driving datasets; occupancy counts vehicles only; the output is never an enforcement decision.<\/p>\n\n<figure>\n  <img decoding=\"async\" src=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\/resolve\/main\/figures\/fig3-campus-plate-masked.png\" alt=\"The same University of Dubai car park with plate areas masked in black, shown before any detection boxes are drawn on top.\" loading=\"lazy\" \/>\n  <figcaption><b>Figure 3.<\/b> The same capture with plate zones masked, before the detection overlay. Publish this class of image \u2014 not the unprotected original.<\/figcaption>\n<\/figure>\n\n<h2 id=\"cvl-repro\"><span class=\"num\">08<\/span>Run it yourself<\/h2>\n\n<p>You need Python 3.11 or newer and an NVIDIA GPU. The canonical files are the Hugging Face Space, not a private folder.<\/p>\n\n<pre><code><span class=\"cmt\"># 1. Get the experiment<\/span>\ngit clone https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\ncd Campus-Vision-Lab\n\n<span class=\"cmt\"># 2. Create an isolated environment<\/span>\npython -m venv .venv\nsource .venv\/bin\/activate        <span class=\"cmt\"># macOS \/ Linux<\/span>\n.venv\\Scripts\\activate           <span class=\"cmt\"># Windows<\/span>\n\n<span class=\"cmt\"># 3. Install GPU PyTorch FIRST, then everything else<\/span>\npython -m pip install --upgrade pip\npython -m pip install torch torchvision --index-url https:\/\/download.pytorch.org\/whl\/cu128\npython -m pip install -r requirements.txt\n\n<span class=\"cmt\"># 4. Confirm the GPU is actually visible<\/span>\npython -c \"import torch; print(torch.cuda.is_available())\"\n\n<span class=\"cmt\"># 5. Launch<\/span>\npython -u app.py<\/code><\/pre>\n\n<p>Open the address it prints, usually <code>http:\/\/127.0.0.1:7860<\/code>. The first estimate downloads the model weights into that machine&#8217;s cache, so it is slower than the rest.<\/p>\n\n<h3>Three things that will go wrong<\/h3>\n\n<div class=\"tw\">\n<table>\n  <thead>\n    <tr><th>Symptom<\/th><th>Cause<\/th><th>Fix<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td><code>torch.cuda.is_available()<\/code> prints <code>False<\/code><\/td><td>Plain <code>pip install torch<\/code> pulled the CPU-only build<\/td><td>Reinstall using the <code>cu128<\/code> index URL in step 3<\/td><\/tr>\n    <tr><td>Out-of-memory error on first estimate<\/td><td>Both models loaded on a small card<\/td><td>Stay on nano weights, or run the detector without the caption model<\/td><\/tr>\n    <tr><td>Distant cars not counted<\/td><td>Default 640-pixel input<\/td><td>Raise <code>imgsz<\/code> to 1280 and lower confidence to ~0.12<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<p>Files: <a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\" target=\"_blank\" rel=\"noopener\">the Space<\/a> \u00b7 <a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\/blob\/main\/app.py\" target=\"_blank\" rel=\"noopener\">app.py<\/a> \u00b7 <a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\/blob\/main\/requirements.txt\" target=\"_blank\" rel=\"noopener\">requirements.txt<\/a><\/p>\n\n<div class=\"plain\">\n  <p class=\"subhead\">What gets marked<\/p>\n  <p>Two photos of the same car park at two time windows \u00b7 the capacity figure and how you obtained it \u00b7 counts, occupancy %, flag and caption \u00b7 one limitation that genuinely appeared in <em>your<\/em> frames \u00b7 one concrete follow-up change (weights, resolution, camera height, or a smaller counted subsection).<\/p>\n<\/div>\n\n<h2 id=\"cvl-limits\"><span class=\"num\">09<\/span>Limits, and what we test next<\/h2>\n\n<p>Every measurement has an error budget. Stating yours is not weakness; it is the thing that separates research from a demo.<\/p>\n\n<ul>\n  <li><strong>Occlusion.<\/strong> A car hidden behind a larger vehicle is never counted. Under-counting is our dominant error.<\/li>\n  <li><strong>Capacity is assumed, not observed.<\/strong> The model cannot see empty bays. A wrong denominator is a methods error, not a model error.<\/li>\n  <li><strong>Night and glare.<\/strong> Headlights, wet tarmac and low light all degrade detection. We have not characterised this properly yet.<\/li>\n  <li><strong>Double counting.<\/strong> Overlapping boxes can inflate the count on dense frames.<\/li>\n  <li><strong>The flags are teaching heuristics.<\/strong> <span class=\"chip c-stress\">Stress<\/span> is a classroom label, not an instruction to Facilities.<\/li>\n  <li><strong>The caption can sound confident and be wrong.<\/strong> That is why it is never the number.<\/li>\n<\/ul>\n\n<p>Planned next tests, in order:<\/p>\n\n<ol>\n  <li>Map bay polygons for one stable car park, then compare bay-classification occupancy against our vehicle \u00f7 capacity ratio on identical photographs. This is the direct ACPDS-style comparison.<\/li>\n  <li>Queue length at the entrance gate during morning arrival.<\/li>\n  <li>Prayer-time rush windows.<\/li>\n  <li>Exam-week overflow car parks.<\/li>\n<\/ol>\n\n<h2 id=\"cvl-faq\"><span class=\"num\">10<\/span>Freshman FAQ<\/h2>\n\n<details>\n  <summary>Do I need to know machine learning to do this lab?<\/summary>\n  <p>No. You need to install Python packages, take a careful photograph, count bays honestly, and write down what you observed. No training, no maths beyond a division. The learning happens when the model gets it wrong and you have to explain why.<\/p>\n<\/details>\n\n<details>\n  <summary>Why not just count the cars by hand? It is one photo.<\/summary>\n  <p>For one photo, hand-counting is genuinely fine \u2014 and you <em>should<\/em> do it once, as a check on the model. The exercise is not about saving labour on a single frame; it is about learning a repeatable measurement, its failure modes, and how to document it. That skill scales; your patience does not.<\/p>\n<\/details>\n\n<details>\n  <summary>Is this surveillance?<\/summary>\n  <p>No, and the design makes that verifiable rather than merely stated. There is no continuous feed \u2014 a human takes a single photo. Plate regions are masked before anything reads the image, and no character recognition runs at all. People are detected only to be blacked out. No identity is computed, stored or matched. Occupancy counts vehicle classes only.<\/p>\n<\/details>\n\n<details>\n  <summary>Can I run it without an NVIDIA GPU?<\/summary>\n  <p>The code falls back to CPU, but expect it to be slow and to feel unpleasant with the caption model enabled. For a class exercise on CPU, run the detector only and skip captioning.<\/p>\n<\/details>\n\n<details>\n  <summary>Why are the models so small? Bigger is better, surely?<\/summary>\n  <p>Bigger is better if it loads. An 8&nbsp;GB laptop is the hardware our students actually have, so the honest choice is small models plus a clearly stated envelope, rather than impressive models that only run on a card nobody in the room owns. Constraints stated up front are a feature of good engineering write-ups.<\/p>\n<\/details>\n\n<details>\n  <summary>Can I reuse this for my own campus or workplace?<\/summary>\n  <p>Yes \u2014 the app code is MIT licensed. Two conditions: use images you have the right to capture, and keep the privacy ordering intact (mask first, then detect, then caption). If you change the weights or resolution, report it. Ultralytics, SmolVLM and PyTorch keep their own licences.<\/p>\n<\/details>\n\n<h2>Where this leaves us<\/h2>\n\n<p>You do not need a data-centre GPU to teach real computer vision on a campus. You need four things: one sentence defining the number you claim, a hardware envelope you can defend out loud, a privacy path for the images you intend to publish, and a protocol other people can clone and run.<\/p>\n\n<p>Ultralytics, Voxel51 and Hugging Face already ship the components. PKLot, CNRPark-EXT and ACPDS already established that the measurement is real \u2014 and, more usefully, exactly where it breaks. Campus Vision Lab is that measurement, sized for Academic City and an 8&nbsp;GB teaching laptop, with the failures left in.<\/p>\n\n<p><strong>Start here:<\/strong> <a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\" target=\"_blank\" rel=\"noopener\">Campus Vision Lab on Hugging Face<\/a>. If you run it on your own campus, I would genuinely like to see the two photographs and the limitation you wrote down.<\/p>\n\n<h3>All sources, in one place<\/h3>\n\n<ul>\n  <li>This lab \u2014 <a href=\"https:\/\/huggingface.co\/spaces\/BuildingTHEITGUY\/Campus-Vision-Lab\" target=\"_blank\" rel=\"noopener\">BuildingTHEITGUY\/Campus-Vision-Lab<\/a><\/li>\n  <li>Ultralytics \u2014 <a href=\"https:\/\/docs.ultralytics.com\/guides\/parking-management\/\" target=\"_blank\" rel=\"noopener\">parking management guide<\/a> \u00b7 <a href=\"https:\/\/github.com\/ultralytics\/ultralytics\/blob\/main\/ultralytics\/solutions\/parking_management.py\" target=\"_blank\" rel=\"noopener\">source<\/a> \u00b7 <a href=\"https:\/\/docs.ultralytics.com\/guides\/nvidia-jetson\/\" target=\"_blank\" rel=\"noopener\">Jetson deployment<\/a><\/li>\n  <li>Hugging Face \u2014 <a href=\"https:\/\/huggingface.co\/HuggingFaceTB\/SmolVLM-500M-Instruct\" target=\"_blank\" rel=\"noopener\">SmolVLM-500M-Instruct<\/a> \u00b7 Marafioti et al., <a href=\"https:\/\/arxiv.org\/abs\/2504.05299\" target=\"_blank\" rel=\"noopener\">arXiv:2504.05299<\/a><\/li>\n  <li>Voxel51 \u2014 <a href=\"https:\/\/huggingface.co\/datasets\/Voxel51\/PKLot\" target=\"_blank\" rel=\"noopener\">PKLot dataset card<\/a><\/li>\n  <li>Community \u2014 <a href=\"https:\/\/huggingface.co\/simahanyan\/parking-lot-yolo26m\" target=\"_blank\" rel=\"noopener\">parking-lot-yolo26m<\/a> \u00b7 <a href=\"https:\/\/huggingface.co\/spaces\/sowmyasreevs\/drone-parking-occupancy\" target=\"_blank\" rel=\"noopener\">drone-parking-occupancy<\/a><\/li>\n  <li>Almeida et al., 2015 \u2014 <a href=\"https:\/\/doi.org\/10.1016\/j.eswa.2015.02.009\" target=\"_blank\" rel=\"noopener\">PKLot paper<\/a> \u00b7 <a href=\"https:\/\/www.inf.ufpr.br\/lesoliveira\/download\/ESWA2015.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a><\/li>\n  <li>Amato et al., 2017 \u2014 <a href=\"https:\/\/doi.org\/10.1016\/j.eswa.2016.10.055\" target=\"_blank\" rel=\"noopener\">CNRPark-EXT paper<\/a> \u00b7 <a href=\"http:\/\/cnrpark.it\/\" target=\"_blank\" rel=\"noopener\">dataset<\/a> \u00b7 <a href=\"https:\/\/github.com\/fabiocarrara\/deep-parking\" target=\"_blank\" rel=\"noopener\">code<\/a><\/li>\n  <li>Marek, 2021 \u2014 <a href=\"https:\/\/arxiv.org\/abs\/2107.12207\" target=\"_blank\" rel=\"noopener\">ACPDS paper<\/a> \u00b7 <a href=\"https:\/\/github.com\/martin-marek\/parking-space-occupancy\" target=\"_blank\" rel=\"noopener\">code<\/a> \u00b7 <a href=\"https:\/\/github.com\/thebkht\/smart-parking-system\" target=\"_blank\" rel=\"noopener\">applied edge fork<\/a><\/li>\n<\/ul>\n\n<p class=\"endnote\">\nMohamed Asath \u00b7 Building THE IT GUY \u00b7 AI Lab<br>\nExperiment ID CVL-PK-001 \u00b7 MIT licence for our app code \u00b7 Ultralytics, SmolVLM and PyTorch keep their own licences<br>\nFigures are served from the Hugging Face Space. Upload copies to your WordPress Media Library if you want long-term control of the images.\n<\/p>\n\n<\/article>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Research walkthrough \u00b7 AI Lab \u00b7 Experiment CVL-PK-001 Every morning between 07:30 and 09:00, our campus car parks fill up. You can feel it as a student circling for a bay. But nobody at the University could put a number on it \u2014 and buying a licence-plate camera system to find that number would be [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1379,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[95],"tags":[174,172,180,170,179,177,168,171,176,173,175,178],"class_list":["post-1378","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-automation","tag-ai-lab","tag-buildingtheitguy","tag-campus-parking","tag-computer-vision","tag-cvl-pk-001","tag-hugging-face","tag-local-ai","tag-parking-occupancy","tag-privacy","tag-smolvlm","tag-university-of-dubai","tag-yolo"],"featured_image_src":"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png","author_info":{"display_name":"Mohamed Asath","author_link":"https:\/\/www.buildingtheitguy.com\/index.php\/author\/asathwebtieradmin\/"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How we measure peak-time campus parking from one still photo - without plates, cameras - Building THE IT GUY Campus Parking from One Still Photo | BuildingTHEITGUY<\/title>\n<meta name=\"description\" content=\"Learn how campus parking occupancy is measured from one still photo with YOLO and SmolVLM\u2014no plate cameras, privacy-safe, on an 8 GB laptop. Experiment CVL-PK-001.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How we measure peak-time campus parking from one still photo - without plates, cameras - Building THE IT GUY Campus Parking from One Still Photo | BuildingTHEITGUY\" \/>\n<meta property=\"og:description\" content=\"Learn how campus parking occupancy is measured from one still photo with YOLO and SmolVLM\u2014no plate cameras, privacy-safe, on an 8 GB laptop. Experiment CVL-PK-001.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/\" \/>\n<meta property=\"og:site_name\" content=\"Building THE IT GUY\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-18T06:41:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-18T06:42:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mohamed Asath\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mohamed Asath\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/\"},\"author\":{\"name\":\"Mohamed Asath\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/#\\\/schema\\\/person\\\/cce03fcda4c40ccf57ab3844ca707561\"},\"headline\":\"How we measure peak-time campus parking from one still photo &#8211; without plates, cameras\",\"datePublished\":\"2026-09-18T06:41:19+00:00\",\"dateModified\":\"2026-09-18T06:42:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/\"},\"wordCount\":4155,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/WP-featured-campus-parking-1200x630-1.png\",\"keywords\":[\"AI Lab\",\"BuildingTHEITGUY\",\"campus parking\",\"computer vision\",\"CVL-PK-001\",\"Hugging Face\",\"local AI\",\"parking occupancy\",\"privacy\",\"SmolVLM\",\"University of Dubai\",\"YOLO\"],\"articleSection\":[\"IT Automation\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/\",\"url\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/\",\"name\":\"How we measure peak-time campus parking from one still photo - without plates, cameras - Building THE IT GUY Campus Parking from One Still Photo | BuildingTHEITGUY\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/WP-featured-campus-parking-1200x630-1.png\",\"datePublished\":\"2026-09-18T06:41:19+00:00\",\"dateModified\":\"2026-09-18T06:42:22+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/#\\\/schema\\\/person\\\/cce03fcda4c40ccf57ab3844ca707561\"},\"description\":\"Learn how campus parking occupancy is measured from one still photo with YOLO and SmolVLM\u2014no plate cameras, privacy-safe, on an 8 GB laptop. Experiment CVL-PK-001.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/WP-featured-campus-parking-1200x630-1.png\",\"contentUrl\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/WP-featured-campus-parking-1200x630-1.png\",\"width\":1200,\"height\":630,\"caption\":\"Experiment CVL-PK-001: counting vehicles and estimating lot occupancy from a single campus parking photo, with plate zones masked for privacy.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\\\/it-automation\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How we measure peak-time campus parking from one still photo &#8211; without plates, cameras\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/#website\",\"url\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/\",\"name\":\"Building THE IT GUY\",\"description\":\"Making Everyone&#039;s Life Easier\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/#\\\/schema\\\/person\\\/cce03fcda4c40ccf57ab3844ca707561\",\"name\":\"Mohamed Asath\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ab17cc6285a5051affe4181f53011c89cc055de9416bcc44b3e2771be318d870?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ab17cc6285a5051affe4181f53011c89cc055de9416bcc44b3e2771be318d870?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ab17cc6285a5051affe4181f53011c89cc055de9416bcc44b3e2771be318d870?s=96&r=g\",\"caption\":\"Mohamed Asath\"},\"description\":\"Turning IT Challenges into Opportunities\",\"sameAs\":[\"https:\\\/\\\/www.buildingtheitguy.com\"],\"url\":\"https:\\\/\\\/www.buildingtheitguy.com\\\/index.php\\\/author\\\/asathwebtieradmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How we measure peak-time campus parking from one still photo - without plates, cameras - Building THE IT GUY Campus Parking from One Still Photo | BuildingTHEITGUY","description":"Learn how campus parking occupancy is measured from one still photo with YOLO and SmolVLM\u2014no plate cameras, privacy-safe, on an 8 GB laptop. Experiment CVL-PK-001.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/","og_locale":"en_US","og_type":"article","og_title":"How we measure peak-time campus parking from one still photo - without plates, cameras - Building THE IT GUY Campus Parking from One Still Photo | BuildingTHEITGUY","og_description":"Learn how campus parking occupancy is measured from one still photo with YOLO and SmolVLM\u2014no plate cameras, privacy-safe, on an 8 GB laptop. Experiment CVL-PK-001.","og_url":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/","og_site_name":"Building THE IT GUY","article_published_time":"2026-09-18T06:41:19+00:00","article_modified_time":"2026-09-18T06:42:22+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png","type":"image\/png"}],"author":"Mohamed Asath","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mohamed Asath","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#article","isPartOf":{"@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/"},"author":{"name":"Mohamed Asath","@id":"https:\/\/www.buildingtheitguy.com\/#\/schema\/person\/cce03fcda4c40ccf57ab3844ca707561"},"headline":"How we measure peak-time campus parking from one still photo &#8211; without plates, cameras","datePublished":"2026-09-18T06:41:19+00:00","dateModified":"2026-09-18T06:42:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/"},"wordCount":4155,"commentCount":0,"image":{"@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#primaryimage"},"thumbnailUrl":"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png","keywords":["AI Lab","BuildingTHEITGUY","campus parking","computer vision","CVL-PK-001","Hugging Face","local AI","parking occupancy","privacy","SmolVLM","University of Dubai","YOLO"],"articleSection":["IT Automation"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/","url":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/","name":"How we measure peak-time campus parking from one still photo - without plates, cameras - Building THE IT GUY Campus Parking from One Still Photo | BuildingTHEITGUY","isPartOf":{"@id":"https:\/\/www.buildingtheitguy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#primaryimage"},"image":{"@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#primaryimage"},"thumbnailUrl":"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png","datePublished":"2026-09-18T06:41:19+00:00","dateModified":"2026-09-18T06:42:22+00:00","author":{"@id":"https:\/\/www.buildingtheitguy.com\/#\/schema\/person\/cce03fcda4c40ccf57ab3844ca707561"},"description":"Learn how campus parking occupancy is measured from one still photo with YOLO and SmolVLM\u2014no plate cameras, privacy-safe, on an 8 GB laptop. Experiment CVL-PK-001.","breadcrumb":{"@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#primaryimage","url":"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png","contentUrl":"https:\/\/www.buildingtheitguy.com\/wp-content\/uploads\/2026\/09\/WP-featured-campus-parking-1200x630-1.png","width":1200,"height":630,"caption":"Experiment CVL-PK-001: counting vehicles and estimating lot occupancy from a single campus parking photo, with plate zones masked for privacy."},{"@type":"BreadcrumbList","@id":"https:\/\/www.buildingtheitguy.com\/index.php\/how-we-measure-peak-time-campus-parking-from-one-still-photo-without-plates-cameras\/it-automation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.buildingtheitguy.com\/"},{"@type":"ListItem","position":2,"name":"How we measure peak-time campus parking from one still photo &#8211; without plates, cameras"}]},{"@type":"WebSite","@id":"https:\/\/www.buildingtheitguy.com\/#website","url":"https:\/\/www.buildingtheitguy.com\/","name":"Building THE IT GUY","description":"Making Everyone&#039;s Life Easier","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.buildingtheitguy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.buildingtheitguy.com\/#\/schema\/person\/cce03fcda4c40ccf57ab3844ca707561","name":"Mohamed Asath","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ab17cc6285a5051affe4181f53011c89cc055de9416bcc44b3e2771be318d870?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ab17cc6285a5051affe4181f53011c89cc055de9416bcc44b3e2771be318d870?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ab17cc6285a5051affe4181f53011c89cc055de9416bcc44b3e2771be318d870?s=96&r=g","caption":"Mohamed Asath"},"description":"Turning IT Challenges into Opportunities","sameAs":["https:\/\/www.buildingtheitguy.com"],"url":"https:\/\/www.buildingtheitguy.com\/index.php\/author\/asathwebtieradmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/posts\/1378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/comments?post=1378"}],"version-history":[{"count":1,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/posts\/1378\/revisions"}],"predecessor-version":[{"id":1380,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/posts\/1378\/revisions\/1380"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/media\/1379"}],"wp:attachment":[{"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/media?parent=1378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/categories?post=1378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.buildingtheitguy.com\/index.php\/wp-json\/wp\/v2\/tags?post=1378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}