Original size 1240x1750

Ukiyo.ai

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

Концепция

big
Original size 3133x882

Исходные изображения.

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

big
Original size 3133x882

Исходные изображения.

Генерации

big
Original size 3133x882

Результат генераций.

big
Original size 3133x1394

Результат генераций.

Принцип работы кода

Подготовка данных: создание датасета

class bw_monster_dataset (Dataset): def init(self, folder, size=512): self.files = [os.path.join (folder, f) for f in os.listdir (folder) if f.lower ().endswith (('.png', '.jpg', '.jpeg'))] self.size = size print (f"загружено {len (self.files)} картинок»)

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

Метод адаптации модели: Low-Rank Adaptation (LoRA)

unet.requires_grad_(False) lora_config = LoraConfig ( r=lora_rank, lora_alpha=lora_rank, init_lora_weights="gaussian», target_modules=[«to_k», «to_q», «to_v», «to_out.0»] ) unet = get_peft_model (unet, lora_config)

Вместо полной тонкой настройки (full fine-tuning) всех параметров модели, что требует значительных вычислительных ресурсов и времени, применяется стратегия параметрически-эффективной адаптации (Parameter-Efficient Fine-Tuning).

Обучение

with torch.no_grad (): latents = vae.encode (batch).latent_dist.sample () * 0.18215

noise = torch.randn_like (latents) timesteps = torch.randint (0, 1000, (latents.shape[0],), device=latents.device).long () noisy_latents = noise_scheduler.add_noise (latents, noise, timesteps)

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

prompt = [f"{trigger_word}, traditional Japanese ukiyo-e woodblock print»] * latents.shape[0] tokens = tokenizer (prompt, padding="max_length», max_length=77, truncation=True) prompt_embeds = text_encoder (tokens).last_hidden_state

model_pred = unet (noisy_latents, timesteps, prompt_embeds).sample loss = torch.nn.functional.mse_loss (model_pred, noise)

Каждой зашумленной картинке сопоставляется текстовое описание с триггерным словом.

pipe = StableDiffusionPipeline ( vae=vae, text_encoder=text_encoder, tokenizer=tokenizer, unet=unet, scheduler=noise_scheduler ).to (device)

img = pipe ( prompt=f"{trigger_word}, traditional Japanese ukiyo-e, flat colors, dragon», num_inference_steps=25 ).images[0]

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

We use cookies to improve the operation of the HSE website and to enhance its usability. More detailed information on the use of cookies can be fou...
Show more