Ana içeriğe atla
Bloga dön

Yapay Zeka Videosunda Karakter Tutarlılığı: Modeller Yüzleri Nasıl Hatırlar?

Dikkat mekanizmalarından kimlik gömmelerine kadar, çekimler arasında karakter kimliğini koruyan yeniliklere teknik bir derinlemesine bakış.

Alexis · Yapay zeka yazarı, otomatik kontroller, editör sorumluluğu8 min read

Yapay Zeka Videosunda Karakter Tutarlılığı: Modeller Yüzleri Nasıl Hatırlar?

Yapay zeka video üretimindeki en kalıcı zorluklardan biri, çekimler arasında karakter tutarlılığını korumak oldu. Herhangi bir film yapımcısına sorun: baş karakterinizin yüzü kesmeler arasında belli belirsiz değiştiği anda hikâye dağılır. 2025'te modellerin, zorlu bir zirveye iyi planlanmış bir rota kadar zarif hissettiren mimari yeniliklerle bu sorunu nihayet çözdüğünü gördük. Modern video modellerinin yüzleri hatırlamayı nasıl öğrendiğini birlikte inceleyelim.

Tutarlılık Zorluğu

Geleneksel difüzyon modelleri her kareyi olasılıksal örneklemeyle üretir. Bu, çeşitlilik için yararlı ancak kimlik açısından sorunlu bir varyans yaratır. 24fps hızında 10 saniyelik bir video üretirken model, her biri sapma fırsatı içeren 240 ardışık karar verir.

# 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 ve Pika 1.0 gibi ilk video modelleri bununla gözle görülür biçimde zorlanıyordu. Karakterlerin görünümü değişiyor, çekimler arasında hafifçe yaşlanıyor veya tutarsız özellikler geliştiriyorlardı. Uygulayıcılar buna "kimlik sapması" diyordu. Asıl atılım, karakter tutarlılığını bir son işlem sorunu olarak değil, mimari bir sorun olarak ele almakla geldi.

Kimliği Koruyan Gömmeler: Temel

İlk büyük yenilik, üretim süreci boyunca kalıcı olan özel kimlik gömmelerinin kullanıma sunulmasıydı. Modeller artık yalnızca metin koşullandırmasına güvenmek yerine açık kimlik belirteçlerini koruyor:

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

Bu kimlik belirteçleri daha sonra her gürültü giderme adımında difüzyon sürecine eklenir. Bu, belirsiz koşullarda her zaman yeniden klips takabileceğiniz, tırmanış rotasındaki sabit emniyet noktalarına benzetmeyi sevdiğim "çapa noktalarını" oluşturur.

Kareler Arası Dikkat: Zamansal Kimliği Öğrenmek

İkinci atılım mimariydi: Modeller artık karakter görünümüyle ilgili kararlar verirken kareler arasında açıkça dikkat kuruyor. Difüzyon transformerları, uzay-zaman yaması işleme yapıları sayesinde bunu doğal olarak destekliyor, ancak tutarlılık odaklı modeller daha da ileri gidiyor.

Temel Yenilik: Zamansal boyut boyunca özellikle yüz bölgelerine dikkat eden özel kimlik dikkat katmanları:

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

Mekânsal, zamansal ve kimliğe özgü dikkati birleştiren bu üçlü dikkat mekanizması, modelin görünüm kararları verirken hem yerleşik kimliğe hem de önceki karelere açıkça başvurmasını sağlar.

Güncel Model Yaklaşımlarının Karşılaştırması

Başlıca video üretim platformları karakter tutarlılığını farklı şekillerde uyguladı:

ModelYaklaşımTutarlılık YöntemiEtkinlik
Sora 2Uzay-zaman yamalarıUzun bağlam yoluyla örtükKısa klipler için iyi
Veo 3Çok aşamalı üretimAna kare sabitlemeİnsan hareketi için güçlü
Gen-4.5Referans koşullandırmasıAçık kimlik enjeksiyonuSınıfının en iyisi tutarlılık
Kling 1.6Yüz farkındalıklı dikkatÖzel yüz takibiYakın planlar için güçlü

Runway'in Gen-4.5 modeli burada özel olarak anılmayı hak ediyor. Yaklaşımları, referans görüntüsü koşullandırmasını, diğer üretim kararlarından bağımsız olarak modelin korumak üzere eğitildiği "kimlik kilitleri" adı verilen öğrenilmiş belirteçlerle birleştiriyor. Bu mimari tercih muhtemelen Video Arena'daki üstünlüklerine katkı sağladı.

Referans Kare Paradigması

2025'teki önemli değişimlerden biri, referansla koşullandırılmış üretime geçiş oldu. Modeller artık karakterleri yalnızca metin açıklamalarından üretmek yerine, kanonik görünümü belirleyen referans görselleri kabul ediyor:

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 parametresi önemli bir dengeyi temsil eder. Çok yüksek olduğunda model katılaşır ve doğal ifade çeşitliliğini gösteremez. Çok düşük olduğunda ise sapma geri döner. Genellikle 0.7-0.85 aralığında olan ideal noktayı bulmak, kısmen sanat, kısmen bilimdir.

Kimliği Korumaya Yönelik Kayıp Fonksiyonları

Bu sistemleri eğitmek, kimlik sapmasını açıkça cezalandıran özel kayıp fonksiyonları gerektirir:

Kimliği Koruma Kaybı:

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

Burada f, önceden eğitilmiş bir yüz tanıma kodlayıcısıdır, G üreticidir ve v_t üretilen kareleri temsil eder. İlk terim, üretilen yüzlerin referanslarla eşleşmesini sağlar; ikincisi ise kareler arası değişimi cezalandırır.

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

Çok Karakterli Senaryolar: Daha Zor Sorun

Tek karakter tutarlılığı büyük ölçüde çözüldü. Birden fazla ayrı kimliğin aynı anda korunması gereken çok karakterli senaryolar ise hâlâ zorlu. Dikkat mekanizmaları kimlikleri birbirine karıştırarak karakterler arasında özellik sızıntısına yol açabiliyor.

Güncel yaklaşımlar ayrı kimlik bankaları kullanıyor:

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)

Ayırıcı belirteçler, tırmanıcılar arasındaki emniyet noktaları gibi davranır ve yakın mesafede çalışırken bile kimliklerin ayrı kalmasını sağlar.

İçerik Üreticileri İçin Pratik Çıkarımlar

Bu araçları geliştirmek yerine kullananlar için çeşitli pratik kalıplar ortaya çıktı:

Referans görsel kalitesi

Nötr ifadeli, iyi aydınlatılmış ve yüksek çözünürlüklü referans görseller daha tutarlı sonuçlar üretir. Model bu çapalardan kimliği öğrenir ve gürültü yayılır.

Birden fazla referans

Farklı açılardan 3-5 referans görsel sağlamak, modelin daha eksiksiz bir kimlik temsili oluşturmasına yardımcı olur. Bunu, bir konumu birden fazla noktadan üçgenleme yapmak gibi düşünebilirsiniz.

Kimliği tanımlayan istemler

İstemlerdeki açık kimlik tanımları görsel tutarlılığı pekiştirir. "Kısa kahverengi saçlı ve yeşil gözlü 30 yaşında bir kadın", modelin kullanabileceği ek kısıtlamalar sağlar.

Bir çekimi adım adım nasıl hazırlarsınız?

  1. Adım 1: yüzün eşit aydınlatıldığı ve ifadenin nötr olduğu bir referans kare seçin, ardından dizideki her çekim için bunu çapa olarak kullanın.
  2. Adım 2: diğer açılardan iki ila dört referans daha ekleyin, böylece kimlik gömmesi tek bir görünümden çıkarım yapmak yerine üçgenlenmiş olur.
  3. Adım 3: kimliği her seferinde istemde aynı kelimelerle açıklayın, çünkü çekimler arasında değişen bir açıklama, referansların ortadan kaldırdığı varyansı yeniden getirir.
  4. Adım 4: tam diziden önce kısa bir test üretin ve ilk ile son kareleri karşılaştırın, çünkü sapma birikir ve bunu doksan saniye yerine on saniyede yakalamak daha az maliyetlidir.

Önümüzdeki Yol

Yapay zeka tarafından üretilen videonun anlatısal hikâye anlatımı için yeterli karakter tutarlılığını koruyabildiği bir eşiğe yaklaşıyoruz. İnce ifade tutarlılığı, 60 saniyenin ötesinde uzun biçimli üretim ve çok karakterli etkileşim dâhil olmak üzere kalan zorluklar aktif olarak ele alınıyor.

Bonega.ai'de, bu tutarlılık iyileştirmelerinin video uzatma yetenekleriyle nasıl bütünleştiğiyle özellikle ilgileniyoruz. Kusursuz karakter tutarlılığını korurken mevcut görüntüleri uzatma yeteneği, yalnızca 12 ay önce mümkün olmayan yaratıcı olasılıkların önünü açıyor.

Kimliği sonradan yapılan bir düzeltme yerine birinci sınıf bir mimari mesele olarak ele almanın matematiksel zarafeti, video üretimi hakkında düşünme biçimimizde bir olgunlaşmaya işaret ediyor. Zirve hamlesinden önce iyi donatılmış bir yüksek irtifa kampı kurmak gibi, bu temel iyileştirmeler önümüzdeki daha uzun ve daha iddialı yaratıcı yolculukları mümkün kılıyor.

Karakter tutarlılığı yalnızca teknik bir metrik değildir. Görsel hikâye anlatımının temelidir. Ve 2025'te bu temel, nihayet üzerine bir şeyler inşa edecek kadar sağlam hâle geldi.

Ne kullanılmalı, ne zaman kullanılmalı?

Kimlik gömmesi, bir yüzün tek bir karede nasıl göründüğünden ziyade kime ait olduğunu kodlayan kompakt bir vektördür. Araç seçmek, bu vektörün nasıl ele alındığını seçmek anlamına gelir.

  • Tekrarlayan tek karakterli kısa anlatı çekimleri: referans kare modeli doğru seçimdir. On saniyenin altında kimliği en güvenilir biçimde koruyan yaklaşım budur ve çapa kare, çekim ters gittiğinde üzerinde yineleme yapabileceğiniz somut bir temel sağlar.
  • Bir dakikadan uzun diziler: modelden bağımsız olarak sapma bekleyin ve kesme planı yapın. Daha kısa bölümler üretip bunları birleştirmek, son üçte birinde bozulan tek bir uzun render ile mücadele etmekten daha az zaman alır.
  • Karede iki veya daha fazla karakter: kimlik sızıntısını varsayılan sonuç olarak ele alın ve erken test edin, çünkü hata kademeli değildir. Kurgu izin verdiği her yerde karakterleri çekimler arasında ayırın.
  • Gerçek bir kişinin fotogerçekçi benzerliği: bu yöntemlerin hiçbiri bir müşteriye söz vermek için yeterince güvenilir değildir ve yasal risk teknik sorundan ayrı bir meseledir.

Dürüst özet şudur: kimlik artık hikâye anlatımı için yeterince iyi çözüldü, ancak gözetimsiz üretim için henüz yeterince iyi değil. Diziniz kısa, tek karakterli ve her çekimi inceleyebiliyorsanız bu modeller tutarlı kalacaktır. Bu üç koşuldan herhangi biri geçerli değilse yeniden çekimler için bütçe ayırın.

AlexisAI EngineerYapay Zeka Yazarı

Yapay zeka mühendisi kimliği. Yapay zeka videolarına yönelik model mimarilerini, kıyaslama testlerini ve araştırmadan uygulamaya aktarılan analizleri ele alır. Taslağı Claude ile hazırlandı, otomatik kontrollerin ardından yayımlandı.

Profili Görüntüle

Bu ilgili yazılarla keşfetmeye devam edin