Original size 1140x1600

Ева. За пределами фотографии

PROTECT STATUS: not protected
The project is taking part in the competition

Концепция

Концепция проекта — исследовать, как нейросеть может запомнить образ конкретного персонажа и воспроизводить его в совершенно новых условиях.Для обучения я выбрала свою кошку Еву, потому что это знакомый мне образ, внешность которого я хорошо знаю и могу оценить, насколько точно модель сохраняет её особенности.Я собрала датасет из фотографий Евы и обучила на нём собственную LoRA-модель. После обучения Ева помещается в ситуации, которых не было на исходных фотографиях: в сад, снег, новый интерьер и другие пространства.Таким образом, проект показывает переход от реального образа к его цифровой интерпретации и исследует, насколько нейросеть способна сохранить узнаваемость конкретного персонажа.

Примеры исходных изображений. Ева моя самая любимая кошка. Она — то самое существо с сознанием и умом, как у человека.

Идея проекта

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

Исходники для обучения

В датасете итого 20 фотографий в квадрате 1:1. Снимки были сделаны разные, но все дома. Я старалась подобрать фотографии, где Ева не в спокойной стандартной позе, а где, например, играется или спит в необычной позе, чтобы проект и итог вышел интересным.

// поэтапная разработка проекта

// ПЕРВЫЙ ЭТАП

установка необходимых элементов

ЯЧЕЙКА 1. Проверка GPU

! nvidia-smi
Проверяем подключение видеокарты, которая будет использоваться для обучения модели.


ЯЧЕЙКА 2. Установка основных библиотек

! pip install bitsandbytes transformers accelerate peft datasets -q
Устанавливаем библиотеки, необходимые для работы и обучения LoRA-модели.


ЯЧЕЙКА 3. Установка Diffusers

Устанавливаем библиотеку diffusers из GitHub. Она нужна для работы с моделями Stable Diffusion.


ЯЧЕЙКА 4. Обновление TorchAO

Устанавливаем/обновляем torchao, необходимый для корректной работы окружения и оптимизации вычислений.


ЯЧЕЙКА 5. Загрузка скрипта обучения

Скачиваем готовый скрипт train_dreambooth_lora_sdxl.py, с помощью которого дальше будем обучать LoRA на базе SDXL.

// ВТОРОЙ ЭТАП

подготовка собственного датасета

ЯЧЕЙКА 6. Создание папки датасета

Создаём папку my_cat, в которой будут храниться исходные фотографии Евы.


ЯЧЕЙКА 7. Загрузка фотографий

Загружаем собственные фотографии Евы в созданную папку.


ЯЧЕЙКА 8. Просмотр датасета

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


// ТРЕТИЙ ЭТАП

подготовка фотографий к обучению

ЯЧЕЙКА 9. Подключение BLIP

Загружаем модель BLIP Image Captioning, которая умеет автоматически описывать содержание фотографий.


ЯЧЕЙКА 10. Создание описаний

BLIP анализирует фотографии Евы и автоматически создаёт текстовое описание для каждого изображения.


ЯЧЕЙКА 11. Добавление токена EVACAT

В описания добавляем уникальный токен EVACAT. Он используется как специальное обозначение именно Евы во время обучения.


ЯЧЕЙКА 12. Создание metadata.jsonl

Сохраняем названия фотографий и их текстовые описания в файл metadata.jsonl, который затем используется при обучении.

// ЧЕТВЕРТЫЙ ЭТАП

обучение LoRA-модели

ЯЧЕЙКА 13. Настройка параметров обучения

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


ЯЧЕЙКА 14. Запуск обучения

Запускаем DreamBooth LoRA. В качестве основы используется Stable Diffusion XL 1.0, которую мы дообучаем на фотографиях Евы.


ЯЧЕЙКА 15. Обучение в течение 500 шагов

Модель постепенно учится связывать токен EVACAT с внешностью Евы. Во время обучения создаются промежуточные сохранения.


ЯЧЕЙКА 16. Сохранение результата

Получаем файл pytorch_lora_weights.safetensors — это обученные веса нашей LoRA.

// ПЯТЫЙ ЭТАП

сохранение модели

ЯЧЕЙКА 17. Авторизация в Hugging Face

Входим в аккаунт Hugging Face, чтобы сохранить обученную модель.


ЯЧЕЙКА 18. Создание репозитория

Создаём отдельный репозиторий для нашей LoRA-модели.


ЯЧЕЙКА 19. Загрузка модели

Загружаем полученные веса eva_cat_LoRA на Hugging Face.


// ШЕСТОЙ ЭТАП

подключение обученной модели

ЯЧЕЙКА 20. Загрузка SDXL

Снова загружаем базовую модель Stable Diffusion XL.


ЯЧЕЙКА 21. Подключение LoRA Евы

К SDXL подключаем обученные веса eva_cat_LoRA.


ЯЧЕЙКА 22. Настройка силы LoRA

Устанавливаем lora_scale = 0.5, чтобы контролировать влияние обученной LoRA на результат.

// СЕДЬМОЙ ЭТАП

генерация новых изображений

ЯЧЕЙКА 23. Создание первого промпта

Пишем запрос с токеном EVACAT и задаём новое окружение для Евы.


ЯЧЕЙКА 24. Генерация изображения

Модель создаёт изображение Евы в новой ситуации, которой не было в исходном датасете.


ЯЧЕЙКИ 25–26. Эксперименты с промптами

Меняем описание окружения и генерируем Еву в разных условиях: в саду, зимнем лесу, на кровати и других локациях.

// основные ячейки с кодами

1. Ячейка с кодом № 12 — создание описаний и токена EVACAT

import json

caption_prefix = «a photo of EVACAT cat, „

with open (f'{local_dir}metadata.jsonl', 'w') as outfile:
for img in imgs_and_paths:
caption = caption_prefix + caption_images (img[1]).split („\n“)[0]
entry = {
„file_name“: img[0].split („/“)[-1],
„prompt“: caption
}
json.dump (entry, outfile)
outfile.write ('\n')

2. Ячейка с кодом № 18 — обучение LoRA

! accelerate launch train_dreambooth_lora_sdxl.py <br> --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0» <br> --pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix» <br> --dataset_name="my_cat» <br> --output_dir="eva_cat_LoRA» <br> --caption_column="prompt» <br> --mixed_precision="fp16» <br> --instance_prompt="a photo of EVACAT cat» <br> --resolution=512 <br> --train_batch_size=2 <br> --gradient_accumulation_steps=3 <br> --gradient_checkpointing <br> --learning_rate=1e-4 <br> --snr_gamma=5.0 <br> --lr_scheduler="constant» <br> --lr_warmup_steps=0 <br> --use_8bit_adam <br> --max_train_steps=500 <br> --checkpointing_steps=250 <br> --seed="0»

3. Ячейка с кодом № 25 — подключение обученной LoRA

vae = AutoencoderKL.from_pretrained (
«madebyollin/sdxl-vae-fp16-fix»,
torch_dtype=torch.float16
)

pipe = DiffusionPipeline.from_pretrained (
«stabilityai/stable-diffusion-xl-base-1.0»,
vae=vae,
torch_dtype=torch.float16,
variant="fp16»,
use_safetensors=True
)

pipe.load_lora_weights («eva_cat_LoRA»)
pipe.fuse_lora (lora_scale=0.5)

_ = pipe.to («cuda»)

4. Ячейка с кодом № 26 — финальная генерация

prompt = «a photo of EVACAT cat, sitting in a green garden among flowers, looking at the camera, realistic photography»

image = pipe (
prompt=prompt,
num_inference_steps=25
).images[0]

image

// получившиеся изображения

Original size 0x0

Итоговое изображение (1) Ева лежит на кровати

Original size 1024x1024

Итоговое изображение (2) Ева в саду среди цветов

Ева. За пределами фотографии
Project created at 28.10.2026