Игры с возрастом и генная инженерия
Этот материал — продолжение рассказа о кнопках, пипках и переключателях, которые управляют процессом генерации картинок в графических нейросетях. Начало можно найти в статье Seed, sampler и другие непонятные слова: краткий курс по управлению графическими нейросетями. Конечно, существуют популярные модели вроде YandexArt ("Шедеврум") или DALL-E, которые не дают возможности повлиять на настройки и предлагают единственную кнопку "Генерировать", при этом выдавая очень хороший результат. Но здесь речь не о них, а о платформах с гибким управлением, которые предоставляют пользователям больше свободы действия и больше контроля над искусственным интеллектом.
В этой и следующих статьях поговорим о превращении картинки в другую картинку. Этот метод встречается не во всех моделях и пока не слишком популярен у пользователей. Между тем с его помощью можно получать результаты, которых было бы трудно достичь, используя одни только текстовые запросы. Хороший пример — анимация, в которой девушка с картины Яна Вермеера проживает целую жизнь, взрослея и старясь на глазах.
Чтобы вам проще было понять то, о чём я сейчас буду говорить, я советую предварительно прочитать если не всю статью про параметры настроек, то хотя бы ту её часть, где говорится про параметр Seed, потому что он тесно связан с методом генерации картинки по картинке.
Давайте сначала разберёмся, что такое img2img, а потом посмотрим на примерах трёх нейросетей, как он работает.
Что такое img2img
Для того чтобы нейросеть сгенерировала изображение, ей нужно первым делом объяснить, что именно следует генерировать. Как правило, для этого используется текстовое описание сюжета будущей картинки. Этот вариант генерации — txt2img или Text to Image, "текст в картинку" — самый распространённый, с ним работают все существующие нейросетевые модели.
Модели, основанные на Stable Diffusion (и некоторые другие) понимают и ещё один способ ввода: визуальный, img2img или Image to Image, то есть "картинка в картинку". В этом случае можно обойтись вообще без текста, достаточно показать нейросети исходную картинку и попросить сделать что-нибудь похожее. Впрочем, добавление текстовой подсказки в большинстве случаев всё равно нужно.
В отличие от других параметров генерации, функция генерации картинки по картинке в разных нейросетях работает немного по-разному и выдаёт разные результаты, хотя базовый принцип её действия везде одинаков.
Как работает img2img
Суть метода img2img заключается в том, что вместо случайно сгенерированного числа (Seed, или зерна) (1), которое определяет исходный визуальный шум (2), из которого путём пошагового очищения формируется картинка (3), в качестве отправной точки нейросеть использует загруженное пользователем изображение, к которому затем добавляется шум, который, в свою очередь, потом пошагово очищается.
От количества добавленного к картинке шума зависит, насколько результат генерации будет похож на оригинал. Это как пытаться спрятать картину, присыпав её сверху опилками. Если опилок (шума) добавить немного, то нейросети будет слишком очевидно, что за ними скрывается, и картина быстро найдётся: на выходе вы получите практически идентичное изображение. Если насыпать опилки толстым слоем, нейросеть будет ориентироваться почти вслепую, главным образом на текстовую подсказку, и результат генерации будет почти таким же, как при использовании метода "текст в картинку". Количество добавляемого шума регулируется настройкой Strength (сила), значения которой на разных платформах могут располагаться на шкале от 0 до 1 или от 0 до 100.
Для нейросети выглядит это приблизительно вот так:
Это общий принцип, но в разных нейросетях (вероятно, из-за использования разных алгоритмов — точно не скажу, я не профессионал) он реализовывается немного по-разному. Как — покажу на нескольких примерах, а в качестве подопытных кроликов будут выступать "Девушка с жемчужной серёжкой" Яна Вермеера и пушистый котик.
img2img на платформе Openart
Первая нейросеть для моих экспериментов выбрана случайно и никаких предпочтений не выдаёт, я просто хочу испытать несколько площадок и сравнить, как работает img2img на каждой из них.
Для начала я попробую омолодить девушку на портрете лет эдак до трёх от роду. Для этого на платформе Openart я выбираю режим Image to Image, загружаю исходную картинку и добавляю к ней запрос A toddler girl with a pearl earring — маленькая девочка с жемчужной серёжкой (в английском языке словом toddler называют детей в возрасте примерно до трёх лет). Параметр Strength (сила) я устанавливаю на отметке 0,2 (мало опилок).
Слева — исходное изображение, справа — новое. Вы видите разницу? Я тоже нет. Меняю параметр Strength на 0,75:
И вуаля! Молодильные яблочки подействовали. Обратите внимание, что изменился не только возраст героини, но и стиль изображения. Теперь оно гораздо больше похоже на фото: по умолчанию Openart оригинальный стиль не сохраняет. Является ли девочка справа тем же самым человеком, что и на исходном портрете — вопрос спорный, внешность иногда сильно меняется с возрастом. Впрочем, чуть позже посмотрим, насколько хорошо с этим справятся другие модели.
Теперь попробую задачу посложнее: превращение котика в пёсика. Загружаю котофото, в поле для текстового запроса ввожу A puppy lying on a polished floor (щенок, лежащий на полированном полу). Ползунок Strength выбираю на глазок поменьше, получается 0,31. Слева — исходное фото, справа — результат:
Котик смотрит с явной издёвкой и превращаться в пёсика отказывается. К картинке было добавлено слишком мало шума, чтобы нейросеть могла извлечь из него что-то помимо исходного изображения. Увеличиваю значение параметра Strength до 0,75:
И снова магия сработала, и нейросеть выдала умильного какой-то-терьера с (почему-то) синими глазами. Общая композиция, цветовая гамма и поза животинки остались прежними.
Теперь поброжу по другим площадкам, чтобы посмотреть, как этот же метод работает в других местах.
img2img на платформе Playgroundai
Несмотря на то что на Playgroundai используется та же базовая модель Stable Diffusion, что и на Openart, инструменты генерации по картинке реализованы здесь немного иначе.
Параметр Strength называется Image Strength, может принимать значения от 0 до 100, и действуют они ровно противоположным образом: при значении 100 исходное изображение не изменится совсем, а при значении 0 результат будет максимально отличаться от оригинала. Всё потому, что здесь под "силой" понимают степень влияния на результат именно исходной картинки, а не добавленного шума.
Playgroundai с самого начала стеснительно предупредил, что точного воспроизведения лица на портрете может и не получиться, поэтому он просто использует загруженную картинку "для вдохновения", а там как пойдёт. Но он явно поскромничал.
Насчёт трёх лет от роду можно, конечно, посомневаться, но портретное сходство налицо. Обратите внимание, что чем меньше значение Image Strength, тем ближе результат к желаемому возрасту, поскольку нейросети не нужно стараться точно воспроизвести оригинал.
Для экспериментов над котиком я остановлюсь на значении 30. Сначала снова сделаю из него щенка:
А потом, в чисто научных интересах, — плюшевого медведя (запрос A plush teddy bear lying on he floor):
Медведь получился пугающе реалистичным, но всё же, кажется, плюшевым. Цвета и композиция снова сохраняются.
img2img на платформе Getimg
На сайте Getimg всё похоже на Openart: шкала значений Strength охватывает значения от 0 до 1, и работает так же: 0 — никаких изменений, 1 — максимально возможные изменения оригинала.
Я использую три значения Strength: 0,2, 0,45 и 0,8, чтобы показать, как кот постепенно превращается в котопса, а затем окончательно в пса:
В отличие от предыдущих примеров, модель от Getimg не особенно старается сохранить сходство с оригиналом с увеличением значений Strength: изображение стало чёрно-белым, а фон заполнили какие-то непонятные тряпки (или другие щенки, что тоже возможно). Неизменными остались только поза и композиция.
Та же история повторяется с другим примером. На этот раз для разнообразия я буду старить девушку, а не омолаживать её. Запрос звучит так: An old woman with a pearl earring (пожилая женщина с жемчужной серёжкой).
Чем больше свободы действий получает нейросеть, тем старше выглядит женщина на портрете, и тем меньше она похожа на картину Вермеера. Либо точно выполнять запрос и при этом сохранять сходство с оригиналом — задача для алгоритмов getimg слишком сложная, либо они просто не придают этому большого значения. Запрос выполнен, а остальное — мелочи.
В большинстве нейросетей, использующих метод "картинка по картинке", он устроен и работает так же, как в рассмотренных примерах. Но бывают и особые случаи, и к ним относятся как раз мой любимец Leonardo AI и всеобщий любимец "Кандинский". Поэтому в следующих частях посмотрим, как работает генерация картинки по картинке у них, а заодно разберёмся, когда вообще этот метод действует, а когда нет, и для каких целей его лучше всего использовать.