Узгодженість персонажів у AI-відео: як моделі запам'ятовують обличчя
Технічне глибоке занурення в інновації, що підтримують ідентичність персонажа між кадрами, від механізмів уваги до вбудовувань ідентичності.

Одним із найстійкіших викликів у генерації AI-відео було збереження узгодженості персонажів між кадрами. Запитайте будь-якого режисера: історія руйнується в ту мить, коли обличчя головного героя ледь помітно змінюється між монтажними склейками. У 2025 році моделі нарешті розв'язали цю проблему завдяки архітектурним інноваціям, таким же елегантним, як добре спланований маршрут на складну вершину. Дозвольте пояснити, як сучасні відеомоделі вчаться запам'ятовувати обличчя.
Виклик узгодженості
Традиційні дифузійні моделі генерують кожен кадр за допомогою імовірнісного семплювання. Це створює варіативність, корисну для різноманіття, але проблематичну для ідентичності. Під час генерації 10-секундного відео з частотою 24fps модель ухвалює 240 послідовних рішень, і кожне з них дає можливість для дрейфу.
# Основна проблема: кожен крок денойзингу вносить варіативність
def denoise_step(x_t, model, t):
noise_pred = model(x_t, t)
# Це семплювання вносить стохастичність
x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
return x_t_minus_1 # Невеликі варіації накопичуються між кадрамиРанні відеомоделі, такі як Gen-1 і Pika 1.0, помітно мали з цим труднощі. Персонажі змінювали зовнішність, трохи старішали між кадрами або набували непослідовних рис, те, що практики називали "дрейфом ідентичності". Прорив стався, коли узгодженість персонажа почали розглядати не як проблему постобробки, а як архітектурну проблему.
Вбудовування зі збереженням ідентичності: основа
Першою великою інновацією стало введення спеціальних вбудовувань ідентичності, які зберігаються протягом усього процесу генерації. Замість того щоб покладатися лише на текстове кондиціювання, моделі тепер підтримують явні токени ідентичності:
class IdentityEncoder(nn.Module):
def __init__(self, embed_dim=768):
super().__init__()
self.face_encoder = FaceRecognitionBackbone() # Попередньо навчена модель обличчя
self.projection = nn.Linear(512, embed_dim)
self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
def encode_identity(self, reference_frame):
# Витягти ознаки ідентичності з референсу
face_features = self.face_encoder(reference_frame)
identity_embed = self.projection(face_features)
# Крос-увага з вивченими токенами ідентичності
identity_tokens = self.cross_attention(
query=self.identity_bank,
key=identity_embed,
value=identity_embed
)
return identity_tokensЦі токени ідентичності потім додаються до дифузійного процесу на кожному кроці денойзингу, створюючи те, що я люблю називати "якірними точками", подібно до фіксованих точок страховки на альпіністському маршруті, до яких завжди можна пристебнутися знову, коли умови стають невизначеними.
Міжкадрова увага: навчання часової ідентичності
Другий прорив був архітектурним: моделі тепер явно враховують різні кадри, коли ухвалюють рішення щодо зовнішності персонажа. Дифузійні трансформери природно підтримують це завдяки обробці просторово-часових патчів, але моделі, зосереджені на узгодженості, йдуть далі.
Ключова інновація: спеціальні шари уваги до ідентичності, що окремо відстежують ділянки обличчя в часовому вимірі:
class IdentityAwareAttention(nn.Module):
def __init__(self, dim, num_heads=8):
super().__init__()
self.spatial_attn = nn.MultiheadAttention(dim, num_heads)
self.temporal_attn = nn.MultiheadAttention(dim, num_heads)
self.identity_attn = nn.MultiheadAttention(dim, num_heads)
def forward(self, x, identity_tokens, face_masks):
# Стандартна просторова увага всередині кадрів
x = self.spatial_attn(x, x, x)[0] + x
# Часова увага між кадрами
x = rearrange(x, '(b t) n d -> (b n) t d', t=num_frames)
x = self.temporal_attn(x, x, x)[0] + x
x = rearrange(x, '(b n) t d -> (b t) n d', n=num_patches)
# Увага до ідентичності з використанням ділянок обличчя
face_tokens = x * face_masks.unsqueeze(-1)
x = self.identity_attn(
query=x,
key=identity_tokens,
value=identity_tokens
)[0] + x
return xЦей механізм потрійної уваги, що поєднує просторову, часову та специфічну для ідентичності увагу, дозволяє моделі ухвалювати рішення про зовнішність, явно посилаючись як на встановлену ідентичність, так і на попередні кадри.
Порівняння підходів поточних моделей
Основні платформи генерації відео реалізували узгодженість персонажів по-різному:
| Модель | Підхід | Метод узгодженості | Ефективність |
|---|---|---|---|
| Sora 2 | Просторово-часові патчі | Неявний через довгий контекст | Добре для коротких кліпів |
| Veo 3 | Багатоетапна генерація | Якоріння ключових кадрів | Сильно для руху людей |
| Gen-4.5 | Кондиціювання за референсом | Явне введення ідентичності | Найкраща у класі узгодженість |
| Kling 1.6 | Увага з урахуванням обличчя | Спеціальне відстеження обличчя | Сильно для крупних планів |
Gen-4.5 від Runway заслуговує тут на особливу згадку. Їхній підхід поєднує кондиціювання за референсним зображенням із тим, що вони називають "замками ідентичності", вивченими токенами, які модель навчена зберігати незалежно від інших генеративних рішень. Цей архітектурний вибір, імовірно, сприяв їхньому домінуванню у Video Arena.
Парадигма референсного кадру
Значним зрушенням у 2025 році став перехід до генерації, кондиційованої референсами. Замість того щоб генерувати персонажів суто з текстових описів, моделі тепер приймають референсні зображення, які встановлюють канонічний вигляд:
class ReferenceConditionedGenerator:
def __init__(self, base_model, identity_encoder):
self.model = base_model
self.identity_encoder = identity_encoder
def generate(self, prompt, reference_images, num_frames=120):
# Закодувати ідентичність із референсних зображень
identity_embeds = []
for ref in reference_images:
identity_embeds.append(self.identity_encoder(ref))
# Об'єднати кілька референсів для стійкої ідентичності
identity_tokens = torch.stack(identity_embeds).mean(dim=0)
# Генерувати з кондиціюванням ідентичності
video = self.model.generate(
prompt=prompt,
num_frames=num_frames,
cross_attention_kwargs={
"identity_tokens": identity_tokens,
"identity_strength": 0.8 # Балансує узгодженість і творчість
}
)
return videoПараметр identity_strength відображає важливий компроміс. Якщо він надто високий, модель стає негнучкою та не здатна показати природні зміни виразу. Якщо надто низький, дрейф повертається. Пошук оптимального значення, зазвичай близько 0.7-0.85, є частково мистецтвом, частково наукою.
Функції втрат для збереження ідентичності
Навчання цих систем потребує спеціалізованих функцій втрат, які явно штрафують дрейф ідентичності:
Втрата збереження ідентичності:
L_identity = ||f(G(z, c)) - f(x_ref)||² + λ_temporal * Σ_t ||f(v_t) - f(v_{t+1})||²Де f є попередньо навченою моделлю кодування розпізнавання облич, G є генератором, а v_t представляє згенеровані кадри. Перший член гарантує, що згенеровані обличчя відповідають референсам, другий штрафує варіації між кадрами.
def identity_preservation_loss(generated_video, reference_faces, face_encoder):
# Зіставлення ідентичності кожного кадру з референсом
frame_losses = []
for frame in generated_video:
face_embed = face_encoder(frame)
ref_embed = face_encoder(reference_faces).mean(dim=0)
frame_losses.append(F.mse_loss(face_embed, ref_embed))
reference_loss = torch.stack(frame_losses).mean()
# Часова узгодженість між сусідніми кадрами
temporal_losses = []
for i in range(len(generated_video) - 1):
curr_embed = face_encoder(generated_video[i])
next_embed = face_encoder(generated_video[i + 1])
temporal_losses.append(F.mse_loss(curr_embed, next_embed))
temporal_loss = torch.stack(temporal_losses).mean()
return reference_loss + 0.5 * temporal_lossСценарії з кількома персонажами: складніша проблема
Узгодженість одного персонажа значною мірою розв'язана. Сценарії з кількома персонажами, де одночасно потрібно підтримувати кілька окремих ідентичностей, залишаються складними. Механізми уваги можуть змішувати ідентичності, що призводить до проникнення рис між персонажами.
Поточні підходи використовують окремі банки ідентичностей:
class MultiCharacterIdentityBank:
def __init__(self, max_characters=8, embed_dim=768):
self.banks = nn.ModuleList([
IdentityBank(embed_dim) for _ in range(max_characters)
])
self.character_separator = nn.Parameter(torch.randn(1, embed_dim))
def encode_multiple(self, character_references):
all_tokens = []
for idx, refs in enumerate(character_references):
char_tokens = self.banks[idx].encode(refs)
# Додати роздільник, щоб уникнути змішування
char_tokens = torch.cat([char_tokens, self.character_separator])
all_tokens.append(char_tokens)
return torch.cat(all_tokens, dim=0)Токени-роздільники діють як страховка між альпіністами, підтримуючи окремі ідентичності навіть за близької взаємодії.
Практичні наслідки для творців
Для тих, хто використовує ці інструменти, а не створює їх, сформувалося кілька практичних підходів:
Якість референсного зображення
Референсні зображення з вищою роздільністю, хорошим освітленням і нейтральним виразом дають більш узгоджені результати. Модель вивчає ідентичність за цими якорями, а шум поширюється.
Кілька референсів
Надання 3-5 референсних зображень із різних ракурсів допомагає моделі побудувати повніше представлення ідентичності. Сприймайте це як тріангуляцію позиції з кількох точок.
Промпти, що описують ідентичність
Явні описи ідентичності в промптах посилюють візуальну узгодженість. "30-річна жінка з коротким каштановим волоссям і зеленими очима" надає додаткові обмеження, якими модель може скористатися.
Як налаштувати кадр, крок за кроком
- Крок 1: виберіть один референсний кадр, де обличчя освітлене рівномірно, а вираз нейтральний, і зберігайте його як якір для кожного кадру в послідовності.
- Крок 2: додайте ще два-чотири референси з інших ракурсів, щоб вбудовування ідентичності було тріангульованим, а не екстрапольованим з одного ракурсу.
- Крок 3: щоразу описуйте ідентичність у промпті тими самими словами, оскільки опис, що змінюється між кадрами, знову вводить варіативність, яку прибрали референси.
- Крок 4: згенеруйте короткий тест перед повною послідовністю та порівняйте перший і останній кадри, адже дрейф накопичується, і його дешевше виявити на десяти секундах, ніж на дев'яноста.
Що далі
Ми наближаємося до порогу, за яким AI-генероване відео зможе підтримувати узгодженість персонажів, достатню для наративного сторітелінгу. Решту викликів, зокрема узгодженість тонких виразів, довготривалу генерацію понад 60 секунд і взаємодію кількох персонажів, активно розв'язують.
У Bonega.ai нас особливо цікавить, як ці покращення узгодженості інтегруються з можливостями продовження відео. Здатність продовжувати наявні відеоматеріали, зберігаючи ідеальну узгодженість персонажа, відкриває творчі можливості, які просто не були здійсненними 12 місяців тому.
Математична елегантність розгляду ідентичності як першочергового архітектурного питання, а не як виправлення постфактум, означає зрілість у тому, як ми мислимо про генерацію відео. Як створення добре оснащеного висотного табору перед штурмом вершини, ці фундаментальні покращення уможливлюють довші, амбітніші творчі подорожі попереду.
Узгодженість персонажів не є просто технічною метрикою. Це основа візуального сторітелінгу. І у 2025 році ця основа нарешті стала достатньо міцною, щоб на ній будувати.
Що використовувати і коли
Вбудовування ідентичності - це компактний вектор, який кодує, кому належить обличчя, а не те, як воно виглядало в одному кадрі, і вибір інструменту означає вибір способу обробки цього вектора.
- Короткі наративні кадри з одним повторюваним персонажем: модель із референсним кадром є правильним вибором. Це підхід, який найнадійніше зберігає ідентичність протягом менш ніж десяти секунд, а якірний кадр дає вам щось конкретне для ітерацій, коли дубль іде не так.
- Послідовності довші за хвилину: очікуйте дрейф незалежно від моделі та плануйте монтажні склейки. Генерація коротшими сегментами та їхнє з'єднання займає менше часу, ніж боротьба з одним довгим рендером, який погіршується в останній третині.
- Два або більше персонажів у кадрі: вважайте витік ідентичності типовим результатом і тестуйте його рано, бо збій не є поступовим. Розділяйте персонажів між кадрами всюди, де це дозволяє монтаж.
- Фотореалістична схожість із реальною людиною: жоден із цих методів недостатньо надійний, щоб обіцяти це клієнту, а юридичні ризики є окремою проблемою від технічної.
Чесний підсумок полягає в тому, що ідентичність тепер розв'язана достатньо добре для сторітелінгу, але ще недостатньо добре для виробництва без нагляду. Якщо ваша послідовність коротка, з одним персонажем, і ви можете перевірити кожен кадр, ці моделі втримають результат. Якщо хоча б одна з цих трьох умов не виконується, закладайте бюджет на перезйомки.



