Konsistensi Karakter dalam Video AI: Cara Model Mengingat Wajah
Pembahasan teknis mendalam tentang inovasi yang mempertahankan identitas karakter di seluruh pengambilan gambar, dari mekanisme perhatian hingga embedding identitas.

Salah satu tantangan paling persisten dalam pembuatan video AI adalah menjaga konsistensi karakter di seluruh pengambilan gambar. Tanyakan kepada sineas mana pun: cerita akan runtuh saat wajah protagonis Anda berubah secara halus di antara potongan. Pada 2025, akhirnya kita melihat model memecahkan masalah ini dengan inovasi arsitektural yang terasa seanggun rute yang direncanakan dengan baik menuju puncak sulit. Mari saya jelaskan bagaimana model video modern belajar mengingat wajah.
Tantangan Konsistensi
Model difusi tradisional menghasilkan setiap frame dengan sampling probabilistik. Hal ini menimbulkan variasi, yang berguna untuk keragaman tetapi bermasalah bagi identitas. Saat menghasilkan video 10 detik pada 24fps, model membuat 240 keputusan berurutan, masing-masing dengan peluang terjadinya pergeseran.
# 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 framesModel video awal seperti Gen-1 dan Pika 1.0 tampak kesulitan dalam hal ini. Penampilan karakter akan berubah, sedikit menua di antara pengambilan gambar, atau mengembangkan ciri yang tidak konsisten, yang oleh praktisi disebut "identity drift." Terobosan datang dari memperlakukan konsistensi karakter bukan sebagai masalah pascapemrosesan, melainkan masalah arsitektur.
Embedding yang Mempertahankan Identitas: Fondasinya
Inovasi besar pertama adalah memperkenalkan embedding identitas khusus yang bertahan sepanjang proses pembuatan. Alih-alih hanya mengandalkan conditioning teks, model kini mempertahankan token identitas eksplisit:
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_tokensToken identitas ini kemudian disuntikkan ke dalam proses difusi pada setiap langkah denoising, menciptakan sesuatu yang saya anggap sebagai "titik jangkar", seperti perlindungan tetap pada rute panjat yang selalu dapat Anda kaitkan kembali saat kondisi menjadi tidak pasti.
Perhatian Lintas Frame: Mempelajari Identitas Temporal
Terobosan kedua bersifat arsitektural: model kini secara eksplisit memperhatikan lintas frame saat mengambil keputusan tentang penampilan karakter. Transformer difusi secara alami mendukung hal ini melalui pemrosesan patch ruang-waktu mereka, tetapi model yang berfokus pada konsistensi melangkah lebih jauh.
Inovasi Utama: Lapisan perhatian identitas khusus yang secara spesifik memperhatikan wilayah wajah di seluruh dimensi temporal:
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 xMekanisme perhatian tiga lapis ini, yang menggabungkan perhatian spasial, temporal, dan khusus identitas, memungkinkan model mengambil keputusan penampilan sambil secara eksplisit merujuk pada identitas yang telah ditetapkan dan frame sebelumnya.
Perbandingan Pendekatan Model Saat Ini
Platform pembuatan video utama menerapkan konsistensi karakter secara berbeda:
| Model | Pendekatan | Metode Konsistensi | Efektivitas |
|---|---|---|---|
| Sora 2 | Patch ruang-waktu | Implisit melalui konteks panjang | Baik untuk klip pendek |
| Veo 3 | Pembuatan multi-tahap | Penjangkaran keyframe | Kuat untuk gerakan manusia |
| Gen-4.5 | Conditioning referensi | Penyuntikan identitas eksplisit | Konsistensi terbaik di kelasnya |
| Kling 1.6 | Perhatian sadar wajah | Pelacakan wajah khusus | Kuat untuk close-up |
Gen-4.5 milik Runway layak mendapat perhatian khusus di sini. Pendekatan mereka menggabungkan conditioning gambar referensi dengan apa yang mereka sebut "identity locks", token terpelajar yang dilatih untuk dipertahankan model terlepas dari keputusan generatif lainnya. Pilihan arsitektural ini kemungkinan berkontribusi pada dominasi mereka di Video Arena.
Paradigma Frame Referensi
Pergeseran signifikan pada 2025 adalah menuju pembuatan yang dikondisikan oleh referensi. Alih-alih menghasilkan karakter semata-mata dari deskripsi teks, model kini menerima gambar referensi yang menetapkan penampilan kanonis:
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 videoParameter identity_strength mewakili trade-off penting. Terlalu tinggi, dan model menjadi kaku, tidak mampu menampilkan variasi ekspresi alami. Terlalu rendah, dan pergeseran kembali terjadi. Menemukan titik ideal, biasanya sekitar 0.7-0.85, adalah perpaduan seni dan sains.
Fungsi Loss untuk Pelestarian Identitas
Melatih sistem ini memerlukan fungsi loss khusus yang secara eksplisit menghukum pergeseran identitas:
Loss Pelestarian Identitas:
L_identity = ||f(G(z, c)) - f(x_ref)||² + λ_temporal * Σ_t ||f(v_t) - f(v_{t+1})||²Di mana f adalah encoder pengenalan wajah pralatih, G adalah generator, dan v_t mewakili frame yang dihasilkan. Suku pertama memastikan wajah yang dihasilkan sesuai dengan referensi, sedangkan suku kedua menghukum variasi antarfame.
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_lossSkenario Multi-Karakter: Masalah yang Lebih Sulit
Konsistensi karakter tunggal sebagian besar sudah terpecahkan. Skenario multi-karakter, di mana beberapa identitas berbeda harus dipertahankan secara bersamaan, tetap menantang. Mekanisme perhatian dapat mencampuradukkan identitas, yang menyebabkan kebocoran fitur antar karakter.
Pendekatan saat ini menggunakan bank identitas terpisah:
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)Token pemisah bertindak seperti belay di antara para pemanjat, mempertahankan identitas yang berbeda bahkan saat beroperasi dalam jarak dekat.
Implikasi Praktis bagi Kreator
Bagi mereka yang menggunakan alat-alat ini, bukan membangunnya, beberapa pola praktis telah muncul:
Kualitas gambar referensi
Gambar referensi beresolusi lebih tinggi, dengan pencahayaan baik dan ekspresi netral menghasilkan hasil yang lebih konsisten. Model mempelajari identitas dari jangkar ini, dan noise menyebar.
Banyak referensi
Memberikan 3-5 gambar referensi dari sudut berbeda membantu model membangun representasi identitas yang lebih lengkap. Anggap saja seperti menentukan posisi dari beberapa titik.
Prompt yang mendeskripsikan identitas
Deskripsi identitas eksplisit dalam prompt memperkuat konsistensi visual. "Seorang perempuan berusia 30 tahun dengan rambut cokelat pendek dan mata hijau" memberikan batasan tambahan yang dapat dimanfaatkan model.
Cara menyiapkan pengambilan gambar, langkah demi langkah
- Langkah 1: pilih satu frame referensi dengan wajah yang mendapat pencahayaan merata dan ekspresi netral, lalu pertahankan sebagai jangkar untuk setiap pengambilan gambar dalam urutan tersebut.
- Langkah 2: tambahkan dua hingga empat referensi lagi dari sudut lain, agar embedding identitas ditriangulasi, bukan diekstrapolasi dari satu sudut pandang.
- Langkah 3: deskripsikan identitas dalam prompt dengan kata-kata yang sama setiap kali, karena deskripsi yang bergeser di antara pengambilan gambar akan memperkenalkan kembali variasi yang dihilangkan oleh referensi.
- Langkah 4: buat pengujian singkat sebelum urutan penuh dan bandingkan frame pertama serta terakhir, karena pergeseran terakumulasi dan lebih murah dideteksi pada sepuluh detik daripada sembilan puluh detik.
Jalan ke Depan
Kita mendekati ambang ketika video yang dihasilkan AI dapat mempertahankan konsistensi karakter yang cukup untuk penceritaan naratif. Tantangan yang tersisa, termasuk konsistensi ekspresi halus, pembuatan bentuk panjang melampaui 60 detik, dan interaksi multi-karakter, sedang ditangani secara aktif.
Di Bonega.ai, kami sangat tertarik pada bagaimana peningkatan konsistensi ini terintegrasi dengan kemampuan perpanjangan video. Kemampuan untuk memperpanjang rekaman yang sudah ada sambil mempertahankan konsistensi karakter sempurna membuka kemungkinan kreatif yang sama sekali tidak layak dilakukan 12 bulan lalu.
Keanggunan matematis dalam memperlakukan identitas sebagai perhatian arsitektural kelas satu, alih-alih koreksi pasca-hoc, menandai kematangan dalam cara kita memikirkan pembuatan video. Seperti membangun kamp tinggi yang diperlengkapi dengan baik sebelum dorongan menuju puncak, peningkatan mendasar ini memungkinkan perjalanan kreatif yang lebih panjang dan ambisius di masa depan.
Konsistensi karakter bukan sekadar metrik teknis. Ini adalah fondasi penceritaan visual. Dan pada 2025, fondasi itu akhirnya cukup kukuh untuk dibangun di atasnya.
Apa yang digunakan, dan kapan
Embedding identitas adalah vektor ringkas yang mengodekan pemilik sebuah wajah, bukan bagaimana wajah itu terlihat dalam satu frame, dan memilih alat berarti memilih cara alat tersebut menangani vektor itu.
- Pengambilan gambar naratif pendek dengan satu karakter berulang: model frame referensi adalah pilihan yang tepat. Pendekatan ini paling andal menjaga identitas di bawah sepuluh detik, dan frame jangkar memberi Anda sesuatu yang konkret untuk diiterasi saat satu pengambilan gagal.
- Urutan lebih dari satu menit: perkirakan pergeseran terlepas dari modelnya, dan rencanakan pemotongan. Membuat segmen yang lebih pendek dan menggabungkannya membutuhkan lebih sedikit waktu dibanding melawan satu render panjang yang menurun kualitasnya pada sepertiga terakhir.
- Dua atau lebih karakter dalam frame: perlakukan kebocoran identitas sebagai hasil bawaan dan uji sejak awal, karena kegagalannya tidak terjadi secara bertahap. Pisahkan karakter di antara pengambilan gambar jika proses penyuntingan memungkinkan.
- Kemiripan fotorealistis dengan orang sungguhan: tidak satu pun metode ini cukup andal untuk dijanjikan kepada klien, dan paparan hukum adalah masalah terpisah dari masalah teknis.
Ringkasan jujurnya adalah bahwa identitas kini cukup terpecahkan untuk penceritaan, tetapi belum cukup baik untuk produksi tanpa pengawasan. Jika urutan Anda pendek, berkarakter tunggal, dan Anda dapat meninjau setiap pengambilan, model ini akan bertahan. Jika salah satu dari tiga hal tersebut tidak terpenuhi, siapkan anggaran untuk pengambilan ulang.



