
Концепция

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

Генерации


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