ReelTime
Computer vision basketball highlights
Problem
Handheld 1v1 film is mostly lowlights. Cutting makes by hand does not scale.
Solution
I built a pipeline that finds made shots in full-game video and cuts them into a highlight reel. I also built a labeling UI and gold set so the detector is scored on labels someone actually verified, not on unlabeled footage treated as a miss.
I did not train the main YOLO detector. My work was everything around it: verification gates that reject false makes, a rim specialist that locks the active hoop per scene, the eval harness, the label UI, and the speed path (single-decode two-pass skim, TensorRT on Modal).
75% recall on unseen labeled footage.
Python · YOLO · OpenCV · ffmpeg
Demo from public YouTube footage.
How it works
Full-game video goes in. Verified makes come out as clips and a stitched reel. YOLO proposes ball, rim, and candidate makes. My verification stack decides whether the ball actually went through the hoop before ffmpeg cuts the clip.
The hard part is that made can fire for one or two frames,
so you cannot skim the video the way you would for a dense object.
I labeled makes from the on-screen scoreboard, matched predictions
within a few seconds, and logged what sped the pipeline up versus what
killed recall (stride subsampling, downscaling the detector).
| Piece | What |
|---|---|
| My stack | Rim lock, verification gates, eval harness, label UI, two-pass skim |
| Detection | YOLO (bballvision + rim nano I trained) |
| Verification | Confidence, ball sweep, dedup |
| Output | ffmpeg clips + highlight reel |
| Eval | Hand-labeled gold set, label UI |
| Infer | CoreML local, Modal + TensorRT cloud |
Weights, cached detections, and source footage are not in the repo.