
Идея проекта — создать «диалог эпох» через генеративное искусство: обучить Stable Diffusion на стилях двух контрастных художников, чтобы сгенерировать серию изображений, иллюстрирующих эволюцию искусства от классического реализма к модернистскому кубизму.
Из всего датасета я отобрала изображения работ только двух художников:
Уинслоу Гомер (Winslow Homer): 14 изображений. Американский художник-реалист XIX века, известный морскими пейзажами, сценами повседневной жизни и изображениями природы. Его стиль характеризуется реалистичным изображением света, цвета и динамики (например, волны, ветер, люди в естественной среде).
Пабло Пикассо (Pablo Picasso): 17 изображений. Испанский художник XX века, один из основоположников кубизма, с абстрактными формами, геометрическими фигурами и экспериментами с перспективой
Для обучения моделей Stable Diffusion я использовала данные из National Gallery of Art Open Data Program — открытого репозитория, предоставляемого Национальной галереей искусства США (National Gallery of Art, NGA). Этот датасет содержит метаданные о более чем 130,000 произведениях искусства из коллекции галереи, включая информацию об авторах, названиях работ, датах создания, материалах и ссылках на изображения. Данные доступны в формате CSV и обновляются ежедневно.
Репозиторий: github.com/NationalGalleryOfArt/opendata
Страница с политикой открытого доступа к изображениям: nga.gov/artworks/free-images-and-open-access
Данные и изображения из этого источника выпущены под лицензией Creative Commons Zero (CC0 1.0), что означает полное отречение от авторских прав и смежных прав. Это позволяет свободно использовать, модифицировать, распространять и применять данные в любых целях, включая коммерческие, без необходимости указания авторства или получения разрешения.
Также я использовала grok4 для генерации идей
Пайплайн обучения
Что такое LoRA? LoRA (Low-Rank Adaptation) — это умный способ обучить огромную нейросеть, не трогая большую часть её весов. Вместо того чтобы менять все 865 миллионов параметров Stable Diffusion, я добавляю к ней маленькие «адаптеры» и обучаю только их. В результате обучаются всего 0,6% параметров, что сильно экономит память и время.
Картины авторов для обучения
Результирующая серия изображений
На мой взгляд, финальная серия изображений вышла очень удачная. Так как изначальной задумкой было с помощью SD сгенерировать серию изображений, сочетающих реалистичный стиль Уинслоу Гомера (морские пейзажи, динамика природы) с кубизмом Пабло Пикассо (геометрические формы, абстракция). это и вышло по итогу. Действительно, в результате, картинки выходили со смешением абстрактного и классического стиля
Анализ работ
В данной картине нейросеть в лице будто показала более классические черты, а все остальное оставила в кубизме, что как раз соответствует запросу. Возможно здесь преобладает кубизм, однако все равно видно, что здесь не только след от Пикассо.
На данной сгенерированной картине тоже хорошо виден результат работы. Если рассмотреть внимательно, становится видно, что лицо человека выглядит достаточно реалистично и точно не является чистым кубизмом. Скорее это отсылка к Уинслоу Гомеру. Однако костюм мужчины явно в более кубических формах, что отсылает уже к кубизму.
На самом деле, в процессе обучения получались интересные изображения. Например, некоторые выходили прямо супер классическими и почти не содержали кубических форм, однако к последним изображениям нейросеть начала лучше видеть и различать стили и начала выдавать более качественный результат. Ниже будет представлена первая сгенерированная картина, которая явно не содержит в себе особых кубических форм.
Доп описание процесса обучения со скриншотами
Перед началом я скачала датасет с изображениями картин Гомера и Пикассо, затем разархивировала zip-архив и переименовала папки для удобства. (будет отражено в коде)
Затем установила необходимые библиотеки для обучения с LoRA (будет отражено в коде)
Шаг второй: загружаю и анализирую датасет с картинами Гомера и Пикассо
Всего изображений: 31
Распределение по художникам: artist Picasso, Pablo 17 Homer, Winslow 14 Name: count, dtype: int64
1. Разделяю датасет: фильтрую строки по имени художника 2. Создаю отдельные папки для каждого художника (хотя далее буду обучать на смешанном датасете) 3.Копирую файлы изображений Гомера в отдельную папку 4.Копирую файлы изображений Пикассо в отдельную папку
1. Создаю папку для сохранения визуализаций 2. Создаю сетку 2×4 для визуализации примеров из датасета 3. Верхний ряд: 4 примера работ Уинслоу Гомера (реализм, морские пейзажи) 4. Нижний ряд: 4 примера работ Пабло Пикассо (кубизм, абстракция)
Подготовка модели и обучение с LoRA
Для обучения я использовала технику LoRA (Low-Rank Adaptation) для экономии ресурсов и предотвращения переобучения на небольшом датасете. Без него постоянно было CUDA out of memory
Создаю класс датасета и настраиваю LoRA для обучения
1. Импортирую библиотеки для работы с LoRA 2. Запускаю сборщик мусора Python
1* UNet: главная нейросеть, которая убирает шум из изображения Именно её я буду дообучать с помощью LoRA на картинах 2* VAE (Variational AutoEncoder): сжимает изображения в компактное представление (latents) и обратно декодирует latents в полноразмерные изображения 3* Noise Scheduler: управляет процессом добавления/удаления шума на разных этапах
1* Gradient checkpointing: не храню все промежуточные вычисления, а пересчитываю при необходимости (Замедляет обучение примерно на ~20%, но экономит много памяти) 2* xFormers: оптимизированная реализация механизма внимания в трансформерах (attention) Ускоряет работу и уменьшает потребление памяти 3* CPU offload: часть модели хранится в оперативной памяти, а не видеопамяти 4. Замораживаю веса компонентов, которые не нужно обучать Это экономит память и ускоряет обучение
1. Применяю LoRA к этим типам слоёв нейросети 2. Создаю конфигурацию LoRA
1. Применяю LoRA к UNet 2. Показываю, сколько параметров на самом деле обучаются 3. Создание pipeline
1. Включаю оптимизации в финальном pipeline 2. Сохранение 3. Для LoRA сохраняю только адаптеры, а не всю модель
Планировщик обучения
Основная функция обучения
Процесс обучения: 1. Загружаю картины из датасета 2. Загружаю предобученную Stable Diffusion 3. Добавляю к ней LoRA адаптеры 4. Обучаю только адаптеры на наших картинах 5. Сохраняю обученные адаптеры
memory limit — подбирает оптимальные параметры обучения в зависимости от объёма видеопамяти.
Если памяти мало — уменьшаем разрешение, batch size и ранг LoRA.
Если памяти достаточно — используем более качественные настройки.
1. Запускаю обучение модели 2. Получаю рекомендуемые параметры в зависимости от объёма GPU памяти 3. Запускаю обучение модели с LoRA на смешанном датасете (Гомер + Пикассо) Модель научится генерировать изображения, сочетающие оба стиля 4. Очищаю память GPU после обучения
Генерация изображений с обученными LoRA моделями