
Follow Through
Shot-form analysis
Your shot,
graded against the pros.
Record the shot. Follow Through extracts the shooter's pose, aligns every frame to a pro reference, and returns a 0-99 similarity score plus the three mechanics to fix first. A coach can read it in thirty seconds.
Reference -- Shaquille O'Neal
Target -- Steve Nash
Pipeline
How it works.
01
Pose extraction
MediaPipe lands 18 joints per frame. Savitzky-Golay smooths the jitter without flattening the snap at release.
02
Normalisation
Centre on the hip midpoint; scale by the shoulder-to-hip distance. Camera angle and body size wash out, leaving only form.
03
Deviation + scoring
Per-joint Euclidean distance to the reference, resampled to a common 60-frame axis. Mean deviation collapses into one number you can say out loud.
The product layer
A score is the headline.
Advice is what you do with it.
The score answers how close am I? The coaching layer answers what do I change?For the three most-deviated joints, the system writes specific cues in plain English: vertical offsets ("elbow drops 8% lower than Nash at release"), lateral offsets ("guide-hand wrist drifts across the body"), and timing deltas. The whole analysis layer is pure functions -- no UI, no framework, ready to ship on a phone.
- Joints tracked
- 18
- Score range
- 0 -- 99
- Unit tests on analysis
- 10
Example output -- Shaq vs. Nash
What the system actually returns.
Similarity score
Noticeably different mechanics
Mean per-joint deviation of 0.251 across 18 shared joints over a 60-frame aligned window.
Top-3 coaching cues
- 01
Guide-hand wrist
Sits lower than Nash’s. Lift it higher through the shot.
- 02
Shooting wrist
Tucked too close vs. Nash’s. Let it extend outward naturally.
- 03
Right heel
Tucked too close vs. Nash’s. Let the base open up on the release.
Per-joint deviation
Normalised Euclidean deviation per joint, descending. Top contributors drive the advice.
Engineering note
Training data was the hardest part. I got around it with NBA 2K.
Labelled pose data from real basketball film is expensive and scarce. Before MediaPipe made the custom-trained pose step unnecessary in production, I generated synthetic training data from NBA 2K -- a game engine that renders realistic shooting mechanics on demand, with programmatic control over camera, lighting, and player. Good enough as a proof of concept, good enough to test on, and a pattern that still works wherever training data is the bottleneck. (The production system now leans on MediaPipe's pretrained landmarks.)
Under the hood
Stack.
- PoseMediaPipe Pose
- SmoothingSavitzky-Golay, per-joint
- AnalysisPure Python: NumPy + Pandas, zero UI deps
- Testspytest; contract tests on every public function
- Mobile targetKMP shared + Compose / SwiftUI native UI
- Video I/OOpenCV + H.264 transcode for browser delivery