Three models trained from scratch — YOLOv8 hold detection, HRNet pose tracking, a linear-regression move scorer — running as real AWS Lambda functions below, not a mock.
Why upload photos instead of just a live feed? Finding an actual bouldering wall to test in front of isn't practical for most visitors here (myself included, writing this at a desk). Try it with the bundled example below, upload your own climbing photos, or use your webcam if you do have a wall handy.
One honest gap: the move-scoring model was still in early data collection when I paused this project — no hand-graded "good move" labels ever got collected, so it's trained on a heuristic stand-in (reward upward progress, prefer a comfortable reach) instead. Treat suggestions as directional, not gospel.
Every result below comes from the real deployed Lambda functions. First call after idle time may take 10–30s while they cold-start — everything after that is a couple seconds.
Point the camera at an empty section of wall, then scan.
Step into frame for a live suggestion every couple of seconds.
A YOLOv8 model, trained on ~300 hand-labeled photos, finds every bolt-on hold (single class: handle). Each detected hold is cropped, K-means finds its dominant color, and a second K-means pass clusters holds into "tracks" — the color-coded routes climbers actually follow.
HRNet estimates a 17-point COCO skeleton for the climber, cropped to a YOLOv6-detected person first so joints stay sharp even on a full-frame photo. The camera stays fixed on a tripod in the intended flow, so the wall only needs scanning once.
For each hand and foot, the nearest detected hold on the chosen track becomes that limb's current position. From there, every same-track hold within roughly one body-length becomes a candidate next move — hands search upward, feet search below the hips.
A regularized linear regression scores every candidate move and the highest-scored one gets suggested. Trained on a heuristic target — net upward progress, comfortable reach — since real hand-graded labels were never collected before the project paused.
Three container-image functions — detection, pose, scoring — each independently deployable.
Each model ships as its own image, sized to fit compiled deps like torch and OpenCV that exceed Lambda's zip limits.
HTTP APIs front each Lambda; this page calls them directly from the browser.
Model weights and run history — hold detections, poses, and scored moves per session.