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.

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 frejmoveRani 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_tokensOvi 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 xOvaj 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:
| Model | Pristup | Metod doslednosti | Efikasnost |
|---|---|---|---|
| Sora 2 | Prostor-vremenske zakrpe | Implicitno kroz dugačak kontekst | Dobar za kratke klipove |
| Veo 3 | Višefazno generisanje | Sidrenje ključnim frejmovima | Snažan za ljudski pokret |
| Gen-4.5 | Uslovljavanje referencama | Eksplicitno ubacivanje identiteta | Najbolja doslednost u klasi |
| Kling 1.6 | Pažnja svesna lica | Namensko praćenje lica | Snaž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 videoParametar 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_lossScenariji 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
- 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.
- Korak 2: dodajte još dve do četiri reference iz drugih uglova, kako bi reprezentacija identiteta bila triangulisana umesto ekstrapolirana iz jednog pogleda.
- 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.
- 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.



