Projecthackathon

Built at ExecuTorch Hackathon — IoT Track

Pip: a robot head you can teach in seconds

Pip is a small pan-tilt robot head on the Arduino VENTUNO Q that learns new objects on the spot. Hold up any object, press a button and say its name: Pip takes a few photos, learns it with no training step, and nods whenever it sees it again. Show it something unknown and it gives a curious look. Everything runs on the board, with no cloud. How it works: - Sees: DINOv2-small runs on the Qualcomm Hexagon NPU through ExecuTorch + QNN in about 5 ms per image. We wrote a custom export that keeps DINOv2's image features (no classifier) and calibrates quantization on photos from our own webcam. 16-bit activations kept accuracy high where 8-bit dropped to 0.81 similarity with the CPU model. - Learns: each object is stored as a few 384-number DINOv2 fingerprints and matched by nearest neighbor. An empty-scene baseline and mean-centering remove the background, and answers must be confident and stable before Pip reacts. - Hears: object names are transcribed offline with Whisper on the board's CPU, using the webcam mic. - Moves: two Feetech STS3215 servos give it body language: nod, shake, curious look, look around. - Dual brain: Modulino Buttons are read by the STM32 microcontroller and sent to Linux over the Arduino Bridge (A = learn, B = forget, C = pause). Along the way we solved several platform issues and documented them in the repo: ExecuTorch export paths for the board's system-wide QNN SDK, pinned packages that no longer existed, a startup race where the microcontroller registered Bridge functions before the Linux Router was listening, and MIPI camera support missing from the image. - **NPU inference:** about 5 ms per image for DINOv2-small (16-bit activations, 8-bit weights) - **NPU vs CPU:** DINOv2-small takes **6.3 ms** per image on the Hexagon NPU (ExecuTorch + QNN, 16-bit activations, 8-bit weights) vs **684 ms** in PyTorch on the board's CPU: **~108× faster**

View source
// latest_project_recording.mp4
// Project brief

Pip is a small pan-tilt robot head on the Arduino VENTUNO Q that learns new objects on the spot. Hold up any object, press a button and say its name: Pip takes a few photos, learns it with no training step, and nods whenever it sees it again. Show it something unknown and it gives a curious look. Everything runs on the board, with no cloud. How it works: - Sees: DINOv2-small runs on the Qualcomm Hexagon NPU through ExecuTorch + QNN in about 5 ms per image. We wrote a custom export that keeps DINOv2's image features (no classifier) and calibrates quantization on photos from our own webcam. 16-bit activations kept accuracy high where 8-bit dropped to 0.81 similarity with the CPU model. - Learns: each object is stored as a few 384-number DINOv2 fingerprints and matched by nearest neighbor. An empty-scene baseline and mean-centering remove the background, and answers must be confident and stable before Pip reacts. - Hears: object names are transcribed offline with Whisper on the board's CPU, using the webcam mic. - Moves: two Feetech STS3215 servos give it body language: nod, shake, curious look, look around. - Dual brain: Modulino Buttons are read by the STM32 microcontroller and sent to Linux over the Arduino Bridge (A = learn, B = forget, C = pause). Along the way we solved several platform issues and documented them in the repo: ExecuTorch export paths for the board's system-wide QNN SDK, pinned packages that no longer existed, a startup race where the microcontroller registered Bridge functions before the Linux Router was listening, and MIPI camera support missing from the image. - **NPU inference:** about 5 ms per image for DINOv2-small (16-bit activations, 8-bit weights) - **NPU vs CPU:** DINOv2-small takes **6.3 ms** per image on the Hexagon NPU (ExecuTorch + QNN, 16-bit activations, 8-bit weights) vs **684 ms** in PyTorch on the board's CPU: **~108× faster**

// Built with
QualcommArduino VENTUNO Q (Dragonwing IQ8 + STM32H5), ExecuTorch, Qualcomm QNN (HTP NPU), DINOv2, Arduino App Lab + Bridge, Modulino Buttons, Feetech STS3215 servos, faster-whisper, OpenCV, Python
// Watch & explore
// 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