Computer vision · R&D

jumpsight

Analysing a figure-skating jump from one phone video, with every number shipped together with how sure the system is about it.

Year
2026
Status
R&D, own engine
Scale
959 commits
Stack
Python · YOLOX · RTMPose · ONNX Runtime · OpenCV · SciPy · FastAPI · PostgreSQL
  • ±0.54rotation error on 1,705 jumps (MMFS)
  • 91%Axel recognised (FS-Jump3D)
  • ±0.5–1frames on landing, control clip
  • ~13 sper clip on CPU, first events after ~2 s

The problem

Coaches film on ordinary phones: 30 fps, compressed, often re-sent through Telegram. A jump lasts about half a second and one rotation takes roughly four frames, so most numbers are at the edge of what the video contains. The system has to measure what it can and say plainly what it cannot.

How it works

  1. 01

    Probe and decode

    Real frame timestamps (phones record variable frame rate), bitrate, a quick 360×640 pass over the whole clip and an audio track for the landing sound.

  2. 02

    Detect and track

    YOLOX-tiny on every third frame, IoU tracking and background stabilisation keep one skater in focus while the phone pans.

  3. 03

    Find the attempts

    Body-box kinematics and a ballistic parabola mark where the skater leaves the ice. Spirals and lifts that look similar are rejected with a reason.

  4. 04

    Pose in every frame

    RTMPose-m runs on full-resolution windows around each attempt and returns the joints the rest of the pipeline measures.

  5. 05

    Timing, rotation, type

    Takeoff and landing come from the ballistic bound around the apex. Rotation uses two independent channels. A rule tree, mirrored for direction, names the jump.

  6. 06

    A report that admits limits

    Every value is an object with a 68% interval, a tier and a status. What cannot be measured comes back as "absent" with a machine-readable reason, never as a plausible guess.

Left: the system's run on a FS-Jump3D triple Lutz (CC BY-NC-SA 4.0). Right: the original.Steps 2–4 draw real solved motion from my capture pipeline.

Limits I know about

  • On toe jumps the takeoff can read up to two frames early: the toe pick release is invisible at ankle level. Filming at 60 fps fixes it.
  • At about seven turns per second and 30 fps, rotation counting can alias. The system then refuses with AZIMUTH_ALIASING_SUSPECT instead of guessing.
  • Lutz and Flip differ by the blade edge, which compressed 30 fps video often does not show (76.5% on that pair).

Need something like this?

Tell me about your task and data. I will answer with how I would approach it.

Discuss a project →