В этом блоге есть небольшой раздел "ИИ-интенсив", где собраны статьи, в которых я стараюсь по возможности доходчиво рассказать, как работают нейросети (в основном основанные на Stable Diffusion), и как ими осознанно пользоваться. Я не технический специалист, поэтому глубоко погружаться в тему не могу при всём желании, но ту часть, которую нужно знать не разработчикам, а обычным пользователям, вполне могут понять и гуманитарии.
Сегодня я снова совсем немного коснусь теории работы с нейросетями на базе Stable Diffusion, но главным образом опять буду развлекаться практикой при содействии модели Fooocus. Если вы захотите повторять за мной, то вам нужно знать, как добраться до Fooocus и как с ней работать. Подробная статья с пошаговой инструкцией находится по этой ссылке.
Мы будем генерировать серию портретов одного и того же человека в разных ситуациях и образах. Если вас когда-либо интересовало, можно ли с помощью нейросетей создать постоянного персонажа и переносить его из одной сцены в другую, то короткий ответ — да. Персонаж будет менять позу, одежду и выражение лица, но при этом оставаться самим собой.
Я регулярно читаю и смотрю материалы разных авторов на тему работы со Stable Diffusion, и чаще всего для подобных демонстраций по какой-то неясной причине выбирают портреты девушек с розовыми (непременно) волосами. Чтобы никто не подумал, что такие трюки срабатывают только с розововолосыми девушками, я собираюсь сломать шаблон. Помните одного из джентльменов, нарисованных нейросетью в прошлый раз?
Вот он и будет объектом наших опытов. Но сначала — совсем немного теории.
Что такое ControlNet
Название ControlNet могло уже вам встречаться — да вот хотя бы в телеграм-боте "Кандинского" версии 2.2:
Но даже если название вы и не видели, то практически наверняка пользовались этой штукой на практике.
Когда вы вводите текстовое описание (prompt), вы задаёте нейросети условия, которые она должна соблюсти при выполнении задачи, то есть при генерации картинки. Как правило, эти условия довольно расплывчаты и дают возможность по-разному их интерпретировать.
ControlNet — это модель-надстройка к Stable Diffusion, которая добавляет к описанию дополнительные, более строгие условия. Эти условия обозначены не в тексте, а в загружаемом исходном изображении, где показано не только что, но и примерно как нужно нарисовать. Нейросеть анализирует загруженный исходник и выборочно копирует оттуда необходимые элементы. ControlNet управляет заменой лиц на фотографиях в приложениях вроде Wombo Me, режимом Img2Img и "живым холстом".
Модель ControlNet содержит набор вложенных моделей — алгоритмов, которые по-разному обрабатывают вводное изображение и применяются для решения различных задач. Например, алгоритм Canny определяет контуры объекта на картинке и старается точно их воспроизвести в собственной генерации (если вы копировали в детстве понравившиеся рисунки, положив сверху лист бумаги и обводя их карандашом на просвет, то здесь примерно то же самое), Depth Map анализирует глубину резкости (глубина резкости определяет, на каком расстоянии от точки фокусировки фон начинает размываться), а Open Pose — позу человека или животного.
Попрактиковаться с разными алгоритмами можно, например, на платформе Playgroundai в режиме генерации Image to Image. После загрузки вводного изображения в левой боковой панели инструментов появляются настройки ControlNet, которые здесь называются Control Traits. Каждая позволяет загружать отдельное изображение как образец:
Вы можете задать контуры (Edge, эквивалент Canny) из одной картинки, а глубину резкости (Depth) — из другой. Но сегодня наша песочница не здесь, сегодня мы практикуемся на Fooocus. В него и переходим.
Фокусы с ControlNet: клонируем лицо
Итак, интерфейс Fooocus загружен, исходное изображение готово. Для начала оценим его критически: сочетание цилиндра с бабочкой — так себе стиль. Благородный джентльмен смахивает скорее на фо(оо)кусника из варьете. Поэтому предлагаю его переодеть, а заодно перенести в какую-нибудь другую обстановку.
Для этого сначала отмечу галочкой пункт Input image (ввести изображение) под полем для ввода текста. Появятся вкладки с четырьмя группами настроек: Upscale or Variation, Image Prompt, Inpaint or Outpaint и Describe. Все они представляют интерес, но для моих сегодняшних целей мне понадобится вкладка Image Prompt. В ней находятся аж четыре окна с настройками для загрузки вводных референсных изображений. Чтобы увидеть настройки, нужно отметить галочкой пункт Advanced (продвинутый) внизу группы.
Поскольку моя цель заключается в том, чтобы создать другое изображение уже существующего персонажа, мне нужно поместить в первое окошко ввода исходную картинку — образец. Её можно перетащить сверху, из окна генерации, либо загрузить с компьютера.
А поскольку из этой картинки мне нужно заимствовать только лицо, я выбираю опцию FaceSwap (поменять лицо) в настройках внизу окошка.
В поле ввода текста нужно написать, что я хочу увидеть на выходе. В моём случае это A man wearing a leather jacket, close up portrait (мужчина в кожаной куртке, портрет крупным планом).
Жму Generate, и после некоторого ожидания получаю четверню:
Нельзя сказать, что все четверо похожи на исходник как близнецы, которых родная мать не различит, но всё же результат очень близок к этому. При желании степень сходства можно увеличить ползунком Weight в настройках, который по умолчанию установлен на значении 0,75. Но не увлекайтесь, иначе вы оставите нейросети слишком мало места для творческого манёвра.
По-моему, вот этот вариант получился самым убедительным:
Можно придумать моему персонажу (назову его Леопольдом) интересную насыщенную, полную приключений жизнь:
Фокусы продолжаются: меняем позу
В начале статьи говорилось о том, что ControlNet включает в себя алгоритмы, способные определять позу человека и использовать её в создаваемом изображении. Для демонстрации этого мне понадобится ещё одна референсная фотография, с которой нейросеть позаимствует позу. Пусть это будет водитель за рулём автомобиля, повернувшийся лицом к пассажиру на заднем сидении.
Загружаю фотографию во второе свободное окошко и выбираю PyraCanny из списка алгоритмов внизу. Не забываю добавить текст описания (вообще-то в данном случае можно обойтись и без него, но с ним надёжнее):
А теперь жму Generate:
Обратите внимание, что воспроизводится только поза с исходника, а не мимика. За лицо по-прежнему отвечает FaceSwap. Вероятно, при понижении значения Weight можно повторить и мимику, но есть риск, что исчезнет портретное сходство. Тем не менее Fooocus сделала требуемое: Леопольд усажен в машину и внимательно вас слушает.
Как использовать возможности ControlNet на практике — придумайте сами, но хочу предупредить, что создание фальшивых аккаунтов на сайтах знакомств незаконно, аморально и рано или поздно выйдет вам боком 😏
С другой стороны, аккаунты виртуальных персонажей в соцсетях живут и процветают, приобретая всё больше подписчиков. Что ж, если кому-то интересно следить за жизнью и похождениями несуществующего человека, я не могу их за это осуждать. Может быть, на наших глазах рождается новый вид искусства: что-то среднее между литературой, кино и реалити-шоу.
Это ещё не всё о Fooocus: в одной из следующих статей пройдёмся по оставшимся вкладкам в режиме Input Image и посмотрим, что интересного найдётся там.