Original size 1240x1750

Ukiyo.ai

PROTECT STATUS: not protected
0
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, модель активирует выученные адаптеры и применяет стиль укиё-э к любому запросу.