ищем лучшие моменты в матчах Dota 2 с помощью collapse на magnus в рамках the international 2021

Ищем лучшие моменты в матчах Dota 2 с помощью Collapse на Magnus в рамках The International 2021 Дота

Здесь ты можешь найти любое видео (вод) прошедшей игры. При поиске ты можешь указывать турнир, стадию, раунд, команду, игрока и даже героя

  • BTS Pro Series S14
  • BB SB
  • Fallen Cup S2
  • Tundra
  • Secret
  • Liquid
  • Aster
  • PSG.LGD
  • Entity
  • nine
  • TA2000
  • YatoroGOD
  • Collapse
  • Stormstormer
  • Larl
  • aQua
  • Quinn

(RU) Ancient Tribe vs Water Rune Enjoyers | map 1 | DPC WEU 2023 Tour 1

DPC EU Tour 1, Lower Division, Table

(RU) IVY vs Team Bald Reborn | map 1 | DPC WEU 2023 Tour 1

DPC SA Tour 1, Lower Division, Table

(RU) UD Vessuwan VS SPAWN | map 2 | DPC SEA 2023 Tour 1

DPC SEA Tour 1, Lower Division, Table

(RU) Army Geniuses VS Xerxia | map 1 | DPC SEA 2023 Tour 1

Ищем лучшие моменты в матчах Dota 2 с помощью Collapse на Magnus в рамках The International 2021

С 2015-го года перед каждым The International Valve проводит Dota 2 Short Film Contest. Это конкурс видеороликов, в котором может принять участие каждый. И за все время существования этого конкурса уже скопилось довольно много качественных работ, которые кто-то мог пропустить. Роликов 2022-го года здесь нет, так как до конца приема заявок еще почти два месяца. Предлагаем вспомнить самые интересные конкурсные работы в материале Cybersport.Metaratings.ru.

TI 5

Неплохой ролик в техническом плане, есть сюжет и некая драма. Это была первая возможность участвовать в Dota 2 Short Film Contest, поэтому конкуренции было не очень много.

Новости:  A 15-year-old boy from Russia destroys publics. Already imposed 11 thousand MMR and already lost to Jatoro

Победитель того же года. Очень качественный ролик в техническом плане, который саркастично включил в себя основные проблемы и мемы того времени (BF на Drow Ranger, Daedalus на Crystal Maiden, 100% башей от Spirit Breaker, Faceless Void с универсальным уклонением). Конкуренции за первое место в том году и не было.

TI 6

Lesllee создал весьма много анимационных роликов по Dota 2. Его контент привлекает довольно простой, но приятной анимацией и графикой, а также своей забавностью. Его участие в конкурсе точно не было лишним.

К началу TI 6 Oracle был новым героем, так что увидеть ролик, посвященный ему, ожидали многие. Получился он довольно неплохим.

Небольшой и простой ролик, но на важную тему – проблему коммуникации между тиммейтами. За тридцать секунд автор показал все, что наболело.

Игрокам на первой позиции может очень понравится концепция этого видео. Отличное аудио, отличная задумка, все красиво выполнено.

Победитель 2016-го года. В принципе, почти каждый год победителями становились практически идеальные ролики, которые включали в себя долю юмора, отличный звук, шикарную техническую часть, а также раскрывали какую-то проблему. Идея этого ролика в том, что сапорты порой не выполняют свои функции, из-за чего остальная команда может страдать.

2016-ый выдался гораздо интереснее предыдущего года, и достойных кандидатов тут оказалось заметно больше.

TI 7

А первое место себе не изменяет. В очередной раз очень гениальная задумка, на которую приятно смотреть.

TI 8

Не самый лучший ролик в истории, но старания автора явно стоит отметить. Хорошая идея, несколько отсылок, да и технически отлично реализовано.

Идея похожа на The Ward с прошлого года. Одно неудачное действие, которое, казалось бы, не должно принести серьезных последствий, как раз именно их и несет.

Видео не получило высоких оценок, что немного странно. Очень качественный ролик с шикарным посылом – никогда не сдаваться.

Да что этот ваш Титаник? Вот настоящая драма. Экшена нет, но все весьма грустно. Людей настолько тронуло, что ролик получил второе место по итогам голосования.

Очередное первое место. Конкуренция была высока, но спорить с тем, что награда заслуженна, не имеет смысла. Все отлично реализовано, а концепция напоминает победителя прошлого года.

TI 9

Ролик, занявший второе место по итогам голосования, рассказывает об истории Рошана. Выглядит все очень красиво и интересно.

И победитель этого года. Автор 4fun стал завсегдатаем в списке призеров этого конкурса. Удивляться нечему – делает он видео крайне качественно. Ролик отличный, хотя сам год выдался довольно слабым.

TI 10

Так как в 2020-ом году TI не было, то времени на производство роликов было в два раза больше, лишний год, грубо говоря. Так что этот год выдался, наверное, лучшим на качественные видео. Невероятно красивый ролик, который даже в топ-10 не попал. Дело, скорее всего, в простой задумке, но как же это красиво исполнено.

Опять 4fun, но тут он выдал уже что-то невероятное. Если сравнивать с работами 2017-го года, то разница в техническом исполнении просто огромна. И при таком качестве видео заняло лишь третье место на голосовании.

Очевидно, что самая сложная работа в Dota2 досталась курьерам, но в 2021-ом им было уделено особое внимание, так как первые два места заняли ролики именно про курьеров. Заслуженно.

Все помнят патч, когда курьеры могли использовать предметы? Была доступна эта возможность не так долго, но зато именно она помогла данному ролику занять первое место по итогам года.

Каждый год зрители могли насладиться достойными работами, поэтому ждём окончания конкурса и новых интересных роликов.

Недавно в Dota 2 появилась возможность нарезать видео-ролики в формате .mp4 при просмотре записей матчей. Я не удержался и решил сделать простой алгоритм поиска интересных моментов aka хайлайтов. Вот что из этого получилось на примере последней карты гранд-финала The International 2021, где Collapse из Team Spirit катал PSG.LGD на своем Magnus’е.

Видео ускорено в 1.5 раза.

Под катом

  • Анализ событий матча
  • Кластеризация методом DBSCAN
  • Идеи по усовершенствованию подхода

Формат записей матчей в Dota 2

Но мы сегодня протобафы ковырять не будем. Вместо этого воспользуемся результатами умельцев из комьюнити (ссылка на репозиторий в конце статьи).

Парсинг реплеев

Естественно умельцы не остановились на достигнутом и реализовали парсер с говорящим названием Clarity. Он написан на Java и представляет из себя набор processor’ов, обрабатывающий события разных типов.

Чтобы не возиться с настройками, поднимем контейнер в Docker. Скачаем репозиторий.

git clone https://github.com/odota/parser.git

sudo service docker start

И выполним build-скрипт.

sudo bash parser/scripts/rebuild.sh

Под капотом скрипт создает контейнер и запускает веб-сервер на локальном порту 5600.sudo docker build -t odota/parser .
sudo docker rm -fv parser
sudo docker run -d —name parser —net=host odota/parser

У нас появился парсер.Теперь нужен реплей матча. Есть несколько способов его получить.

Вы можете скачивать реплеи через вкладку Watch в клиенте игры. Я использовалmatch_id = 6227492909.

Результат сохраняется в корневую папку игры. Пример пути на машинах под Windows.

C:Program Files (x86)Steamsteamappscommondota 2 betagamedota
eplays

Допустим мы справились с поиском .dem файла. Прогоним его через парсер.

На выходе получим JSON’ы, разделенные символами переноса строки и сохраненные в отдельный файл .jsonlines.

Анализ событий матча

Для удобства дальнейшего анализа расчехлим Python и Jupyter. Считаем файл с предыдущего шага и посчитаем количество событий.

40-минутный матч превратился в ~200k событий. Посмотрим на их структуру.

Видим, что разные события имеют разные поля. Но все события имеют поля type — тип события и time — время в секундах с начала матча. Стоит отметить, что время может принимать отрицательные значения. Это позволяет отделять события до и после выхода крипов (00:00 по часам матча).

Посчитаем количество событий разных типов.

Я предположил, что интересными могут оказаться те моменты, когда герои наносят друг другу урон. Рассмотрим подробнее события DOTA_COMBATLOG_DAMAGE. Для начала посчитаем, сколько урона игроки нанесли друг другу.

Урон персонажей друг по другу

Полученные значения я сравнил с выводами на все том же сайте OpenDota и остался доволен, потому что они совпали.

Обратим внимание, что в игре используются текстовые идентификаторы персонажей, которые могут не соответствовать привычным именам. Например, герой Magnus в реплеях использует кодовое имя npc_dota_hero_magnataur.

Визуализируем таймлайн урона от игрока Collapse на Magnus по персонажам других игроков.

События нанесения урона Magnus по другим героям по минутам матча

Матчи в Dota 2 можно условно разделить на 2 большие стадии: лайнинг и основная. В случае Collapse это разделение проходит по границе ~10 минут с момента выхода крипов. Герой Magnus раскрывается как раз в основной стадии за счет покупки Blink Dagger и обилия массовых драк. Поэтому отсечем события до 10 минуты, а также увеличим размер точек в зависимости от нанесенного урона.

Урон от Magnus по героям противников после 10-й минуты матча

Кластеризация методом DBSCAN

Заметим, что ощутимую часть времени персонаж не наносит урон. А значит и шансы обнаружить хайлайты в эти моменты крайне невелики. С другой стороны, события нанесения урона образуют достаточно плотные группы. Интуиция подсказывает, что эти группы и есть потенциальные клипы с хайлайтами. Все что требуется — найти начало и конец каждого клипа.

Задачу можно свести к кластеризации — методу машинного обучения без учителя, где общая идея заключается в том, чтобы разделить исходную выборку на подмножества похожих объектов — кластеры.

Алгоритмов кластеризации достаточно много, ниже иллюстрация результатов работы некоторых из них на синтетических данных.

Мы воспользуемся алгоритмом DBSCAN. Суть проста: объединить объекты, которые находятся — окрестности друг друга. Расстояние между объектами можно считать с помощью разных метрик, но в нашем примере хватит самой привычной — Евклидовой.

Причем мы не будем использовать абсолютное значение урона, а только время события. Т.е. для мы просто группируем события с интервалом не более ~30 секунд.

Вторым важным параметром алгоритма является min_samples. Он определяет минимальное число объектов в кластерах. Если вокруг точки мало соседей, то ей присваивается метка -1 — выброс. В данном примере можно взять min_samples = 1 и ничего не сломается, но на практике это может привести к клипам с хайлайтами, у которых начало будет совпадать с концом.

Кластеризованный урон от Magnus

Осталось только вспомнить, что кластеры в данном случае — временные промежутки матча. Для нарезки клипов с хайлайтами выделим начало и конец каждего кластера.

Успех! Осталось воспользоваться фичей игры и нарезать клипы. Итоговое видео вы уже видели в начале статьи.

Идеи по усовершенствованию подхода

  • Внимательный читатель заметит, что кластеризацию мы использовали скорее для общего развития. Можно потюнить параметры алгоритма или вовсе изменить подход для поиска временных промежутков с потенциальными хайлайтами.
  • Некоторые моменты получились не очень насыщенными. Как отсортировать временные промежутки по эпичности?Подсказка: можно использовать не только события урона.
  • Как реализовать автоматическую запись видео, чтобы не приходилось запускать клиент игры и накликивать руками?Подсказка: существуют консольные команды demo_goto, demo_gototick.

В следующей части мы увеличим масштаб и напишем сервис для параллельного парсинга реплеев на Celery и Flask.

Оцените статью
Dota Help
Добавить комментарий