Всем привет! Сегодня хочу пригласить вас в небольшое путешествие в мир генеративных нейросетей. Это будет скорее экспериментальный и развлекательный пост, никакого занудства — только практика и живой интерес. В качестве подопытных у нас выступят уже обученные диффузионные модели.
Поехали! Думаю, ни для кого не секрет, что вся магия будет твориться на Python с его экосистемой библиотек. Мой главный инструмент сегодня — библиотека diffusers с открытым исходным кодом. Это настоящий швейцарский нож для работы с диффузиями: она умеет всё — от загрузки популярных моделей до их тонкой настройки. Но звезда сегодняшнего вечера — это StableDiffusionPipeline. Кстати, называть это просто нейросетью было бы ошибкой. На самом деле это целый конвейер, сложный механизм, где несколько мощных компонентов работают в унисон, чтобы превратить ваш текстовый запрос в готовое изображение. Давайте разбираться, как это устроено!
Напишем небольшой код:
1from genaibook.core import get_device 2import torch 3from diffusers import StableDiffusionPipeline 4 5device = get_device() 6pipe = StableDiffusionPipeline.from_pretrained( 7 "stable-diffusion-v1-5/stable-diffusion-v1-5", 8 torch_dtype=torch.float32 9).to(device) 10 11if device == "cpu": 12 pipe.enable_attention_slicing() 13 14prompt = "sun" 15image = pipe(prompt).images[0] 16image.show()
Разберем код построчно в мельчайших деталях.
- 1. from genaibook.core import get_device — импортирует функцию get_device() из пользовательского модуля genaibook.core. Это вспомогательная функция которая автоматически определяет, какое устройство доступно: "cuda" — если есть видеокарта NVIDIA с поддержкой CUDA, "mps" — если это Mac с чипом Apple Silicon (M1/M2/M3), "cpu" — если ничего из вышеперечисленного не найдено.
- 2. import torch — импортирует PyTorch — основную библиотеку для работы с нейросетями. Используется для работы с тензорами и управления устройствами.
- 3. from diffusers import StableDiffusionPipeline — импортирует основной класс для работы со Stable Diffusion. Краткое описание которого уже приведено мною выше.
- 5. device = get_device() — Определение устройства. Вызов функции get_device() возвращает строку с названием устройства (например, "cuda"), которое будет использоваться для вычислений. Это критически важно, так как: на GPU (CUDA) генерация будет в 10-50 раз быстрее, на CPU процесс будет очень медленным (минуты вместо секунд).
- 6-9. pipe = StableDiffusionPipeline.from_pretrained(...) — "stable-diffusion-v1-5/stable-diffusion-v1-5" — указывает путь к модели на Hugging Face Hub. Это официальная модель Stable Diffusion v1.5 от Stability AI. При первом запуске она будет скачана (5-7 ГБ) и сохранена в кэш. Можно указать параметр cache_dir (str) который указывает путь к папке на локальном диске, где будут храниться загруженные модели. torch_dtype=torch.float32 — задает точность вычислений. Значение float32 полная точность (32 бита), обеспечивает максимальное качество, но требует больше памяти (~5-6 ГБ VRAM), для менее производительных устройств можно использовать значение torch.float16, но точность снизиться в два раза. Так же метод from_pretrained может использовать следующие параметры: variant (str, например, "fp16" или "non_ema") — Позволяет загрузить конкретную "вариацию" модели из репозитория. Например, для экономии видеопамяти можно установить variant="fp16", чтобы загрузить версию с половинной точностью (часто используется вместе с torch_dtype=torch.float16). Также может использоваться для загрузки версии без EMA (Exponential Moving Average) для задач тонкой настройки. safety_checker (bool или None) — Позволяет управлять встроенным фильтром для проверки сгенерированного контента (NSFW). Чтобы отключить его (и тем самым немного ускорить генерацию), нужно передать safety_checker=None.
- 9. to(device) — помещает всю загруженную модель на выбранное устройство, все тензоры модели будут храниться и обрабатываться там.
- 11-12. if device == "cpu": pipe.enable_attention_slicing() — Если модель работает на процессоре то включаем оптимизацию памяти, если наша модель будет работать на графическом процессоре то эта оптимизация не нужна.
- 14-16. prompt = "sun"; image = pipe(prompt).images[0]; image.show() — Сама генерация и отображение изображения. Для сохранения результата генерации изображения на локальном диске необходимо использовать вместо метода show(), метод save([имя файла]).
Немножко о модели «Stable Diffusion v1.5»
Это одна из самых известных и широко используемых моделей для генерации изображений по текстовому описанию, разработана и выпущена в 2022 году. Она стала важной вехой в развитии открытых генеративных моделей и до сих пор остается популярной благодаря своей гибкости и большому сообществу. Модель оптимизирована для генерации изображений с разрешением 512x512 пикселей, именно на нем она показывает наилучшее качество. Лицензия: Распространяется под лицензией CreativeML OpenRAIL-M, которая позволяет использовать модель в коммерческих и некоммерческих целях, но накладывает ограничения на создание вредоносного контента.
Преимущества:
- Огромное сообщество: Для нее созданы тысячи специализированных тонко настроенных версий (fine-tunes) под разные стили, которые часто называют DreamBooth-моделями.
- Скорость и низкие требования: Она значительно быстрее и менее требовательна к ресурсам, чем, например, SDXL, что позволяет запускать ее даже на мобильных устройствах или в браузере.
Недостатки:
- Промт задается на английском языке.
- Качество: Не достигает полной фотореалистичности.
- Текст: Не умеет генерировать разборчивый текст внутри изображений.
- Сложные сцены: Испытывает трудности с задачами на композицию объектов (например, "красный куб на синем шаре").
- Генерация лиц: Лица и люди в целом могут генерироваться с искажениями.
- Язык и культура: Лучше всего работает с английскими запросами и может отражать культурные и расовые предубеждения, присутствующие в обучающих данных.
Примеры сгенерированных изображений моделью «Stable Diffusion v1.5»
Следующим шагом будет выбор другой модели и генерация с помощью ее новых изображений. В таблице ниже представлены альтернативные модели.
| Название модели | Имя в репозитории | Особенности |
|---|---|---|
| Stable Diffusion v2.1 | stabilityai/stable-diffusion-2-1 |
Лучше понимает промпты, 768x768 |
| SDXL | stabilityai/stable-diffusion-xl-base-1.0 |
Высокое качество, 1024x1024 |
| SDXL Turbo | stabilityai/sdxl-turbo |
Очень быстрая (1-2 шага вместо 50) |
| Stable Diffusion 3 | stabilityai/stable-diffusion-3-medium |
Новая архитектура, лучшее качество |
| Realistic Vision | SG161222/Realistic_Vision_V5.1_noVAE |
Фотореализм |
| DreamShaper | Lykon/dreamshaper-xl-1-0 |
Универсальная, арт-стили |
| OpenJourney | prompthero/openjourney |
Стиль Midjourney |
| Anime | hakurei/waifu-diffusion |
Аниме-стиль |
Пробуем генерировать изображения при помощи модели «SDXL»
Вес модели составляет порядка 14 Гб. Ниже приведены образцы изображений с промтами. Генерация одного изображения занимает более длительное время чем это было сделано предыдущей моделью.
Генерировать изображения с помощью модели «SDXL Turbo»
Генерация одного изображения также как и предыдущая модель, занимает длительное время (т.к. у меня нет графического ускоретеля).
Итог. О качестве генерируемых изображений, в зависимости от выбранной модели, можете судить сами, результаты представлены наглядно. К сожалению проверить какие сгенерированные изображения возвращают другие модели, мне не удалось и все мои попытка это сделать потерпели фиаско, т.к. у меня нет видеокарты (вообще ее нет, возможно я когда нибудь ее приобрету).
На этом все, в следующей статье попробуем создать 3-х слойную сверточную сеть распознающую печатные буквы русского алфавита, без каких-либо фреймворков.