Это перевод моей статьи на medium.com.
Год назад я провёл краткий обзор по теме переноса стиля. Пару месяцев назад я решил вернуться к этому вопросу и исследовать прогресс за последний год. За это время случилось много значимых изменений: архитектура open-source модели Stable Diffusion стала, лидирующей среди моделей для задач генерации изображений. Особенно её модификация SDXL [1]. Hugging Face превратился в лидирующую платформу для запуска модели Stable Diffusion с помощью библиотеки diffusers [2].
Базовая архитектура
Stable Diffusion является композицией нескольких более простых моделей, использующих концепцию мультимодальности. Основой архитектуры являются блоки UNet c cross-attention [3], которые отвечают за генерацию изображения или его латентного представления. Главной задачей, которую эта технология решает, является контроль и направление процесса генерации изображения на каждом шаге, с помощью текста или другого изображения. Это открыло путь к множеству практических применений генерации изображений. Например, мы хотим добавить очки на фотографию человека, создать серию персонажей, поиграться с возрастными характеристиками, или просто создать изображение себя в новой ситуации.
Другой важной вехой развития технологии генерации изображений стала модель Stable Diffusion XL, основанная на исследованиях NVIDIA ensemble of expert denonisers [4]. NVIDIA выявила, что влияние на генерируемое изображение текста промпта меняется на разных этапах, благодаря чему, им удалось сгенерировать точный текст на фотографии, что обычно не так просто при генерации изображения по текстовому описанию. Таким образом, в июле 2023 года была представлена модель SDXL со специализированыс refiner для генерации эстетических изображений высокого разрешения. [5]
В ноябре 2023 года был представлен ControlNet [6]. Эта технология расширила возможности для более низкоуровевого контроля генерации деталей изображений с помощью специализированных функций потерь. ControlNet добавляет обучаемые блоки-дубликаты UNet, условие подается на вход модели-дубля.
Оптимизации
Недавние достижения в области оптимизации производительности, особенно технология Low-Rank Adaptation [7], изначально были созданы для LLM, но вскоре были адаптированы для Stable Diffusion. Идея проста: адаптировать фундаментальную модель с миллионами параметров под прикладную задачу. Достаточно выбрать небольшую долю параметров и зафайнтьюнить их. Одним из приятных побочных эффектов такого подхода, является стабилизация процесса настройки, предотвращающая переобучение.
С этого момента я начал замечать много исследований от азиатских технологических гигантов. Недавно ByteDance выпустила код и статью с технологией SDXL-Lighting [8]. Суть этой технологии заключается в прогрессивной дистилляции, которая проводится серией этапов, на каждом из которых создаётся промежуточная модель-учитель различных размеров. Таким образом, с помощью технологии LoRA базовая модель SDXL была настроена, чтобы производить такой же качественный результат, что и SDXL с refiner, но требуя меньшего количества шагов. Обычно base модели SDXL плюс refiner требуется около 50 шагов, но SDXL-Lighting выдаёт достойные результаты всего за 4 или 8 шагов.
Перенос стиля
Одной из первых работ по переносу стиля, которая действительно меня удивила, был DreamBooth [9]. Суть технологии заключается в том, чтобы получить несколько фотографий человека или стиля, добавить аннотации и применить файнтьюн технику Stable Diffusion с помощью LoRA. Я экспериментировал с этой технологией, и это было первое решение, которое я мог запустить локально на своём ноутбуке и получить достойные результаты. Ещё одна интересная техника переноса стиля — это ZipLoRA [10], идея которой заключается в файнтьюне отдельных адаптеров для переноса стиля и object identity, и их последующем объединении таким образом, чтобы сохранялись обе характеристики.
Следующей впечатляющей техникой переноса стиля для меня стал IP-Adapter [11] от азиатского гиганта Tencent, дочерней компании которого является WeChat. Можно подать на вход одно или несколько изображений, и стили этих изображений используются для генерации новых изображений с некоторым текстовым направлением подсказки. Правда, этот подход иногда страдает от деформированных пальцев и искажённых конечностей человека. Другое исследование Tencent — это PhotoMaker [12], техника, сосредоточенная на сохранении Face ID с использованием эмбеддингов. Далее я предоставлю некоторые из моих экспериментов с генерацией изображений.
И, наконец, самая впечатляющая техника переноса Face ID без файнтьюнинга — это PuLID от ByteDance. Она использует те же эмбеддинги лица, дополненные, более продвинутыми техниками фкнциями потерь. Этот подход решил большинство проблем с деформациями IP-Adapter.
Diffusers от Hugging Face
Hugging Face включает в себя несколько фундаментальных библиотек для искусственного интеллекта. Они охватывают все возможные задачи NLP: от генерации текста до распознавания именованных сущностей (NER) и классификации текстов, а также множество задач генерации изображений, таких как преобразование изображения в другое изображение или текста в изображение и многие другие. Они ввели концепцию пайплайна, позволяющую инкапсулировать несколько взаимосвязанных моделей. Таким образом, пользователь получает простой интерфейс для запуска модели, абстрагированный от архитектуры модели. Они пошли дальше и создали библиотеку для Parameter-Efficient Fine-Tuning, благодаря чему почти любые модели из хаба Hugging Face могут быть зафайнтьюнены. Ещё одна важная библиотека для Supervised fine-tuning — это RTL — Transformer Reinforcement Learning, предназначенная для учета челочесеской обратной связи. По сути, любая задача ИИ может быть решена с помощью этих инструментов.
Мне особенно понравились эксперименты с IP-Adapter и PuLID: некоторые примеры и код для генерации изображений прилагаются ниже. На MacBook не всё идеально quantised и оптимизировано, поэтому для IP-Adapter нужно около 14 Гб оперативной памяти, а для PuLID чуть меньше — около 9 Гб. На архитектуре CUDA требуется значительно меньше.
Код 1 для IP-Adapter
import torch
from PIL import Image
from diffusers import AutoPipelineForText2Image, StableDiffusionXLImg2ImgPipeline
from transformers import CLIPVisionModelWithProjection
prompt = "A black ink drawing of a beautiful guy, in a club with tattoos. High quality painting."
negative_prompt = "wrinkles, low resolution wrinkles, low resolution, low quality"
face_prompt = "style/me.jpg"
style_prompt = "style/red_glasses.jpg"
device = "mps"
denoising_threshold = 0.7
# [face, style ]
ip_adapter_scale = [0.95, 0.3]
steps = 50
dtype = torch.float32
image_encoder = CLIPVisionModelWithProjection.from_pretrained(
"h94/IP-Adapter",
subfolder="models/image_encoder",
torch_dtype=dtype,
cache_dir="./model/IP-Adapter"
).to(device)
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
image_encoder=image_encoder,
use_safetensors=True,
torch_dtype=dtype,
cache_dir="./model/stable-diffusion-xl-base-1.0"
).to(device)
pipeline.load_ip_adapter("h94/IP-Adapter",
subfolder="sdxl_models",
variant=variant,
weight_name=["ip-adapter-plus-face_sdxl_vit-h.safetensors",
"ip-adapter-plus_sdxl_vit-h.safetensors"],
cache_dir="./model/IP-Adapter")
pipeline.set_ip_adapter_scale(ip_adapter_scale)
pil_face_prompt = Image.open(face_prompt)
pil_style_prompt = Image.open(style_prompt)
image = pipeline(
prompt=prompt,
negative_prompt=negative_prompt,
ip_adapter_image=[pil_face_prompt, pil_style_prompt],
denoising_end=denoising_threshold,
num_inference_steps=steps,
output_type="latent",
).images
refiner = StableDiffusionXLImg2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
torch_dtype=dtype,
vae=pipeline.vae,
use_safetensors=True,
cache_dir="./model/stable-diffusion-xl-refiner-1.0"
).to(device)
image = refiner(
prompt=prompt,
num_inference_steps=steps,
denoising_start=denoising_threshold,
image=image,
).images
image[0].show()
Код 2 для PuLID
# git clone https://github.com/ToTheBeginning/PuLID.git
import time
import numpy as np
import torch
from PIL import Image
from sdxl.PuLID.pulid.pipeline import PuLIDPipeline
from sdxl.PuLID.pulid.utils import seed_everything, resize_numpy_image_long
pipeline = PuLIDPipeline()
id_image = Image.open("./me/me.jpg").convert('RGB')
id_image = np.array(id_image)
id_image = resize_numpy_image_long(id_image, 1024)
id_embeddings = pipeline.get_id_embedding(id_image)
aux_images = ['./me/me1.jpg', './me/me2.jpg', './me/me3.jpg', './me/me4.jpg']
aux_embeddings = []
for aux_path in aux_images:
aux_image = Image.open(aux_path).convert('RGB')
aux_image = np.array(aux_image)
aux_image = resize_numpy_image_long(aux_image, 1024)
aux_embeddings.append(pipeline.get_id_embedding(aux_image))
all_embeddings = [id_embeddings] + aux_embeddings
id_embeddings = torch.cat(all_embeddings, dim=1)
prompt = "A black ink contrast drawing of a beautiful guy with tattoos. Two flying red dragons in background. High quality drawing portrait."
negative_prompt = "wrinkles, low resolution wrinkles, low resolution, low quality"
images = pipeline.inference(prompt, (1, 1280, 984), negative_prompt, id_embeddings, 0.85, 0.6, 4)
images[0].show()
Сcылки
1. SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis — 2023 — https://arxiv.org/pdf/2307.01952
2. Stable Diffusion with ? Diffusers — https://huggingface.co/blog/stable_diffusion
3. High-Resolution Image Synthesis with Latent Diffusion Models — 2021 — https://arxiv.org/pdf/2112.10752
4. eDiff-I: Text-to-Image Diffusion Models with an Ensemble of Expert Denoisers — 2022 — https://arxiv.org/pdf/2211.01324
5. SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis — 2023 — https://arxiv.org/pdf/2307.01952
6. Adding Conditional Control to Text-to-Image Diffusion Models — 2023 — https://arxiv.org/pdf/2302.05543
7. LoRA: Low-Rank Adaptation of Large Language Models — 2021 — https://arxiv.org/pdf/2106.09685
8. SDXL-Lightning: Progressive Adversarial Diffusion Distillation — 2024 — https://arxiv.org/pdf/2402.13929
9. DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation — 2022 — https://arxiv.org/pdf/2208.12242
10. ZipLoRA: Any Subject in Any Style by Effectively Merging LoRAs — 2023 — https://arxiv.org/pdf/2311.13600
11. IP-Adapter: Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models — 2023 — https://arxiv.org/pdf/2308.06721
12. PhotoMaker: Customizing Realistic Human Photos via Stacked ID Embedding — 2023 — https://arxiv.org/pdf/2312.04461
13. PuLID: Pure and Lightning ID Customization via Contrastive Alignment — 2024 — https://arxiv.org/pdf/2404.16022