AI影片的人物一致性:模型如何記住臉孔
深入剖析鏡頭間人物身份保持技術。從注意力機制到身份嵌入的架構創新深度分析。

AI 影片生成中最具挑戰性的問題之一,一直是如何在不同鏡頭間保持人物的一致性。任何電影製作人都能體會:當主角的臉部在不同鏡頭間產生細微變化時,整個故事就會分崩離析。到了 2025 年,我們終於看到模型透過優雅的架構創新解決了這個難題,就像精心規劃的登山路線一樣。讓我為您詳細介紹現代影片模型是如何學會記住臉孔的。
一致性的挑戰
傳統的擴散模型透過機率採樣來生成每一幀。這會引入變異性—雖然有助於增加多樣性,但對身份保持卻是個問題。在生成一部 10 秒的影片時(以 24fps 計),模型會進行 240 次順序決定,每一次都有可能造成偏差。
# 核心問題:每個去噪步驟都會引入變異性
def denoise_step(x_t, model, t):
noise_pred = model(x_t, t)
# 這個採樣步驟引入了隨機性
x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
return x_t_minus_1 # 細微的變異在多幀中不斷累積早期的影片模型,如 Gen-1 和 Pika 1.0,在這方面存在明顯的問題。人物的外觀會改變,在鏡頭之間看起來年齡不同,或者發展出不一致的特徵—從業者稱之為「身份漂移」。突破來自於將人物一致性視為架構問題,而非後期處理問題。
身份保護嵌入:基礎概念
第一個重大創新是引入專門的身份嵌入,這些嵌入在整個生成過程中保持不變。與其僅依賴文字條件,模型現在維護明確的身份令牌:
class IdentityEncoder(nn.Module):
def __init__(self, embed_dim=768):
super().__init__()
self.face_encoder = FaceRecognitionBackbone() # 預訓練的人臉模型
self.projection = nn.Linear(512, embed_dim)
self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
def encode_identity(self, reference_frame):
# 從參考幀提取身份特徵
face_features = self.face_encoder(reference_frame)
identity_embed = self.projection(face_features)
# 與學習的身份令牌進行交叉注意
identity_tokens = self.cross_attention(
query=self.identity_bank,
key=identity_embed,
value=identity_embed
)
return identity_tokens這些身份令牌隨後被注入到去噪過程的每一步中,創造了我喜歡稱之為「錨點」的東西—就像登山路線上的固定保護一樣,在條件不確定時,您總是可以返回這些點進行安全確保。
跨幀注意力:學習時間身份
第二個突破是架構上的:模型現在在做出關於人物外觀的決定時,明確地跨幀進行注意力分配。擴散 Transformers 透過其時空補丁處理自然支持這一點,但關注一致性的模型更進一步。
關鍵創新: 專門的身份注意力層,特別關注時間維度上的臉部區域:
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):
# 幀內的標準空間注意力
x = self.spatial_attn(x, x, x)[0] + x
# 跨幀的時間注意力
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)
# 使用臉部區域的身份特定注意力
face_tokens = x * face_masks.unsqueeze(-1)
x = self.identity_attn(
query=x,
key=identity_tokens,
value=identity_tokens
)[0] + x
return x這個三層注意力機制—空間、時間和身份特定—允許模型在明確參考既定身份和之前幀的同時做出外觀決定。
現有模型方法比較
主要的影片生成平台採用了不同的人物一致性實現方式:
| 模型 | 方法 | 一致性方式 | 有效性 |
|---|---|---|---|
| Sora 2 | 時空補丁 | 透過長內容的隱式方法 | 短片效果不錯 |
| Veo 3 | 多階段生成 | 關鍵幀錨定 | 人物動作強 |
| Gen-4.5 | 參考條件化 | 明確的身份注入 | 一致性最佳 |
| Kling 1.6 | 人臉感知注意力 | 專門的臉部追蹤 | 特寫鏡頭表現強 |
Runway 的 Gen-4.5 值得特別提及。他們的方法結合了參考圖像條件化和他們稱之為「身份鎖」的技術—學習的令牌,模型被訓練為無論其他生成決定如何都要保持這些令牌。這個架構選擇可能對他們在影片競技場上的成功做出了貢獻。
參考幀範例
2025 年的一個重要轉變是朝向參考條件化生成的發展。與其純粹從文字描述生成人物,模型現在接受建立標準外觀的參考圖像:
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):
# 從參考圖像編碼身份
identity_embeds = []
for ref in reference_images:
identity_embeds.append(self.identity_encoder(ref))
# 匯集多個參考以獲得穩健的身份
identity_tokens = torch.stack(identity_embeds).mean(dim=0)
# 使用身份條件進行生成
video = self.model.generate(
prompt=prompt,
num_frames=num_frames,
cross_attention_kwargs={
"identity_tokens": identity_tokens,
"identity_strength": 0.8 # 平衡一致性與創意
}
)
return videoidentity_strength 參數代表了一個重要的權衡。若太高,模型會變得僵硬,無法顯示自然的表情變化。若太低,漂移問題會回歸。找到最適點—通常在 0.7-0.85 之間—既是藝術,也是科學。
身份保護的損失函數
訓練這些系統需要特殊的損失函數,明確懲罰身份漂移:
身份保護損失:
L_identity = ||f(G(z, c)) - f(x_ref)||² + λ_temporal * Σ_t ||f(v_t) - f(v_{t+1})||²其中 f 是預訓練的人臉辨識編碼器,G 是生成器,v_t 代表生成的幀。第一項確保生成的臉孔與參考相符;第二項懲罰幀間變異。
def identity_preservation_loss(generated_video, reference_faces, face_encoder):
# 每幀對參考的身份匹配
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_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多角色場景:更具挑戰的問題
單個角色的一致性在很大程度上已經得到解決。多角色場景—需要同時維護多個不同身份—仍然是挑戰。注意力機制可能會混淆身份,導致角色間的特徵滲漏。
現有方法使用單獨的身份庫:
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)
# 添加分隔符以防止混淆
char_tokens = torch.cat([char_tokens, self.character_separator])
all_tokens.append(char_tokens)
return torch.cat(all_tokens, dim=0)分隔符令牌的作用就像登山者之間的中繼點—即使在緊密靠近時也能維持不同的身份。
對創作者的實際意義
對於使用這些工具而不是構建工具的人來說,已經出現了幾個實用的模式:
參考圖像品質很重要: 更高解析度、光線充足、表情中性的參考圖像能產生更一致的結果。模型從這些錨點學習身份,而噪音會傳播。
多個參考增強穩健性: 提供來自不同角度的 3-5 張參考圖像有助於模型建立更完整的身份表現。可以想像為從多個點三角測量位置。
提示工程以保持一致性: 提示中明確的身份描述能強化視覺一致性。「一位 30 歲的女性,短棕色頭髮和綠眼睛」提供了模型能利用的額外約束條件。
未來展望
我們正在接近 AI 生成影片能保持足以進行敘事故事的人物一致性的臨界點。剩餘的挑戰—細微表情一致性、超過 60 秒的長格式生成以及多角色互動—正在被積極處理。
在 Bonega.ai,我們特別感興趣的是這些一致性改進如何與影片延伸功能整合。在維持完美人物一致性的同時延伸現有素材的能力開啟了 12 個月前根本不可能實現的創意可能性。
將身份視為一流架構考量而非事後補正的數學優雅性標誌著我們對影片生成思考方式的成熟。就像在登頂前建立一個物資充足的高營地一樣,這些基礎改進使更長、更雄心勃勃的創意之旅成為可能。
人物一致性不僅是一個技術指標—它是視覺故事的基礎。而在 2025 年,這個基礎終於堅實到足以支撐更多的構建了。
相關文章
繼續探索這些相關文章

AI影片的世界模型革命:物理模擬如何在2026年取代像素生成
從猜測像素到模擬物理,世界模型正在從根本上改變AI如何創建影片。以下是為什麼這很重要。

中國AI影片崛起: 快手Kling如何超越矽谷
前8大AI影片模型中有7個來自中國公司。我們分析快手Kling如何達到6000萬用戶,以及這一轉變對整個產業的意義。

MiniMax Hailuo 02,中國預算AI影片模型挑戰業界巨頭
MiniMax的Hailuo 02以遠低於西方競品的成本提供具有競爭力的影片品質,僅用一個Veo 3影片的價格就能生成10個。這個來自中國的挑戰者值得關注。
