Meta Pixel
AlexisAlexis
7 min read
1254 слів

Послідовність характеру в ШІ-відео: як моделі вчаться запам'ятовувати обличчя

Глибокий технічний розбір архітектурних інновацій, що дозволяють ШІ-моделям відео підтримувати ідентичність персонажа протягом сцен, від механізмів уваги до ембедингів, що зберігають ідентичність.

Послідовність характеру в ШІ-відео: як моделі вчаться запам'ятовувати обличчя

Одна з найнаполегливіших проблем у генерації ШІ-відео — це збереження послідовності персонажа протягом сцен. Запитайте будь-якого кінематографіста: історія розпадається, як тільки обличчя головного героя змінюється між дублями. У 2025 році ми нарешті побачили, як моделі вирішили цю проблему архітектурними інноваціями, які мають таку ж елегантність, як добре спланований маршрут на складну вершину. Дозвольте мені розповісти, як сучасні відео-моделі вчаться запам'ятовувати обличчя.

Виклик послідовності

Традиційні дифузійні моделі генерують кожен кадр за допомогою ймовірнісного вибірки. Це вносить дисперсію — корисну для різноманітності, проблемну для ідентичності. При генерації 10-секундного відео на 24 кадри за секунду модель приймає 240 послідовних рішень, кожне з яких може призвести до відхилення.

# The core problem: each denoising step introduces variance
def denoise_step(x_t, model, t):
    noise_pred = model(x_t, t)
    # This sampling introduces stochasticity
    x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
    return x_t_minus_1  # Slight variations accumulate over frames

Ранні відео-моделі, як Gen-1 та Pika 1.0, явно мали з цим проблеми. Персонажі змінювали зовнішність, дещо старіли між сценами або розвивали несумісні риси — те, що практики називали "зносом ідентичності". Прорив прийшов з розуміння послідовності персонажа не як проблеми пост-обробки, а як архітектурної.

Ембединги, що зберігають ідентичність: основа

Перша велика інновація — введення спеціалізованих ембедингів ідентичності, які залишаються протягом процесу генерації. Замість того, щоб покладатися виключно на текстове кондиціонування, моделі тепер зберігають явні токени ідентичності:

class IdentityEncoder(nn.Module):
    def __init__(self, embed_dim=768):
        super().__init__()
        self.face_encoder = FaceRecognitionBackbone()  # Pre-trained face model
        self.projection = nn.Linear(512, embed_dim)
        self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
 
    def encode_identity(self, reference_frame):
        # Extract identity features from reference
        face_features = self.face_encoder(reference_frame)
        identity_embed = self.projection(face_features)
 
        # Cross-attend with learned identity tokens
        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):
        # Standard spatial attention within frames
        x = self.spatial_attn(x, x, x)[0] + x
 
        # Temporal attention across frames
        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)
 
        # Identity-specific attention using face regions
        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):
        # Encode identity from reference images
        identity_embeds = []
        for ref in reference_images:
            identity_embeds.append(self.identity_encoder(ref))
 
        # Pool multiple references for robust identity
        identity_tokens = torch.stack(identity_embeds).mean(dim=0)
 
        # Generate with identity conditioning
        video = self.model.generate(
            prompt=prompt,
            num_frames=num_frames,
            cross_attention_kwargs={
                "identity_tokens": identity_tokens,
                "identity_strength": 0.8  # Balances consistency vs creativity
            }
        )
        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):
    # Per-frame identity matching to reference
    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 consistency between adjacent frames
    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)
            # Add separator to prevent conflation
            char_tokens = torch.cat([char_tokens, self.character_separator])
            all_tokens.append(char_tokens)
        return torch.cat(all_tokens, dim=0)

Токени-розділювачі працюють як страховки між альпіністами — зберігаючи окремі ідентичності навіть коли вони працюють у близькій близькості.

Практичні наслідки для творців

Для тих, хто використовує ці інструменти, а не будує їх, з'явилося кілька практичних патернів:

Якість референцного зображення має значення: зображення вищої розділювальної здатності, добре освітлені, з нейтральними виразами дають послідовніші результати. Модель вчиться ідентичності з цих якорів, і шум поширюється.

Кілька референцій покращують робастність: надання 3-5 референцних зображень під різними кутами допомагає моделі побудувати більш повне уявлення про ідентичність. Подумайте про це як триангуляцію позиції з кількох точок.

Інженерія запитів для послідовності: явні опису ідентичності в запитах посилюють візуальну послідовність. "Тридцятирічна жінка з коротким коричневим волоссям та зеленими очима" дає додаткові обмеження, які модель може використовувати.

Дорога вперед

Ми наближаємось до порогу, де ШІ-генероване відео може підтримувати послідовність персонажа, достатню для розповідання історій. Залишаючись проблем — тонка послідовність виразів, довгоформатна генерація понад 60 секунд та взаємодія між кількома персонажами — активно вирішуються.

У Bonega.ai ми особливо зацікавлені в тому, як ці поліпшення послідовності інтегруються з можливостями розширення відео. Здатність розширити існуючу відеозйомку, зберігаючи ідеальну послідовність персонажа, відкриває творчі можливості, які просто були неможливі 12 місяців тому.

Математична елегантність розглядання ідентичності як архітектурної проблеми першого рівня, а не як пост-обробного виправлення, позначає дозрівання в тому, як ми думаємо про генерацію відео. Подібно до встановлення добре залишеного високого табору перед штурмом вершини, ці фундаментальні поліпшення дозволяють довші, більш амбітні творчі подорожі, що лежать попереду.

Послідовність персонажа — це не просто технічна метрика — це основа візуального розповідання. І у 2025 році ця основа нарешті стала достатньо твердою для того, щоб на ній будувати.

Ця стаття була корисною?

Alexis

Alexis

Інженер ШІ

Інженер ШІ з Лозанни, що поєднує глибину досліджень з практичними інноваціями. Ділить час між архітектурами моделей та альпійськими вершинами.

Схожі статті

Продовжуйте дослідження з цими схожими публікаціями

Сподобалась ця стаття?

Дізнавайтеся більше та слідкуйте за нашими останніми матеріалами.

Послідовність характеру в ШІ-відео: як моделі вчаться запам'ятовувати обличчя