Meta Pixel
AlexisAlexis
6 min read
1186 ord

Karakterkonsistens i AI-video: Hvordan modeller lærer å huske ansikter

En teknisk gjennomgang av arkitekturinnovasjoner som gjør det mulig for AI-videomodeller å opprettholde karakteridentitet over hele opptaket, fra oppmerksomhetsmekanismer til identitetsbevarende embeddings.

Karakterkonsistens i AI-video: Hvordan modeller lærer å huske ansikter

En av de vanskeligste oppgavene innen AI-videogenerering har vært å opprettholde karakterkonsistens over flere klipp. Spør en hvilken som helst filmskapere: en historie faller fra hverandre når hovedpersonens ansikt endrer seg subtilt mellom klippene. I 2025 har vi endelig sett modeller løse dette problemet med arkitekturinnovasjoner som føles like elegante som en velplanlagt rute opp en vanskelig fjelltopp. La meg vise deg hvordan moderne videomodeller lærer å huske ansikter.

Konsistensutfordringen

Tradisjonelle diffusjonsmodeller genererer hver frame med probabilistisk sampling. Dette introduserer varians—nyttig for variasjon, problematisk for identitet. Når man genererer en 10-sekunders video ved 24fps, tar modellen 240 sekvensielle beslutninger, hver med mulighet for drift.

# Kjerneproblemet: hver denoising-trinn introduserer varians
def denoise_step(x_t, model, t):
    noise_pred = model(x_t, t)
    # Denne sampllingen introduserer stokastisitet
    x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
    return x_t_minus_1  # Små variasjoner akkumuleres over frames

Tidlige videomodeller som Gen-1 og Pika 1.0 sleit synlig med dette. Karakterer ville skifte utseende, alders lett mellom klipp, eller utvikle inkonsistente trekk—det praktisenter kalte "identitetsdrift." Gjennombruddet kom fra å behandle karakterkonsistens ikke som et etterbehandlingsproblem, men som et arkitekturproblem.

Identitetsbevarende embeddings: Grunnlaget

Den første store innovasjonen var å introdusere dedikerte identitetsembeddings som opprettholdes gjennom generasjonsprosessen. I stedet for å bare stole på tekstbetinging, opprettholder modeller nå eksplisitte identitetstokener:

class IdentityEncoder(nn.Module):
    def __init__(self, embed_dim=768):
        super().__init__()
        self.face_encoder = FaceRecognitionBackbone()  # Forhåndsopplært ansiktsmodell
        self.projection = nn.Linear(512, embed_dim)
        self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
 
    def encode_identity(self, reference_frame):
        # Hent identitetsfunksjoner fra referansebilde
        face_features = self.face_encoder(reference_frame)
        identity_embed = self.projection(face_features)
 
        # Tverroppmerksomhet med lærte identitetstokener
        identity_tokens = self.cross_attention(
            query=self.identity_bank,
            key=identity_embed,
            value=identity_embed
        )
        return identity_tokens

Disse identitetstokerene blir deretter injisert i diffusjonsprosessen ved hvert denoising-trinn, og skaper det jeg liker å tenke på som "ankerpunkter"—som sikring på en klatrierute som du alltid kan klippe deg tilbake til når forholdene blir usikre.

Tversframe-oppmerksomhet: Læring av temporal identitet

Det andre gjennombruddet var arkitekturmessig: modeller oppmerker nå eksplisitt på tvers av frames når de tar beslutninger om karakterutseende. Diffusjonstransformere støtter naturligvis dette gjennom deres romtids-patchbehandling, men konsistensfokuserte modeller går lenger.

Nøkkelinnovasjon: Dedikerte identitetsoppmerksomhetslag som spesifikt oppmerker på ansiktsregioner over den tidsmessige dimensjonen:

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 romlig oppmerksomhet innen frames
        x = self.spatial_attn(x, x, x)[0] + x
 
        # Temporal oppmerksomhet på tvers av 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)
 
        # Identitetsspesifikk oppmerksomhet ved bruk av ansiktsregioner
        face_tokens = x * face_masks.unsqueeze(-1)
        x = self.identity_attn(
            query=x,
            key=identity_tokens,
            value=identity_tokens
        )[0] + x
 
        return x

Denne trippel-oppmerksomhetsmekanismen—romlig, temporal og identitetsspesifikk—tillater modellen å ta utseendebeslutninger mens den eksplisitt refererer til både den etablerte identiteten og tidligere frames.

Dagens modelltyper sammenlignet

De store videogenereringsplattformene har implementert karakterkonsistens på forskjellige måter:

ModellTilnærmingKonsistensmetodeEffektivitet
Sora 2Romtids-patchesImplisitt gjennom lang kontekstBra for korte klipp
Veo 3Multi-trinnsgenereringNøkkelframe-ankerSterk for menneskebevegelse
Gen-4.5ReferansekondisjonerEksplisitt identitetsinjeksjonBeste konsistens
Kling 1.6Ansiktsbevisst oppmerksomhetDedikert ansiktssporingSterk for nærbilde

Runway sin Gen-4.5 fortjener spesiell omtale her. Deres tilnærming kombinerer referansebildekondisjoner med det de kaller "identitetslåser"—lærte tokener som modellen er trenet til å bevare uavhengig av andre generasjonsbeslutninger. Dette arkitekturvalget bidro sannsynligvis til deres Video Arena-dominans.

Referanseframe-paradigmet

En betydelig endring i 2025 har vært overgangen til referansekondisjoner generering. I stedet for å generere karakterer rent fra tekstbeskrivelser, aksepterer modeller nå referansebilder som etablerer kanonisk utseende:

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):
        # Kode identitet fra referansebilder
        identity_embeds = []
        for ref in reference_images:
            identity_embeds.append(self.identity_encoder(ref))
 
        # Samle flere referanser for robust identitet
        identity_tokens = torch.stack(identity_embeds).mean(dim=0)
 
        # Generer med identitetskondisjoner
        video = self.model.generate(
            prompt=prompt,
            num_frames=num_frames,
            cross_attention_kwargs={
                "identity_tokens": identity_tokens,
                "identity_strength": 0.8  # Balanserer konsistens vs kreativitet
            }
        )
        return video

identity_strength-parameteren representerer en viktig avveining. For høy, og modellen blir stiv, ute av stand til å vise naturlig uttrykksvariasjoner. For lav, og driften kommer tilbake. Å finne søtpunktet—typisk rundt 0.7-0.85—er delvis kunst, delvis vitenskap.

Tapsfunksjoner for identitetsbevarelse

Trening av disse systemene krever spesialiserte tapsfunksjoner som eksplisitt straffer identitetsdrift:

Identitetsbevarelsesstap:

L_identity = ||f(G(z, c)) - f(x_ref)||² + λ_temporal * Σ_t ||f(v_t) - f(v_{t+1})||²

Der f er en forhåndsopplært ansiktsgjenkjenningskodar, G er generatoren, og v_t representerer genererte frames. Det første leddet sikrer at genererte ansikter samsvarer med referanser; det andre straffer frame-til-frame-variasjon.

def identity_preservation_loss(generated_video, reference_faces, face_encoder):
    # Per-frame identitetsmatchning til referanse
    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 konsistens mellom tilstøtende 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

Flerkarak-scenarier: Det vanskeligere problemet

En-karakter-konsistens er stort sett løst. Multi-karakter-scenarier—der flere distinkte identiteter må opprettholdes samtidig—fortsetter å være utfordrende. Oppmerksomhetsmekanismene kan forvirre identiteter, noe som fører til funksjonsblødning mellom karakterer.

Nåværende tilnærminger bruker separate identitetsbanker:

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)
            # Legg til separator for å forhindre forvirring
            char_tokens = torch.cat([char_tokens, self.character_separator])
            all_tokens.append(char_tokens)
        return torch.cat(all_tokens, dim=0)

Separatortokenene fungerer som sikringer mellom klatrere—opprettholder distinkte identiteter selv når de opererer i nær tilknytning.

Praktiske implikasjoner for skapere

For de som bruker disse verktøyene i stedet for å bygge dem, har flere praktiske mønstre dukket opp:

Referansebildekvalitet betyr noe: Høyere-oppløsning, godt opplyste referansebilder med nøytrale uttrykk gir mer konsistente resultater. Modellen lærer identitet fra disse ankrene, og støy propagerer.

Flere referanser forbedrer robusthet: Å gi 3-5 referansebilder fra forskjellige vinkler hjelper modellen til å bygge en mer fullstendig identitetsrepresentasjon. Tenk på det som å triangulere en posisjon fra flere punkter.

Prompt-engineering for konsistens: Eksplisitte identitetsbeskrivelser i prompts forsterker visuell konsistens. "En 30 år gammel kvinne med kort brunt hår og grønne øyne" gir ytterligere begrensninger som modellen kan utnytte.

Veien videre

Vi nærmer oss en terskel der AI-generert video kan opprettholde karakterkonsistens tilstrekkelig for narrativ fortelling. De gjenværende utfordringene—subtil uttrykkkonsistens, langtidsgenerering utover 60 sekunder og multi-karakter-interaksjon—blir aktivt løst.

I Bonega.ai er vi spesielt interessert i hvordan disse konsistensforberingene integreres med videoforlengelsesegenskaper. Muligheten til å forlenge eksisterende opptak mens man opprettholder perfekt karakterkonsistens åpner kreative muligheter som ganske enkelt ikke var gjennomførbare for 12 måneder siden.

Den matematiske elegansen ved å behandle identitet som en førsteklasses arkitekturkonsern, i stedet for en påfølgende korreksjon, markerer en modenhet i hvordan vi tenker på videogenerering. Som å etablere en velforsynt høy kamp før en toppklatring, gjør disse grunnleggende forbringelsene det mulig for de lengre, mer ambisiøse kreative reisene som ligger foran.

Karakterkonsistens er ikke bare en teknisk metrikk—det er grunnlaget for visuell fortelling. Og i 2025 har det grunnlaget endelig blitt solid nok til å bygge videre på.

Var denne artikkelen nyttig?

Alexis

Alexis

KI-ingeniør

KI-ingeniør fra Lausanne som kombinerer forskningsdybde med praktisk innovasjon. Deler tiden mellom modellarkitekturer og alpine topper.

Relaterte artikler

Fortsett å utforske med disse relaterte innleggene

Likte du denne artikkelen?

Oppdag mer innsikt og hold deg oppdatert på vårt nyeste innhold.

Karakterkonsistens i AI-video: Hvordan modeller lærer å huske ansikter