Генеративное искусство
Мой прошлый пост был о смене работы, после которого на меня подписалось много человек. Но к сожалению больше жизнеутверждающих историй у меня для вас нет, поэтому вот небольшой пост о том, что может наука о данных.
Генеративное искусство - это настолько обширная область, что хватит на много постов: тут вам и последние достижения 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_... и пример работы.
Спасибо за внимание.