Instructions to use fvossel/csgo-player-detection with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- ultralytics
How to use fvossel/csgo-player-detection with ultralytics:
# Couldn't find a valid YOLO version tag. # Replace XX with the correct version. from ultralytics import YOLOvXX model = YOLOvXX.from_pretrained("fvossel/csgo-player-detection") source = 'http://images.cocodataset.org/val2017/000000039769.jpg' model.predict(source=source, save=True) - Notebooks
- Google Colab
- Kaggle
| license: other | |
| library_name: ultralytics | |
| pipeline_tag: object-detection | |
| tags: | |
| - yolo | |
| - yolo26 | |
| - object-detection | |
| - counter-strike | |
| - cs2 | |
| # 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](https://huggingface.co/datasets/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](https://github.com/fvossel/RealTimeObjectDetectionCSGO) 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 | |
| ```python | |
| 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: | |
| ```bash | |
| 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. | |