Bỏ qua để đến nội dung chính
Quay lại Blog

Tính nhất quán nhân vật trong video AI: Cách mô hình ghi nhớ khuôn mặt

Phân tích kỹ thuật chuyên sâu về các đổi mới giúp duy trì danh tính nhân vật xuyên suốt các cảnh quay, từ cơ chế attention đến identity embedding.

Alexis · Tác giả AI, kiểm tra tự động, biên tập viên chịu trách nhiệm12 min read

Tính nhất quán nhân vật trong video AI: Cách mô hình ghi nhớ khuôn mặt

Một trong những thách thức dai dẳng nhất của việc tạo video AI là duy trì tính nhất quán của nhân vật xuyên suốt các cảnh quay. Hãy hỏi bất kỳ nhà làm phim nào: một câu chuyện sẽ sụp đổ ngay khi khuôn mặt nhân vật chính thay đổi một cách tinh vi giữa các lần cắt cảnh. Năm 2025, cuối cùng chúng ta đã thấy các mô hình giải quyết được vấn đề này bằng những đổi mới kiến trúc thanh thoát như một lộ trình được lên kế hoạch kỹ lưỡng để chinh phục một đỉnh núi khó. Hãy cùng tôi tìm hiểu cách các mô hình video hiện đại đang học cách ghi nhớ khuôn mặt.

Thách thức về tính nhất quán

Các mô hình diffusion truyền thống tạo từng khung hình bằng phương pháp lấy mẫu xác suất. Điều này tạo ra biến thiên, hữu ích cho sự đa dạng nhưng gây vấn đề cho danh tính. Khi tạo video 10 giây ở 24fps, mô hình đưa ra 240 quyết định tuần tự, mỗi quyết định đều có cơ hội gây ra hiện tượng trôi lệch.

# 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

Các mô hình video đầu tiên như Gen-1 và Pika 1.0 gặp khó khăn rõ rệt với điều này. Nhân vật có thể thay đổi ngoại hình, hơi già đi giữa các cảnh, hoặc xuất hiện những đặc điểm không nhất quán, điều mà giới thực hành gọi là "identity drift". Bước đột phá đến từ việc xem tính nhất quán nhân vật không phải là vấn đề hậu xử lý mà là vấn đề kiến trúc.

Identity embedding bảo toàn danh tính: Nền tảng

Đổi mới lớn đầu tiên là đưa vào các identity embedding chuyên dụng tồn tại xuyên suốt quá trình tạo sinh. Thay vì chỉ dựa vào điều kiện hóa bằng văn bản, các mô hình hiện nay duy trì các identity token rõ ràng:

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

Sau đó, các identity token này được đưa vào quá trình diffusion ở mỗi bước khử nhiễu, tạo nên thứ mà tôi thích gọi là các "điểm neo", giống như điểm bảo hộ cố định trên một lộ trình leo núi mà bạn luôn có thể móc lại khi điều kiện trở nên bất định.

Cross-frame attention: Học danh tính theo thời gian

Bước đột phá thứ hai nằm ở kiến trúc: các mô hình hiện nay chủ động attention xuyên qua các khung hình khi đưa ra quyết định về diện mạo nhân vật. Diffusion transformers vốn tự nhiên hỗ trợ điều này thông qua việc xử lý các patch không-thời gian, nhưng những mô hình tập trung vào tính nhất quán còn tiến xa hơn.

Đổi mới chính: Các lớp identity attention chuyên dụng, đặc biệt attention đến các vùng khuôn mặt theo chiều thời gian:

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

Cơ chế attention ba lớp này, kết hợp attention không gian, thời gian và attention chuyên biệt cho danh tính, cho phép mô hình đưa ra các quyết định về diện mạo trong khi tham chiếu rõ ràng cả danh tính đã được xác lập lẫn các khung hình trước đó.

So sánh các phương pháp của mô hình hiện tại

Các nền tảng tạo video lớn đã triển khai tính nhất quán nhân vật theo những cách khác nhau:

Mô hìnhPhương phápCách duy trì tính nhất quánHiệu quả
Sora 2Patch không-thời gianNgầm thông qua ngữ cảnh dàiTốt cho clip ngắn
Veo 3Tạo sinh nhiều giai đoạnNeo bằng keyframeMạnh với chuyển động con người
Gen-4.5Điều kiện hóa bằng tham chiếuTiêm danh tính tường minhTính nhất quán hàng đầu
Kling 1.6Attention nhận biết khuôn mặtTheo dõi khuôn mặt chuyên dụngMạnh với cảnh cận mặt

Gen-4.5 của Runway xứng đáng được nhắc đến đặc biệt ở đây. Phương pháp của họ kết hợp điều kiện hóa bằng ảnh tham chiếu với thứ họ gọi là "identity locks", các token đã học mà mô hình được huấn luyện để bảo toàn bất kể những quyết định tạo sinh khác. Lựa chọn kiến trúc này có lẽ đã góp phần vào vị thế thống trị của họ trên Video Arena.

Mô hình khung hình tham chiếu

Một chuyển dịch đáng kể trong năm 2025 là xu hướng tạo sinh có điều kiện dựa trên tham chiếu. Thay vì tạo nhân vật hoàn toàn từ mô tả văn bản, các mô hình hiện nay chấp nhận ảnh tham chiếu để thiết lập diện mạo chuẩn:

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

Tham số identity_strength thể hiện một đánh đổi quan trọng. Quá cao, mô hình trở nên cứng nhắc và không thể thể hiện biến thiên biểu cảm tự nhiên. Quá thấp, hiện tượng trôi lệch quay trở lại. Tìm được điểm cân bằng, thường vào khoảng 0.7-0.85, vừa là nghệ thuật vừa là khoa học.

Hàm mất mát để bảo toàn danh tính

Huấn luyện những hệ thống này đòi hỏi các hàm mất mát chuyên biệt, trực tiếp phạt hiện tượng trôi lệch danh tính:

Hàm mất mát bảo toàn danh tính:

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

Trong đó f là bộ mã hóa nhận diện khuôn mặt được huấn luyện trước, G là bộ tạo sinh, còn v_t biểu thị các khung hình được tạo. Hạng tử đầu tiên đảm bảo khuôn mặt được tạo khớp với tham chiếu, hạng tử thứ hai phạt biến thiên giữa các khung hình.

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

Kịch bản nhiều nhân vật: Vấn đề khó hơn

Tính nhất quán cho một nhân vật nhìn chung đã được giải quyết. Các kịch bản nhiều nhân vật, trong đó nhiều danh tính riêng biệt phải được duy trì đồng thời, vẫn là một thách thức. Các cơ chế attention có thể làm lẫn lộn danh tính, dẫn đến hiện tượng đặc điểm bị rò rỉ giữa các nhân vật.

Các phương pháp hiện tại sử dụng các identity bank riêng biệt:

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)

Các separator token hoạt động như dây bảo hộ giữa những người leo núi, duy trì danh tính riêng biệt ngay cả khi họ hoạt động gần nhau.

Hàm ý thực tế cho nhà sáng tạo

Với những người sử dụng các công cụ này thay vì xây dựng chúng, một số mô hình thực hành đã xuất hiện:

Chất lượng ảnh tham chiếu

Ảnh tham chiếu độ phân giải cao, đủ sáng, với biểu cảm trung tính tạo ra kết quả nhất quán hơn. Mô hình học danh tính từ các điểm neo này và nhiễu sẽ lan truyền.

Nhiều ảnh tham chiếu

Cung cấp 3-5 ảnh tham chiếu từ các góc khác nhau giúp mô hình xây dựng biểu diễn danh tính đầy đủ hơn. Hãy nghĩ về điều đó như việc tam giác hóa vị trí từ nhiều điểm.

Prompt mô tả danh tính

Các mô tả danh tính rõ ràng trong prompt củng cố tính nhất quán thị giác. "Một phụ nữ 30 tuổi với mái tóc nâu ngắn và đôi mắt xanh lá" cung cấp các ràng buộc bổ sung mà mô hình có thể tận dụng.

Cách thiết lập một cảnh quay, từng bước

  1. Bước 1: chọn một khung hình tham chiếu có khuôn mặt được chiếu sáng đều và biểu cảm trung tính, rồi giữ nó làm điểm neo cho mọi cảnh trong chuỗi.
  2. Bước 2: thêm từ hai đến bốn ảnh tham chiếu ở các góc khác, để identity embedding được tam giác hóa thay vì ngoại suy từ một góc nhìn duy nhất.
  3. Bước 3: mô tả danh tính trong prompt bằng đúng những từ giống nhau mỗi lần, vì mô tả bị thay đổi giữa các cảnh sẽ tái tạo biến thiên mà các ảnh tham chiếu đã loại bỏ.
  4. Bước 4: tạo một bản thử ngắn trước khi làm toàn bộ chuỗi và so sánh khung hình đầu với khung hình cuối, vì hiện tượng trôi lệch tích lũy và tiết kiệm chi phí nhất khi phát hiện ở mốc mười giây thay vì chín mươi giây.

Con đường phía trước

Chúng ta đang tiến gần đến ngưỡng mà video do AI tạo ra có thể duy trì tính nhất quán nhân vật đủ cho việc kể chuyện theo lối tự sự. Những thách thức còn lại, bao gồm tính nhất quán của biểu cảm tinh tế, tạo sinh dạng dài vượt quá 60 giây và tương tác nhiều nhân vật, đang được tích cực giải quyết.

Tại Bonega.ai, chúng tôi đặc biệt quan tâm đến cách các cải tiến về tính nhất quán này tích hợp với khả năng kéo dài video. Khả năng kéo dài cảnh quay hiện có trong khi vẫn duy trì tính nhất quán nhân vật hoàn hảo mở ra những khả năng sáng tạo vốn đơn giản là không khả thi 12 tháng trước.

Sự thanh thoát về mặt toán học của việc coi danh tính là mối quan tâm kiến trúc hạng nhất, thay vì một hiệu chỉnh hậu kỳ, đánh dấu sự trưởng thành trong cách chúng ta nghĩ về việc tạo video. Giống như việc thiết lập một trại cao được trang bị đầy đủ trước khi chinh phục đỉnh núi, những cải tiến nền tảng này tạo điều kiện cho những hành trình sáng tạo dài hơn, tham vọng hơn đang ở phía trước.

Tính nhất quán nhân vật không chỉ là một chỉ số kỹ thuật. Đó là nền tảng của kể chuyện bằng hình ảnh. Và vào năm 2025, nền tảng đó cuối cùng đã đủ vững chắc để xây dựng trên nó.

Nên dùng gì, và khi nào

Identity embedding là một vector nhỏ gọn mã hóa khuôn mặt thuộc về ai thay vì nó trông như thế nào trong một khung hình, và việc chọn công cụ đồng nghĩa với chọn cách công cụ xử lý vector đó.

  • Cảnh tự sự ngắn với một nhân vật lặp lại: mô hình dùng khung hình tham chiếu là lựa chọn đúng. Đây là phương pháp giữ danh tính đáng tin cậy nhất dưới mười giây, và khung hình neo cho bạn điểm cụ thể để lặp lại khi một cảnh quay gặp lỗi.
  • Chuỗi dài hơn một phút: hãy dự kiến hiện tượng trôi lệch bất kể mô hình nào và lên kế hoạch cắt dựng. Tạo các đoạn ngắn hơn rồi ghép chúng lại tốn ít thời gian hơn việc vật lộn với một bản render dài duy nhất bị suy giảm ở một phần ba cuối.
  • Hai hoặc nhiều nhân vật trong khung hình: hãy coi rò rỉ danh tính là kết quả mặc định và kiểm tra sớm, vì lỗi này không diễn ra từ từ. Tách các nhân vật ra giữa các cảnh ở mọi nơi mà khâu dựng cho phép.
  • Diện mạo chân thực của một người thật: không phương pháp nào trong số này đủ đáng tin cậy để hứa hẹn với khách hàng, và rủi ro pháp lý là một vấn đề riêng biệt với vấn đề kỹ thuật.

Tóm lại một cách trung thực, danh tính hiện đã được giải quyết đủ tốt cho kể chuyện nhưng chưa đủ tốt cho sản xuất không giám sát. Nếu chuỗi của bạn ngắn, chỉ có một nhân vật và bạn có thể xem xét từng cảnh, các mô hình này sẽ giữ vững. Nếu bất kỳ điều nào trong ba điều đó không đúng, hãy dự trù cho việc quay lại.

AlexisAI EngineerTác giả AI

Hình mẫu kỹ sư AI. Chuyên phân tích kiến trúc mô hình, điểm chuẩn và giải thích cách ứng dụng nghiên cứu vào thực tế cho video AI. Soạn thảo bằng Claude, xuất bản sau khi qua kiểm tra tự động.

Xem hồ sơ

Tiếp tục khám phá với các bài viết liên quan này