Meta Pixel
AlexisAlexis
7 min read
1256 riječi

Konzistentnost lika u AI videu: Kako modeli uče zapamtiti lica

Tehničko istraživanje arhitekturnih inovacija koje omogućavaju AI video modelima da održavaju identitet lika tijekom snimanja, od mehanizama pažnje do embedding-a koji čuvaju identitet.

Konzistentnost lika u AI videu: Kako modeli uče zapamtiti lica

Jedan od najtrajnijih izazova u generiranju AI videa bila je održavanja konzistentnosti likova tijekom snimanja. Pitajte bilo kojeg filmskog redatelja: priča se raspada čim se lice glavnog lika neznatno promijeni između rezova. U 2025. godini, konačno smo vidjeli kako modeli rješavaju ovaj problem kroz arhitekturne inovacije koje su elegantne poput dobro planiranog uspona na težak vrh. Omogućite mi da vas vodem kroz to kako moderni video modeli uče zapamtiti lica.

Izazov konzistentnosti

Tradicionalni difuzijski modeli generiraju svaki okvir probabilističkim uzorkovanjem. To unosi varijancu—korisno za raznolikost, problematično za identitet. Kod generiranja 10-sekundnog videa pri 24fps, model donosi 240 uzastopnih odluka, od kojih svaka ima mogućnost za pomak.

# Temeljni problem: svaki korak denoisanja unosi varijancu
def denoise_step(x_t, model, t):
    noise_pred = model(x_t, t)
    # Ovo uzorkovanje unosi stohastičnost
    x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
    return x_t_minus_1  # Manji pomaci se akumuliraju tijekom okvira

Rani video modeli poput Gen-1 i Pika 1.0 vidljivo su se borili s tim. Likovi bi mijenjali izgled, malo bi ostarili između rezova ili bi razvili neusklađene značajke—što su praktičari nazivali "pomak identiteta". Proboj je došao od tretiranja konzistentnosti lika ne kao problema naknadne obrade, već kao arhitekturnog.

Embedding-i koji čuvaju identitet: Temelj

Prva velika inovacija bila je uvođenje posvećenih embedding-a identiteta koji se održavaju tijekom procesa generiranja. Umjesto da se oslanjaju samo na tekstualno uvjetovanje, modeli sada održavaju eksplicitne tokene identiteta:

class IdentityEncoder(nn.Module):
    def __init__(self, embed_dim=768):
        super().__init__()
        self.face_encoder = FaceRecognitionBackbone()  # Prethodno trenirani model lica
        self.projection = nn.Linear(512, embed_dim)
        self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
 
    def encode_identity(self, reference_frame):
        # Izdvoji značajke identiteta iz referentnog okvira
        face_features = self.face_encoder(reference_frame)
        identity_embed = self.projection(face_features)
 
        # Unakrsna pažnja sa naučenim žetonima identiteta
        identity_tokens = self.cross_attention(
            query=self.identity_bank,
            key=identity_embed,
            value=identity_embed
        )
        return identity_tokens

Ovi se tokeni identiteta zatim ubacuju u difuzijski proces pri svakom koraku denoisanja, stvarajući ono što volim zvati "točkami sidrenja"—poput fiksne zaštite na planinskom usponu koju možeš uvijek vrati kada se uvjeti postanu nesigurni.

Unakrsna pažnja između okvira: Učenje vremenskog identiteta

Drugi proboj bio je arhitekturan: modeli sada eksplicitno paze na okvire kada donose odluke o izgledu lika. Difuzijski transformeri prirodno to podržavaju kroz njihovu obradu spacetime patcha, ali modeli fokusirani na konzistentnost idu dalje.

Ključna inovacija: Posvećeni slojevi pažnje fokusirani na identitet koji specifično paze na 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 pažnja u okviru
        x = self.spatial_attn(x, x, x)[0] + x
 
        # Vremenska pažnja kroz okvire
        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 koristeći dijelove 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—prostorna, vremenska i specifična za identitet—omogućava modelu da donese odluke o izgledu dok eksplicitno referira na uspostavljeni identitet i prethodne okvire.

Usporedba pristupa trenutnih modela

Platforme za generiranje videa implementirale su konzistentnost lika na različite načine:

ModelPristupMetoda konzistentnostiUčinkovitost
Sora 2Spacetime patchiImplicitno kroz dugi kontekstDobra za kratke isječke
Veo 3Generiranje u više fazaSidljenje ključnih okviraSnažna za ljudske pokrete
Gen-4.5Uvjetovanje referencaEksplicitno ubacivanje identitetaNajbolja konzistentnost
Kling 1.6Pažnja svjesna licuPosvećeno praćenje licaSnažna za gledanja blizu

Runway-ov Gen-4.5 zasluživuje posebnu važnost ovdje. Njihov pristup kombinira uvjetovanje referentne slike s onim što oni nazivaju "zaključavanju identiteta"—naučenim žetonima koje je model treniran čuvati bez obzira na druge odluke generiranja. Ovaj arhitekturan izbor vjerojatno je pridoneo njihovoj dominaciji Video Arena.

Paradigma referentnog okvira

Značajni pomak u 2025. godini bila je premjena prema generiranju uvjetovanom referencom. Umjesto da se likovi generiraju čisto iz tekstualnih opisa, modeli sada primaju referentne slike koje uspostavljaju kanontski 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))
 
        # Spoji više referenci za robusniji identitet
        identity_tokens = torch.stack(identity_embeds).mean(dim=0)
 
        # Generiraj uz uvjetovanje identitetom
        video = self.model.generate(
            prompt=prompt,
            num_frames=num_frames,
            cross_attention_kwargs={
                "identity_tokens": identity_tokens,
                "identity_strength": 0.8  # Balansira konzistentnost i kreativnost
            }
        )
        return video

Parametar identity_strength predstavlja važan kompromis. Ako je premali, model postaje krut, ne može pokazati prirodnu varijaciju izraza lica. Ako je premali, vraća se pomak. Pronalaženje optimalne točke—obično oko 0.7-0.85—dijelom je umijeće, dijelom znanost.

Funkcije gubitka za čuvanje identiteta

Treniranje tih sustava zahtijeva specijalizirane funkcije gubitka koje eksplicitno kažnjavaju pomak identiteta:

Gubitak čuvanja identiteta:

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

Gdje je f prethodno trenirani encoder prepoznavanja lica, G je generator, a v_t predstavlja generirane okvire. Prva komponenta osigurava da generirana lica odgovaraju referencama; druga kažnjava varijaciju od okvira do okvira.

def identity_preservation_loss(generated_video, reference_faces, face_encoder):
    # Udopoljavanje identiteta po okviru s 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 konzistentnost između susjednih okvira
    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

Konzistentnost jednog lika je uglavnom riješena. Scenariji s više likova—gdje se moraju istovremeno održavati višestruki različiti identiteti—ostaju izazovni. Mehanizmi pažnje mogu zamiješati identitete, što vodi do curenja značajki 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 separator da spriječiš miješanje
            char_tokens = torch.cat([char_tokens, self.character_separator])
            all_tokens.append(char_tokens)
        return torch.cat(all_tokens, dim=0)

Tokeni separatora djeluju kao sigurnosne točke između penjača—održavajući različite identitete čak i kada su u bliskoj blizini.

Praktične implikacije za stvaratelje

Za one koji koriste ove alate umjesto da ih grade, nekoliko praktičnih pristupa se pokazalo:

Kvaliteta referentne slike je važna: Visokorezolucijske, dobro osvjetljene referentne slike s neutralnim izrazima lica daju konzistentnije rezultate. Model uči identitet iz tih sidrišta, a šum se širi.

Više referenci poboljšava robusnost: Pružanje 3-5 referentnih slika iz različitih kutova pomaže modelu da gradi potpuniju reprezentaciju identiteta. Razmisli o tome kao triangulaciji pozicije iz više točaka.

Inženjerstvo upita za konzistentnost: Eksplicitni opisi identiteta u uputama jačaju vizualnu konzistentnost. "Žena od 30 godina s kratkom smeđom kosom i zelenim očima" daje dodatna ograničenja koja model može iskoristiti.

Put naprijed

Približavamo se točki gdje AI video generirani videi mogu održavati konzistentnost likova dovoljnu za narativnu priču. Preostali izazovi—suptilna konzistentnost izraza, dugoročno generiranje preko 60 sekundi i interakcija između više likova—aktivno se rješavaju.

U Bonega.ai-u nas posebno zanima kako se ta poboljšanja konzistentnosti integriraju s mogućnostima proširenja videa. Sposobnost proširenja postojećeg snimka dok se održava savršena konzistentnost lika otvara kreativne mogućnosti koje jednostavno nisu bile izvedive prije 12 mjeseci.

Matematička elegancija tretiranja identiteta kao arhitekturne concern prvog reda, umjesto kao naknadne ispravke, označava sazrijevanje u tome kako razmišljamo o generiranju videa. Kao što je uspostavljanje dobro opremljenog visokog kampa prije završnog pokušaja na vrh, ta temeljnja poboljšanja omogućavaju duže, ambicioznije kreativne putovanje koja leže ispred nas.

Konzistentnost likova nije samo tehnička metrika—ona je temelj vizualnog pripovjedanja. A u 2025. godini, taj temelj je konačno dovoljno čvrst da se na njega gradi.

Je li vam ovaj članak bio koristan?

Alexis

Alexis

AI Inženjer

AI inženjer iz Lausannea koji kombinira dubinu istraživanja s praktičnom inovacijom. Dijeli svoje vrijeme između arhitektura modela i alpskih vrhova.

Povezani članci

Nastavite istraživati s ovim povezanim objavama

Svidio vam se ovaj članak?

Otkrijte više i pratite naš najnoviji sadržaj.

Konzistentnost lika u AI videu: Kako modeli uče zapamtiti lica