Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

Сбор скриншотов, уточнение задачи и другие технические подробности всего процесса.

Геймдизайнер Гейб Смедресмен опубликовал текст о создании алгоритма, который способен находить такие же паттерны в реальной жизни, как и environmental-пазлы в The Witness. В финале Гейб признался, что полученного результата недостаточно, чтобы решить задачу, но его наработки может использовать кто-то другой. Автор детально рассказал, как постепенно уточнялась его задача, и поделился подробностями всего процесса.

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

После прохождения некоторые игроки начинают замечать эти паттерны даже в реальной жизни
После прохождения некоторые игроки начинают замечать эти паттерны даже в реальной жизни
Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

Сбор данных и уточнение задачи

Для начала Гейб сделал около 300 скриншотов environmental-пазлов с разных ракурсов — на некоторых головоломки видны чётко, а на других присутствуют препятствия.

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

Гейб вручную создал обучающие метки для каждого из этих скриншотов. Чтобы ускорить процесс, в Photoshop он сделал специальный экшен для автоматизации повторяющихся шагов. Автор использовал инструмент «Выделение и маска», чтобы выбрать область головоломки, а затем запускал экшен, который преобразовывал эту часть в чёрно-белое изображение и сохранял её как PNG в папке «метки».

Обучающие маски наложены на исходные скриншоты
Обучающие маски наложены на исходные скриншоты

Автор отметил, что во время решения задач интереснее всего переосмыслять весь процесс и преодолевать проблемы. Его первоначальная формулировка задачи звучала так — идентифицировать и маркировать шаблоны environmental-пазлов. Но оказалось, что такой вариант неточен: появлялись неожиданные проблемы, из-за которых пришлось уточнить определение того, какие части изображения должны быть помечены как головоломка.

Вот что касается круглой точки, с которой начинается каждая линия.

  • Можно ли учитывать круг, который скрыт за объектом?
  • Можно ли учитывать круг, который не полностью виден в области просмотра?
  • В какой мере допустимы отклонения и неровности в границах круга?
  • Под каким углом можно смотреть на круг, а под каким нельзя?

И вот что касается линии всего остального паттерна.

  • Можно ли считать приемлемой линию, которая выходит из поля зрения?
  • Какая степень расширения или сужения линии приемлема?
  • В какой степени приемлемо изменение цвета в пределах линии или круга?
  • Если на линию наложен прозрачный элемент (лазер или тень), следует ли это считать прерыванием линии? Должен ли он быть помечен как часть линии?

Архитектура модели

По сути, эта задача обычно называется «семантическая сегментация». Модель должна маркировать, какие пиксели изображения относятся к определённому типу объекта. Гейб выбрал модель архитектуры U-Net — изначально её разработали для сегментации медицинских изображений.

У U-Net есть энкодер (левая сторона изображения), который развивает возможность обнаружения признаков через несколько свёрточных слоев, и декодер (справа), который создаёт семантическую карту всего изображения через слияние информации об объекте из нижней части U с информацией о местоположении из энкодера.

Слева энкодер, справа декодер
Слева энкодер, справа декодер

Автор использовал пример кода U-Net, чтобы решить свою задачу.

Запуск кода

Гейб отметил, что для запуска кода не нужен опыт. Это можно сделать самостоятельно.

git clone git@github.com:wandb/witness.git pip install -r requirements.txt # Init on W&B to save your run results wandb init # Split data from /data/all into a training and validation sets ./process.py # Train your model, and save the best one ./train.py # Output the prediction for all examples in the validation set ./predict.py

Автор использовал инстанс p3.2xlarge на Amazon EC2 для запуска обучения. Эти инстансы используют графические процессоры для более быстрого обучения. Гейб применял Ubuntu Deep Learning AMI, который предварительно устанавливает все необходимые двоичные файлы и библиотеки Python.

Первые результаты

Даже самый первый запуск дал информативные и многообещающие результаты. После сохранения наиболее эффективной модели Гейб использовал скрипт predict.py, чтобы определить примеры, в которых данные были неоднозначны или неправильно помечены. Также учитывались особенно сложные загадки.

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

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

Анализ модели

Как признался Гейб, одна из наиболее интересных частей машинного обучения для него — это исследование внутренней структуры обученной модели для выявления значимых эмерджентных форм и поведений. Он написал скрипт visualize.py, который разбивает простую трёхуровневую версию U-Net и визуализирует промежуточные слои обученной нейросети.

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

Вот визуализация активации каждой ячейки во втором слое. Это чёрно-белое изображение — необработанная активация каждой ячейки на отдельном примере изображения. Белый означает, что ячейка активируется конкретной частью изображения.

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

Глубоко в нейронной сети (слой 12 в нижней части U) клетки труднее анализировать, поскольку они собирают очень маленькие фрагменты информации.

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

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

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

А вот одна ячейка в 19 слое, которая научилась идентифицировать шаблон головоломки в большинстве примеров изображений.

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

И еще одна ячейка в том же слое, которая, идентифицирует границу вокруг головоломки в большинстве примеров.

Пазлы в реальном мире: как разработчик с помощью The Witness тренировал нейросеть видеть паттерны в окружении

Следующие шаги

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

Есть несколько вариантов улучшения данных для обучения.

  • Увеличить количество данных — сперва нужно сделать больше скриншотов, а затем промаркировать их вручную. Это затратно по времени, но просто в техническом исполнении.
  • Изменение поля зрения для увеличения данных (эта настройка доступна в игре). Сбор обучающих данных в различных областях может сделать модель более устойчивой.
  • Уточнение аугментации данных. Текущая модель использует некоторые стандартные правила для дополнения данных. Их можно улучшить — например, если функция обрезает часть круга пазла, она может сохранить метку головоломки, которая стала неправильной.
  • Синтетические данные. Если бы был доступ к кастомной сборке игры, которая могла бы выводить внутреннее представление области с головоломкой вместе со скриншотом, то можно было бы автоматически генерировать десятки тысяч визуализаций с идеальными метками.
  • Более чёткое разделение между обучением и проверкой. Наборы обучения и проверки случайным образом отделяются от набора скриншотов, из-за чего нет гарантии, что каждый элемент в наборе проверки — это новый пазл. Поэтому лучше всего было бы убедиться, что некоторые головоломки появляются только в наборе проверки.

Также есть несколько способов улучшить алгоритм и модель.

  • Transfer learning. Можно использовать предварительно обученную модель, такую как ResNet, для contracting layers, что позволило бы модели использовать все изученные функции из гораздо большего обучающего датасета.
  • Альтернативные архитектуры. Можно представить альтернативу, когда одна модель берёт в качестве входных данных снимок экрана и генерирует набор возможных головоломок в виде чёрно-белых масок. Затем вторая модель фильтрует кандидатов в окончательный набор головоломок. Такой подход мог бы значительно облегчить расширение обучающих данных, поскольку было бы намного проще генерировать синтетические 1-битные маски, чем генерировать синтетические RGB-скриншоты.

Применение в реальном мире

Изначальная цель этого проекта — найти шаблоны The Witness в реальном мире. Таким, например, занимаются в ветке Reddit WitnessIRL. Гейб сократил масштаб проекта, так как определение шаблонов на скриншотах было достаточно сложной задачей. А примерно сотня изображений в этой теме — недостаточно для достижения значимого прогресса.

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

6060
15 комментариев

Очень годный пост однако 

14
Ответить

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

3
Ответить

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

1
Ответить

А что нереального?
Да и пазлы в окружении не обязательны.

6
Ответить

Да, реально.
Можно даже минут за десять управиться ;)

1
Ответить

Да как бы да, если не париться с дополнительными головоломками то сюжетка проходится на ура

Ответить

можно. есть две концовки. обычная и метаконцовка.

Ответить