Назад в блог

Попытка генерации изображений с помощью ИИ

Попытка генерации изображений с помощью ИИ

Почему мы это делаем

В конце предыдущего поста я упомянул тестирование 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 - это важно, когда это становится функцией продукта.

Сценарий: прогулка по Амстердаму

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

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

Screenshot of ComfyUI screen with workflow

Карта глубины обрабатывает пропорции тела. , 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 - все ошибки подсвечиваются прямо на графе. Исправьте подключение, запустите снова.

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

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

Source image of model used for generation with ComfyUI AI generated image of real life model in Amsterdam

Что ожидается

Работоспособность рабочей модели достаточна, чтобы служить основой. Следующие шаги, которые я начал выполнять параллельно:

  • Связь ComfyUI с сайтом, создание очередей работ и функций выполнения, интерфейсов для пользователей и администраторов. У меня уже есть готовый MVP для этого, который я сейчас тестирую локально. Скоро я опубликую ещё один пост здесь и разверну решение на сайте.

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

  • Ещё один важный момент - обучение LoRA на портфолио Татьяны - это то, что внедрит визуальный стиль в генерацию, а не только местоположение.

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