Почему мы это делаем
В конце предыдущего поста я упомянул тестирование ComfyUI и диффузионных моделей. Это было упомянуто не просто так - это следующий логический шаг для bigunphoto. Идея: клиент загружает фотографию, выбирает сценарий - прогулка по Амстердаму, модная фотосессия, прибрежный портрет - и получает набор изображений в визуальном стиле фотографа. Физическая фотосессия не требуется.
Вопрос был, с чего начать. У меня не было опыта работы с конвейерами генерации изображений за пределами использования потребительских приложений.
Почему именно ComfyUI
Я начал с небольшого исследования. В наши дни любой может генерировать высококачественные изображения с помощью Google Gemini с интегрированным nanobanana, с помощью ChatGPT или даже через этот странный Discord подход, требуемый для работы с MidJourney. Но это в основном веб-сервисы, которые невозможно интегрировать с bigunphoto.com. Мне нужно было что-то специфичное для фотографии. Самый простой и очевидный путь был бы использовать сервисы, доступные по API - Replicate, fal.ai, что-то управляемое. Оплата за генерацию, нет проблем с инфраструктурой.
В то же время я искал решение DIY, потому что у меня есть интерес практиковаться в этой области. Другим принципом была оплата по мере использования с минимальными затратами для MVP.
С другой стороны, проблема стиля. У Татьяны есть специфическая визуальная подпись - то, как она работает со светом, настроение, кадрирование, выбор поз. Стандартная диффузионная модель не знает об этом. Её обучение требует тонкой настройки, а тонкая настройка означает управление конвейером. Управляемые API не дают этого при разумной стоимости.
У меня есть MacBook M4 Max с 36 ГБ объединенной памяти. Не самая мощная машина на рынке, но я обнаружил, что она способна запускать диффузионные модели, такие как FLUX или JuggernautXL. Стоимость генерации - копейки за электричество. Это казалось правильным подходом для прототипирования, прежде чем начинать пользоваться облачными вычислениями со всеми связанными с этим затратами. Так я и развернул ComfyUI локально.
ComfyUI - это интерфейс на основе узлов для построения конвейеров генерации изображений. Вы соединяете узлы вместе - каждый узел делает одну вещь: загружает модель, применяет предобработчик, запускает семплер, декодирует вывод. Рабочий процесс - это граф. Вы можете видеть, что происходит на каждом шаге, что полезно, когда что-то идет не так, и вещи пойдут не так.
Сейчас у него почти нет альтернатив, Automatic1111 не обновлялся уже более года. Я выбрал ComfyUI, потому что графовая модель лучше соответствует тому, как я думаю о конвейере как о системе, и потому что она обеспечивает больше контроля над отдельными шагами. Кроме того, рабочие процессы - это файлы JSON, что означает, что их можно вызывать программно из backend - это важно, когда это становится функцией продукта.
Сценарий: прогулка по Амстердаму
Для первого теста я выбрал полноформатную фотографию модели, которую решил перенести в Амстердам. Сохранить пропорции лица и тела, изменить фон, слегка изменить позу.
Это три отдельные проблемы, и каждая требует своего узла.

Карта глубины обрабатывает пропорции тела. , AIO Aux Preprocessor с DepthAnythingV2 берет исходную фотографию и создает изображение глубины в градациях серого - чем светлее пиксели, тем ближе они к камере. Это кодирует объем и силуэт фигуры, не фиксируя позу полностью. Модель ControlNet читает эту карту глубины во время генерации и использует ее в качестве ограничения. Сила 0,65, end_percent 0,65 - означает, что ControlNet влияет на первые 65% шагов диффузии, а затем позволяет модели работать свободно над деталями. Чем ниже сила, тем больше свободы в позе; чем выше сила, тем более буквально копируется силуэт.
Лицо обрабатывается с помощью IPAdapter FaceID . Это не замена лица - он кодирует лицо из исходного изображения в виде вложения и задает условия для генерации похожего лица. IPAdapter Unified Loader FaceID загружает модель с предустановкой FACEID PLUS V2. InsightFace обрабатывает обнаружение лица и извлечение вложения. Параметры веса контролируют, насколько сильно вложение лица тянет генерацию - если слишком низко, лицо отклоняется, если слишком высоко, все остальное становится жестким.
ReActor работает в конце как корректирующий слой. После генерации он выполняет прямую замену лица с исходной фотографии на сгенерированный результат. IP-Adapter дает модели направление; ReActor обеспечивает назначение. Вместе они обрабатывают случаи, когда IP-Adapter генерирует лицо, которое близко, но не точно - что чаще происходит с профильными снимками, чем с фронтальными.
Контрольная точка, или модель - Juggernaut XL. Она обучена на создание фото реалистичных изображений людей и дает лучшие результаты для всего тела, чем базовая модель SDXL. Семплер - dpmpp_2m_sde с планировщиком Karras - лучше детали, чем у стандартного Euler. CFG при 6,0, 30 шагов.
Что мы получили
Первые блины запеклись комом сразу в нескольких смыслах: ReActor был подключен наоборот и заменил лицо на исходной фотографии вместо сгенерированной. Апскейлер производил то, что выглядело как сломанный CRT монитор. InsightFace не был подключен вовсе, поэтому IP-Adapter работал без вложений лица.
Каждый "ком" был ошибкой подключения, а не сбоем модели. Вот что касается ComfyUI - все ошибки подсвечиваются прямо на графе. Исправьте подключение, запустите снова.
После устранения неполадок с подключениями: фон с генерацией амстердамского канала убедительный, пропорции сохраняются, одежда меняется, естественным образом меняется поза, хотя фигура в целом остается неизменной. Генерация лица - почти отлично, заметно, что это один и тот же человек, хоть не идеальный клон. Достижение точного сходства - это функция качества исходной фотографии и угла. Фронтальные снимки с хорошим освещением дают лучшие результаты, чем профильные.
Несоответствие освещения между фигурой и фоном - это оставшийся видимый артефакт. Источник был студийным; сгенерированный фон - уличный рассеянный свет. Они не совсем согласуются. Это известная проблема, и есть подходы к ее решению - узлы цветовой градации, более тщательная инженерия подсказок вокруг освещения или другая стратегия генерации фона. Это следующий шаг.

Что ожидается
Работоспособность рабочей модели достаточна, чтобы служить основой. Следующие шаги, которые я начал выполнять параллельно:
Связь ComfyUI с сайтом, создание очередей работ и функций выполнения, интерфейсов для пользователей и администраторов. У меня уже есть готовый MVP для этого, который я сейчас тестирую локально. Скоро я опубликую ещё один пост здесь и разверну решение на сайте.
Другая история - создание сложных рабочих процессов в ComfyUI, которые могли бы помочь генерировать набор изображений с разными позами, поддерживать смену одежды и т. д.
Ещё один важный момент - обучение LoRA на портфолио Татьяны - это то, что внедрит визуальный стиль в генерацию, а не только местоположение.
Если это звучит как что-то, что вас заинтересовало - виртуальная фотосессия в выбранном вами месте, в эстетике настоящего фотографа - следите за блогом и оставайтесь на связи. Очень скоро вы сможете это попробовать.
