Original size 1100x1600

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

PROTECT STATUS: not protected
4
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
4
We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more