Исходный размер 1848x2745

Обучение Stable Diffusion стилю «Over the garden wall»

big

Описание идеи и исходные изображения

В этой работе мне хотелось поймать и передать атмосферу мультфильма «По ту сторону изгороди». Этот сериал обладает уникальным художественным стилем, средой и нарративом; у него много фанатов, однако ничего похожего за последние 11  лет так и не вышло. Поэтому я посчитал, что будет здорово и важно обучить ИИ, который сможет воспроизводить визуальные аспекты из «По ту сторону изгороди».

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

big
Исходный размер 1280x720

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

В начале обучения была поставлена цель перенять цветовую палитру, линии, силуэты и освещение / тени. Во многом эта задача оказалось выполненной.

big
Исходный размер 2400x1350

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 1920x1080

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Сложность обучения Stable Diffusion напрямую перекликается с особенностями стиля мультсериала. Дело в том, что он совмещает глубоко детализированные объекты окружения — лес, долина, пустошь — и минималистичных, отчасти карикатурных персонажей.

Исходный размер 1600x900

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 1920x1080

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

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

0

Скриншоты для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 2880x1605

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

0

Скриншоты для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 2026x1136

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 1600x900

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 1920x1080

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Исходный размер 1920x1080

Скриншот для обучения Stable Diffusion, «По ту сторону изгороди», режиссёр Нат Кэш, 2014

Результирующие изображения и пояснения

При генерации картинок я вдохновлялся сюжетными аспектами «По ту сторону изгороди». Так, больше всего было сгенерировано иллюстраций с лесом, потому что герои практически не выбирались из него; получилось много примеров с ветками, кустами и растениями, лесными обитателями и в целом природой.

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Заход солнца в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Осенний туманный лес»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Викторианский коттедж в лесу»

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

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Пикник в лесу»

Также был сделан акцент на магических / загадочных атрибутах, таких как зеркало, ножницы или пианино.

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Винтажное волшебное зеркало»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Поезд, пересекающий лес»

Во многом стиль мультика получилось повторить: сгенерированные изображения обладают схожей палитрой, мазками, наполненностью композиции и наложением теней. Тем не менее сеть довольно посредственно справляется с визуализацией антропоморфных существ или животных.

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Винтажный пароход плывёт по реке»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Винтажный пароход плывёт по реке»

Есть прецеденты, когда из-за сложности запроса ИИ совершенно выходила за пределы обозначенной цветовой гаммы. Поэтому нейросети есть куда расти.

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Силуэт человека с оленьими рогами»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Силуэт фигуры с оленьими рогами»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Паук и паучья сеть в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Ледяное озеро в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Осенний туманный лес»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Викторианский винтажный коттедж»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Птицы в кустах, окруженные терниями»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Кот в шляпе в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Осень, огороженная сельская местность»

Изображения сгенерированные после обучения Stable Diffusion. Промпт: «Маленькая птица в лесу»

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

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Пианино в тёмном месте»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Ветряная мельница в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Ветряная мельница в лесу у реки»

Изображения сгенерированные после обучения Stable Diffusion. Промпт: «Лачуга в тёмном лесу»

При запросе нарисовать домик можно заметить, что Stable Diffusion сдвигает объект в угол, а лес выводит на первый план, на него выставляет акценты. На картинках доминируют коричневые и зелёные оттенки.

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Деревня вид издалека»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Осеннее туманное кладбище»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Цирковой шатёр в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Поле из подсолнухов»

Исходный размер 3072x2730

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Винтажный паровой поезд в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Заход солнца в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Золотой час в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Золотой час в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Винтажная комната с книгами»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Олень в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Олень в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Цветочная поляна в лесу»

Исходный размер 768x768

Изображение сгенерированное после обучения Stable Diffusion. Промпт: «Цветочная поляна в лесу»

Код и процесс обучения

В начале я устанавливаю необходимые библиотеки: diffusers (для диффузионных моделей), accelerate (для обучения с распределенной и смешанной точностью) и bitsandbytes (для оптимизаторов, экономящих память). Затем подключаю Google Диск, на случай если для обучения понадобится доступ к локальному набору данных или хранения контрольных точек.

Следующий блок устанавливает и настраивает xformers  — библиотеку, которая ускоряет операции графических процессоров. Эта настройка гарантирует, что все зависимости установлены, а среда выполнения готова для интенсивных операций с GPU.

Исходный размер 1880x1504

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Далее я добавляю основные библиотеки: стандартные модули Python (такие как itertools, math, os) обрабатывают общие операции, в то время как специализированные модули (из torch, diffusers и transformers) отвечают за глубокое обучение, обработку диффузионной модели и кодирование текста.

Использую вспомогательную функцию image_grid для тестовой визуализации изображений в формате таблицы. Она используется позже для отображения набора данных и сгенерированных выходных данных.

Исходный размер 1892x1210

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Затем в скрипте задаю путь к базовой модели (в данном случае «stabilityai/stable-diffusion-2»), которая служит предварительно подготовленной контрольной точкой. После прописываю код для отображения загруженных изображений в виде таблицы; это нужно, чтобы проверить правильность организации набора данных перед началом обучения.

Следующий этап: загружаю картинки и преобразую их в RGB (для стандартизации входного формата), привожу иллюстрации к одинаковому формату для корректного обучения: изменяю размер, обрезаю, нормализую. Нормализация — масштабирование значений пикселей до диапазона, обычно ориентированного вокруг нуля — крайне важна, потому что она согласуется с распределением данных, ожидаемым нейронной сетью.

Обработка осуществляется с использованием инструментария torchvision от PyTorch, он гарантирует что все изображения, поступающие в сеть, имеют одинаковые размеры и распределение.

Исходный размер 3670x1774

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Также я определяю два основных класса наборов данных:

DreamBoothDataset: Этот класс обрабатывает как «изображения экземпляров» (пользовательские изображения, которые описывают новую концепцию), так и необязательные «изображения классов», если включено предварительное сохранение. Предварительное сохранение — это метод, при котором используются дополнительные изображения из того же класса (но не содержащие новой концепции), чтобы гарантировать, что модель не будет перегружена несколькими обучающими изображениями.

Набор данных возвращает маркированные текстовые подсказки вместе с преобразованными изображениями и настраивает каждый образец как пару графических данных и соответствующее им текстовое описание.

PromptDataset: Этот набор данных используется при создании изображений классов, если это необходимо. Он повторяет заданный запрос несколько раз, чтобы модель могла создавать несколько изображений для предварительного сохранения.

Исходный размер 2114x1798

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Если включена опция предварительного сохранения, скрипт проверяет, существует ли необходимое количество изображений классов. Если нет, он использует предварительно обученный пайплайн Stable Diffusion для их генерации на лету. Это нужно для улучшения обобщения и сохранения целостности более широкой концепции класса при точной настройке ограниченного набора пользовательских изображений.

Затем я загружаю три критически важных компонента из предварительно подготовленной модели:

Кодировщик текста (CLIPTextModel): Обрабатывает текстовые подсказки для создания вложений.

Вариационный автоэнкодер (VAE): Кодирует изображения в скрытое пространство и декодирует их обратно. Этот шаг необходим для процесса распространения, поскольку он уменьшает размер изображения и фокусируется на функциях высокого уровня.

UNet: Основная сеть, которая учится устранять скрытые помехи в изображениях. Эта модель отрабатывается в процессе обучения, поскольку она учит, как «обратить вспять» процесс диффузии (добавления шума) и генерировать связные изображения по промпту. Также загружаю токенизатор для преобразования текстовых описаний в идентификаторы токенов, которые может обрабатывать кодировщик текста.

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

Обучение со смешанной точностью («fp16»): Сокращает использование памяти и ускоряет обучение за счет использования арифметики с меньшей точностью.

Контрольные точки градиента: Дополнительно экономит память, сохраняя активации только на выбранных слоях. Использование 8-разрядного оптимизатора Adam Оптимизирует использование памяти и позволяет проводить обучение на домашних ПК.

Исходный размер 1846x1300

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

В этом блоке я определяю ядро обучения. Основные этапы включают в себя:

Настройка ускорителя: Ускоритель из библиотеки accelerate от Hugging Face используется для плавного управления тренировками с разной точностью и на нескольких устройствах. Он также управляет накоплением градиента. Замораживание ненужных весов: VAE (и, возможно, текстовый кодировщик) заморожены (т.е. их параметры настроены так, что не требуют градиентов), поскольку тонкой настройке подвергается только UNet. Это снижает вычислительную нагрузку и предотвращает переобучение.

Инициализация оптимизатора: В зависимости от настроек, код выбирает 8-разрядный Adam-оптимизатор, который экономит память. Он настроен на обновление только тех параметров, для которых требуются градиенты. Загрузчик данных и сортировка: Обучающий набор данных помещается в загрузчик данных, который перемешивает данные и группирует выборки. Прописанная функция сортировки гарантирует, что изображения сэмплов и (если применимо) классов и их маркированные подсказки будут корректно сгруппированы.

Планировщик скорости обучения: Планировщик настроен для управления скоростью обучения во время тренировки, хотя в данном случае используется постоянная скорость обучения. Цикл обучения: Кодирование изображений: Каждое изображение прогоняется через VAE для получения скрытых образов. Затем скрытые образы масштабируются. Добавление шума: Случайный шум отбирается и добавляется к скрытым шумам через диффузию.

Исходный размер 1980x1806

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Прогнозирование UNet: UNet обрабатывает скрытые шумы вместе с закодированными текстовыми подсказками (кондиционирование), чтобы предсказать добавленный шум. Вычисление потерь: Прогнозируемый шум сравнивается с фактическим шумом с использованием среднеквадратичной ошибки потерь. Если включено предварительное сохранение, потери вычисляются двумя блоками (один для изображений, например, и один для изображений классов), а затем объединяются.

Обратное распространение: градиенты вычисляются и накапливаются. Затем оптимизатор обновляет веса модели, и градиенты удаляются. Контрольные точки: через регулярные промежутки времени текущее состояние модели сохраняется в чекпоинт. Это важно для длительных тренировок, чтобы восстановиться после возможных перерывов либо решить проблему переобучения.

Исходный размер 1914x1678

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Следующий шаг — запускаю функцию обучения с помощью accelerate.notebook_launcher для эффективного цикла обучения на всех доступных устройствах. После обучения все остаточные градиенты удаляются, чтобы освободить память. Затем сохраняю модель в репозитории Hugging Face.

Исходный размер 1878x1622

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Исходный размер 1674x1110

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

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

Исходный размер 1872x752

Скриншот кода для обучения Stable Diffusion стилю «Over the garden wall», Google Colaboratory

Использование ГенИИ

При работе с обучением Stable Diffusion я обращался к чату GPT от Open AI, он помогал мне с решением багов в коде, генерацией идей для результирующих изображений, а также объяснял, как работают библиотеки и функции.

Обучение Stable Diffusion стилю «Over the garden wall»
Проект создан 03.04.2025
Мы используем файлы cookies для улучшения работы сайта и большего удобства его использования. Более подробную информац...
Показать больше