YOLO26 player detection for CS2 β€” 640x640 native crops

Detects player bodies and heads, split by team, on a 640x640 centre crop at native resolution. Trained on fvossel/csgo-player-detection, plus a small set of images that dataset does not redistribute.

⚠ Intended use

This model was trained to study how well a detector performs on a real-time task and what that costs in latency. It is part of a demonstration project, and it is explicitly not meant to be used for cheating.

Use it offline, against bots, or on your own -insecure server. Not on a VAC-secured server, not in matchmaking, not on an account you care about.

Pointing a detector at a screen is the easy half. Acting on it is where it falls apart: synthetic mouse input is flagged as injected by the operating system itself, and a system that reacts in milliseconds produces an aim distribution no human produces. Neither is a gap that a more careful implementation closes. The project repository explains this in full and includes the tooling to measure it.

Metrics

Measured on a persistent holdout of 1204 images that no training run has ever seen. The split is block-wise by scene, not per frame β€” a random per-frame split puts near-identical neighbouring frames on both sides and inflates the numbers.

mAP50 mAP50-95 Precision Recall
overall 0.905 0.727 0.937 0.840
Class Instances Precision Recall mAP50 mAP50-95
ct_body 563 0.922 0.867 0.919 0.797
ct_head 511 0.930 0.831 0.888 0.608
t_body 677 0.930 0.833 0.908 0.784
t_head 634 0.967 0.828 0.906 0.718

Class none (ID 0) is an empty placeholder kept so the IDs stay stable.

Inference 3.9 ms per image at the reported batch size, on the training machine.

Usage

from ultralytics import YOLO

model = YOLO("yolo26n_csgo_20260727-231745.pt")
results = model.predict("crop.png", conf=0.25, iou=0.5)

Feed it a 640x640 centre crop cut at native resolution, not a resized screenshot. A 1920x1080 frame scaled down to 640 shrinks a head from roughly 13x17 px to 4x6 px, which is not the scale this model was trained on. This is the single most common way to get bad results out of it.

Training

Base weight yolo26n.pt
Epochs 150
Batch 32
Image size 640
Optimizer auto, cosine LR
Mosaic 1.0, closed for the last 15 epochs

Augmentation is deliberately conservative: no rotation, no vertical flip, limited hue and scale. The game renders a fixed, upright world β€” augmenting it into poses that cannot occur costs capacity without buying robustness.

Only images confirmed by hand were trained on. The labelling loop pre-annotates with a larger model and then confirms or corrects each image; unchecked model output never reaches training.

Files

  • yolo26n_csgo_20260727-231745.pt β€” PyTorch weight, the one to use
  • yolo26n_csgo_20260727-231745.onnx β€” portable ONNX export

No TensorRT engine is published. An .engine is tied to the exact GPU, driver and TensorRT version it was built on. Build your own:

python scripts/export.py --weights models/yolo26n_csgo_20260727-231745.pt --format engine

Licence

The training images show Counter-Strike 2 and are derivative of Valve's assets. The weights are published for research. Check whether your intended use is covered before building on this.

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Collection including fvossel/csgo-player-detection