CAPS won the 2nd runner-up at Qualcomm Hack The Challenge 2026: AI camera counts parking spaces running on the device

Qualcomm Future Makers — Hack The Challenge 2026 is an innovation program for students, with a prompt centered around a single constraint: the AI model must run directly on the device. The Grand Finale — Hack Day will take place on August 16, 2026, at the University of Science, VNU-HCM, organized by Qualcomm in collaboration with innoex. The CAPS team, Little Sun, ranked in the Top 12 finals and received the second runner-up prize, valued at 10,000,000 VND.

This article documents the technical details: the measured figures on the device, the selected parameters, and the reasons for choosing them. The source code is public, with the link at the end of the article.
The prompt requires the model to run on-site, and that constraint determines everything that follows.
Running on the device means that the frame is processed directly on the board mounted on the ceiling, rather than being sent back to a server located elsewhere. The parking lot benefits from this approach in three ways: the images remain within the lot, the system can still count when the connection is unstable, and operating costs are limited to electricity expenses.
In return, the entire computational budget is confined to a single embedded board. All other design choices for CAPS stem from that constraint.
CAPS places a camera on the ceiling instead of a sensor for each parking space.
The typical approach in parking lots is to attach an ultrasonic or magnetic field sensor to each space and then run wires back to the controller. The number of sensors increases with the number of spaces, and so does the number of failures.
CAPS hangs a camera from the ceiling and designates each parking spot as a polygonal area in the frame. In the competition version, two cameras monitor six spots across two floors: camera 01 (MaixCam) monitors A1–A3, while camera 02 (ESP32-CAM) monitors B-1–B3. Each device is equipped with an additional light, illuminating red down onto the occupied space.

616 ms per inference is the figure that determines the camera budget.
Measured on Arduino UNO Q — QRB2210, aarch64, 2 GB RAM — the vehicle recognition model takes a median of 616 ms for each inference at a resolution of 640×640. This is the measurement on the actual device, running onnxruntime on the CPU.
From that figure, the rest can be inferred. The default capture cycle of 3 seconds can accommodate about three cameras and still remains under load. For six cameras, the cycle must stretch to 5 seconds if the board is to remain unchanged.
This is how a measured figure becomes a deployment limit: installers know in advance that they are trading off between the number of cameras and update latency, rather than realizing it when the parking lot has been fully set up.
Four out of five frames must agree for a parking space to change status.
A pedestrian walking by, a shadow cast, a blurry frame due to shaking — each one is enough for a misclassification. Reading each frame and reporting immediately would yield a continuously flashing status board.
CAPS implements a voting filter: a parking space only changes status when 4 out of 5 consecutive frames agree on the same outcome. The cost of this is latency, which can be calculated: with a cycle of 3 seconds, a newly parked vehicle shows up on the board after about 12–15 seconds.
"Undefined" is the third state and it is distinct from "vacant".
The voting filter creates a situation where the two-state system processes incorrectly: a parking space that the system has not seen enough frames to conclude. Calling it "vacant" would guide drivers to a spot that may actually be occupied.
CAPS reports three distinct states — vacant, occupied, and undefined — and directly annotates the explanation on the admin screen: Unknown is not free: the system has not yet seen enough frames to decide.

The board retains timestamps for each status change, allowing any reporting error to be traced back to the frame that generated it.
The parking space is specified by drawing a polygon over the camera frame.
Every parking lot has its own geometry, so the positions of spaces must be redeclared each time it is set up. CAPS brings this process to the browser: installers open the camera frame, draw a polygon for each space, assign a space code, and save. Changes take effect immediately, and the recognition process continues to run.

This method of specification accommodates diagonal spaces and spaces partially obstructed by columns — something that a rectangular box aligned to axes would mistakenly cut off.
Drivers look up parking spaces using their license plate, on a separate screen.
The admin screen is for parking operators. The driver needs something entirely different: where there are still free spaces, and where their vehicle will park later. CAPS completely separates that interface — opening it brings up a search box Find your car, enter the license plate for a search, and below are the available spaces in each level.

The interface is available in two languages, Vietnamese and English, and the mobile version retains that same layout vertically. A level that is full shows the number 0 in red along with the line "This level is out of free spaces", instead of requiring the reader to deduce from a number.

The device shell is self-built by the team, separating the ceiling mount from the body carrying the camera.

The mount is fixed to the ceiling, and the body rotates around a ball joint. The installer screws it in once and then adjusts the camera's view, instead of taking it off and reattaching until the view is clear.
The hardware and software running CAPS
Layer | Component |
|---|---|
Processing | Arduino UNO Q — QRB2210, aarch64, 2 GB RAM, 32 GB flash |
Main Camera | MaixCam, GC4653 sensor, serves JPEG images over HTTP |
Secondary Camera | ESP32-CAM, OV3660 or OV2640 sensor |
Indicator Light | WS2812B LED Ring |
Recognition | YOLO exported to ONNX, runs onnxruntime on CPU |
Service | FastAPI, SQLAlchemy, SQLite |
Interface | React, Ant Design, TypeScript, Vite |
Deployment | Docker Compose, systemd |

Source code is public under the MIT license
CAPS-DASH is on GitHub under the MIT license: github.com/nguyminhdc78-del/CAPS-DASH. The code repository includes the recognition service, admin interface, and deployment documentation using Docker Compose.
Results of the competition will be announced in the organizers' post.

See CAPS in action
The video recording the team's competition entry shows the complete lifecycle of a parking event: a vehicle enters the space, the ceiling light changes color, and the status board updates after the voting filter finalizes.
Other images from the finals



The figures in the article are measured on the build from August 2026. Different boards, resolutions, or models will yield different results — re-measure before moving to a new configuration.