ybashir/CS2-HUD-OCR-Crops
CS2 HUD OCR Crops Per-region HUD crops sliced from three Counter-Strike 2 match recordings, labelled where possible from the demo file's parse_ticks state. Built to train a specialist CRNN that replaces the EasyOCR killfeed reader (currently ~6 s p95 on CPU) with a sub-30 ms specialist. Source Three matches by the same POV player (farouqqq), recorded in CS2's built-in DVR + the corresponding .dem files: sample map dem rounds resolution fps sample1… See the full description on the dataset page: https://huggingface.co/datasets/ybashir/CS2-HUD-OCR-Crops.
CS2 HUD OCR Crops
Per-region HUD crops sliced from three Counter-Strike 2 match recordings, labelled where possible from the demo file's parse_ticks state. Built to train a specialist CRNN that replaces the EasyOCR killfeed reader (currently ~6 s p95 on CPU) with a sub-30 ms specialist.
Source
Three matches by the same POV player (farouqqq), recorded in CS2's built-in DVR + the corresponding .dem files:
Frames sampled at 5 fps. Per-region ROIs slice via the `hud_extractor` package's calibrated hud_template.json.
Signals + label sources
killfeed and friendly_chat are saved without text labels in this release because the EasyOCR teacher (~600 ms / row on CPU) made a single pass impractical. The crops are ready for a GPU-side labeling sweep (EasyOCR gpu=True is ~10× faster on a single T4).
File layout
dataset/cs2_ocr/
├── crops/ # PNG, one per labeled crop
│ ├── hp_sample1_r07_f000048.png
│ ├── money_sample2_r03_f000132.png
│ ├── killfeed_sample3_r05_f000240_row2.png
│ ├── friendly_chat_sample1_r10_f000600_row3.png
│ └── ...
├── train.parquet
├── val.parquet
├── test.parquet
└── manifest.jsonSplit key = (sample, round), so no frame leak across splits.
Parquet schema
How to load
from datasets import load_dataset
ds = load_dataset("ybashir/CS2-HUD-OCR-Crops")To get an actual image rather than a path you'll need to join the crop_path column with the downloaded crops/ directory.
Build details
- Frame extractor + dem alignment + ROI slicer: `scripts/build_crnn_dataset.py`
- Clip cutter (per-round mp4s): `scripts/cut_clips.py`
- HUD template (calibrated ROIs + row slots): `hud_extractor/hud_extractor/config/hud_template.json`
Known limitations
- POV-only labels. The
demground truth applies tofarouqqq's state; other players' HUDs are not in scope. sample3round 1 begins before the dem started recording. Itsdem_freeze_sis negative — the dem-truth labels begin partway into the clip.parse_eventis broken on these dem files (EntityNotFoundacross every version ofdemoparser2), soplayer_deathcorrelations for killfeed verification are not available. EasyOCR remains the only signal source for killfeed/chat.- Re-encoded clips (
-c libx264 -crf 20) lose a few decibels vs. the source DVR; not visible at HUD resolution but flagged for transparency.
License
CC-BY-4.0. The underlying gameplay footage is captured from a personal Counter-Strike 2 session (Valve Corp.) — the dataset is published for non-commercial research on HUD-region OCR distillation.
