
Сгенерировать реалистичный портрет по одному описанию несложно. Гораздо труднее одновременно управлять десятками параметров: возраст, пол, причёска, форма лица и другие признаки.
Такую задачу решал заказчик: ему нужно было генерировать набор фотореалистичных изображений людей для биометрического приложения. Предыдущие эксперименты давали изображения, которые выглядели явными рисунками. Поэтому нам нужно было подобрать более эффективный метод генерации и управления атрибутами.
Исторический обзорный кейс, концепцию которого можно применять и на современных моделях.
В чём была задача
Заказчику нужно было генерировать датасет фотореалистичных изображений людей по нескольким десяткам заданных признаков: возрасту, полу, особенностям лица, волос и другим параметрам.
Главная сложность была в управлении таким количеством атрибутов. Если задавать всё одним большим промптом, часть признаков терялась или конфликтовала с другими, а результат становился менее предсказуемым. Поэтому нужно было собрать пайплайн, в котором совместимые признаки можно задавать вместе, а более сложные — добавлять поэтапно.
Проект делали ещё до нынешнего поколения генеративных сервисов, но сама задача — локально и управляемо поэтапно генерировать изображения по заданным параметрам — актуальна и сейчас.
На первом этапе мы сравнили DALL-E, Midjourney и разные варианты Stable Diffusion. По итогам исследования заказчик выбрал локальное решение на базе Stable Diffusion.
Разработкой занималась команда Singularis.
Что мы наколдовали

Основой стал локальный пайплайн на Stable Diffusion. Для разных этапов генерации использовали несколько подходов:
Text-to-image — для создания базового изображения по подробному описанию;
Image-to-image — чтобы добавлять или менять признаки на уже полученном изображении;
ControlNet и IP Adapter — для дополнительного управления генерацией через референс;
Compel — для длинных промптов и управления влиянием отдельных ключевых слов.
Отдельно мы составили матрицу совместимости атрибутов: она помогала заранее разделять признаки, которые можно задавать вместе, и те, которые лучше добавлять на разных этапах генерации.
Не смешивать всё в один промпт
Одним из ключевых факторов оказалось качество промпта: формулировки и вес отдельных признаков заметно влияли на результат.
Но попытка задать все характеристики сразу работала хуже. Поэтому сложные сочетания мы разделяли на несколько этапов: сначала создавали базовый портрет, а затем добавляли отдельные признаки через img2img или ControlNet.
Такой подход особенно помогал в случаях, когда изменение одного параметра затрагивало остальные. Например, при добавлении очков или смене пола могли заметно измениться основные черты лица, а персонаж переставал быть похож на исходный.

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

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

В нём можно было создавать базовое изображение, а затем последовательно добавлять более сложные атрибуты через img2img и ControlNet. Для управления длинными промптами и влиянием отдельных признаков использовался Compel.
UPD после комментов: В качестве демо, пример реалистичной поэтапной генерации уже с применением моделей нового поколения: сравнение результата на старте и после этапной генерации.

Генерируйте поэтапно - будет вам счастье
При большом количестве параметров недостаточно просто перечислить их в одном промпте. Устойчивый результат даёт разделение совместимых и конфликтующих признаков и их добавление на разных этапах генерации.

