Projecthackathon

Built at ExecuTorch Hackathon — IoT Track

On-device self-correcting runtime for deployed vision models

# Self-correcting QC on the edge: sealed detector on the NPU, judged and retrained on the board **Team Edgeble** (Akhil Beeram, Aharone Routu, Buji Mamidipalli, Rithwik Beeram, Jagan Teki) **Track:** IoT, Arduino VENTUNO Q (Qualcomm Dragonwing IQ8 / QCS8275, Hexagon V75) **Repo:** https://github.com/edgeble/self-correction-qc-executorch (Apache-2.0) ## The problem A vision model on a production line is right on the day it is installed and wrong the day the lighting changes. A battery-terminal checker that reads good batteries as mismatched stops the line, and the fix today is a human, a laptop and a retrain somewhere else. We show the runtime correcting itself on the device: on the spot at the decision point, and over time by retraining the model's head on the board. ## What we built - **Our own model.** A YOLO11n detector trained on our 9 V battery data (four classes: positive, negative, and the two mismatch cases), exported with ExecuTorch 1.5.1 and the Qualcomm QNN backend as a sealed int8 `.pte` for the Hexagon NPU. ExecuTorch did not list this chip; we patched the chipset tables and found the QNN runtime that the board accepts. - **A rig.** A rotating ring with a stepper motor, a USB camera and three light strips on Modbus/RS485, so the lighting failure can be produced on demand. - **edgeble-infer**, our C/C++ inference engine, hosts the sealed program: camera, tracking, the gate that turns detections into GO/NG, the HDMI and browser view, and the hooks where the correction layer plugs in. ExecuTorch is the model runtime inside it, not a replacement for it. - **The judge.** At the decision point every terminal crop is compared, with the same frozen backbone the detector runs (a second sealed `.pte` on the NPU, 256-d), against a bank of examples the line confirmed in good light. A clear match flips the label in about 15 ms; an unclear one abstains. The model never judges itself. - **On-device retrain.** The trainable head of the same network is retrained on the board from the corrected frames, in minutes, checked for learning and forgetting, and hot-swapped with the old head kept for rollback. The sealed front on the NPU never changes. ## What we measured on the Q (2026-10-18) - Sealed inference: 9.5 ms per frame, 30 fps, ~7% NPU, one CPU core, 259 MB. - Judge on the recorded mixed clip, same frames, same binary, two panes started together: model as installed 16 NG / 33 GO; with the judge 10 NG / 39 GO. Six false positives corrected, zero genuine mismatches lost. 77 verdicts: 46 confirmed, 22 abstained, 9 flips, 6 to 109 ms each. - On-device head retrain: end to end on the board (7.6 min for 930 frames); the recipe has not yet removed the lighting false positives on this model, and the README says so with the logs. ## Why ExecuTorch One PyTorch model, two sealed programs on the same NPU (detector and embedder), the trainable head exported as a separate program with its weights in a `.ptd` the device can rewrite, and a C++ runtime small enough to live inside our own engine. Correct now, fix forever, nothing leaves the device. ## Honest limits The judge's bank is built from the line's own good-light run; a new room needs that run first, until then the judge abstains. The self-correction architecture is Edgeble's, patent pending (India filed, US in progress); the procedure and the retrain recipe are not in the repository, the results, logs and code around them are.

View source
// Project brief

# Self-correcting QC on the edge: sealed detector on the NPU, judged and retrained on the board **Team Edgeble** (Akhil Beeram, Aharone Routu, Buji Mamidipalli, Rithwik Beeram, Jagan Teki) **Track:** IoT, Arduino VENTUNO Q (Qualcomm Dragonwing IQ8 / QCS8275, Hexagon V75) **Repo:** https://github.com/edgeble/self-correction-qc-executorch (Apache-2.0) ## The problem A vision model on a production line is right on the day it is installed and wrong the day the lighting changes. A battery-terminal checker that reads good batteries as mismatched stops the line, and the fix today is a human, a laptop and a retrain somewhere else. We show the runtime correcting itself on the device: on the spot at the decision point, and over time by retraining the model's head on the board. ## What we built - **Our own model.** A YOLO11n detector trained on our 9 V battery data (four classes: positive, negative, and the two mismatch cases), exported with ExecuTorch 1.5.1 and the Qualcomm QNN backend as a sealed int8 `.pte` for the Hexagon NPU. ExecuTorch did not list this chip; we patched the chipset tables and found the QNN runtime that the board accepts. - **A rig.** A rotating ring with a stepper motor, a USB camera and three light strips on Modbus/RS485, so the lighting failure can be produced on demand. - **edgeble-infer**, our C/C++ inference engine, hosts the sealed program: camera, tracking, the gate that turns detections into GO/NG, the HDMI and browser view, and the hooks where the correction layer plugs in. ExecuTorch is the model runtime inside it, not a replacement for it. - **The judge.** At the decision point every terminal crop is compared, with the same frozen backbone the detector runs (a second sealed `.pte` on the NPU, 256-d), against a bank of examples the line confirmed in good light. A clear match flips the label in about 15 ms; an unclear one abstains. The model never judges itself. - **On-device retrain.** The trainable head of the same network is retrained on the board from the corrected frames, in minutes, checked for learning and forgetting, and hot-swapped with the old head kept for rollback. The sealed front on the NPU never changes. ## What we measured on the Q (2026-10-18) - Sealed inference: 9.5 ms per frame, 30 fps, ~7% NPU, one CPU core, 259 MB. - Judge on the recorded mixed clip, same frames, same binary, two panes started together: model as installed 16 NG / 33 GO; with the judge 10 NG / 39 GO. Six false positives corrected, zero genuine mismatches lost. 77 verdicts: 46 confirmed, 22 abstained, 9 flips, 6 to 109 ms each. - On-device head retrain: end to end on the board (7.6 min for 930 frames); the recipe has not yet removed the lighting false positives on this model, and the README says so with the logs. ## Why ExecuTorch One PyTorch model, two sealed programs on the same NPU (detector and embedder), the trainable head exported as a separate program with its weights in a `.ptd` the device can rewrite, and a C++ runtime small enough to live inside our own engine. Correct now, fix forever, nothing leaves the device. ## Honest limits The judge's bank is built from the line's own good-light run; a new room needs that run first, until then the judge abstains. The self-correction architecture is Edgeble's, patent pending (India filed, US in progress); the procedure and the retrain recipe are not in the repository, the results, logs and code around them are.

// Built with
**Hardware** - Arduino VENTUNO Q: Qualcomm Dragonwing IQ8 / QCS8275, Hexagon V75 NPU, 8 cores, 15 GB RAM, Ubuntu 24.04 (kernel 6.8 qcom) - Rig: NEMA stepper on the board's GPIO, USB camera (1080p MJPG, 30 fps), three LED strips over Modbus RTU / RS485 (CH340 adapter) **Model** - Ultralytics YOLO11n, trained on our own 9 V battery dataset (4 classes), PyTorch - ExecuTorch 1.5.1, Qualcomm QNN backend, PT2E int8 (8a8w, histogram observer), QCS8275 chipset patch - Two sealed programs on the NPU: the detector `.pte` and the backbone embedder `.pte` (256-d) - Trainable head as a separate ExecuTorch program with its weights in a `.ptd`, retrained on the board (PyTorch CPU in a container) **Runtime** - QNN HTP runtime 2.30 (the set that accepts SoC model 82), fastrpc, dma_heap - ExecuTorch aarch64 runtime, static, inside our engine - edgeble-infer: our C/C++ inference engine (OpenCV, GStreamer, libmodbus, tracking, battery gate, MJPEG/HTTP stream, HDMI) - Edgeble correction library (C API): judge at the decision point, bank of confirmed examples, cosine distance with abstain margin, crop validity gate, head swap with rollback **Tooling** - Docker on the Q and on the laptop (x86 export image, aarch64 engine image) - GStreamer camera tee (one camera, four engine instances), Python status page for the 2x2 view - Modbus/RS485 light control, stepper driver in C, scripts for the demo sequence **Ours vs. not ours** - Ours: the model and its data, edgeble-infer, the correction library, the judge embedder, the rig, the tools, the logs - Not ours: ExecuTorch, Qualcomm QNN/QAIRT, Ultralytics, PyTorch, OpenCV, GStreamer, Ubuntu
// More from this event

Keep exploring what builders shipped.

All projects →

Magic Mirror

Magic Mirror

Project brief ExecuTorch Hackathon — Founders, Inc., October 17–18, 2026. Everything below runs on the Arduino VENTUNO Q on the desk: no cloud, no account, no network needed once the board is flashed. The pitch A store fixture that puts the shopper in the product photo. Stand in front of a camera and you appear wearing the garment — the head cutout, the body matte, the garment placement and the generated try-on image are all computed on the board's Hexagon NPU, with the web page that shows the result served from the same device. What's built and measured Piece Where it runs Cost Virtual billboard (BiSeNet head matte → product photo) NPU 12 ms compute, ~1 fps end to end Person segmentation (SegFormer human parsing) NPU 24.9 ms Generated try-on (Stable Diffusion + ControlNet-Canny) NPU ~0.3 s per step Face swap into a studio shot (GHOST, Apache-2.0) NPU 82 ms, fp16 LLM text generation (Gemma 4 E2B) NPU 188 tok/s prompt, 16.3 tok/s gen, 494 MiB Vision Q&A (InternVL3-1B) NPU 0.5 s encode, ~33 tok/s Live speech (Whisper-tiny → Gemma translate) NPU 1.8–2.6 s transcript, ~9 s translated LLM baseline (Llama 3.2 1B, XNNPACK) CPU 10.1 tok/s The NPU numbers are the point: prompt eval is ~12× the CPU baseline on a model twice the size, with resident memory a fraction of it, because the weights live in the NPU context. How it fits together Hugging Face model → optimum-cli export executorch → quantized .pte → ExecuTorch runtime. The same .pte runs on the Mac and on the board, which is what makes iterating on a laptop and demoing on hardware the same workflow. NPU models go through the track bundle's QNN AOT path (Linux only) and are driven by a warm persistent runner — 468 ms per inference launched cold, 26 ms held open with scratch on tmpfs. Two independent routes to the same effect, kept separate on purpose: overlay moves a garment onto a live frame (garment_overlay.py, garment_clip.py), and face swap moves the shopper's face into a studio shot that already has the garment, lighting and pose (board_faceswap_*). Hardware QCS8275, Cortex-A78C big cores, 14 GB RAM, Ubuntu 24.04 aarch64 over adb — not Android, despite answering adb, and considerably better than its published spec. No root; the compiler, the runners and the Python environment were all installed without it. Status and limits Board path: working, demoed, including the web UI and the walkthrough deck. Android/XR app (android/): compiles, never run — no device was attached. macOS cannot do QNN ahead-of-time compilation, so NPU work happens on the board. Thin segmentation classes (arms) lose accuracy at 8a8w; silhouettes don't. The board reboots under heavy load, so long board-side jobs are resumable.

Harshith Ande's team

Kamikaze

Kamikaze is an edge-AI vision system built on the Arduino VENTUNO Q that converts physical consumer items into interactive 3D digital twins in real time. Powered by an on-device Qualcomm Hexagon NPU, the pipeline uses YOLO-World, DINOv2, RapidOCR, and HSV color gating to identify smartphones and beverage cans during a guided five-second scan. An integrated FastMCP server then resolves metric-accurate 3D models by cross-referencing local CAD caches, 1:1 dummy repositories, and procedural mesh generators with live-stitched label textures—all while enforcing a zero-cloud privacy boundary. The resulting Smart Kiosk interface pairs Modulino RGB LED feedback and real-time hardware telemetry with an auto-orienting 3D viewport that dynamically mirrors the physical pose of the object in the user's hand.

Qualcomm

Team AAA

Depth Perception

Collating Arduino distance sensor readings with video to train camera-alone depth perception

Qualcomm