futheros-ball-rfdetr β personalized football ball detector
RF-DETR Nano (30M params, Apache-2.0) fine-tuned to detect the ball in amateur football footage (phone cameras, fixed venue cams, 5-a-side) β including the motion-blurred ball in flight, which COCO and broadcast-trained detectors never see.
Built for FUT-HEROS (Build Small Hackathon): upload your match clip β it finds your goals and coaches every scoring strike.
How it was trained: SAM3 as the teacher
No hand labeling. Labels come from facebook/sam3 video tracking on our own match
footage, in two rounds:
- Agreement labels β SAM3 track positions confirmed by an independent RF-DETR detection (β€35px): clean, easy frames.
- Blur labels (v2) β SAM3-only positions on FAST-moving ball frames (speed-gated): SAM3's temporal memory holds the ball through motion blur where per-frame detectors go blind. These frames teach the model that the streak is the ball.
Plus the ball class of roboflow-jvuqo/football-players-detection-3zvbc (broadcast)
for generality. RF-DETR Nano, 30 epochs, effective batch 16 β 5.7 min on one RTX 3090.
Measured results (goal detection on 3 real amateur videos, 8 true goals)
| Detector | Goals | Notes |
|---|---|---|
| zero-shot COCO Nano | 3/8 | + 1 false event |
| Nano fine-tuned on broadcast only | 1/8 | domain shift β worse than zero-shot! |
| this model v1 (agreement labels) | 7/8 | ball location finally correct |
| this model v2 (+ blur labels), sliced inference | 8/8 | all goals at the user's exact times |
Sliced inference = predict on 4 overlapping half-frame tiles + full frame, merge by NMS (the Roboflow sports recipe for tiny/far balls).
Usage
from rfdetr import RFDETRNano
from huggingface_hub import hf_hub_download
ckpt = hf_hub_download("build-small-hackathon/futheros-ball-rfdetr",
"checkpoint_best_total_v2.pth")
model = RFDETRNano(pretrain_weights=ckpt)
detections = model.predict(image, threshold=0.35) # class 1 = ball