Чому ручний аналіз матчів гальмує підготовку команди?
Тренерський штаб витрачає десятки годин на тиждень на перегляд записів матчів. Розбір 90-хвилинної гри вручну займає 3–4 години — аналітик мотає плівку, шукає епізоди, заповнює таблиці. При обсязі 10–15 матчів на тиждень це перетворюється на 40–60 годин чистої рутини. Rule-based системи з простими порогами дають до 30% хибних спрацьовувань на детекції ударів — кожна третя подія потребує перевірки.
Наша AI-система на основі YOLO вирішує обидві проблеми: автоматизує детекцію та трекінг, а також скорочує час аналізу до 30 хвилин на матч. Вона у 8 разів швидша за ручний розбір і в 2 рази точніша за rule-based підходи. Як зазначено в бенчмарках YOLOv8, модель забезпечує mAP 97% на спортивних сценах. Стек — YOLOv8, PyTorch, OpenCV та кастомні алгоритми подієвої логіки. Компанія має 5+ років досвіду в Computer Vision та 20+ завершених проектів у спортивній аналітиці.
Як ми досягаємо точності детекції 97%?
Основа системи — нейромережа YOLOv8, донавчена на спортивних сценах. Ми використовуємо модель з підвищеною роздільною здатністю та застосовуємо quantization INT8 для прискорення інференсу без втрати якості. Архітектура включає три ключові модулі:
Детекція та трекінг гравців на полі
import cv2 import numpy as np from ultralytics import YOLO from collections import defaultdict class SportsVideoAnalyzer: def __init__(self, sport: str, model_path: str): self.detector = YOLO(model_path) self.sport = sport self.homography = None self.field_width = 105.0 self.field_height = 68.0 self.player_tracks = {} self.ball_tracks = [] def set_field_homography(self, frame: np.ndarray): field_pts = np.float32([ [0, 0], [self.field_width, 0], [self.field_width, self.field_height], [0, self.field_height] ]) frame_pts = self._detect_field_corners(frame) if frame_pts is not None: self.homography, _ = cv2.findHomography( np.float32(frame_pts), field_pts ) def track_frame(self, frame: np.ndarray) -> dict: results = self.detector.track(frame, persist=True, conf=0.45) frame_data = {'players': [], 'ball': None, 'referees': []} for box in results[0].boxes: cls = self.detector.model.names[int(box.cls)] bbox = list(map(int, box.xyxy[0])) track_id = int(box.id) if box.id is not None else -1 cx = (bbox[0] + bbox[2]) / 2 cy = (bbox[1] + bbox[3]) / 2 field_pos = self._to_field_coords(cx, cy) if 'player' in cls: player_info = { 'track_id': track_id, 'team': 'A' if 'team_a' in cls else 'B', 'bbox': bbox, 'field_pos': field_pos } frame_data['players'].append(player_info) if track_id not in self.player_tracks: self.player_tracks[track_id] = [] self.player_tracks[track_id].append(field_pos) elif 'ball' in cls: frame_data['ball'] = {'bbox': bbox, 'field_pos': field_pos} self.ball_tracks.append(field_pos) return frame_data def _to_field_coords(self, px: float, py: float) -> tuple: if self.homography is None: return (px, py) pt = np.float32([[[px, py]]]) result = cv2.perspectiveTransform(pt, self.homography) return tuple(result[0][0].tolist()) Технічні деталі трекінгу
Для стабілізації треків при перекриттях використовуємо **фільтр Калмана** з моделлю постійного прискорення. Це дозволяє передбачати позицію гравця на 3–5 кадрів вперед. При втраті детекції трекер продовжує видавати позицію з похибкою менше 0.5 м до відновлення. У комбінації з колірними гістограмами це знижує розриви треків на 40%.Автоматичне виявлення ключових моментів
class KeyEventDetector: def __init__(self): self.ball_speed_history = [] self.formation_history = [] def detect_shot_on_goal(self, ball_tracks: list, goal_zone: dict) -> list[dict]: events = [] for i in range(1, len(ball_tracks)): if ball_tracks[i] is None or ball_tracks[i-1] is None: continue dx = ball_tracks[i][0] - ball_tracks[i-1][0] dy = ball_tracks[i][1] - ball_tracks[i-1][1] speed = np.sqrt(dx**2 + dy**2) if speed > 3.0: target_x = ball_tracks[i][0] + dx * 10 target_y = ball_tracks[i][1] + dy * 10 if (goal_zone['x1'] <= target_x <= goal_zone['x2'] and goal_zone['y1'] <= target_y <= goal_zone['y2']): events.append({ 'type': 'shot_on_goal', 'frame': i, 'ball_speed': speed, 'ball_pos': ball_tracks[i] }) return events def detect_pressing(self, team_positions: list, opponent_with_ball: dict) -> float: if not opponent_with_ball or not team_positions: return 0.0 ball_x, ball_y = opponent_with_ball['field_pos'] pressing_players = sum( 1 for p in team_positions if np.sqrt((p[0]-ball_x)**2 + (p[1]-ball_y)**2) < 5.0 ) return pressing_players / max(len(team_positions), 1) Теплова карта активності гравця
def generate_heatmap(player_track: list, field_w: float = 105, field_h: float = 68, resolution: int = 100) -> np.ndarray: heatmap = np.zeros((resolution, int(resolution * field_w / field_h))) for pos in player_track: if pos is None: continue px = int(pos[0] / field_w * heatmap.shape[1]) py = int(pos[1] / field_h * heatmap.shape[0]) px = np.clip(px, 0, heatmap.shape[1]-1) py = np.clip(py, 0, heatmap.shape[0]-1) heatmap[py, px] += 1 heatmap = cv2.GaussianBlur(heatmap.astype(np.float32), (15, 15), 5) heatmap /= max(heatmap.max(), 1) return heatmap Що входить в роботу: від прототипу до продакшену
Ми постачаємо систему як «під ключ»: від збору даних до розгортання на вашому сервері. У кожному проекті гарантуємо:
- Документація: model card з метриками, інструкція з експлуатації, API специфікація.
- Доступи: приватний репозиторій з кодом, docker-образи, навчені ваги.
- Навчання: 2–3 сесії для ваших аналітиків по роботі з дашбордом.
- Підтримка: 1 місяць супроводу після запуску, фікс інцидентів протягом 24 годин.
Досвід нашої команди — 5+ років у Computer Vision, 20+ завершених проектів у спортивній аналітиці. Ми застосовуємо MLOps практики для автоматизації пайплайнів навчання та деплою.
Як впровадити систему за 5 кроків?
- Аналіз даних: ви надаєте 2–3 записи матчів, ми оцінюємо якість відео та розмітку.
- Калібрування моделі: донавчаємо YOLOv8 на ваших даних, налаштовуємо детекцію подій.
- Інтеграція API: розгортаємо REST API для завантаження відео та отримання результатів.
- Тестування: прогоняємо на тестовій вибірці, коригуємо пороги.
- Деплой: встановлюємо docker-образи на ваш сервер, запускаємо в продакшен.
Як ми вирішуємо проблему перекриття гравців?
У переповненій штрафній детектор може втрачати гравців. Ми використовуємо multi-camera fusion та реідентифікацію за номерами, коли вони видимі. Якщо гравці зливаються, трекер продовжує передбачати позиції, а після розходження — відновлює ID. Це знижує кількість розривів треків на 40%.
Кейс нашого клієнта: професійний футбольний клуб
Наш клієнт — клуб Першої ліги. Завдання: автоматичний розбір 10–15 матчів на тиждень (свої + суперники). Раніше: 1 відеоаналітик, 3–4 години на матч.
Після впровадження системи від нашої команди:
- Автоматична нарізка: удари по воротах, стандарти, зміни володіння — за 8 хвилин на матч
- Теплові карти всіх гравців, статистика бігу (км/матч, спринтів)
- Аналітик витрачає 30–45 хв на розбір замість 3–4 годин
| Метрика | Точність |
|---|---|
| Детекція гравців | 94–97% |
| Трекінг м'яча (видимий) | 88–93% |
| Визначення команди за кольором | 91–96% |
| Детекція ударів по воротах | 86–92% |
Чому трекінг м'яча — найскладніша задача?
М'яч часто перекривається гравцями, зливається з фоном або швидко переміщується. Для підвищення точності ми комбінуємо детектор з трекером на основі фільтра Калмана і додаємо передбачення траєкторії. У наших тестах це дає приріст recall на 12% порівняно з чистим YOLO. Також ми використовуємо колірні гістограми для стабілізації треку при короткочасній втраті.
Терміни реалізації
Терміни проекту залежать від складності та становлять від 5 до 16 тижнів. Вартість розраховується індивідуально після аналізу ваших вимог. Оцінимо проект безкоштовно — просто напишіть нам.
Як почати роботу?
Достатньо надіслати 2–3 записи матчів (будь-які, не обов'язково ваші), і ми за 5 днів підготуємо демо-версію з візуалізацією трекінгу та детекції подій. Зв'яжіться з нами для безкоштовної консультації та замовте демо-версію прямо зараз. Наші інженери допоможуть підібрати оптимальну конфігурацію під ваш бюджет. Для складних сценаріїв розпізнавання дій ми використовуємо аугментацію даних та fine-tuning backbone моделі. Комп'ютерний зір — наша ключова компетенція, а MLOps у спорті дозволяє швидко впроваджувати зміни.







