или Поведенческое клонирование и создание процедурного 3D-контента

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

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

Что, если бы я использовал нейронные сети, чтобы предвидеть, какие объекты я хочу разместить?

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

Но тут все стало по-настоящему странным ...

Обучая такую ​​сеть, я эффективно передал ей часть своего творческого мышления.

Если такая сеть может угадывать, чего я хочу, и когда я этого хочу… делает ли это меня устаревшим? Может ли такая система заменить меня?

Ответ положительный.

Этот образ мышления был вдохновлен такими вещами, как степень Udacity по самоуправлению автомобилем в нано, Python играет в GTA V и MarioFlow. Эти проекты обучают машинному поведению, заставляя пользователя играть в видеоигру. Это метод, получивший название поведенческого клонирования.

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

Поведение при клонировании

Чтобы клонировать свое поведение при проектировании трехмерных уровней, я полагаюсь на два типа сетей. Сверточные нейронные сети (CNN) и рекуррентные нейронные сети (RNN).

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

RNN изучают последовательность вещей. Вы, наверное, видели RNN, которые могут писать главы о Гарри Поттере. Эти сети работают, получая последовательности данных. Итак, если вы накормите его большим количеством предложений, он начнет запоминать, какие слова обычно идут друг за другом.

Как выглядит результат?

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

Вот видео клона обученного поведения в действии:

Вот вид от первого лица созданной им среды:

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

Как обучить своего клона

Чтобы научить машину создавать 3D-уровни, вам нужно накормить ее примерно так:

Я создал в Unity простой инструмент для обучения сети. Вы можете увидеть этот процесс в видео на YouTube ниже:

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

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

Для более технических специалистов я использовал предварительно обученную сеть VGG16 и простой Keras RNN. Это позволяет мне использовать действительно хорошую предварительно обученную нейронную сеть для анализа изображений, а затем создавать последовательности проанализированных изображений для RNN. Сеть VGG16 кодирует каждый кадр того, что я вижу, в вектор признаков. Эти векторы помещены в группы по 15, а метка - это то, что я сделал на 16-м изображении. После предсказания 16-е изображение вставляется в последовательность, а первое изображение выталкивается. Новый лейбл - это то, что я сделал с 17-м изображением.

Ниже описано, как использовать встроенную модель Keras VGG16 в качестве экстрактора функций.

model = keras.applications.VGG16(weights='imagenet', include_top=True)
feat_extractor = Model(inputs=model.input, outputs=model.get_layer("fc2").output)
dataFeatures = [(feat_extractor.predict(x) for x in Images]

Затем функции группируются в последовательности и передаются в очень простую RNN.

model = Sequential()
#input shape 15 vectors of 4096, length of the output from
#vgg16 feature extractor
model.add(SimpleRNN(256, input_shape=(15, 4096)))
model.add(Dense(5, activation='softmax'))

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

20180331132802_0
20180331132804_1
20180331132805_0
20180331132806_1
20180331132808_1

Обученная сеть обслуживается через экземпляр Google Compute Instance. Таким образом, мне не нужно выполнять обработку NN и 3D-графику на одном компьютере.

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

Что делать дальше?

Я считаю, что это довольно удачный POC. Вот некоторые немедленные следующие шаги:

  1. Завершите создание пути RNN или реализуйте что-то вроде SketchRNN от Google.
  2. Продолжайте обучение. Этому типу вещей требуется более пяти часов обучения, чтобы развить устойчивый диапазон поведения.
  3. Оптимизируйте архитектуру для более быстрого прогнозирования. Например, как только я соберу достаточно данных, я могу построить свою собственную CNN, поскольку VGG16 немного избыточен и действительно является тем местом, где находится большая часть времени прогнозирования. Также существует множество гиперпараметров, которые можно точно настроить, чтобы делать более точные прогнозы. Я также даже не уверен, что наличие последовательностей векторов признаков - лучший метод. Может быть, просто последовательности предсказаний CNN?
  4. Запуск нескольких клонов одновременно со скоростью, в 10 раз превышающей обычную.

Что это значит сейчас?

В подзаголовке написано «Поведенческое клонирование и создание процедурного трехмерного содержимого», но действительно ли это трехмерное процедурное создание содержимого (procgen)?

Это зависит от того, кого вы спрашиваете. Procgen обычно требует от разработчиков жесткого кодирования набора правил в системе. Эти правила определяют такие вещи, как визуальные эффекты, рельеф, создание или размещение активов. Хотя procgen определенно увлекателен и моя страсть, может быть, это не самое дружелюбное занятие для художников?

Мой подход к глубокому обучению создает те же системы, основанные на правилах, но создает эти системы по-разному. В то время как стандартная система procgen кодирует эти правила в логические потоки в файлах кода, это кодирует правила в архитектуру нейронной сети и ее веса. Procgen требует разработчиков. Метод глубокого обучения требует показать машине, что вы хотите, чтобы она делала. Это может сделать процесс разработки системы procgen более ориентированным на пользователя. Обратной стороной является то, что изменение этой системы требует переобучения, которое в зависимости от объема вашего проекта может потребовать дополнительных усилий.

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

Что это может означать для будущего?

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

Например, новый плагин Photoshop или Illustrator, который может клонировать ваше художественное поведение?

Что, если бы этот плагин мог продолжать работать с файлом .psd или .ai даже после того, как вы ушли домой на ночь?

Или что, если у вас огромный дедлайн, и вы решили создать 200 клонов поведения, чтобы помочь справиться с идеями? А как насчет 10 000? Что, если бы каждый из этих 10 000 клонов поведения мог работать в 100 раз быстрее, чем вы?

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

Каким будет будущее работы, если каждый сотрудник может быть 10 000 супер-сотрудников?

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

Что, если это вы автоматизируете свою работу?