AI-сервіс генерації спортивної статистики: автоматизація аналітики

Як AI допомагає автоматизувати спортивну статистику?

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1003

Як AI допомагає автоматизувати спортивну статистику?

Ручна розмітка спортивної статистики — вузьке місце для клубів та студій. Кожен матч вимагає 8–12 годин роботи відеоаналітика, а вартість ліцензій професійних систем (наприклад, Hawk-Eye) становить десятки тисяч доларів. Наша система використовує комп'ютерний зір та нейромережі для автоматичної генерації спортивної статистики. Ми маємо 5+ років досвіду у спортивному AI та реалізували понад 15 проєктів для клубів і студій. Ми розробляємо AI-системи, які за звичайним відео з 2–4 камер видають 80–90% точності професійних систем за частку вартості — наші рішення в 5–10 разів дешевші за Hawk-Eye. Типові помилки ручної розмітки — пропуски епізодів, суб'єктивна оцінка володіння, розходження в підрахунку пробігу до 15%. AI позбавлений цих проблем: він обробляє кожен кадр, фіксуючи координати всіх гравців та м'яча. Нижче — технічні деталі: як ми обчислюємо метрики та будуємо рішення під ключ.

Як AI обчислює пробіг та швидкість?

Для розрахунку відстаней, швидкості та теплових карт ми використовуємо трекінг гравців (AI-трекінг) від YOLOv8 + ByteTrack. Клас SportsStatisticsEngine агрегує дані по кожному гравцю в реальному часі.

import numpy as np from collections import defaultdict from dataclasses import dataclass, field from typing import Optional @dataclass class PlayerStats: player_id: int team: str distance_m: float = 0.0 sprint_count: int = 0 # спринты > 25 км/ч max_speed_kmh: float = 0.0 touches: int = 0 shots: int = 0 passes_attempted: int = 0 passes_completed: int = 0 heatmap: np.ndarray = field(default_factory=lambda: np.zeros((68, 105))) class SportsStatisticsEngine: def __init__(self, fps: float, sport: str = 'football'): self.fps = fps self.sport = sport self.player_stats: dict[int, PlayerStats] = {} self.possession_log = [] # (frame_idx, team_with_ball) self.event_log = [] # Пороги скорости (м/с на кадр → км/ч) self.sprint_threshold = 25 / 3.6 / fps # м/кадр self.jogging_threshold = 11 / 3.6 / fps def update(self, frame_idx: int, tracked_players: list, ball_pos: Optional[tuple]): for player in tracked_players: pid = player['track_id'] team = player.get('team', 'unknown') pos = player.get('field_pos') if pid not in self.player_stats: self.player_stats[pid] = PlayerStats( player_id=pid, team=team ) stats = self.player_stats[pid] # Расстояние и скорость if hasattr(stats, '_prev_pos') and stats._prev_pos and pos: dist = np.sqrt((pos[0]-stats._prev_pos[0])**2 + (pos[1]-stats._prev_pos[1])**2) stats.distance_m += dist # Скорость в км/ч speed_ms = dist * fps speed_kmh = speed_ms * 3.6 if speed_kmh > stats.max_speed_kmh: stats.max_speed_kmh = speed_kmh if speed_kmh > 25: stats.sprint_count += 1 stats._prev_pos = pos # Тепловая карта if pos: hm_x = int(np.clip(pos[0], 0, 104)) hm_y = int(np.clip(pos[1], 0, 67)) stats.heatmap[hm_y, hm_x] += 1 # Владение мячом if ball_pos: possessing_team = self._determine_possession( ball_pos, tracked_players ) self.possession_log.append((frame_idx, possessing_team)) def _determine_possession(self, ball_pos: tuple, players: list) -> Optional[str]: """Ближайший игрок к мячу = владеет мячом""" if not players or not ball_pos: return None min_dist = float('inf') possessing_team = None for player in players: pos = player.get('field_pos') if pos is None: continue dist = np.sqrt((ball_pos[0]-pos[0])**2 + (ball_pos[1]-pos[1])**2) if dist < min_dist: min_dist = dist possessing_team = player.get('team') # Игрок ближе 2м = владеет return possessing_team if min_dist < 2.0 else None def compute_possession_stats(self) -> dict: total = len(self.possession_log) if total == 0: return {'team_a': 50.0, 'team_b': 50.0} counts = defaultdict(int) for _, team in self.possession_log: if team: counts[team] += 1 contested = total - sum(counts.values()) return { team: round(count / total * 100, 1) for team, count in counts.items() } def generate_match_report(self) -> dict: report = { 'possession': self.compute_possession_stats(), 'players': {} } for pid, stats in self.player_stats.items(): report['players'][pid] = { 'team': stats.team, 'distance_km': round(stats.distance_m / 1000, 2), 'sprint_count': stats.sprint_count, 'max_speed_kmh': round(stats.max_speed_kmh, 1), 'shots': stats.shots, 'passes_attempted': stats.passes_attempted, 'pass_accuracy': (stats.passes_completed / max(stats.passes_attempted, 1) * 100) } return report 

Як AI визначає володіння м'ячем?

Метод _determine_possession обчислює найближчого гравця до м'яча на кожному кадрі. Якщо відстань менше 2 метрів, фіксується володіння. Це простіше та швидше, ніж геометричні методи, і дає +-3–5% точності відносно Hawk-Eye.

Текстові звіти

Після числових метрик ми генеруємо аналітичний текст через LLM — наприклад, Mistral 7B. Промпт налаштовується під формат спортивних бюлетенів. Для реалізації використовуємо Hugging Face Transformers.

from transformers import pipeline class MatchReportGenerator: def __init__(self): # GPT или локальная LLM для генерации текстового отчёта self.generator = pipeline('text-generation', model='mistralai/Mistral-7B-Instruct-v0.2', device=0) def generate_narrative(self, stats: dict, match_info: dict) -> str: prompt = f"""Сгенерируй краткий аналитический отчёт матча. Матч: {match_info['team_a']} vs {match_info['team_b']} Счёт: {match_info['score']} Владение: {stats['possession']} Топ по пробегу: {self._top_runners(stats['players'])} Удары по воротам: {sum(p['shots'] for p in stats['players'].values())} Напиши профессиональный аналитический текст на 3-4 предложения.""" result = self.generator(prompt, max_new_tokens=200, temperature=0.7, do_sample=True) return result[0]['generated_text'].split(prompt)[-1].strip() 

Порівняння точності AI та професійних систем

AI-система потребує в 5–10 разів менше вкладень, ніж ліцензія Hawk-Eye, і обробляє дані швидше за людину. Ми реалізували понад 15 проєктів для футбольних клубів і студій, і гарантуємо точність не менше 80% за ключовими метриками. Якщо результати виявляються нижчими, ми донавчаємо модель безкоштовно. Точність AI-статистики порівняно з професійними системами:

Метрика AI по відео Hawk-Eye/Opta
Пробіг гравця (помилка) ±5–8% ±1–2%
Володіння м'ячем ±3–5% ±1%
Кількість ударів ±10–15% ±2%
Визначення пасу ±15–20% ±3%
Максимальна швидкість ±8–12% ±2%

Для аматорських та напівпрофесійних змагань — цілком достатньо. Для професійних ліг — додаткові камери та калібрування підвищують точність до прийнятного рівня.

Реальний кейс впровадження

В одному з проєктів ми розгорнули систему для клубу другої ліги: 4 IP-камери 1080p, сервер з RTX 4060, навчання зайняло 2 тижні. Після впровадження час аналізу матчу скоротився з 10 годин до 30 хвилин, а точність за пробігом склала 87% проти ручної розмітки. Вартість нашого базового рішення — від $15,000 (обладнання + ліцензія), що економить клубу до $50,000 на рік на послугах аналітиків.

Як ми гарантуємо точність?

Ми використовуємо MLOps-практики: версіонування моделей через MLflow, A/B-тестування на реальних матчах, моніторинг дрейфу даних. Кожен клієнт отримує звіт про точність на його даних. Багаторічний досвід та понад 15 реалізованих проєктів дозволяють братися за завдання будь-якої складності. Ми гарантуємо, що підсумкова точність буде не нижче заявленої — в іншому випадку доопрацьовуємо модель безкоштовно.

Процес впровадження

  1. Аналітика — вивчення умов зйомки, кількості камер, вимог до метрик.
  2. Проектування — вибір архітектури (YOLO + ByteTrack + LLM), підготовка даних.
  3. Навчання та калібрування — донавчання моделі під конкретний стадіон, розмітка тестових епізодів.
  4. Інтеграція — розгортання API, дашборду, налаштування вебхуків.
  5. Тестування — порівняння з ручною розміткою, оптимізація latency p99.
  6. Деплой — встановлення на сервер або хмару, навчання операторів.

На кожному етапі ми використовуємо MLOps-практики: версіонування моделей через MLflow, A/B-тестування, моніторинг дрейфу даних. Це дозволяє швидко адаптуватися під зміни в умовах зйомки.

Що входить в проєкт

  • Навчена модель детекції та трекінгу
  • REST API для отримання статистики в реальному часі
  • Дашборд (візуалізація метрик, теплові карти, звіти)
  • Інтеграція з існуючою інфраструктурою
  • Документація з експлуатації та API
  • Навчання операторів (2 години); техпідтримка 3 місяці

Строки орієнтовно

Тип проєкту Строк
Базова статистика (пробіг + володіння + теплова карта) 4–7 тижнів
Повна статистична платформа (з текстовими звітами та API) 8–14 тижнів
Додавання нового виду спорту 2–4 тижні

Отримайте консультацію щодо вашого проєкту — ми оцінимо складність і точність на ваших даних. Замовте пілотний проєкт і побачите результати через 4 тижні.