CourtSide Computer Vision v0.2 - Racket Detection ๐ŸŽพ

Fine-tuned YOLOv11n model for detecting tennis rackets in images and videos. Part of the CourtSide Computer Vision suite for comprehensive tennis match analysis.

Racket Detection Example

Model Details

  • Model Name: CourtSide Computer Vision v0.2
  • Model ID: Davidsv/CourtSide-Computer-Vision-v0.2
  • Model Type: Object Detection
  • Architecture: YOLOv11 Nano (n)
  • Framework: Ultralytics YOLOv11
  • Parameters: 2.6M
  • Input Size: 640x640
  • Classes: 1 (racket)

Performance Metrics

Evaluated on validation set (66 images):

Metric Value
mAP@50 66.67%
mAP@50-95 33.33%
Precision ~71%
Recall ~44%
Inference Speed (M4 Pro) ~10ms

Training Details

Dataset

This model was trained on the dataset1 by Tesi, available on Roboflow Universe.

  • Training images: 582
  • Validation images: 66
  • Test images: 55
  • Total: 703 annotated images
  • Annotation format: YOLO format (bounding boxes)
  • Source: Roboflow Universe - Dataset1

Training Configuration

Model: YOLOv11n (nano)
Epochs: 100
Batch size: 16
Image size: 640x640
Device: Apple M4 Pro (MPS)
Optimizer: AdamW
Learning rate: 0.001 โ†’ 0.01
Training time: ~26 minutes

Augmentation

  • HSV color jitter (h=0.015, s=0.7, v=0.4)
  • Random horizontal flip (p=0.5)
  • Translation (ยฑ10%)
  • Scaling (ยฑ50%)
  • Mosaic augmentation

Loss Weights

  • Box loss: 7.5
  • Class loss: 0.5
  • DFL loss: 1.5

Usage

Installation

pip install ultralytics

Python API

from ultralytics import YOLO

# Load CourtSide Computer Vision v0.2 model
model = YOLO('Davidsv/CourtSide-Computer-Vision-v0.2')

# Predict on image
results = model.predict('tennis_match.jpg', conf=0.4)

# Display results
results[0].show()

# Get bounding boxes
for box in results[0].boxes:
    x1, y1, x2, y2 = box.xyxy[0]
    confidence = box.conf[0]
    print(f"Racket detected at [{x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}] with {confidence:.2%} confidence")

Video Processing

from ultralytics import YOLO

model = YOLO('Davidsv/CourtSide-Computer-Vision-v0.2')

# Process video
results = model.predict(
    source='tennis_match.mp4',
    conf=0.4,
    save=True,
    save_txt=True
)

# Track rackets across frames
results = model.track(
    source='tennis_match.mp4',
    conf=0.4,
    tracker='bytetrack.yaml'
)

Command Line

# Predict on image
yolo detect predict model=Davidsv/CourtSide-Computer-Vision-v0.2 source=image.jpg conf=0.4

# Predict on video
yolo detect predict model=Davidsv/CourtSide-Computer-Vision-v0.2 source=video.mp4 conf=0.4 save=True

# Track rackets in video
yolo detect track model=Davidsv/CourtSide-Computer-Vision-v0.2 source=video.mp4 conf=0.4

# Validate model
yolo detect val model=Davidsv/CourtSide-Computer-Vision-v0.2 data=dataset.yaml

Recommended Hyperparameters

Inference Settings

# Balanced (recommended)
conf_threshold = 0.40  # Confidence threshold
iou_threshold = 0.45   # NMS IoU threshold
max_det = 10           # Maximum detections per image (usually 2-4 rackets)

# High precision (fewer false positives)
conf_threshold = 0.55
iou_threshold = 0.45
max_det = 8

# High recall (detect more rackets, more false positives)
conf_threshold = 0.30
iou_threshold = 0.40
max_det = 15

Limitations

  • Motion blur: Rackets in very fast motion may be harder to detect
  • Occlusion: Partially hidden rackets (behind player, net, etc.) may not be detected
  • Angles: Extreme viewing angles may reduce detection accuracy
  • Racket types: Trained on standard tennis rackets, may not generalize to unusual designs
  • Similar objects: May occasionally detect similar elongated objects

Model Biases

  • Trained on professional and amateur match footage
  • Better performance on standard racket designs and colors
  • Dataset may have court-type or player-level biases
  • Optimized for typical tennis camera angles

Use Cases

โœ… Recommended:

  • Tennis match analysis and statistics
  • Player technique analysis
  • Swing detection and tracking
  • Automated coaching feedback
  • Sports analytics dashboards
  • Training video analysis
  • Action recognition pipelines (combined with ball detection)

โš ๏ธ Not Recommended:

  • Real-time officiating decisions
  • Safety-critical applications
  • Detection of non-tennis rackets without fine-tuning

Example Results

Sample Detections

mAP@50: 66.67% - Good detection performance on typical tennis scenes
Precision: ~71% - When detected, about 7 out of 10 detections are correct
Recall: ~44% - Detects approximately 4-5 out of 10 rackets

Confidence Interpretation

Confidence Range Interpretation
> 0.7 High confidence - very likely a tennis racket
0.5 - 0.7 Medium confidence - probably a tennis racket
0.4 - 0.5 Low confidence - possible tennis racket
< 0.4 Very low confidence - likely false positive

CourtSide Computer Vision Suite

This model is part of the CourtSide Computer Vision project for comprehensive tennis analysis:

Available Models

Combined Usage Example

from ultralytics import YOLO

# Load both CourtSide CV models
model_ball = YOLO('Davidsv/CourtSide-Computer-Vision-v0.1')      # Ball detection
model_racket = YOLO('Davidsv/CourtSide-Computer-Vision-v0.2')    # Racket detection

# Detect both in same image
ball_results = model_ball.predict('match.jpg', conf=0.3)
racket_results = model_racket.predict('match.jpg', conf=0.4)

# Combine detections for comprehensive analysis
print(f"Balls detected: {len(ball_results[0].boxes)}")
print(f"Rackets detected: {len(racket_results[0].boxes)}")

Advanced Usage

Detect and Track Swing Actions

from ultralytics import YOLO
import cv2

model = YOLO('Davidsv/CourtSide-Computer-Vision-v0.2')
video = cv2.VideoCapture('match.mp4')

frame_count = 0
racket_positions = []

while True:
    ret, frame = video.read()
    if not ret:
        break

    # Detect rackets
    results = model.predict(frame, conf=0.4, verbose=False)

    # Track racket movement for swing analysis
    for box in results[0].boxes:
        x1, y1, x2, y2 = box.xyxy[0]
        center_x = (x1 + x2) / 2
        center_y = (y1 + y2) / 2
        racket_positions.append((frame_count, center_x, center_y))

    frame_count += 1

# Analyze swing patterns
print(f"Total racket detections: {len(racket_positions)}")

Full Tennis Analysis Pipeline

from ultralytics import YOLO

# Load all CourtSide models
ball_model = YOLO('Davidsv/CourtSide-Computer-Vision-v0.1')
racket_model = YOLO('Davidsv/CourtSide-Computer-Vision-v0.2')

# Process video with both models
ball_results = ball_model.track('match.mp4', conf=0.3)
racket_results = racket_model.track('match.mp4', conf=0.4)

# Combine for action recognition and analytics

Model Card Authors

  • Developed by: Davidsv (Vuong)
  • Model date: November 2024
  • Model version: v0.2
  • Model type: Object Detection (YOLOv11)
  • Part of: CourtSide Computer Vision Suite

Citations

This Model

If you use this model, please cite:

@misc{courtsidecv_v0.2_2024,
  title={CourtSide Computer Vision v0.2: Tennis Racket Detection with YOLOv11},
  author={Vuong},
  year={2024},
  publisher={Hugging Face},
  howpublished={\url{https://huggingface.co/Davidsv/CourtSide-Computer-Vision-v0.2}}
}

Dataset

This model was trained using the dataset1 dataset. Please cite:

@misc{dataset1-yx5qr_dataset,
  title = {dataset1 Dataset},
  type = {Open Source Dataset},
  author = {Tesi},
  howpublished = {\url{https://universe.roboflow.com/tesi-mpvmr/dataset1-yx5qr}},
  url = {https://universe.roboflow.com/tesi-mpvmr/dataset1-yx5qr},
  journal = {Roboflow Universe},
  publisher = {Roboflow},
  year = {2023},
  month = {mar},
  note = {visited on 2024-11-20}
}

License

MIT License - Free for commercial and academic use.

Acknowledgments

Contact & Support

For questions, issues, or collaboration:

  • Hugging Face: @Davidsv
  • Model Updates: Check for newer versions in the CourtSide CV series

Common Issues & Solutions

Issue: Low Recall (Missing Rackets)

Solution: Lower confidence threshold to 0.30-0.35

Issue: Too Many False Positives

Solution: Increase confidence threshold to 0.50-0.55

Issue: Missed Rackets in Fast Motion

Solution: Use model.track() instead of model.predict() for better temporal consistency

Issue: Multiple Detections per Racket

Solution: Increase NMS IoU threshold to 0.50-0.55

Issue: Poor Performance on Unusual Angles

Solution: Consider fine-tuning on your specific camera setup or use data augmentation

Model Changelog

v0.2 (2024-11-20)

  • Initial release of racket detection model
  • YOLOv11n architecture
  • mAP@50: 66.67%
  • 703 training images from Roboflow dataset
  • Optimized for standard tennis racket detection
  • Part of CourtSide Computer Vision suite

Model Size: 5.4 MB
Inference Speed: 10-65ms (device dependent)
Supported Formats: PyTorch (.pt), ONNX, TensorRT, CoreML
Model Hub: Davidsv/CourtSide-Computer-Vision-v0.2

๐ŸŽพ Ready for production use in tennis analysis applications!

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

Evaluation results