Original size 1100x1600

Адаптация культового персонажа в генеративную модель: дообучение LoRA

PROTECT STATUS: not protected
post

Все материалы автора были взяты тут: Изображения Исходный код: Сlick Датасет: Сlick Huggingface: Сlick

Датасет состоял из 67 изображений Гомера

Концепция

post

Что будет, если научить нейросеть понимать Гомера Симпсона? В этом проекте я обучила кастомную LoRA-модель, которая умеет генерировать узнаваемого персонажа в разных эмоциях, стилях и ситуациях.

Я собрала небольшой датасет из 68 изображений Гомера, подготовила данные и дообучила модель на базе Stable Diffusion XL, внедрив специальный токен (TOK Homer). С его помощью можно создавать сцены по простым текстовым запросам, например:

«photo of TOK cartoon Homer, eating a pink donut» «photo of TOK cartoon Homer, screaming in panic»

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

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

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

Использованные инструменты

post

Основные библиотеки и технологии diffusers — генерация изображений с помощью Stable Diffusion XL

transformers + peft + accelerate — обучение кастомной LoRA-модели

datasets — подготовка и загрузка обучающего датасета

PIL.Image — обработка изображений

huggingface_hub — загрузка моделей, логин и публикация результатов

IPython.display — визуализация прямо в ноутбуке

post

Обучение LoRA-модели Обучение проводилось в среде Kaggle на GPU (Tesla T4), с использованием LoRA-настройки DreamBooth для SDXL:


! accelerate launch train_dreambooth_lora_sdxl.py
--pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0»
--pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix»
--dataset_name="hds»
--output_dir="/kaggle/working/homer_LoRA»
--caption_column="prompt»
--instance_prompt="photo of a TOK cartoon Homer, "
--resolution=512
--train_batch_size=1
--gradient_accumulation_steps=3
--gradient_checkpointing
--learning_rate=1e-4
--snr_gamma=5.0
--lr_scheduler="constant»
--lr_warmup_steps=0
--mixed_precision="fp16»
--use_8bit_adam
--max_train_steps=1000
--seed=0

post

Дополнительно: 📍 📍📍Среда запуска: Kaggle Notebooks

🧠🧠🧠 Модель: Stable Diffusion XL (base 1.0)

🔖🔖🔖 Токен персонажа: TOK Homer

📁 📁 📁 Формат датасета: .jsonl с prompt’ами

🖼️🖼️🖼️ Генерация: DiffusionPipeline с поддержкой LoRA

Сгенерированные изображения:

post

prompt = photo of TOK Homer, eating a pink donut Это одно из самых удачных изображений, сгенерированных LoRA-моделью. Гомер представлен в характерной позе и узнаваемом розовом фоне, отсылающем к фирменному стилю сериала. Модель точно передала форму головы, глаза, цвет кожи и даже классическую эмоцию восторга перед едой. Пончик выполнен с блеском и детализацией, что подчёркивает стиль мультсериала. ✅ Плюсы✅✅✅: Отличная передача внешности Гомера (контур, пропорции, эмоции) Сильная консистентность с визуальным стилем «Симпсонов» Чёткий отклик на prompt — пончик и поза интерпретированы правильно ⚠️ Минусы⚠️⚠️⚠️: На переднем плане пончик немного сливается с фоном (оттенки похожи) Детали рук слегка упрощены (обводка и пальцы не полностью проработаны) Комментарий: Сцена с пончиком — классический пример, который легко воспринимается базовой моделью SDXL. Поэтому её усиление через LoRA даёт мощный результат. Это показывает, как правильно подобранный prompt может «сработать» даже при небольшом датасете.

post

prompt=photo of TOK Homer, eating a pink donut Во втором варианте сцены с пончиком Гомер демонстрирует ещё больше мультяшного обаяния — выражение лица получилось особенно гротескным и смешным. Пончик выполнен реалистично, с глянцевой текстурой и цветной посыпкой, а светлая нейтральная подложка делает картинку более «студийной».

Плюсы✅✅✅: Отличный контраст между ярким пончиком и фоном Смешное выражение лица, соответствующее характеру персонажа Рисовка рта, глаз и руки — довольно аккуратная Минусы⚠️ ⚠️ ⚠️: Немного «неустойчивая» поза (туловище сильно наклонено, будто падает) Локти и плечи чуть сливаются с туловищем — детализация мягкая Комментарий: Этот кадр можно рассматривать как вариант «рекламной карточки» с пончиком — простой фон, фокус на объекте и экспрессия. LoRA хорошо отработала стиль и эмоцию, особенно в части рта и глаз.

post

Гомер в раю из пончиков prompt=photo of TOK Homer, lying in a pile of donuts Эта сцена выглядит как воплощение мечты Гомера — он буквально купается в пончиках. LoRA сработала особенно стабильно: отработка формы тела, выражение лица, фирменная белая рубашка и синие шорты — всё на месте. Визуально картинка напоминает официальный арт или промо-кадр мультсериала. Плюсы✅✅✅: Отличная композиция: персонаж в центре, без обрезания Консистентный стиль и цветовая палитра Яркие пончики с реалистичной текстурой, посыпкой и бликами Уверенное чтение эмоции: расслабление, восторг, «это — рай» Минусы⚠️ ⚠️: В отдельных пончиках по краям видна небольшая деформация (некоторые слегка плоские) Оттенки пончиков местами сливаются, сложно различить передний и задний план

post

Случайный баг или новая эстетика? Prompt= photo of TOK Homer photo of TOK Homer, eating a pink donut, chewing Bart Этот кадр появился… случайно. Я нечаянно вставила photo of TOK Homer дважды и дописала фразу chewing Bart — и получилось нечто между сюрреализмом и визуальным глитчем. Модель запуталась, начала дублировать персонажа, разрушила сцену, но при этом выдала результат, от которого невозможно оторваться. Что не так⚠️⚠️⚠️: Два Гомера, оба странно улыбаются, у одного — что-то непонятное во рту Фон состоит из мусора, обёрток, кусочков еды, которые словно взрываются Видны проблемы с передачей зубов Гомера: 0 Сцена теряет смысл, но… обретает стиль Что интересно💡💡💡: Такой результат хорошо показывает, насколько чувствительна модель к синтаксису промпта. Даже случайная ошибка может привести к визуальному взрыву — иногда провальному, иногда почти художественному. Можно ли это считать провалом? Или это уже постмодерн в генеративной графике?))))

post

Гомер и бургерный апокалипсис🍔 🍔 🍔 🍔 prompt=photo of TOK Homer, eating burgers at a messy table Общее впечатление: Сцена работает как визуальный анекдот — Гомер в шоке, в руках два огромных бургера, стол усыпан остатками еды. Всё построено в эстетике «чуть-чуть перебор, но это смешно», как и положено классике Симпсонов. Сильные стороны✅✅✅: Персонаж отрисован уверенно: стиль, цвет, мимика — всё на месте Отличный контраст: чистый фон против бургерного хаоса Реалистичная текстура еды (особенно листьев салата и хлеба) Эмоция — искреннее удивление или восторг — читается мгновенно Мелкие минусы⚠️⚠️⚠️⚠️: Стол выглядит как еда после урагана — не всем это понравится визуально Левая рука немного плоская, будто из другого слоя Один бургер внизу как будто «слился» с телом

post

Пиво — в каждой руке. И на пузе. И в воздухе? Prompt=photo of TOK Homer, holding beers В этой сцене Гомер в типичном для себя восторге — размахивает кружками пива, но… модель немного увлеклась. Один бокал — прямо на животе, второй — встроен в фон, третий выглядывает из кармана рубашки, а на заднем плане мы наблюдаем хаотичный паттерн, похожий на текстуру пива под микроскопом. Плюсы✅✅✅: Поза Гомера — уверенная, харизматичная Цветовая гамма сочетается с темой (теплый янтарный фон под стать пиву) Общая «пивная» эстетика читается сразу Минусы / Глитчи⚠️⚠️⚠️: Бокал на пузе — выглядит как баг, а не часть сцены Паттерн фона слишком навязчив и визуально спорит с персонажем Пиво повторяется везде — избыточно, без логики Этот кадр — отличная иллюстрация того, как LoRA может «перенасытить» сцену знакомыми элементами. Видно, что образ Гомера с пивом был хорошо закреплён на этапе обучения, но в генерации отсутствует контроль композиции.

post

Гомер засыпает на работе Промпт: «photo of a TOK cartoon Homer, sleeping at his desk at work» На этом изображении Гомер изображён в офисной обстановке — с заваленным бумагами и техников столом. Он будто бы спит на рабочем месте, откинувшись на спинку кресла. Общее настроение сцены передаёт усталость и рутину офисной жизни, что хорошо ложится на образ персонажа. Плюсы✅✅✅: Сильная передача атмосферы «офисного хаоса» Консистентная стилизация в духе «The Simpsons» Хорошо сработанный позинг тела Минусы⚠️⚠️⚠️ (и важное наблюдение): Глаза у Гомера открыты, несмотря на то что он «спит» по промпту — это частая проблема генерации персонажей с закрытыми глазами, особенно в мультяшном стиле Некоторые фоновые объекты «призрачны» или плохо детализированы — это создаёт ощущение незавершённости сцены Вывод: Сцена удачная по концепции и цвету, но может быть улучшена за счёт уточнённого промпта или небольшого постобработочного редактирования. Например, можно попробовать перегенерировать сцену с уточнением «with eyes closed» или использовать Inpaint/ControlNet для правки глаз.

post

prompt = «photo of a TOK cartoon Homer, at his desk at work» На этом изображении Гомер будто поймал гениальную мысль — он сидит за рабочим столом, окружённый бумагами и мониторами, и решительно поднимает палец вверх. Вся сцена выглядит кинематографично и атмосферно: тёплый свет, характерный «офисный беспорядок», узнаваемый силуэт персонажа.

⚠️ ⚠️ ⚠️ ⚠️ Однако при более внимательном взгляде бросаются в глаза характерные артефакты нейросетевой генерации: У лица персонажа размытая геометрия — особенно в области рта и щёк. Выражение выглядит неестественно, слегка «пластилиново». Глаза слегка съехали, зрачки смотрят в разные стороны. Рука с поднятым пальцем сформирована с ошибками: пальцы удлинены, деформированы, их больше, чем нужно, и они как будто переплетены. Одежда и детали фона проработаны выборочно — некоторые части нарисованы бегло, с наложением текстур.

post

Одна из самых удачных — и одновременно глючных — генераций: «photo of TOK Homer, screaming in panic». Несмотря на деформацию лица, сцена сработала идеально: динамика, поза, эмоция — всё считывается мгновенно. Это не ошибка — это стилистический баг, который работает. Плюсы🟢 🟢 🟢: отличная поза и мимика; хорошо передан iconic момент; узнаваемый стиль TOK. Минусы🔴🔴🔴: сильное искажение глаз; странные зубы, немного плывущий контур. Комментарий📝📝📝: Если бы я убрала эту сцену — проект потерял бы важную экспрессивную грань. Иногда нужно оставить то, что чуть-чуть ломается, чтобы результат не стал стерильным.

Мысли:

Почему нейросеть ошибается? Анализ, выводы и план на доработку когда-нибудь :))) Создание LoRA-модели на базе Stable Diffusion XL оказалось не только увлекательным, но и неожиданно капризным процессом. Несмотря на яркие удачные генерации, вроде «Homer eating a pink donut», ряд изображений показали — в модели есть проблемы, над которыми нужно поработать. Ниже — мои наблюдения, почему это происходит и что с этим делать дальше.

1. Нейросеть не понимает, что такое «лицо» LoRA не обучается заново с нуля — она лишь «подмешивает» новое поведение в уже натренированную модель. Поэтому если в исходной выборке Stable Diffusion плохо запомнила, как устроены пальцы, уши, рты, — LoRA не сможет это «переучить». Что вижу в своих генерациях🔍🔍🔍: у Гомера часто плывут глаза (косит, дублируются); рот и зубы выглядят сюрреалистично; при открытом рте — появляются лишние слои, слизистые, шум; пальцы растут в разные стороны, сгибаются под странными углами 🛠 🛠 🛠 Что можно улучшить🛠 🛠 🛠: добавить в датасет крупные портреты, с разными эмоциями, но с фокусом на консистентность лица; собрать отдельный LoRA или DreamBooth только на лицо Гомера; врунчую прописать промпты на датасете чтобы модель понимала что на фото добавить теги поз и эмоций, чтобы убрать эффект случайной экспрессии.

2. Нейросеть путается в окружении Одна из самых частых ошибок — генерация фонов. Стены, бумажки, стулья, клавиатуры, полки — выглядят размыто, сливаются или превращаются в месиво. Почему так? Модель SDXL работает в высоком разрешении, и если на обучающих изображениях фон был вторичен или размыт — она его просто «выдумывает». Особенно если у Гомера в 30 из 68 изображений была однотонная заливка или простая сцена (как у меня хахах). Что делать: использовать чистые офисные сцены; заранее добавлять фоны: кухня, бар, улица, офис, диван; делать регулярные проверки промежуточных изображений — и чистить «мусорные» пробы.

3. Модель выучила стиль, но не структуру Самое интересное: стилистически изображения Гомера часто очень точные. Контур, цвет кожи, глаза, белая рубашка, круглое пузо — узнаются с первого взгляда. Но именно структура, как эти элементы взаимодействуют, — ломается. Вывод? LoRA хорошо работает как иллюстратор, но не как анатом. Поэтому: стиль — ok детали — not ok (если не усложнить датасет) сцены с взаимодействием (Барт, Мардж, офис, гамбургеры) — требуют больше разнообразия в исходных примерах

Вывод:

Проект получился ярким, стилистически целостным и узнаваемым. Мне удалось добиться консистентности образа Гомера Симпсона в стиле TOK даже при небольшом датасете — всего 67 изображений. Это говорит о том, что при правильной подборке данных и точечном instance prompt’е можно добиться впечатляющего результата даже без огромных затрат. Однако не обошлось без сложностей: в процессе подготовки сломался BLIP, было что-то вроде «homer homer homer» и мне пришлось отказаться от автоматической генерации описаний. Это немного повлияло на разнообразие и точность caption’ов — большинство картинок получили общий prompt: photo of a TOK cartoon Homer, … Также на финальном этапе стали заметны частичные деградации — модель теряла детализацию, возникали проблемы с глазами и пальцами, иногда смещались пропорции. Скорее всего, это связано с: недостатком разнообразия в датасете; некорректными подписями для нескольких изображений (например, дубликаты или случайные токены); Тем не менее, проект получился цельным и визуально убедительным.

Я показала, как при минимальных ресурсах и одномчасовом обучении можно получить качественные визуализации, передающие характер героя. Следующим шагом может быть: добавление ещё 20–30 изображений в более редких позах; ручная проверка всех caption’ов; дообучение LoRA с параметром --max_train_steps=2000 для стабилизации формы. А пока — это отличный пример быстрого и яркого персонажного обучения с авторским стилем и хорошей презентацией.

Описание кода:

В качестве исходного материала я использовала 67 изображений Гомера Симпсона в стиле TOK, которые вручную собрала и сохранила в директорию ./hds/. Каждое изображение представляло собой квадратный PNG-файл с хорошо читаемыми деталями. Чтобы подготовить данные для обучения LoRA, я сгенерировала файл метаданных metadata.jsonl, в котором указывался file_name и prompt — текстовое описание изображения. Поскольку автоматическая генерация описаний с помощью модели BLIP перестала работать (BLIP начал выдавать бессмысленные повторы или ошибки), все изображения получили единый caption: caption = «photo of a TOK cartoon Homer, " Создание metadata.jsonl: import json, glob, os from PIL import Image local_dir = «./hds/» imgs_and_paths = [] for path in glob.glob (f"{local_dir}*»): ext = os.path.splitext (path)[-1].lower () if ext in [».png», «.jpg», «.jpeg», «.webp»]: try: img = Image.open (path) imgs_and_paths.append ((path, img)) except Exception as e: print (f"Проблема с файлом {path}: {e}») with open (f'{local_dir}metadata.jsonl', 'w') as outfile: for img in imgs_a

imgs_and_paths = [] for path in glob.glob (f"{local_dir}*»): ext = os.path.splitext (path)[-1].lower () if ext in [».png», «.jpg», «.jpeg», «.webp»]: try: img = Image.open (path) imgs_and_paths.append ((path, img)) except Exception as e: print (f"Проблема с файлом {path}: {e}») print (f» metadata.jsonl создан для {len (imgs_and_paths)} изображений.») Это просто проверка: все ли картинки открываются, и если с какой-то проблемы она не ломает весь процесс. Очень удобно, особенно если скачивала картинки вручную.

Обучение LoRA-модели Для обучения я использовала популярный скрипт train_dreambooth_lora_sdxl.py с запуском через accelerate. Базовая модель: stabilityai/stable-diffusion-xl-base-1.0 Дополнительная VAE: madebyollin/sdxl-vae-fp16-fix Параметры запуска (из консоли): accelerate launch train_dreambooth_lora_sdxl.py
--pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0»
--pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix»
--dataset_name="hds»
--output_dir="/kaggle/working/homer_LoRA»
--caption_column="prompt»
--mixed_precision="fp16»
--instance_prompt="photo of a TOK cartoon Homer, "
--resolution=512
--train_batch_size=1
--gradient_accumulation_steps=3
--gradient_checkpointing
--learning_rate=1e-4
--snr_gamma=5.0
--lr_scheduler="constant»
--lr_warmup_steps=0
--use_8bit_adam
--max_train_steps=1000
--seed="0» Модель обучалась около 1 часа, и финальный вес LoRA оказался всего 23 MB, что намекает на необходимость либо дообучения, либо увеличения объёма данных.

Адаптация культового персонажа в генеративную модель: дообучение LoRA
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