PogChampNet — как мы использовали чат Twitch для создания лучших моментов

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


PogChampNet — как мы использовали чат Twitch + глубокое изучение механики автоматического создания лучших моментов только из исходного видео в Visor.gg

Сможем ли мы создать алгоритм, способный самостоятельно находить самые важные и достойные моменты, предоставляя так много видео игрового процесса Overwatch?

Меня зовут Фарза, и раньше я работал над Visor.gg! После ухода из Visor, я попросил разрешения рассказать об одном из своих безумных проектов, над которым я работал вместе со своим коллегой Уильямом — PogChampNet: нейронная сеть, обученная мемами (да, именно так). Вот и она!

В представленном выше видео содержатся лучшие моменты популярных стримеров Overwatch на Twitch, найденные спустя многочасовой просмотр записей их видеотрансляций. Однако, эти моменты не были выбраны человеком. Они были подобраны сверхточной нейронной сетью, которая «просматривала» видео и автоматически создавала клипы с, как ей казалось, достойными моментами только из исходного видео, больше ничего. Просто пиксели. Всё в реальном времени.

Не стесняйтесь задавать мне свои вопросы на Twitter farzatv. Вы также можете скачать проверенную версию PogChampNet тут и основной тестовый скрипт тут.

Погодите, что?

Поговорим о том, как этот алгоритм работает. Чат Twitch, тот самый дикий зверь, что находится в правой стороне каждой видеотрансляции.

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

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

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

Проще говоря, чат Twitch описывает видеотрансляцию для нас!

Если на экране происходит что-то смешное, чат трансляции наполняется словами типа LOL, LMAO, and LUL.

Если происходит что-то действительно впечатляющее, например, стример сделал потрясающее тройное убийство и чудом остаётся живым, то чат Twitch взорвётся фразами, вроде Pog, POGGERS и PogChamp:

Тогда-то я и подумал: «Хорошо, у нас есть тысячи часов записей видеотрансляций и тысячи часов чат-логов, может ли это быть полезным?». За работой над Visor.gg мы долго работали над машинным зрением и глубоко изучали агрегатные данные из компьютерных игр. Когда я ещё над этим работал, одной из проблем было автоматическое создание лучших моментов. Подобные системы давно существовали, но всё, что они делали, было вот этим:

если игрок_сделал_кучу_убийств:
создать_момент()

иначе:
не_создавать_момент()

Главный недостаток этой системы заключается в том, что для создания моментов она использует эти закодированные от руки алгоритмы. В таком случае, если игрок убьёт кучу врагов, то он получит момент. Но что, если, играя в Overwatch, я сделал всего одно убийство, но оно было великолепно просчитано? Или, если я играю на Райнхардте, никого не убил, но совершил что-то, что вырвало победу у врагов? Это всё могло бы быть прекрасными лучшими моментами, но данная система просто не сможет определить это. Для этого потребуется еще больше закодированных от руки алгоритмов.

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

Чат Twitch спешит на помощь

Если я хотел создать нейронную сеть, способную автоматически создавать моменты, то мне бы понадобилось очень много индексированных данных! Однако, меня не особо устраивало тратить столько часов на индексацию информации. Вот тогда-то мне и помог чат Twitch. Как вы уже поняли, чат разрывает словами, вроде POG, POGGERS и PogChamp, когда в игре происходит что-то впечатляющее.

Идея была простой: создать проиндексированные видеоданные, опираясь на чат Twitch, которые мы могли бы «скормить» нейросети, которая в свою очередь оценивает, насколько момент стоящий. Например, если чат взрывается от волнения, то это означает, что в этот момент на трансляции произошло что-то очень интересное.

Я рассказал парочке моих друзей об этой идее, и они всегда дико смеялись и потом добавляли: «...погоди, ты серьезно?»

Так я и мой коллега Уильям начали работать, чтобы доказать, что скептики не правы!

Выбор стримеров

Для начала, нам надо было выбрать стримеров, чьи записи трансляций и чат-логи мы хотели бы использовать, чтобы протестировать нашу нейронную сеть. Эти стримеры должны были:

  1. Очень хорошо играть в Overwatch, чтобы мы могли отобрать как можно больше захватывающих моментов его/её геймплея.
  2. Иметь полный чат зрителей, готовых спамить смайликом PogChamp, когда он/она делает что-то безумное в игре.

Этими стримерами стали: xQc, Seagull, Mendokusaii и PvPTwitch.

Сбор данных

Шаг 1: Сбор видеоматериалов с Twitch. Мы с легкостью собрали необходимый нам материал с помощью TwitchLeecher. Мы просто скачали множество записей прошлых видеотрансляций.

Шаг 2: Сбор чат-логов каждой записи трансляции. Это было также очень легко, мы просто использовали программу TwitchChatDownloader.

Шаг 3: Нахождение интересных моментов. Мы написали скрипт, который разбирал чат-логи и находил моменты, где чат спамил ключевыми словами как «PogChamp», «Poggers», «wow», «holy shit» и многими другими. Вот почему мы назвали наш алгоритм PogChampNet :). Опираясь на временную отметку, когда чат сходил с ума от восхищения, мы создавали 30-секундный клип из загруженной видеозаписи. Идея заключалась в том, что если чат Twitch был так возбуждён, значит на экране должно происходить что-то интересное. Мы также знали, насколько интересным получился момент, основываясь на количестве обнаруженных нами ключевых слов.

Вот несколько ключевых слов из чата Twitch, по которым мы определяли, насколько момент интересен.

Шаг 4: Создание клипов поменьше. К этому моменту у нас были сотни 30-секундных видео. Многие из них действительно были такими, как мы хотели: очень впечатляющие моменты, на которых стример делает по-настоящему хорошую игру. Это было великолепно. Вместо просмотра сотен часов игрового процесса, мы смогли собрать данные за часы, а не за недели. Но была небольшая загвоздка. 99% времени этих 30-секундных клипов не были заслуживающими лучшего момента. Стоящими были всего 5-10 секунд. Нам был необходим более четкий способ промаркировать клип. Мы буквально взяли каждый 30-секундный клип и разбили его на 30 1-секундных нарезок.

Шаг 5: Усовершенствование системы. Отлично, теперь у нас есть тысячи 1-секундных клипов. Мы хотели распределить каждый из этих крошечных клипов по их насыщенности событиями. Уильям создал позволяющую нам быстро и легко распределить каждый клип программу, опирающуюся на нашу придуманную шкалу от 0-9. Мы очень низко оценивали клипы, в которых игрок просто шёл или не проявлял много активности. Высоко мы оценивали клипы, в которых игрок активно себя вёл и обменивался атаками с врагами.

Заметка: Не все клипы были оценены по данной шкале. Некоторым клипам присваивались пометки «п» и «г». Клипы, которые почти никак не связаны с Overwatch, например, где стример отжимался (разминался), должны быть отмечены пометкой «п» — «пропустить», за момент, не относящийся к игре. Для видеозаписи, в которой что-то прервало стримера от игры, и он приостановил её, мы давали метку «г», «геймплей прерван». Благодаря этому, наша нейронная сеть обучалась самостоятельно определять моменты без игрового процесса, что снижало шанс на ложное срабатывание.

ОТЛИЧНО. Теперь у нас есть тысячи промаркированных 1-секундных клипов.

Время глубокого изучения

Я не хотел сильно всё усложнять, а выбрать самую простую версию из всех идей. Думаю, часто люди слишком увлекаются, выбирая структуру нейронной сети, и получают слишком сложные и труднообучаемые модели. Именно поэтому мы пошли безопасным путём и просто выбрали InceptionResNetV2. Это созданная Google структура, которой пользуются множество людей.

Нашей следующей задачей было понять, как теперь «скормить» нейронной сети все эти маленькие клипы, как видео. Поначалу я думал, что нам придется прибегнуть к рекуррентной сети, вроде LSTM, чтобы помочь нашей нейронной сети понять длительность наших клипов. Например, возможно это помогло бы ей «просматривать» полностью 1-секундные видео, для принятия лучшего решения, насколько это достойно лучшего момента.

Но с первой версией вы всегда хотите, чтобы она была как можно более проста/глупа, чтобы установить своего рода базовый уровень. Я избавился от идеи «скармливать» нейронной сети видео, и вместо этого мне на ум пришла идея сделать проблему создания лучших моментов проблемой не классификации видео, а классификации изображений. Классификация изображений значит — «я дал тебе картинку, назови, что на ней изображено». То есть, если я дам картинку автомобиля нейронной сети, то она должна выдать слово «автомобиль». Вот так просто. Но что, если мы дадим ей скриншот одного из наших 1-секундных видео, то сможет ли она определить его насыщенность по шкале 0-9?

Знаю, это звучит странно. Как нейронная сеть способна сказать, содержателен ли был этот момент просто по изображению? Попробуйте представить, что я дал вам несколько картинок, приведенных ниже. Сможете ли вы в целом определить, какие из них были взяты из достойных лучших моментов?

Именно! Две верхние картинки были взяты из довольно захватывающих моментов. На обеих видны убийства, взрывы и использующиеся в данный момент способности героев. А вот две картинки снизу, очевидно, были взяты из неинтересных моментов. На одной из них Маккри просто идёт, а на второй — стример собирается вернуться в главное меню. Так что похоже, мы можем обратить это в проблему классификации изображений, когда мы берём изображение за исходные и выходные уровни оценки момента по шкале от 0-9!

Мы продолжили разбирать каждый индексированный 1-секундный ролик в серии данных и разбили его на 30 кадров. Это совсем не трудно, так как кадровая частота записей была в 30 FPS. Затем мы взяли десятый, двадцатый и тридцатый кадры, сохранили их по отдельности, а объединили их в отдельный индекс для этого 1-секундного клипа. Например, если у 1-секундного клипа была оценка 6, мы бы взяли его десятый, двадцатый и тридцатый кадры, то все бы эти три кадра получили оценку 6.

В конечном счете база данных выглядела вот так:

[
"image_1.png" : 4,
"image_2.png" : 4,
"image_3.png" : 4,
"image_4.png" : 6,
"image_5.png" : 6,
"image_7.png" : 6,
"image_8.png" : 2,
"image_9.png" : 2,
"image_10.png" : 2,
...
]

У нас было около 40 000 индексированных изображений в базе данных.

Заметка: Мы решили отбирать только 3 кадра (вместо всех 30), чтобы избежать добавления множество повторяющейся информации в нашу база данных. Например, 2ой и 3ий кадры в игре будут выглядеть чуть ли не идентично. Это могло бы повредить способность нашей нейронной системе делать выводы!

Практика

Здесь и заканчивается самая сложная часть — объединение множества информации в базе данных. Мы использовали Keras + Python, что было, к слову, очень просто.

get_model — это тот самый код нашей нейронной системы. Он, буквально, меньше, чем пять строк. Прошу заметить, как здесь устроены 12 классов. 10 классов принадлежат шкале 0-9, а 2 оставшихся класса — это «п» и «г».

А затем мы добавили туда скрипт, на котором обучалась наша нейронная сеть (выше). Вот и всё! Мы прогнали его через GCP на 2 Tesla K80s, и это заняло примерно 12 часов на 20 эпох тренировки. Вот и всё!

Время для тестирования / Интересное поведение

Как нам удалось перейти от классификации отдельных кадров до создания клипов во время тестирования? Мы решили найти самые захватывающие моменты из 60-секундного видео. Мы просматривали эту видеозапись, брали каждый десятый кадр, давали его PogChampNet, и получали оценку. Если мы получали несколько больших оценок подряд, наш скрипт обрабатывал эти кадры и создавал 10-секундный клип из них. Если же мы получали маленькие оценки, то мы просто продолжали, ведь это значит, что на этих кадрах не произошло ничего интересного.

Видео в начале этой статьи уже показывает, насколько хорошо работает PogChampNet. Он пугающе хорош в выборе клипов, и делает свою работу отлично. Но, к сожалению, всегда найдутся небольшие проблемы при работе нейронной сети.

Мы хотим вам показать примеры ошибок нейронной сети, когда она оценила момент высоко, когда на самом деле ничего особенного не происходило!

Это открытие контейнеров было оценено на 6.

Эта сцена из видео по League of Legends получила 7.

Этот клип, в котором крутится Таран, был отмечен цифрой 6.

Так что нейронная сеть еще далека от идеала. Подобные ошибки происходят из-за того, что в базе данных всего около 40 000 картинок, поэтому модель не может чётко разобрать каждый клип, что она видит. Я знаю, что выражение «оно ломается, потому что надо больше данных» звучит как отговорка, но тут проблема как раз именно в этом!

Заключение

В целом, PogChampNet работает в разы лучше, чем мы ожидали. Он легко может найти самые захватывающие моменты даже в 10-часовой видеотрансляции, всего несколько раз сработав ложно. Будущие улучшения определенно будут включать в себя использование рекуррентной сети или 3D сверточного направления, чтобы улучшить временное качество данных.

Ну, вот и всё! Нейронная сеть, обученная мемами. Не стесняйтесь задавать мне вопросы, возникшие по поводу PogChampNet, большое спасибо за то, что прочитали эту статью!

Перевод: Саша КотоваРедакция: Amarayne Источник


Источник: m.vk.com

Комментарии: