YOLOv8s MMA Fighter Detector

Fine-tuned YOLOv8s for detecting fighters in MMA and boxing footage. Part of the fight-judge project β€” an AI pipeline for automated combat sports scoring.

Model Description

This model detects the bounding box(es) of fighter(s) in a video frame. It is the first stage in the fight-judge pipeline, providing fighter crops that feed into the downstream pose estimation model.

  • Architecture: YOLOv8s (small)
  • Task: Object detection (single class: fighter)
  • Input: RGB image, 640Γ—640 px
  • Output: Bounding boxes [x_center, y_center, width, height] (normalized), confidence scores
  • Base model: yolov8s.pt (COCO pretrained)
  • Finetuned on: MMA Fighter Detection Dataset β€” 5,106 images, 20 UFC fights

Training

Parameter Value
Epochs 100
Batch size 64 (multi-GPU)
Image size 640
Optimizer Auto (SGD)
LR initial 0.01
LR final 0.01 (cosine off)
Warmup epochs 3
Weight decay 0.0005
AMP true
Hardware 2Γ— GPU (Kaggle)
Training time ~1.2 hours

Augmentations: HSV jitter, horizontal flip (p=0.5), scale, mosaic, random erasing (p=0.4), RandAugment.

Evaluation Results

Evaluated on the held-out test split of the MMA Fighter Detection Dataset.

Metric Value
mAP50-95 (box) 0.9836
mAP50 (box) 0.9950
Precision 0.9983
Recall 0.9990
Val box loss 0.1864
Val cls loss 0.1317

Training converged smoothly. mAP50-95 reached 0.72 by epoch 4 and exceeded 0.98 by epoch 24, stabilizing around 0.983–0.984 in the final epochs.

Dataset

MMA Fighter Detection Dataset

  • 5,106 images extracted from 20 UFC fights (stand-up phases only)
  • 640Γ—640 px, YOLO format, single class: fighter
  • ~2 fighter instances per image (10,186 total annotations)
  • Published on Mendeley Data (CC BY-NC-SA 4.0)
  • Fights span multiple weight classes β€” Poirier, Adesanya, Pereira, Topuria, Gaethje, and others

Split:

Split Images
Train 3,635
Valid 980
Test 491

Usage

from ultralytics import YOLO

model = YOLO("hasanfaesal/yolov8s-mma-fighter-detector")

results = model("fight_frame.jpg")
results[0].show()
# Batch inference on a video
results = model("fight.mp4", stream=True)
for r in results:
    boxes = r.boxes.xyxy   # [x1, y1, x2, y2]
    confs = r.boxes.conf

Limitations

  • Trained exclusively on UFC stand-up footage. Performance may degrade on:
    • Ground game sequences (grappling, guard, mount)
    • Non-UFC broadcasts with different camera setups or overlays
    • Boxing-specific camera angles (ringside, overhead)
  • Single-class model β€” does not distinguish between the two fighters (no ReID)
  • Not designed for crowd scenes or multi-person environments outside of 1v1 combat

Pipeline Context

[This model] β†’ YOLOv11x-pose MMA Pose Estimator β†’ Action Recognition (planned)

Fighter bounding boxes from this model are used as inputs to the top-down pose estimation stage. See the fight-judge repository for the full pipeline.

Citation

If you use this model or the dataset, please cite:

@misc{faisal2025mmafighter,
  author    = {Hasan Faisal},
  title     = {MMA Fighter Detection Dataset},
  year      = {2025},
  publisher = {Mendeley Data},
  version   = {V1},
  doi       = {10.17632/c456bnk8bm.1}
}

License

Code and model weights: MIT License Dataset: CC BY-NC-SA 4.0

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