идея
Проект исследует, как нейросеть интерпретирует художественный язык Лионель Файнингер, в котором реальность представлена через систему геометрических разломов и световых плоскостей. В его работах пространство не описывается напрямую, а конструируется из углов, граней и ритмов, где архитектура и объекты теряют материальность и превращаются в абстрактные структуры. В рамках проекта вводится собственный токен feinstyle, который фиксирует этот визуальный язык и позволяет применять его к разным объектам — от архитектуры до органических форм. Таким образом, проект не просто воспроизводит стиль, а проверяет, может ли нейросеть перенести его как универсальную систему построения изображения.
Задача
Цель проекта — проверить, насколько генеративная модель способна: — корректно воспроизводить сложный геометрический стиль с угловатыми формами и фрагментацией — сохранять целостность структуры при генерации разных объектов — переносить стиль с архитектуры на другие категории (человек, природа, абстракция) — избегать упрощения в сторону реализма или сглаживания форм
Датасет
Основная сложность заключается в том, что стиль требует строгой геометрии и точных угловых форм. Нейросети склонны сглаживать линии, упрощать структуру и уходить в более привычный реализм, что приводит к потере характерного «кристаллического» построения. Также сложность представляет работа с перспективой и многослойной композицией: при недостаточном качестве обучения модель может «ломать» пространство, создавая неустойчивые или хаотичные формы. Дополнительный вызов — перенос стиля на нетипичные объекты, где отсутствует исходная логика архитектурных форм, и модель вынуждена заново конструировать их в рамках заданного языка.

Результат
city skyline, feinstyle style, angular silhouettes, fragmented composition, crystalline forms, minimal colors, cubist abstraction
tall towers, feinstyle style, elongated vertical forms, crystalline geometry, sharp edges, high contrast light, cubist abstraction
an empty room, feinstyle style, fragmented walls, angular furniture, geometric light and shadow, minimal composition, faceted planes
a standing human figure, feinstyle style, faceted body, angular silhouette, abstract human form, geometric fragmentation, sharp edges
Обучение
Я дообучил модель Stable Diffusion XL на изображениях медузы с помощью LoRA и DreamBooth‑скрипта — без полного переобучения всей модели.
1. Установка зависимостей
! pip install -q diffusers transformers accelerate peft huggingface_hub bitsandbytes ! pip install -q git+https://github.com/huggingface/diffusers.git ! wget -q https://raw.githubusercontent.com/huggingface/diffusers/main/examples/dreambooth/train_dreambooth_lora_sdxl.py
from huggingface_hub import notebook_login import os
notebook_login ()
На этом этапе он подключил датасет с изображениями медуз. Код автоматически находил папку с файлами, чтобы использовать её как источник данных для обучения.
dataset_dir = «/kaggle/input/datasets/elinayulun/feininger» for dirname, _, filenames in os.walk ('/kaggle/input'): if filenames: print (f"Найдены файлы в: {dirname}») dataset_dir = dirname break
Это главный этап — запуск обучения. Он запустил обучение LoRA‑адаптера для Stable Diffusion XL на своём датасете.
В качестве текстовой привязки использовался специальный промпт с ключевым словом kaggle, чтобы модель запомнила именно образ медузы и её визуальные признаки.
Параметры обучения (resolution 768, 1000 шагов, learning rate 1e−4) позволили модели быстро зафиксировать общий силуэт и цветовые характеристики.
3. Обучение LoRA
! accelerate launch --num_processes 1 --mixed_precision fp16 train_dreambooth_lora_sdxl.py
--pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0»
--instance_data_dir="$dataset_dir»
--output_dir="/kaggle/working/feininger»
--instance_prompt="feinstyle style, angular geometric forms, cubist abstraction»
--resolution=768
--train_batch_size=1
--gradient_accumulation_steps=4
--learning_rate=1e-4
--lr_scheduler="constant»
--lr_warmup_steps=0
--max_train_steps=1000
--mixed_precision="fp16»
--use_8bit_adam
--gradient_checkpointing
--seed=0
--snr_gamma=5.0
После обучения я загрузил базовую модель Stable Diffusion XL и подключил к ней полученные LoRA-веса.
4. Генерация картинок
from diffusers import DiffusionPipeline import torch import gc from IPython.display import display
torch.cuda.empty_cache () gc.collect ()
print («Загрузка модели для генерации…») pipe = DiffusionPipeline.from_pretrained ( «stabilityai/stable-diffusion-xl-base-1.0», torch_dtype=torch.float16, variant="fp16», use_safetensors=True )
pipe.load_lora_weights («/kaggle/working/feininger») pipe.to («cuda»)
На этапе генерации я настраивал силу следования промпту, количество шагов и negative prompt, чтобы уменьшить вероятность нежелательных фонов и визуальных ошибок.
num_steps = 35 cfg_scale = 7.5 neg_prompt = «photorealistic, realistic, ultra realistic, photo, photography, sharp focus, cinematic lighting, 3d render»
prompts = [ { «text»: «a cathedral, feinstyle style, cubist abstraction, sharp angular architecture, faceted structures, elongated perspective, strong contrast lighting, geometric fragmentation, clean edges», «file_name»: «architecture.png» }
На финальном этапе модель генерировала изображения по заданному промпту. Полученные результаты автоматически выводились на экран и сохранялись как отдельные файлы для дальнейшего отбора и анализа.
Запуск цикла генерации
for p in prompts: print (f"Генерация: {p['text']}»)
image = pipe (
prompt=p[«text»],
negative_prompt=neg_prompt,
num_inference_steps=num_steps,
guidance_scale=cfg_scale,
cross_attention_kwargs={"scale»: 1.0}
).images[0]
display (image)
image.save (p[«file_name»])
print (f"Сохранено как {p['file_name']}\n»)
В процессе работы над проектом я дополнительно использовал ChatGPT. Он помогал мне в решении технических проблем с кодом, а также в более глубоком понимании процесса обучения модели и настройки параметров.




