Да, это снова статья про нейросети, но подождите перелистывать, этого нет на просторах русскоязычного гугла (по крайне мере на первой странице).

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

Нужно создать персонажа с разными выражениями лица

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

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

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

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

Слева изображение, которое использовалось для кастомизации, а справа - результат
Слева изображение, которое использовалось для кастомизации, а справа - результат

Ответа на вопрос "почему так вышло?" я не нашел, хотя узнать было бы интересно.

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

Google it

Чего не хватило моему промту?

Как я уже сказал, на просторах русскоязычных интеренетов, ответа не нашлось. Поэтому пришлось обращаться к коллегам за бугром и этот канал на YT помог понять чего не хватало моему промту. От получения приемлемо-стабильного результата меня отделяли два важных момента:

  1. Нужно использовать более одного изображения. Так модель собирает вашего персонажа из нескольких +- похожих изображений за счет чего повышается стабильность выдаваемого результата.

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

Сейчас перейдем к примерам и все станет понятно.

Инструкция создания персонажа

Процесс состоит из двух шагов:

  1. Шаг 1. Генерация 2-3 изображений персонажа, которые +- похожи друг на друга, это можно назвать датасетом.

  2. Шаг 2. Использование полученных изображений для генерации приемлемо-стабильного персонажа с различными выражениями лица.


Шаг 1. Подготовка датасета изображений

Для генерации первого изображения датасета, я использовал следующий промт:

photo of a regular 28 year old guy with short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

Первое изображение
Первое изображение

Для нашего проекта мы выбрали изображение №2. Теперь нужно сгенерировать еще хотя бы одно изображение с +- похожим лицом. Для этого, необходимо нажать кнопку повторной генерации "????" и так до тех пор, пока не получится желаемое количество похожих изображений.

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

Все сгенерированные изображения
Все сгенерированные изображения
Выбранные изображения
Выбранные изображения

Шаг 2. Генерируем персонажа с разными выражениями лица

Вот и настала самая интересная часть.

Сначала генерируем стабилизованное изображение персонажа. Добавляем в начало того же промта ссылки на выбранные изображения. Промт будет выглядеть примерно так:

https://cdn.discordapp.com/.../*.png https://cdn.discordapp.com/.../*.png photo of a regular 28 year old guy with short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

Для простоты восприятия основную часть ссылки заменил на /.../. Самое главное, чтобы начало и конец ссылки были как в примере. И сразу после ссылок, через пробел, идет тот же самый промт. Результат ниже.

Стабилизированное изображение персонажа
Стабилизированное изображение персонажа

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

Проделываем тоже самое но уже с эмоциями:

  • Улыбка. Добавляем к основному промту smile on his face
    https://cdn.discordapp.com/.../*.png https://cdn.discordapp.com/.../*.png photo of a regular 28 year old guy with smile on his face, short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

  • Счастливый. Добавляем к основному промту an extremely happy facehttps://cdn.discordapp.com/.../*.png https://cdn.discordapp.com/.../*.png photo of an extremely happy 28 year old guy with short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

  • Расстроенный. Добавляем к основному промту an extremely upset, almost crying
    facehttps://cdn.discordapp.com/.../*.png https://cdn.discordapp.com/.../*.png photo of an extremely upset, almost crying 28 year old guy with short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

  • Злой. Добавляем к основному промту an extremely angry facehttps://cdn.discordapp.com/.../*.png https://cdn.discordapp.com/.../*.png photo of an extremely angry 28 year old guy with short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

  • Испуганный. Добавляем к основному промту an extremely horrified facehttps://cdn.discordapp.com/.../*.png https://cdn.discordapp.com/.../*.png photo of an extremely horrified 28 year old guy with short haircut, red hair colour, curly hair, blue eyes, dressed in a gray t-shirt, ultra realistic, face detailed

Результат всех промтов
Результат всех промтов

Финальный результат поближе можно посмотреть на самом первом изображении статьи.

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

Если бы мне требовалось улучшить результат с такими же вводными, я бы прописал в явном виде освещение и фон, возможно из-за них скачет выбор оттенка волос и кожи персонажа.

Комментарии (4)


  1. 7313
    03.04.2023 11:10
    +9

    Просто для сравнения как это делается в SD

    https://www.reddit.com/r/StableDiffusion/comments/1281iva/new_controlnet_face_model/


  1. vagon333
    03.04.2023 11:10
    +2

    Замечательно!
    Пользуюсь MJ и тупил не зная, как переиспользовать существующую фотку для изменения эмоций, хотя именно это часто нужно для серии в рамках проекта.
    Кстати, для поиска подходящих слов к Prompt сделал простой проект fartofart.com (не коммерция, не реклама), который помогает увидеть результат по ключевым словам.


    1. alex_kan Автор
      03.04.2023 11:10

      надо будет тоже потестить)


  1. AlexKimen
    03.04.2023 11:10

    Спасибо. Хорошая инструкция