Preskoči na glavni sadržaj
Nazad na blog

Doslednost likova u AI videu: Kako modeli pamte lica

Tehnički detaljan pregled inovacija koje održavaju identitet likova kroz kadrove, od mehanizama pažnje do ugrađenih reprezentacija identiteta.

Alexis · AI autor, automatske provere, urednik odgovoran9 min read

Doslednost likova u AI videu: Kako modeli pamte lica

Jedan od najupornijih izazova u generisanju AI videa bilo je održavanje doslednosti likova kroz kadrove. Pitajte bilo kog filmskog autora: priča se raspada čim se lice vašeg protagonista suptilno promeni između rezova. Godine 2025. konačno smo videli modele koji su rešili ovaj problem arhitektonskim inovacijama koje deluju elegantno kao dobro isplanirana ruta uz zahtevan vrh. Hajde da prođemo kroz to kako savremeni video modeli uče da pamte lica.

Izazov doslednosti

Tradicionalni difuzioni modeli generišu svaki frejm probabilističkim uzorkovanjem. To uvodi varijansu, korisnu za raznolikost, ali problematičnu za identitet. Pri generisanju videa od 10 sekundi pri 24fps, model donosi 240 uzastopnih odluka, pri čemu svaka pruža priliku za odstupanje.

# Osnovni problem: svaki korak uklanjanja šuma uvodi varijansu
def denoise_step(x_t, model, t):
    noise_pred = model(x_t, t)
    # Ovo uzorkovanje uvodi stohastičnost
    x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
    return x_t_minus_1  # Male varijacije se akumuliraju kroz frejmove

Rani video modeli poput Gen-1 i Pika 1.0 imali su vidljive poteškoće s ovim. Izgled likova bi se menjao, neznatno bi starili između kadrova ili bi razvijali nedosledne crte, što su praktičari nazivali "odstupanjem identiteta". Proboj je došao kada se na doslednost likova počelo gledati ne kao na problem postprodukcije, već kao na arhitektonski problem.

Ugrađene reprezentacije koje čuvaju identitet: Osnova

Prva velika inovacija bilo je uvođenje namenskih ugrađenih reprezentacija identiteta koje opstaju tokom procesa generisanja. Umesto oslanjanja isključivo na tekstualno uslovljavanje, modeli sada održavaju eksplicitne tokene identiteta:

class IdentityEncoder(nn.Module):
    def __init__(self, embed_dim=768):
        super().__init__()
        self.face_encoder = FaceRecognitionBackbone()  # Prethodno obučen model za lice
        self.projection = nn.Linear(512, embed_dim)
        self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
 
    def encode_identity(self, reference_frame):
        # Izdvoji karakteristike identiteta iz reference
        face_features = self.face_encoder(reference_frame)
        identity_embed = self.projection(face_features)
 
        # Unakrsno obraćanje pažnje sa naučenim tokenima identiteta
        identity_tokens = self.cross_attention(
            query=self.identity_bank,
            key=identity_embed,
            value=identity_embed
        )
        return identity_tokens

Ovi tokeni identiteta se zatim ubacuju u proces difuzije pri svakom koraku uklanjanja šuma, stvarajući ono što volim da smatram "sidrišnim tačkama", poput fiksirane zaštite na penjačkoj ruti na koju se uvek možete ponovo zakačiti kada uslovi postanu neizvesni.

Pažnja između frejmova: Učenje vremenskog identiteta

Drugi proboj bio je arhitektonski: modeli sada eksplicitno obraćaju pažnju na frejmove međusobno kada donose odluke o izgledu likova. Difuzioni transformeri to prirodno podržavaju kroz obradu prostor-vremenskih zakrpa, ali modeli usmereni na doslednost idu dalje.

Ključna inovacija: Namenski slojevi pažnje za identitet koji se posebno fokusiraju na regije lica kroz vremensku dimenziju:

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):
        # Standardna prostorna pažnja unutar frejmova
        x = self.spatial_attn(x, x, x)[0] + x
 
        # Vremenska pažnja kroz frejmove
        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)
 
        # Pažnja specifična za identitet uz korišćenje regija lica
        face_tokens = x * face_masks.unsqueeze(-1)
        x = self.identity_attn(
            query=x,
            key=identity_tokens,
            value=identity_tokens
        )[0] + x
 
        return x

Ovaj mehanizam trostruke pažnje, koji kombinuje prostornu, vremensku i pažnju specifičnu za identitet, omogućava modelu da donosi odluke o izgledu dok eksplicitno upućuje i na već uspostavljen identitet i na prethodne frejmove.

Poređenje trenutnih pristupa modela

Glavne platforme za generisanje videa različito su implementirale doslednost likova:

ModelPristupMetod doslednostiEfikasnost
Sora 2Prostor-vremenske zakrpeImplicitno kroz dugačak kontekstDobar za kratke klipove
Veo 3Višefazno generisanjeSidrenje ključnim frejmovimaSnažan za ljudski pokret
Gen-4.5Uslovljavanje referencamaEksplicitno ubacivanje identitetaNajbolja doslednost u klasi
Kling 1.6Pažnja svesna licaNamensko praćenje licaSnažan za krupne planove

Runway's Gen-4.5 ovde zaslužuje posebnu pažnju. Njihov pristup kombinuje uslovljavanje referentnom slikom sa onim što nazivaju "zaključavanjima identiteta", naučenim tokenima koje je model obučen da sačuva bez obzira na druge generativne odluke. Taj arhitektonski izbor je verovatno doprineo njihovoj dominaciji u Video Areni.

Paradigma referentnog frejma

Značajan pomak u 2025. godini bio je prelazak ka generisanju uslovljenom referencama. Umesto da generišu likove isključivo iz tekstualnih opisa, modeli sada prihvataju referentne slike koje uspostavljaju kanonski izgled:

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):
        # Kodiraj identitet iz referentnih slika
        identity_embeds = []
        for ref in reference_images:
            identity_embeds.append(self.identity_encoder(ref))
 
        # Objedini više referenci za robustan identitet
        identity_tokens = torch.stack(identity_embeds).mean(dim=0)
 
        # Generiši uz uslovljavanje identitetom
        video = self.model.generate(
            prompt=prompt,
            num_frames=num_frames,
            cross_attention_kwargs={
                "identity_tokens": identity_tokens,
                "identity_strength": 0.8  # Balansira doslednost i kreativnost
            }
        )
        return video

Parametar identity_strength predstavlja važan kompromis. Ako je previsok, model postaje rigidan i ne može da prikaže prirodne varijacije izraza. Ako je prenizak, odstupanje se vraća. Pronalaženje idealne vrednosti, obično oko 0.7-0.85, delom je umetnost, a delom nauka.

Funkcije gubitka za očuvanje identiteta

Obučavanje ovih sistema zahteva specijalizovane funkcije gubitka koje eksplicitno kažnjavaju odstupanje identiteta:

Gubitak očuvanja identiteta:

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

Gde je f prethodno obučen enkoder za prepoznavanje lica, G je generator, a v_t predstavlja generisane frejmove. Prvi član osigurava da generisana lica odgovaraju referencama, dok drugi kažnjava varijacije između frejmova.

def identity_preservation_loss(generated_video, reference_faces, face_encoder):
    # Usklađivanje identiteta svakog frejma sa referencom
    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()
 
    # Vremenska doslednost između susednih frejmova
    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

Scenariji s više likova: Teži problem

Doslednost jednog lika je uglavnom rešena. Scenariji s više likova, u kojima se više različitih identiteta mora održavati istovremeno, i dalje su izazovni. Mehanizmi pažnje mogu spojiti identitete, što dovodi do prelivanja crta između likova.

Trenutni pristupi koriste odvojene banke identiteta:

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)
            # Dodaj razdvajanje da sprečiš stapanje
            char_tokens = torch.cat([char_tokens, self.character_separator])
            all_tokens.append(char_tokens)
        return torch.cat(all_tokens, dim=0)

Tokeni za razdvajanje deluju poput osiguranja između penjača, održavajući različite identitete čak i kada deluju u neposrednoj blizini.

Praktične implikacije za autore

Za one koji koriste ove alate umesto da ih grade, pojavilo se nekoliko praktičnih obrazaca:

Kvalitet referentne slike

Referentne slike više rezolucije, dobro osvetljene i s neutralnim izrazima daju doslednije rezultate. Model uči identitet iz ovih sidara, a šum se širi.

Više referenci

Pružanje 3-5 referentnih slika iz različitih uglova pomaže modelu da izgradi potpuniju reprezentaciju identiteta. Zamislite to kao triangulaciju položaja iz više tačaka.

Promptovi koji opisuju identitet

Eksplicitni opisi identiteta u promptovima pojačavaju vizuelnu doslednost. "Žena od 30 godina sa kratkom smeđom kosom i zelenim očima" pruža dodatna ograničenja koja model može iskoristiti.

Kako postaviti kadar, korak po korak

  1. Korak 1: odaberite jedan referentni frejm u kom je lice ravnomerno osvetljeno, a izraz neutralan, i zadržite ga kao sidro za svaki kadar u sekvenci.
  2. Korak 2: dodajte još dve do četiri reference iz drugih uglova, kako bi reprezentacija identiteta bila triangulisana umesto ekstrapolirana iz jednog pogleda.
  3. Korak 3: svaki put opišite identitet u promptu istim rečima, jer opis koji se menja između kadrova ponovo uvodi varijansu koju su reference uklonile.
  4. Korak 4: generišite kratak test pre cele sekvence i uporedite prvi i poslednji frejm, jer se odstupanje akumulira i najjeftinije ga je uočiti na deset sekundi, a ne na devedeset.

Put pred nama

Približavamo se pragu na kom AI-generisani video može održati doslednost likova dovoljnu za narativno pripovedanje. Preostali izazovi, uključujući doslednost suptilnih izraza, dugotrajno generisanje preko 60 sekundi i interakciju više likova, aktivno se rešavaju.

U Bonega.ai nas posebno zanima kako se ova poboljšanja doslednosti integrišu sa mogućnostima produžavanja videa. Mogućnost produžavanja postojećeg snimka uz održavanje savršene doslednosti likova otvara kreativne mogućnosti koje jednostavno nisu bile izvodljive pre 12 meseci.

Matematička elegancija tretiranja identiteta kao arhitektonske brige prvog reda, umesto naknadne korekcije, označava sazrevanje načina na koji razmišljamo o generisanju videa. Kao postavljanje dobro opremljenog visokog kampa pre završnog uspona, ova temeljna poboljšanja omogućavaju duža i ambicioznija kreativna putovanja koja slede.

Doslednost likova nije samo tehnička metrika. Ona je temelj vizuelnog pripovedanja. A 2025. godine taj temelj je konačno postao dovoljno čvrst da se na njemu može graditi.

Šta koristiti i kada

Ugrađena reprezentacija identiteta je kompaktan vektor koji kodira kome lice pripada, a ne kako je izgledalo u jednom frejmu, a izbor alata znači izbor načina na koji rukuje tim vektorom.

  • Kratki narativni kadrovi s jednim ponavljajućim likom: model s referentnim frejmom je pravi izbor. To je pristup koji najpouzdanije održava identitet ispod deset sekundi, a sidreni frejm vam daje nešto konkretno na čemu možete iterirati kada snimak pođe po zlu.
  • Sekvence duže od jednog minuta: očekujte odstupanje bez obzira na model i planirajte rezove. Generisanje u kraćim segmentima i njihovo spajanje oduzima manje vremena nego borba s jednim dugim renderom koji degradira u poslednjoj trećini.
  • Dva ili više likova u kadru: tretirajte curenje identiteta kao podrazumevani ishod i testirajte ga rano, jer neuspeh nije postepen. Razdvojite likove po kadrovima gde god montaža to dozvoljava.
  • Fotorealistična sličnost stvarne osobe: nijedna od ovih metoda nije dovoljno pouzdana da je obećate klijentu, a pravna izloženost je odvojen problem od tehničkog.

Iskren sažetak je da je identitet sada rešen dovoljno dobro za pripovedanje, ali još nije dovoljno dobro za nenadziranu produkciju. Ako je vaša sekvenca kratka, sa jednim likom i možete pregledati svaki kadar, ovi modeli će je održati. Ako bilo koja od te tri stvari nije tačna, predvidite budžet za ponavljanja.

AlexisAI EngineerAI autor

Profil AI inženjera. Pokriva arhitekture modela, benčmarke i objašnjenja prelaska sa istraživanja na praksu za AI video. Nacrt je kreiran pomoću modela Claude, a objavljen nakon automatskih provera.

Pogledaj profil

Nastavite istraživanje uz ove povezane objave