Генеративное искусство

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

Генеративное искусство - это настолько обширная область, что хватит на много постов: тут вам и последние достижения OpenAI по генерации полноценных песен (https://soundcloud.com/openai_audio), и генерация стихов (пример отсюда - https://habr.com/ru/post/334046/)

Скучаю за твоим окном

И нежными эфирами

Люблю тебя своим теплом

Тебя стенографируя


Да и тут по генерации всякого текстового были уже посты. Кстати, если кто поделится небольшой русской моделью GPT-2, буду весьма признателен (а то я натыкался только на аналог 345М, но такое в память домашнего ноута не влезает).

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

Генеративное искусство Нейронные сети, Искусство, Картинки, Видео, Длиннопост

В самом простом приближении, несложными математическими функциями можно описать построение любых фигур в любом пространстве: фракталов, кругов, линий. Имея набор правил, можно задать динамику для таких фигур, а внося рандом в изначальное состояние, получить необычные флуктуации. Например, известная игра "Жизнь" (https://ru.wikipedia.org/wiki/Игра_«Жизнь») тоже в каком-то роде генеративное искусство. Или примеры сверху и снизу.

Генеративное искусство Нейронные сети, Искусство, Картинки, Видео, Длиннопост

Но я бы хотел показать совсем уж сложнопредсказуемое направление - композиционные нейросети или CPPN. В чем основная суть: CPPN - это функция, описывающая интенсивность цвета в каждой точке на заданной сетке. В случае цветных изображений, соответственно, интенсивность цветов RGB. Функций существует множество. Задав сетку и случайное распределение коэффициентов (или весов) функции, прогоняем через нее сетку и что-то получаем. Чтобы было еще интереснее, можно задать композицию функций - выход одной будет подаваться на вход другой и т.д. Очевидный минус - невозможно предугадать, какой будет результат. Можно только ожидать определенный паттерн, потому что разные функции строят разные паттерны. Вот результат работы композиции тангенциальных функций.

Генеративное искусство Нейронные сети, Искусство, Картинки, Видео, Длиннопост

Разберемся с пространством: изображение имеет высоту и ширину, тут все понятно. RGB цвета задаются 3-мерным пространством, тоже понятно. А вот если добавить еще одно скрытое пространство, представленное простым вектором (последовательностью) одного числа к нашей функции, то мы получим некое сжатое представление нашего изображения (для каждой точки на сетке функция будет получать уже 4 параметра, а выдавать 3 - интенсивность цвета. 4-й параметр скрыт). Так вот незначительно изменяя этот параметр, мы незначительно изменим наше изображение. Но в какую сторону? Неизвестно. Вот наглядное изображение того, как в один раз построенную модель можно таким образом вносить искажения и что получается:

Кстати, музыка тоже сгенерирована.

Теперь расскажу про свой опыт, но перестану прикидываться математиком - естественно я не писал композиции функций в ручную, а использовал нейросетевые библиотеки. Каждый слой нейросети имел некоторое количество нейронов - чем больше нейронов, тем сложнее изображение (то же касается и слоев, тут главное не переусердствовать, рискуя выродить изображение в черный прямоугольник), и свою функцию активации - мне нравилась функция relu.

Я человек, видимо, нордический, мне ближе минимализм. Поэтому мои примеры сгенерированных изображений вот:

Генеративное искусство Нейронные сети, Искусство, Картинки, Видео, Длиннопост
Генеративное искусство Нейронные сети, Искусство, Картинки, Видео, Длиннопост

После того, как я поигрался с изображениями, решил замутить такое же "флуктуационное" видео на один из своих треков (я еще музыкой балуюсь). Для этого я взял аудио-сигнал ударных, проредил для начала до 30 кадров в секунду, стандартизировал значения к промежутку (0, 1) и в цикле по длительности трека добавлял аудио-сигнал к тому самому скрытому пространству. Это дало пульсацию изображения под ритм. А добавляя к значению скрытого пространство еще линейное изменение, получаем плавное движение изображения. Да, я заново изобрел заставки windows media player, только в разы тяжелее с вычислительной стороны. Так, это видео в жалких 720 р рендерилось 25 часов на моем старом ноуте. Результат мне не нравится, честно говоря, так как довольно бедно получилось, но переделывать по очевидным причинам я не стал и просто добавил некоторые эффекты на пост-обработке.

На волне экспериментов захотелось замутить простую программку, чтобы любой мог поиграться с этой архитектурой, но собирать питоновские проекты (еще и с tensorflow на борту) оказалось тем еще квестом. У меня не получилось, но если у кого есть питон и кто не хочет заморачиваться с написанием таких штук, вот ссылка на мой простой скрипт с интерфейсом: https://github.com/AlexBryl27/art_generator/blob/master/art_... и пример работы.

Спасибо за внимание.