Минчанин Константин Келлер создал сервис автоматической нарезки интересных игровых моментов из стримов, а потом переключился на распознавание скинов в «стрелялках». Но технологию не удалось довести до ума, и два уникальных сервиса пришлось заморозить. Константин рассказал в интервью Dev.by, что пошло не так и почему он не стал применять свои технологии в рекламе или порноиндустрии.
Читать далее…
Виртуальные матчи реальных спортсменов
Всё началось с моего увлечения видеоиграми и стримингом. Я разрабатывал приложение, которое позволяло играть в фэнтези-киберспорт. В Америке фэнтези-спорт пользуется совершенно сумасшедшей популярностью. Эта миллиардная индустрия зародилась где-то в 2006–м. Например, любишь ты баскетбол. Ты можешь собрать виртуальную команду игроков, которые в реальности будут играть в эти дни какие-то матчи, и соревноваться с такими же, как и ты, юзерами с их виртуальными командами — на основании тех очков, которые реальные игроки наберут в своих матчах. Можешь задрафтить себе Стефена Карри, Леброна Джеймса и, если они хорошо играют, ты наберёшь много очков.
Эта твоя виртуальная команда не соответствует реальной команде: ты драфтишь игроков из настоящих, но разных команд. И наблюдать за тем, как они играют, становится проблематично: матчи–то проходят в разное время и лишь иногда пересекаются друг с другом. И я решил, что было бы классно посмотреть видеоролик с нарезкой лучших моментов, в которых участвуют лишь игроки моей виртуальной команды.
Я придумал название Fansy: это от слова Fantasy, я игрался с формами, искал что-то компактное, ёмкое — вот и получилось «фэнси». И слово не было занято ещё. На самом деле, над названием долго не думали.
Мы начали эксперименты: оказалось, что вручную хайлайты вырезать тяжело, долго и дорого. Искали способ сделать это дёшево и быстро. В конце 2015 года в ряде штатов фэнтези-спорт приравняли к азартным играм, что привело к необходимости получать лицензию в каждом штате, где у тебя есть пользователи, — и мы работу над проектом остановили.
Если есть убийство — значит, интересно
Где-то через год, в декабре 2016-го, в Минске проходил AI-хакатон. Еще до него я создал пост на «Сабреддите Твитча» и спросил стримеров, нужен ли им сервис, который за них станет нарезать хайлайты. Если пост наберет сто апвотов — мы попробуем сделать прототип. Пост набрал несколько сотен апвотов и положительных комментариев всего за несколько часов.
Я стал искать разработчиков и по счастливой случайности познакомился с Сергеем. Он тогда жил в Ростове, работал в местном НИИ и преподавал компьютер-вижн. В тот момент он занимался похожей идеей для реального спорта. Мы начали обсуждать идею и решили разрабатывать продукт для киберспорта, для игр. Сергей прилетел на хакатон, мы впервые увидели друг друга и за 48 часов сделали прототип, который даже смог более-менее приемлемо нарезать хайлайты.
Видеоролики — это такие чёрные ящики интернета: нет возможности автоматически проиндексировать содержимое, добавить разметку либо сделать навигацию. Для компьютера это всего лишь набор пикселей. С появлением видеостриминга проблема стала ещё более актуальной: за 5 лет на платформе Twitch было создано около миллиарда часов игрового видеоконтента, который мало популярен — потому что по нему невозможна навигация.
Мне хотелось сделать сервис, который будет «понимать» игровые видео: научится определять, что это за игра и какие в ней ключевые события. Как оказалось, до нас никто ничего подобного не делал. Были компании, которые смотрели не на видео, а на поток данных. Они брали реплей, в котором были данные обо всех событиях, оцифровывали его, превращали в видео и размечали. То есть, они использовали не компьютер-вижн, а файл реплея с метаразметкой и данными. В гаражах эту идею с компьютер-вижном на коленке пилили около полудесятка людей, но они не выходили с ними и по разным причинам забрасывали.
Мы изучали вопрос и выяснили, что у топовых стримеров есть профессиональные видеоредакторы, которые за них делают всю работу: просматривают по много часов видео в день, находят самые интересные моменты и делают из них нарезки. И в большинстве случаев редактору принадлежит канал: стример платит ему какие-то деньги за монтаж, а весь доход с рекламы от просмотров тоже забирает видеоредактор. А стримеры с меньшей аудиторией делают это сами вручную либо же вообще не занимаются своими Ютуб-каналами. У большинства стримеров нет хороших каналов, там в лучшем случае быстро срезанные записи: «Вот я выложил 5-часовой стрим, смотрите».
Мы начали с League of Legend: около 80% всей аудитории сосредоточено вокруг 8-10 самых популярных игр. Так что мы взяли самую популярную: месячная аудитория там около 110 миллионов. Плюс она очень зрелищная, по ней проходят киберсоревнования, как и по «Доте» и «Каунтер Страйку», — за этими играми интересно смотреть. А поскольку я сам играю в «ЛоЛ», то понимаю, что там и как.
Когда я думал, как решить задачу, то видел три возможных варианта: анализировать на уровне клиент-сервер, брать данные из официальных API игры либо использовать компьютерное зрение. Универсальным вариантом оказалось именно компьютерное зрение. Сначала надо распознать игру, а потом распознать в ней разные события. Является ли видео игрой? Если да — то какой именно? Можно предположить, что в нужных нам играх для изображения характерен особый визуальный паттерн, который можно получить из численного представления гистограммы изображения. Используя эти данные, можно обучить классификатор.
В целом в играх интересные моменты строятся вокруг ключевых событий — например, убийств. И если было убийство — значит, момент точно был интересным. Вопрос в том, как выбрать точку начала и конца этого хайлайта. Как в футболе: все знают, что интересны голы, ещё иногда интересны пасы — их можно отследить.
Для распознавания самих событий можно использовать до пяти источников информации:
1. Визуальные маркеры (движение персонажей, визуальные эффекты);
2. Аудиомаркеры (звуки событий, выстрелов, заклинаний);
3. UI-элементы (счёт, текстовый либо графический лог событий);
4. Лог чата стриминг-платформы;
5. Эмоции стримера (распознание речи и эмоций, если используется веб-камера).
Четвёртый и пятый источники лишь косвенно указывают на наличие события, но зато могут выступать маркерами значимости момента.
Самым многообещающим и простым в реализации выглядел подход с использованием UI-элементов игрового интерфейса. Нужно всего лишь декодировать видеопоток на отдельные кадры, в кадре локализовать элементы игрового интерфейса и отследить изменение их визуального состояния либо распознать текстовую информацию (текущее время, счета, имя героя). Для хакатона мы выбрали этот подход, и в результате финальный прототип распознавал примерно три четверти всех событий тестовых видео.
Но сложно определить, в какой момент начать вырезание. Иногда нужно брать не само убийство и даже не эпизод за пять секунд до убийства: бывает, кто-то кого-то преследует секунд двадцать и только потом убивает, — интересна вся сцена целиком. Для хакатона мы проанализировали, сколько в среднем занимает одна такая сцена — и на такой длительности остановились. Самые интересные моменты в «ЛоЛе» длятся 7-15 секунд, а крупные тим-файты — 30-40 секунд. Средняя игра длится 30-40 минут, и нарезка самых интересных моментов получалась на 5-10 минут, включая в себя 15-40 хайлайтов.
Нарезаю стримы: доллар за ведро
Ещё нужно было дать ответ на вопрос, где производить анализ и распознание видео: локально, на компьютере пользователя, или на сервере? Продуктам вроде MSQRD и Fabby критически важно переносить обработку фото/видео на мобильник пользователя. Для нас же ситуация была обратной. В связи с тем, что компьютер пользователя уже занят двумя очень тяжёлыми процессами — рендерингом игры и трансляцией стрима — добавление процессов декодирования и распознания привело бы к уменьшению fps в игре. А перенос алгоритмов распознания в облако не требовал от пользователя устанавливать наше ПО и давал возможность анализировать уже загруженные в сеть видео.
Тогда на хакатоне мы даже не попали в тройку лидеров. Начали ресерчить дальше и смотреть, что из этого можно сделать. Надо было проверить: как дорого будет стоить обработка одной минуты стрима? Популярный стример играет каждый день примерно по 6–8 часов, допустим, 25 дней в месяц, — итого около 175 часов. И если выйдет, что только на оплату серверов для каждого стримера надо будет платить 20-30-40 долларов — то эти же деньги лягут на плечи самих стримеров. А мы хотели выяснить: сможем ли мы сделать обработку стримов настолько дешёвой, чтобы для части стримеров вообще предложить бесплатную модель?
Для обработки видео мы стали использовать AWS EC2 spot instances: начали с версии m3.2xlarge и спускались вниз, к более дешёвым версиям, анализируя производительность. В итоге оказалось, что для обработки стрима в 1.080p достаточно инстанса t2.large. Цена на него колебалась в районе 3 центов в час. То есть, себестоимость поддержки топового стримера с точки зрения лишь работы оборудования составляла бы примерно 5 долларов в месяц, что уже позволяло нам дальше продолжать ресерч.
Чтобы сервера не простаивали в моменты, когда стример спит, мы написали микро-сервис, который следил за онлайн-статусом Twitch-каналов и запускал инстанс только в момент, когда начиналась трансляция. В команде этот микро-сервис получил прозвище Саурон.
По умолчанию мы могли бы обрабатывать стримы бесплатно, но их хранение в хорошем качестве и бесконечным сроком мы бы предоставляли за какую-то подписку в месяц. Сергей подключил двух семи-миддл разработчиков, которые помогали нам с веб-архитектурой и с распознанием.
Я подался на все местные конкурсы, что проводились: Imaguru проводил стартап-сауну и питч-батл от «Логина» (это крупная литовская конференция), и, соответственно, был венчур-дей. Мы тогда выиграли Venture Day, отобрались в весенний батч Startup Sauna и выиграли поездку на Login.
Следующей целью был прототип продукта, который можно тестировать на стримерах. Но мы начали понимать, что на SaaS-модели много не заработаешь. Весь рынок стримеров — это несколько сотен тысяч человек, но 90% аудитории сосредоточено у нескольких тысяч стримеров. Это хороший бизнес, но это не стартап: потенциальный размер рынка всего лишь пара тысяч стримеров, а не пара сотен тысяч. Мы решили ещё немного переформатировать продукт.
Хочу вот эту пушку
Если смотришь трансляцию «ЛоЛа» и видишь классный скин, то хочется купить его себе. Но сходу у зрителя нет информации, что это за скин — точно так же, как у телезрителя нет информации, что за бутсы носит футболист на экране. Скинов в игре несколько сотен, причем зритель ищет и покупает их только после просмотра стрима — соответственно, конверсия ниже. И мы решили, что надо научиться распознавать эти скины и предлагать зрителю возможность прямо сейчас отложить их в корзину, чтобы после окончания просмотра купить. Это хороший способ дополнительной монетизации как для платформы, так и для стримера.
Мы начали изучать рынок скинов и выяснили, что он очень большой. В 2016 году 160 миллионов геймеров потратили 6 миллиардов долларов на скины и вэнити-айтемы. Сумасшедший рынок! Начали думать, как его увеличить, как договориться с паблишерами. Сначала мы запустили на Ютубе прототип для тестирования конверсии. Обычный ролик, в конце которого были ссылки на покупку скинов из видео. Конверсия оказалась неплохой. Тогда мы обзвонили владельцев всех нишевых стриминговых платформ с предложением проинтегрировать прототип для тестирования; многие заинтересовались.
Выглядело бы это так. Ты смотришь какой-то стрим и видишь классный хайлайт: человек из «калаша» убивает пятерых, и у него какой-то сумасшедший зелёный скин. Тебе интересно — что это? Под стримом у тебя небольшой блок — это наш виджет, который встроен в дизайн сайта, как будто это фича самого сайта. Наводишь на блок — и тебе показывается: это такой-то скин, стоит столько-то, и тут же кнопка «Купить». ОК, думаешь ты, отложу в корзину и вернусь к этому позже. У тебя эта информация сохранилась, ты можешь не отвлекаться от стрима и ты знаешь, что в конце трансляции ты сможешь пересмотреть в корзине все скины, что встретились тебе во время матча, и купить какой захочешь.
В данном случае мы работали с CS: GO, потому что у них открытые маркеты: легко было встроиться в экосистему продаж, можно было найти ссылки на все айтемы и дать их в любом виджете, продавать и смотреть, сколько можно заработать.
Алгоритм распознания не зависит от платформы. Мы забираем стрим с платформы точно так же, как будто его забирает компьютер пользователя, анализируем его и возвращаем данные. Это могло бы работать и на консолях, но, как мне кажется, самые интересные конверсии были бы только на компьютерах. Отчасти потому, что на консолях нет таких крутых ММО и competitive-игр, на которых скины продаются такими объемами и у которых такое же внимание со стороны стриминга. То есть, это были бы «писишные» игры: Dota, LoL, Counter Strike, PUBG и так далее. Нам нужно лишь проинтегрировать свой виджет.
С шопами, которые продают эти скины, мы договорились о реферальной программе по следующей схеме: от покупки в 10 долларов примерно 10-15% доставалось бы нам. Из этой суммы 70% уходило бы самой платформе, оставшиеся 30% — непосредственно Fansy. По сути, похоже на Google AdWords. Но, конечно, мы понимали, что очень крупным платформам вроде Twitch, Douyutv или Beam в долгосрочной перспективе не выгодно делиться с нами комиссией. Посмотрев на работу нашего виджета и на конверсию, они бы просто купили нас.
Но поначалу мы договорились с очень небольшой платформой, у которой и процента всего трафика не было. Но все же объем трафика был достаточным, чтобы проверить гипотезу, посмотреть на конверсию и уже с презентацией, слайдами и цифрами идти на крупные платформы.
«ЛоЛ» и «Танки» не продают свои скины через third party marketplaces, они продают только через свой маркетплейс. И шансы, что мы уговорим «ЛоЛ» делиться с нами комиссией с продажи, очень сомнительны. Но если бы мы договорились с Twitch, то потом, используя их имя и команду, могли бы уже зайти в «ЛоЛ» и договориться с ними о продажах. Потенциально к этим шести миллиардам долларов рынка мы бы могли добавить пару-тройку процентов.
Но гораздо сложнее, чем договориться, оказалось научиться распознавать эти скины. Это уже не просто сцены для нарезки хайлайтов — тут надо опознавать сам 3D-объект разных цветов, с разными фонами, в разных проекциях, — задача намного сложнее. Следующие три месяца Сергей работал над прототипом, а я общался с владельцами магазинов скинов, с паблишерами, со стриминговыми платформами.
Примерно с конца мая до середины июля мы этим занимались, между итерациями проходило по нескольку недель. А где-то к июлю 2017 года третья итерация алгоритма распознавания показала, что мы не можем делать распознавание объекта с достаточным качеством.
Мы не смогли обеспечить 99% распознавания и минимального ложного срабатывания — в таких случаях приходилось бы оформлять возврат денег, а это очень дорого и влияет на репутацию всех партнеров, начиная от стриминговой платформы и заканчивая магазином, который тебе айтем продал.
Даже если распознаванием скина платформа занимается через партнера, все равно все будут думать, что это делает «Твитч». И в случае неправильного распознавания и возврата денег падает репутация именно у «Твитча».
А мы не смогли сделать даже 90% распознавания: у третьего прототипа распознание было на уровне 70%, но в этих 70% было много некорректно распознанных скинов. Мы распознали скин, но это оказывался не тот айтем, — и это приходилось вручную отсекать. А для того, чтобы работать с крупными стриминговыми платформами, надо было или обеспечить 99% распознавания, или распознавать чуть меньше скинов, но зато с абсолютной точностью. А это сложно, потому что они маленькие, очень похожи друг на друга, в динамике, фон меняется.
Проблему можно решить, собрав достаточно большой датасет. Но для игр подобных датасетов нет, и их надо собирать вручную: оцифровать много видео, нанять людей для разметки, причем людей, разбирающихся в игре. Задача для команды из четырех человек выглядела очень дорогой и трудоемкой. Получилось, что мы тратим слишком много энергии на проект с очень высокими рисками и непредсказуемым результатом. Неясно было, какая выйдет конверсия, даже если у нас всё получится.
И тогда мы решили заморозить проект до тех пор, пока не сможем сделать нормальное распознание. Мы не закрывали проект, там до сих пор работают сервера, и Сергей продолжает эксперименты. Но пока непонятно, как добиться приемлемого уровня распознавания.
Мы не будем патентовать свои находки, мы за опен-сорс. Если бы код был написан нормально, с комментариями, мы бы его выложили. Очень многие продукты в мире созданы на базе опенсорсных проектов, и мы тоже такими пользовались в своей работе. Рынок движется вперед благодаря ресерчам и проектам, которые выкладываются в открытый доступ.
Можно было бы заняться распознаванием вещей в видеороликах. Смотришь кино или рекламу, видишь у парня куртку — о, хочу себе такую же. Сервис распознал, ты в два клика купил. Многие компании работают над этим. И есть две причины, почему мы не смотрим в эту сторону. Первая — именно потому, что компаний много: «Гугл», «Амазон» и компании поменьше, — конкурировать с ними уже поздно. Вторая — мы все же нацелены на гейминг, на компьютерные игры, именно это нас тянуло вперед.
Да, с точки зрения коммерции выгоднее делать распознавание объектов в рекламе, например. Это совершенно космический рынок: у YouTube миллионы видосов, и никто не знает, что там за вещи. Но мы не пытались заняться коммерцией, мы не делали стартап на миллион, мы просто хотели поиграться с технологией. Стартап — это такая штука, которой надо заниматься долго. Ты поднимаешь раунды, берёшь на себя обязательства и в целом увязаешь в этом на много лет, от двух до десяти. И ты должен очень любить то, что ты делаешь. А я не хочу распознавать объекты в рекламе. Мне после хакатона вообще предлагали начать распознавать сцены и объекты в порно — там ещё больше денег, там компании богаче. Тоже можно распознавать инструменты, игрушки, и тоже можно делать нарезки хайлайтов. Но это не та ниша, в которой я бы хотел работать.
Возвращаться к нарезке стримов тоже не будем: это не настолько интересная история, чтобы превращать её в стартап. От «Амазона» мы выиграли кредит на 120 тысяч долларов, благодаря этому работают наши серверы по нарезке стримов, и люди смогут пользоваться нашим сервисом до лета. Потом мы напишем им письмо и отключимся.
А я с августа заинтересовался блокчейном и теперь все силы отдаю новому проекту.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.