

Идея проекта
Темой моего проекта стали портреты XVIII века — жанр, в котором особенно чётко проявляется характер человека, внимание к свету, фактуре и композиции. Меня заинтересовало, как современные технологии могут переосмысливать такие образы и сохранять их выразительность в цифровой среде.
Для этого я использую нейросеть Stable Diffusion и метод обучения LoRA, который позволяет адаптировать модель под нужный стиль без больших вычислительных затрат. Цель проекта — обучить нейросеть создавать изображения в духе классической живописи и понять, насколько точно она способна передавать настроение и эстетику XVIII века.
Далее я поэтапно расскажу о каждом процессе внутри проекта — от подбора и подготовки датасета до обучения модели и анализа полученных результатов
1. Импорт библиотек
На первом этапе я подключила все необходимые библиотеки, которые используются при обучении и генерации изображений

torch и torch.nn отвечают за построение и обучение нейронных сетей, torchvision.transforms используется для предварительной обработки изображений, diffusers содержит реализацию Stable Diffusion, а peft — модуль, который позволяет обучать лёгкие адаптационные слои LoRA без изменения основной модели.
Path, os и PIL.Image обеспечивают работу с файлами и изображениями, tqdm выводит прогресс обучения, а random помогает при случайной выборке данных и промптов.
Таким образом, этот блок подготавливает окружение и инструменты для всех последующих шагов.
На первом этапе для обучения модели я использовала изображения портретов, которые изначально были взяты с сайта Kaggle — Art Portraits. После скачивания все файлы были размещены в папке проекта на Google Drive
2. Подключение Google Drive
Данный этап обеспечивает сохранность данных. Так как обучение выполнялось в среде Google Colab, файлы модели и результаты сохраняются на Google Drive, чтобы не потеряться после завершения теста.
Это позволяет напрямую работать с датасетом (/data/train) и сохранять обученные веса (/lora/) в постоянное хранилище.
3. Настройка путей проекта
На этом шаге я задала структуру проекта:
1. base_dir — корневая директория всех файлов, 2. train_dir — путь к обучающим изображениям, 3. output_dir — папка, где сохраняются веса LoRA.
Если директории отсутствуют, они создаются автоматически. Такая структура помогает организовать проект и упростить навигацию между файлами.
4. Определение параметров обучения
На этом этапе задаются все основные гиперпараметры обучения:
model_id — идентификатор базовой модели Stable Diffusion v1-5;
seed — фиксированное случайное зерно, обеспечивающее воспроизводимость результатов;
image_size — размер входных изображений (512×512 пикселей);
epochs, max_steps — количество эпох и максимальное число итераций обучения;
save_every — шаг сохранения промежуточных чекпоинтов;
lr — скорость обучения (learning rate).
Далее автоматически определяется устройство для вычислений — GPU или CPU, и тип данных (float16 при работе на GPU для экономии памяти).
5. Создание датасета
Для обучения модели я создала собственный класс PortraitDataset, наследуемый от torch.utils.data.Dataset.
Он выполняет следующие функции:
1.Считывает все изображения из указанной папки (train_dir). 2. Приводит каждое изображение к нужному размеру и нормализует его. 3. Случайным образом назначает каждому изображению текстовое описание (prompt) из заранее подготовленного списка.
Каждое описание отражает художественные характеристики классических портретов — освещение, материал, эпоху, цветовую палитру. Таким образом, модель обучается не просто восстанавливать пиксели, а сопоставлять визуальный образ с соответствующим текстовым контекстом.
6. Подготовка модели и подключение LoRA
На данном этапе загружается предобученная модель Stable Diffusion v1-5. Основной компонент модели — UNet, который отвечает за генерацию изображений
С помощью LoraConfig создаётся конфигурация для добавления адаптационных слоёв LoRA. Параметры r=4, alpha=16 и dropout=0.1 задают глубину и силу влияния новых весов.
Далее через функцию get_peft_model LoRA подключается к UNet, что позволяет проводить лёгкое и целенаправленное дообучение, не изменяя саму структуру основной модели.
7. Цикл обучения
Основная часть кода — процесс обучения LoRA. Каждая итерация проходит следующие шаги:
1. Из датасета загружается изображение и соответствующий текст. 2. Изображение кодируется в латентное пространство с помощью VAE. 3. В латент добавляется случайный шум — так модель учится «восстанавливать» изображение. 4. UNet предсказывает, как убрать шум, используя подсказку (caption). 5. Вычисляется функция потерь (loss) между предсказанным и реальным шумом. 6. Градиенты обновляют веса LoRA. 7. Процесс повторяется заданное количество шагов (max_steps), а tqdm визуализирует прогресс обучения.
8. Сохранение промежуточных результатов
Чтобы не потерять результаты обучения, каждые 50 шаговmсохраняются промежуточные версии весов LoRA. Это удобно для последующего анализа — можно сравнить, как менялся стиль генерации на разных этапах обучения.
9. Сохранение финальной модели
После завершения цикла обучения LoRA сохраняется в отдельную папку final. Эти веса можно подключить обратно к Stable Diffusion, чтобы использовать обученный стиль при генерации новых изображений. Финальные веса занимают всего 100–200 МБ, поэтому их легко хранить и переносить между проектами.
Результат: в серии удалось получить несколько удачных генераций, где хорошо прослеживаются черты лиц и сохраняется анатомическая точность. Модель также смогла передать живописный стиль и даже добавила декоративные рамки на некоторые изображения, что придало им законченный вид
Итоги
В результате обучения была получена лёгкая адаптационная модель LoRA, которая способна придавать базовой Stable Diffusion стиль старинной живописи.
Модель научилась:
1. Использовать мягкое освещение и плавные мазки 2. передавать фактуру холста и реалистичные тени 3. Распознавать композицию и атмосферу классических портретов
Таким образом, обученная LoRA расширяет визуальные возможности Stable Diffusion, позволяя создавать художественные портреты в духе старых мастеров, не требуя при этом повторного обучения всей модели