Overwatch 2 Killfeed Row Detector

A YOLOv8s detector that finds killfeed rows in Overwatch 2 gameplay β€” the banners that appear top-right when a player is eliminated.

Locating the row is the first stage of finding kills in a VOD. Once you have the box you can OCR the attacker's name and attribute the kill; without it you are guessing from frame differences or audio, both of which fire on the wrong things.

Results

Evaluated on the dataset's held-out test split (45 images, 61 boxes) β€” images never seen in training or validation.

Metric Value
mAP@50 0.9936
mAP@50-95 0.8302
Precision 0.9784
Recall 0.9836

Inference measured at ~25 ms/image at 640px on Apple MPS; substantially faster on a CUDA GPU.

The high mAP@50 is expected and not as impressive as it looks: a killfeed row is a fixed, high-contrast UI element in a predictable screen region, which is close to the easiest case object detection has. The gap down to 0.83 at mAP@50-95 is the honest number β€” box edges are loose, because a row's exact boundary is ambiguous where the coloured bar fades into its border.

Usage

from ultralytics import YOLO

model = YOLO("killfeed.pt")
results = model.predict("frame.png", imgsz=640, conf=0.25)

for box in results[0].boxes:
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"kill_row at ({x1:.0f}, {y1:.0f}) - ({x2:.0f}, {y2:.0f}) conf={box.conf.item():.2f}")

An ONNX export (killfeed.onnx) is included for runtimes without PyTorch.

Feed it the killfeed band, not the whole frame. The model was trained on crops of the top-right region β€” (x0, x1, y0, y1) = (0.62, 1.00, 0.00, 0.42) as fractions of the frame. Passing a full 1920Γ—1080 screenshot will work poorly, because at 640px inference the row shrinks to a handful of pixels.

Training

Base yolov8s.pt
Data tnguyen2002/overwatch2-killfeed-rows β€” 453 images, 626 boxes
Epochs 50
Image size 640
Batch 16
Optimizer auto
Ultralytics 8.4.95

The released checkpoint has had its optimizer and EMA state stripped (89.5 MB β†’ 22.5 MB); it scores identically to the full checkpoint.

Classes

One: kill_row.

The model finds rows. It does not identify who got the kill, which hero was used, or whether a row is a final blow or an assist β€” those are downstream problems and there are no labels for them here.

Limitations

  • POV footage. Trained almost entirely on first-person player recordings. Broadcast and observer overlays render the killfeed differently.
  • Two HUD scales. Overwatch lets players resize the HUD; the training data spans two source recordings, not that whole range.
  • Patch-bound. Blizzard has restyled the killfeed before and will again. This model describes the UI as it looked in mid-2026.
  • Band-cropped input. See usage above β€” this is a real constraint, not a preference.
  • Small training set. 453 images. Enough for a fixed UI element, not enough to survive a visual redesign.

Licence

AGPL-3.0, inherited from Ultralytics YOLOv8, which this model was trained with and which its weights derive from. Ultralytics offers a separate Enterprise licence for use without AGPL obligations.

Note the network clause: AGPL-3.0 requires that users interacting with the software over a network be able to obtain its corresponding source. If you deploy this model in a service, that applies to you.

The training images contain Overwatch 2 UI and hero art, Β© Blizzard Entertainment. This model is published for research use and is not endorsed by or affiliated with Blizzard.

Citation

@misc{overwatch2_killfeed_detector,
  title  = {Overwatch 2 Killfeed Row Detector},
  author = {Tom Nguyen},
  year   = {2026},
  url    = {https://huggingface.co/tnguyen2002/overwatch2-killfeed-detector}
}
Downloads last month
6
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Dataset used to train tnguyen2002/overwatch2-killfeed-detector