- BrainTools - https://www.braintools.ru -
В прошлом месяце Stability AI выпустила Stable Diffusion XL 1.0 [1] (SDXL) и дала открытый доступ [2] к его исходному коду всем желающим.
Релиз прошел практически незамеченным, потому что шумиха вокруг генеративного искусственного интеллекта [3] немного поутихла. Все слишком заняты ChatGPT [4]ом и прочими ИИ, генерирующими текст.
Примечательно, что это одна из первых моделей с открытым исходным кодом, которая может генерировать изображения с разрешением 1024×1024 без махинаций, а значит, позволяет отображать гораздо больше деталей. На самом деле SDXL состоит из двух моделей: базовой и дополнительной модели улучшения [5], которая значительно повышает детализацию. А поскольку улучшение не замедляет скорость генерации, я настоятельно рекомендую по возможности его использовать.
Отсутствие ажиотажа вокруг SDXL не означает, что он не достоин внимания. Теперь, когда модель имеет полную поддержку для диффузоров от [7]Hugging Face [8] в библиотеке Python с соответствующими оптимизациями производительности, мы можем ее использовать. Дело в том, что демонстрации SDXL в диффузорах [9] просты и легко настраиваются:
import torch
from diffusers import DiffusionPipeline, AutoencoderKL
# load base SDXL and refiner
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix",
torch_dtype=torch.float16)
base = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
vae=vae,
torch_dtype=torch.float16,
variant="fp16",
use_safetensors=True,
)
_ = base.to("cuda")
refiner = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
text_encoder_2=base.text_encoder_2,
vae=base.vae,
torch_dtype=torch.float16,
variant="fp16",
use_safetensors=True,
)
_ = refiner.to("cuda")
# generation using both models (mixture-of-experts)
high_noise_frac = 0.8
prompt = "an astronaut riding a horse"
negative_prompt = "blurry, bad hands"
image = base(
prompt=prompt,
negative_prompt=negative_prompt,
denoising_end=high_noise_frac,
output_type="latent",
).images
image = refiner(
prompt=prompt,
negative_prompt=negative_prompt,
denoising_start=high_noise_frac,
image=image,
).images[0]
Я загрузил облачную виртуальную машину [10] с новым графическим процессором среднего уровня L4 [11] и приступил к работе. С графическим процессором L4 генерация каждого изображения 1024×1024 занимает около 22 секунд. В отличие от предыдущих моделей Stable Diffusion на графических процессорах среднего уровня вы можете генерировать только одно изображение за раз, поскольку используется 100% мощности графического процессора. Так что придётся запастись терпением.
В меньшем разрешении вы можете генерировать быстрее, но делать это не рекомендуется, потому что результаты будут намного хуже.
Диффузоры также обеспечили поддержку двух новых функций, с которыми я раньше не экспериментировал: prompt weighting [12] (Вес подсказки), а также обучение [13] и инференс Dreambooth LoRA [14]. Поддержка веса подсказки с помощью диффузоров принудительно использует библиотеку Python, чтобы использовать вес подсказки более математически [15]. Вы можете добавить любое количество +
или -
к заданному слову, чтобы увеличить или уменьшить его «вес» (важность) в результирующем позиционном встраивании текста и, следовательно, в окончательной генерации. Вы также можете усилить фразы: например, если вы создаете фотореалистичный Сан-Франциско San Francisco landscape by Salvador Dali, oil on canvas (Сан Франциско пейзаж от Сальвадора Дали, холст масло)
, вы можете усилить изобразительное средство San Francisco landscape by Salvador Dali, (oil on canvas)+++
чтобы Stable Diffusion вел себя более предсказуемо. Тестирование показало, что пофиксилась большая часть проблем с подсказками Stable Diffusion 2.0 и выше, особенно с более высоким значением classifier-free guidance [16] (по умолчанию guidance_scale составляет
7,5; я предпочитаю использовать 13).
Все сгенерированные примеры из моделей LoRA в этой статье используют значение guidance_scale
13.
Но что наиболее важно, так это поддержка Dreambooth [17] LoRA, которая позволяет создавать модели Stable Diffusion на заказ. Dreambooth — это метод тонкой настройки Stable Diffusion на очень небольшом наборе исходных изображений и ключевом слове-триггере, позволяющем использовать «концепцию» из этих изображений в других контекстах с заданным ключевым словом.
Обучение самой Stable Diffusion, даже небольших моделей, требует много часов на дорогих графических процессорах. Вот тут-то и появляется LoRA [18]: вместо целой модели обучается небольшой адаптер на визуальную модель. Это значит, что достаточно одного дешевого GPU и 10 минут времени. При этом качество финальной модели + LoRA сравнимо с полной тонкой настройкой. Обученные LoRA представляют собой небольшой дискретный двоичный файл, а значит, им можно легко делиться с другими пользователями или в репозиториях, таких как Civitai [19].
Небольшой недостаток LoRA в том, что вы можете иметь только один актив одновременно: можно объединить несколько LoRA, чтобы получить преимущества от всех, но это непросто.
До того, как LoRA со Stable Diffusion получили более широкое распространение, существовала текстовая инверсия [20], которая позволяла кодировщику текста выучить концепцию. Но на её обучение уходят часы, при этом результаты могут оказаться разочаровывающими.
В предыдущей статье [21] я тренировал текстовую инверсию на меметике Ugly Sonic [22] (Уродливый Соник), так как его не было в исходном наборе данных Stable Diffusion и он был бы уникален. Результаты были неоднозначными:
Попробовать LoRA на Ugly Sonic могло бы стать хорошей проверкой потенциала SDXL. К счастью, Hugging Face предоставляет train dreambooth lora_sdxl.py script [23] для обучения LoRA с использованием базовой модели SDXL, которая работает «из коробки», хотя пришлось немного подправить параметры. Сгенерированные образы Уродливого Соника из обученной LoRA [24] вышли намного лучше и точнее по соответствию подсказкам.
Добившись такого успеха, я решил заново провести еще один эксперимент, который делал с текстовой инверсией [25]. Только теперь я обучил LoRA на сильно искаженных, мусорных изображениях в качестве wrong
подсказки. Я надеялся, что LoRA сможет использовать wrong
в качестве «негативной подсказки» и избегать создания подобных изображений. Я написал Jupyter Notebook [26] для создания синтетических «неправильных» изображений с использованием самого SDXL. На этот раз я использовал различный вес подсказок, чтобы получить более четкие примеры плохих изображений (blurry
и bad hands)
. Как ни странно, нам нужно использовать SDXL для создания изображений низкого качества с высоким разрешением.
wrong
изображений, которые напоминают обложки альбомов панк-рока 2000-х годов.wrong
изображений, которые фокусируются на эффекте зловещей долины [27]. Сгенерированные ИИ изображения на первый взгляд кажутся нормальными, но при ближайшем рассмотрении ты ощущаешь нарастающий ужас. Вот почему важно генерировать примеры с полным разрешением 1024×1024.Я обучил и загрузил LoRA [28] в базовую модель Stable Diffusion XL и написал Jupyter Notebook [29], чтобы сравнить результаты с заданной подсказкой:
Базовый уровень + улучшение. Без LoRA. (наш базовый уровень)
Без использования отрицательной подсказки wrong
(чтобы убедиться, что нет эффекта плацебо)
С использованием LoRA отрицательной подсказки wrong
(наш целевой результат)
Каждый вариант имеет один и тот же источник, поэтому композиция изображения должна быть одинаковой для всех трех случаев, а влияние отрицательной подсказки wrong
и LoRA на базовое изображение должно быть очевидным.
Начнем с простой подсказки из демо SDXL 0.9 [30] :
A wolf in Yosemite National Park, chilly nature documentary film photography
Подсказка wrong
на базовой модели добавляет листву и дополнительную глубину изображению леса, но LoRA добавляет гораздо больше: более четкое освещение и тени, более детализированную листву и изменение позы волка, чтобы он смотрел в камеру, что смотрится более интересно.
Мы можем получить другую перспективу с похожей композицией фотографии, добавив к подсказке «очень крупный план», используя тот же исходник.
An extreme close-up of a wolf in Yosemite National Park, chilly nature documentary film photography
Версия с LoRA имеет гораздо лучшую текстуру, яркость и резкость, чем другие. Примечательно, что само по себе добавление wrong
подсказки меняет перспективу.
Еще один хороший пример — фуд-фотография, особенно странная фуд-фотография, которую я создал с помощью DALL-E 2 [31] . Могут ли SDXL + wrong
LoRA обрабатывать неевклидовы [32] гамбургеры с усиленным весом подсказки, чтобы сделать их действительно странными.
a large delicious hamburger (in the shape of five-dimensional alien geometry)++++, professional food photography
К сожалению, не может даже после нескольких попыток. Тем не менее, результат все еще интересен: базовый SDXL, похоже, воспринял «инопланетную» часть подсказки более буквально, чем ожидалось (и изобразил миленького инопланетянина в шляпке-булочке!), но LoRA лучше понимает именно дух подсказки. Он делает «инопланетный» бургер, который людям было бы трудно съесть. Ну и сама подача куда эффектнее.
Заметно улучшилась читаемость текста в Stable Diffusion 2.0. Могут ли SDXL и wrong
LoRA сделать текст еще более читабельным? Например, нормально изобразить развороты газет с большим количеством текста?
lossless PDF scan of the front page of the January 2038 issue of the Wall Street Journal featuring a cover story about (evil robot world domination)++
По сравнению со Stable Diffusion 2.0 читаемость текста стала лучше, но не слишком. Что примечательно, в LoRA макет страницы стал более «современным» с различной вёрссткой статей, а заголовки имеют правильный размер и толщину шрифта. Между тем, базовая модель даже с
негативной подсказкой wrong,
имеет скучную компоновку и почему-то сделана на состаренной пожелтевшей бумаге.
А как насчет изображений людей? Решает ли LoRA с помощью wrong
печально известную проблему [33] рук? В обучающие данные LoRA мы включали немало таких негативных примеров. Давайте изменим подсказку про Тейлор Свифт из моей первой попытки со Stable Diffusion 2.0:
USA President Taylor Swift (signing papers)++++, photo taken by the Associated Press
Посмотрите на правую руку Тейлор: в SDXL по умолчанию она крайне нереалистична и на самом деле становится даже хуже при добавлении wrong
, но в LoRA это исправлено! Цветокоррекция с помощью LoRA намного лучше: пиджак более белый, а не желтовато-белый. Но с руками всё ещё проблема: создавать людей с помощью SDXL 1.0 по-прежнему сложно и результат нестабилен.
Теперь ясно, что wrong
+ LoRA работает более интересно, чем просто отрицательная подсказка wrong
, поэтому мы просто сравним базовый результат с результатом LoRA. Вот еще несколько примеров сравнения базовой модели с wrong
LoRA:
realistic human Shrek blogging at a computer workstation, hyperrealistic award-winning photo for vanity fair
— Руки лучше, освещение лучше. Одежда более детализирована, а фон интереснее.pepperoni pizza in the shape of a heart, hyperrealistic award-winning professional food photography
— Пепперони более детализирован и имеет интересную текстуру, меньше лишних пепперони по краям, корочка выглядит более хрустящейpresidential painting of realistic human Spongebob Squarepants wearing a suit, (oil on canvas)+++++
— У Губки Боба снова появился нос, а на его костюме стало больше пуговиц.San Francisco panorama attacked by (one massive kitten)++++, hyperrealistic award-winning photo by the Associated Press
— LoRA на самом деле пытается вникнуть в подсказку.hyperrealistic death metal album cover featuring edgy moody realistic (human Super Mario)++, edgy and moody
— Пропорции Марио более корректны, а освещение более резкое и мрачное.LoRA wrong
доступен здесь [28], хотя я не могу гарантировать его эффективность в интерфейсах, отличных от диффузоров. Все ноутбуки, используемые для создания этих изображений, доступны в этом репозитории GitHub [34], включая общий блокнот [35] wrong
SDXL 1.0 + Refine + LoRA Colab, который вы можете запустить на бесплатном графическом процессоре T4. И если вы хотите увидеть показанные здесь изображения в более высоком разрешении, можете просмотреть их в исходном коде сообщения [36].
На самом деле я не уверен на 100%, что происходит под капотом. Я думал, что трюк с wrong
LoRA просто улучшает качество и четкость сгенерированного изображения, но, похоже, LoRA заставляет SDXL вести себя более разумно и более точно соответствовать духу подсказки. На техническом уровне отрицательная подсказка устанавливает область скрытого пространства, где начинается процесс диффузии; эта область одинакова как для базовой модели, использующей отрицательную подсказку wrong
, так и для wrong в
LoRA. Думаю, что LoRA изменяет эту нежелательную область обширного многомерного скрытого пространства, чтобы она была более похожа на начальную область, поэтому маловероятно, что нормальная генерация ее улучшит.
Обучение SDXL на плохих изображениях с целью его улучшения технически является формой обучения с подкреплением на основе отзывов людей [37] (RLHF): та же техника, [38] которая использовалась при обучении ChatGPT и сделала его настолько мощным. В то время как OpenAI использует обучение с подкреплением [39], чтобы улучшить модель на основе позитивных взаимодействий с пользователем и неявно уменьшить негативное поведение [40], я использую негативные взаимодействия с пользователем (т. е. выбор заведомо плохих изображений) для неявного усиления позитивного поведения [41]. Но с Dreambooth LoRA вам не нужно столько входных данных, сколько требуется большим языковым моделям.
Есть ещё множество путей для развития «отрицательных LoRA»: мои параметры генерации синтетического набора данных можно было бы значительно улучшить, а LoRA можно было бы обучать дольше. Но пока что я очень доволен результатами и буду рад провести больше тестов с отрицательными LoRA. Например, слияние с другими LoRA, чтобы понять, способно ли это их улучшить (особенно LoRA + Ugly Sonic LoRA! wrong
)
Хотите верьте, хотите нет, но это только верхушка айсберга. SDXL теперь имеет поддержку [42] ControlNet для [43] строгого управления общей формой и композицией сгенерированных изображений:
ControlNet также можно использовать с LoRA, а это уже повод для новой статьи…
Автор: Cloud4Y
Источник [44]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/10630
URLs in this post:
[1] Stable Diffusion XL 1.0: https://stability.ai/blog/stable-diffusion-sdxl-1-announcement
[2] дала открытый доступ: https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0
[3] интеллекта: http://www.braintools.ru/article/7605
[4] ChatGPT: https://chat.openai.com/
[5] модели улучшения: https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0
[6] внимание: http://www.braintools.ru/article/7595
[7] диффузоров от : https://huggingface.co/docs/diffusers/index
[8] Hugging Face: https://huggingface.co/
[9] демонстрации SDXL в диффузорах: https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/stable_diffusion_xl
[10] облачную виртуальную машину: https://www.cloud4y.ru/cloud-hosting/gpu/
[11] графическим процессором среднего уровня L4: https://www.nvidia.com/en-us/data-center/l4/
[12] prompt weighting: https://huggingface.co/docs/diffusers/using-diffusers/weighted_prompts
[13] обучение: http://www.braintools.ru/article/5125
[14] Dreambooth LoRA: https://huggingface.co/docs/diffusers/training/dreambooth
[15] математически: http://www.braintools.ru/article/7620
[16] classifier-free guidance: https://arxiv.org/abs/2207.12598
[17] Dreambooth: https://dreambooth.github.io/
[18] LoRA: https://github.com/microsoft/LoRA
[19] Civitai: https://civitai.com/
[20] текстовая инверсия: https://arxiv.org/abs/2208.01618
[21] предыдущей статье: https://minimaxir.com/2022/09/stable-diffusion-ugly-sonic/
[22] Ugly Sonic: https://knowyourmeme.com/memes/ugly-sonic
[23] train dreambooth lora_sdxl.py script: https://github.com/huggingface/diffusers/tree/main/examples/dreambooth
[24] обученной LoRA: https://huggingface.co/minimaxir/sdxl-ugly-sonic-lora
[25] еще один эксперимент, который делал с текстовой инверсией: https://minimaxir.com/2022/11/stable-diffusion-negative-prompt/
[26] написал Jupyter Notebook: https://github.com/minimaxir/sdxl-experiments/blob/main/wrong_image_generator.ipynb
[27] зловещей долины: https://en.wikipedia.org/wiki/Uncanny_valley
[28] LoRA: https://huggingface.co/minimaxir/sdxl-wrong-lora
[29] Jupyter Notebook: https://colab.research.google.com/github/minimaxir/sdxl-experiments/blob/main/sdxl_wrong_comparison.ipynb
[30] демо SDXL 0.9: https://stability.ai/blog/sdxl-09-stable-diffusion
[31] создал с помощью DALL-E 2: https://minimaxir.com/2022/07/food-photography-ai/
[32] неевклидовы: https://en.wikipedia.org/wiki/Non-Euclidean_geometry
[33] проблему: https://www.buzzfeednews.com/article/pranavdixit/ai-generated-art-hands-fingers-messed-up
[34] в этом репозитории GitHub: https://github.com/minimaxir/sdxl-experiments
[35] блокнот: https://colab.research.google.com/github/minimaxir/sdxl-experiments/blob/main/sdxl_image_generation.ipynb
[36] коде сообщения: https://github.com/minimaxir/minimaxir.github.io/tree/master/content/post/2023-08-21-stable-diffusion-xl-wrong
[37] обучения с подкреплением на основе отзывов людей: https://openai.com/research/learning-from-human-preferences
[38] же техника,: https://openai.com/research/instruction-following
[39] подкреплением: http://www.braintools.ru/article/5528
[40] поведение: http://www.braintools.ru/article/9372
[41] поведения: http://www.braintools.ru/article/5593
[42] теперь имеет поддержку: https://huggingface.co/diffusers/controlnet-canny-sdxl-1.0
[43] для: https://github.com/lllyasviel/ControlNet
[44] Источник: https://habr.com/ru/companies/cloud4y/articles/756496/?utm_source=habrahabr&utm_medium=rss&utm_campaign=756496
Нажмите здесь для печати.