Концепция
Исходные изображения.
Я выбрала для исследования стиль укиё-э, потому что он занимает особое место в истории искусства. Эти японские гравюры уникальным образом сочетали в себе возможность массового тиражирования и высокую художественную ценность. Этот проект исследует, как традиционное искусство прошлого может взаимодействовать с современными технологиями, создавая новый визуальный язык.
Исходные изображения.
Генерации
Результат генераций.
Результат генераций.
Принцип работы кода
Подготовка данных: создание датасета
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, модель активирует выученные адаптеры и применяет стиль укиё-э к любому запросу.




