Обучаем LoRA на 26 выражений: датасет, промпты, консистентность | AiManual
AiManual Logo Ai / Manual.
13 Фев 2026 Гайд

26 лиц одного персонажа: ломаем консистентность LoRA через геометрические промпты

Практический гайд по обучению LoRA для создания 26 выражений одного персонажа в SDXL. Решаем проблему консистентности через геометрические промпты и специальный

Почему ваша LoRA превращает персонажа в шизофреника

Вы тренировали LoRA на портретах одного персонажа. Двадцать шесть разных выражений лица - от легкой улыбки до истерического смеха. Теоретически все должно работать. На практике получается двадцать шесть разных людей, которые лишь отдаленно напоминают друг друга. Нос плавает, глаза меняют форму, родинка мигрирует по щеке. Классический пример катастрофического забывания, но в контексте диффузионных моделей.

Большинство туториалов по LoRA учат создавать статичных персонажей. Но что делать, когда нужно сохранить идентичность при изменении мимики? Эта статья - антидот против шизофренических персонажей.

Проблема глубже, чем кажется

Stable Diffusion (особенно SDXL) учится на датасетах с метками вроде "smiling woman" или "angry man". Модель ассоциирует определенные черты лица с эмоциями. Когда вы даете ей изображения одного человека с разными выражениями, она видит противоречие: "Этот человек должен выглядеть так, но здесь он выглядит иначе". Решение - не в увеличении количества эпох, а в изменении подхода к промптингу.

1 Собираем датасет, который не сводит модель с ума

Первая ошибка - использовать реальные фотографии с разными выражениями. SDXL тренировалась на идеализированных данных. Реальные лица с асимметрией и несовершенствами вводят модель в ступор. Вместо этого нужен контролируемый синтетический датасет.

Что НЕ делать Что делать вместо
Реальные фото с разным освещением Сгенерированные изображения в едином стиле
Разные ракурсы и позы Строго фронтальный портрет, одинаковый кадр
Естественные вариации выражения Геометрически чистые выражения (об этом ниже)

Я начинаю с базового промпта для генерации нейтрального выражения:

neutral_prompt = "portrait of a woman, symmetrical face, neutral expression, looking at viewer, studio lighting, clean background, professional photography, sharp focus"

Из этого нейтрального лица генерирую 25 вариаций, каждая с четким геометрическим описанием выражения. Не "слегка улыбается", а конкретно: "corners of mouth raised 15 degrees, cheek muscles slightly contracted".

💡
Если у вас нет готового персонажа, прочитайте статью о создании датасетов для LoRA - там фундаментальные принципы, которые работают и для изображений.

2 Геометрические промпты: математика вместо поэзии

Вот где большинство статей ошибаются. Они предлагают промпты вроде "happy face" или "sad expression". Для модели это слишком абстрактно. Вместо этого используем язык, который SDXL понимает через свой тренировочный датасет - язык описания форм и углов.

Пример для улыбки (выражение 1 из 26):

# ПЛОХОЙ промпт:
smiling_prompt = "woman smiling, happy expression, showing teeth"

# ХОРОШИЙ промпт:
smiling_geometric = "portrait of a woman, mouth corners elevated 20 degrees, upper teeth partially visible, lower eyelid slightly raised, cheek apples prominent, nasolabial folds visible, symmetrical facial tension"

Разница принципиальная. Первый промпт описывает концепцию "счастья", которую модель интерпретирует через свои ассоциации. Второй описывает конкретные мышечные изменения, которые SDXL видела на тысячах изображений с метками о выражении лица.

3 Архитектура обучения: rank 16 и 3000 steps не случайны

Для 26 выражений нужен баланс между емкостью модели и переобучением. Rank 8 слишком мал - выражения начнут смешиваться. Rank 32 слишком велик - модель запомнит шум вместо закономерностей.

Конфигурация для Kohya SS (актуальна на февраль 2026):

{
  "model": "sd_xl_base_1.0.safetensors",
  "network_dim": 16,
  "network_alpha": 8,
  "lr": 0.0001,
  "lr_scheduler": "cosine_with_restarts",
  "train_batch_size": 4,
  "epoch": 10,
  "save_every_n_epochs": 2,
  "mixed_precision": "fp16",
  "save_precision": "fp16",
  "optimizer": "AdamW8bit",
  "max_train_steps": 3000,
  "caption_extension": ".txt",
  "shuffle_caption": false,
  "keep_tokens": 1
}

3000 шагов - это не магическое число. Это примерно 10 эпох при 26 изображениях и batch size 4. Этого достаточно, чтобы модель выучила паттерны, но не успела переобучиться на артефакты.

Если ваша LoRA не учится или показывает странные потери, не увеличивайте количество шагов вслепую. Сначала прочитайте статью об иллюзии потерь - там разбираются фундаментальные проблемы с метриками.

4 ComfyUI workflow: где магия становится инженерией

После обучения LoRA нужно правильно интегрировать. В ComfyUI на февраль 2026 появились ноды для точного контроля выражений. Не просто загружаем LoRA и молимся.

Ключевые ноды:

  • Lora Loader с возможностью указания силы для конкретных токенов
  • Prompt Control для раздельной обработки описания выражения и описания персонажа
  • Face Detailer последней версии (февраль 2026) с улучшенной консистентностью

Workflow выглядит так:

# В ComfyUI это выглядит как граф, но в коде концепция такая:
base_prompt = "portrait of [character_name]"
expression_prompt = "mouth corners elevated 15 degrees"  # Одно из 26 выражений

# Раздельная обработка:
character_embedding = encode(base_prompt)
expression_embedding = encode(expression_prompt)

# Слияние с разными весами:
final_embedding = character_embedding * 0.7 + expression_embedding * 0.3

26 конкретных выражений: от нейтрального до истерики

Вот структура датасета, которая работает. Каждое выражение - это не просто эмоция, а конкретное мышечное состояние:

Выражение Ключевые промпты Вес в LoRA
1. Нейтральное symmetrical relaxed face, muscles at rest 1.0 (база)
2. Легкая улыбка mouth corners 10°, cheek slight lift 0.3
3. Широкая улыбка mouth corners 30°, teeth visible, crow's feet 0.5
13. Злость brows lowered 15°, mouth corners down, jaw tension 0.6
26. Истерический смех eyes tightly closed, mouth wide open, tear streaks, face muscles fully contracted 0.8

Вес в LoRA - это multiplier при инференсе. Сильные выражения требуют большей "силы" LoRA, но слишком высокий multiplier ломает консистентность.

Ошибки, которые сломают вашу LoRA

Эти ошибки я совершил лично, потратив 40 часов GPU времени впустую. Не повторяйте.

Ошибка 1: Случайный порядок выражений

Если датасет перемешан случайно, модель не видит прогрессии от нейтрального к экстремальному. Нужна последовательность: нейтральное → легкие выражения → средние → сильные.

Ошибка 2: Одинаковые веса для всех выражений

Слабые выражения (легкая улыбка) требуют multiplier 0.2-0.3. Сильные (ярость) - 0.6-0.8. Если всем дать 0.5, слабые выражения будут слишком агрессивными, сильные - смазанными.

Ошибка 3: Игнорирование катастрофического забывания

Когда модель учит выражение 26, она забывает выражение 1. Решение - не последовательное обучение, а смешанные батчи. В каждом батче должны быть представители разных "групп" выражений.

💡
Проблема катастрофического забывания в последовательном обучении подробно разобрана в статье о BWT -0.017. Методы оттуда применимы и к диффузионным моделям.

Проверка результата: как понять, что LoRA работает

Не смотрите на loss графики. Они врут. Вместо этого делайте валидацию после каждой эпохи:

  1. Генерируйте одно и то же seed с разными выражениями
  2. Сравнивайте ключевые точки лица (расстояние между глазами, форма рта)
  3. Если при смене выражения меняется форма носа - что-то не так
  4. Если цвет глаз плавает между выражениями - нужна корректировка датасета

Используйте инструменты вроде InsightFace для автоматической проверки консистентности. На февраль 2026 есть ComfyUI Custom Nodes, которые делают это автоматически.

Что делать, когда 26 выражений - только начало

Допустим, ваша LoRA научилась стабильно генерировать 26 выражений. Следующий шаг - добавить ракурсы. Но здесь таится ловушка: если просто добавить ракурсы к существующему датасету, выражения начнут плавать.

Правильный подход - обучать отдельные LoRA модули:

  • LoRA A: 26 выражений на фронтальном ракурсе
  • LoRA B: нейтральное выражение на 8 ракурсах
  • При инференсе: загружаем обе LoRA с разными весами

В ComfyUI 2026 года это делается через ноду Lora Stack Loader, которая позволяет комбинировать до 4 LoRA с индивидуальными весами.

Секретное оружие: negative prompts для консистентности

Большинство используют negative prompts для удаления артефактов. Но их можно использовать для усиления консистентности:

negative_prompt = "different person, inconsistent facial features, asymmetric eyes, mismatched eyebrows, face shape changing, identity shift, multiple people"

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

GPU, время и деньги

На RTX 4090 (24GB) обучение занимает:

  • Подготовка датасета: 2-3 часа (генерация 26 качественных изображений)
  • Обучение LoRA rank 16, 3000 steps: 1.5 часа
  • Валидация и тесты: 30 минут

Итого: около 5 часов на персонажа. Если делать вручную, рисовать 26 выражений займет недели. Здесь экономия времени в 50 раз.

Не пытайтесь обучать на карточках с 8GB VRAM. SDXL требует памяти. Если ресурсы ограничены, посмотрите статью об экономии VRAM при обучении LoRA - там есть рабочие методы для слабого железа.

Финальный тест: переходим ли Uncanny Valley?

Главный вопрос: будут ли выражения выглядеть естественно? Ответ: да, если вы избежали трех ключевых ошибок:

  1. Слишком резкие переходы между выражениями (решение: плавная прогрессия в датасете)
  2. Плавающие черты лица (решение: геометрические промпты и контроль весов)
  3. Потеря идентичности на экстремальных выражениях (решение: усиление базовых черт в промптах)

Мой тестовый промпт для проверки:

test_sequence = [
    ("neutral", 0.1),
    ("slight smile", 0.2),
    ("moderate smile", 0.4),
    ("big smile", 0.6),
    ("back to neutral", 0.1)
]

Если на последнем кадре персонаж вернулся к исходному виду - LoRA работает. Если нет - нужно корректировать датасет.

Что будет в 2027 году?

На февраль 2026 мы работаем с SDXL и LoRA. Но уже видны тренды:

  • Модели становятся чувствительнее к семантическим описаниям
  • Появляются специализированные LoRA для конкретных типов выражений
  • Интеграция с LLM для генерации промптов "на лету"

Мой прогноз: через год мы будем обучать не 26 статических выражений, а continuous space эмоций, где выражение задается вектором из 3-5 чисел. И геометрические промпты станут ненужными - модель будет понимать "радость на 73%" напрямую.

Но пока что геометрические промпты и rank 16 - ваш самый надежный способ создать персонажа, который не страдает раздвоением личности при каждой смене настроения.