← Back

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.

GitHub