본문으로 건너뛰기
블로그로 돌아가기

AI 비디오의 캐릭터 일관성: 모델이 얼굴을 기억하는 방식

어텐션 메커니즘부터 아이덴티티 임베딩까지, 장면 간 캐릭터 정체성을 유지하는 혁신 기술을 기술적으로 심층 분석합니다.

Alexis · AI 작성, 자동 검수, 편집자 책임18 min read

AI 비디오의 캐릭터 일관성: 모델이 얼굴을 기억하는 방식

AI 비디오 생성에서 가장 오래 지속된 과제 중 하나는 장면 간 캐릭터 일관성을 유지하는 일이었습니다. 어떤 영화 제작자에게 물어봐도 마찬가지입니다. 컷이 바뀔 때마다 주인공의 얼굴이 미묘하게 달라지는 순간, 이야기는 무너집니다. 2025년, 우리는 마침내 모델이 이 문제를 해결하는 모습을 보았습니다. 그 구조적 혁신은 험난한 정상으로 향하는 잘 계획된 등반 루트만큼이나 우아하게 느껴집니다. 현대 비디오 모델이 얼굴을 기억하는 법을 살펴보겠습니다.

일관성의 과제

전통적인 diffusion 모델은 확률적 샘플링으로 각 프레임을 생성합니다. 이는 다양성에는 유용하지만 정체성에는 문제가 되는 분산을 도입합니다. 24fps에서 10초짜리 비디오를 생성할 때 모델은 240개의 순차적 결정을 내리며, 각각에서 드리프트가 발생할 기회가 있습니다.

# 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과 Pika 1.0 같은 초기 비디오 모델은 이 문제로 눈에 띄게 어려움을 겪었습니다. 캐릭터의 외형이 변하고, 장면 사이에서 약간 나이가 들어 보이거나, 일관되지 않은 특징이 생겼습니다. 실무자들은 이를 "identity drift"라고 불렀습니다. 돌파구는 캐릭터 일관성을 후처리 문제가 아니라 아키텍처 문제로 다루면서 나왔습니다.

아이덴티티 보존 임베딩: 기반

첫 번째 주요 혁신은 생성 과정 전반에 걸쳐 유지되는 전용 아이덴티티 임베딩의 도입이었습니다. 이제 모델은 텍스트 컨디셔닝에만 의존하는 대신 명시적인 아이덴티티 토큰을 유지합니다.

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

그런 다음 이 아이덴티티 토큰은 모든 디노이징 단계에서 diffusion 프로세스에 주입됩니다. 이는 제가 생각하기에 "앵커 포인트"와 같습니다. 등반 루트에 설치된 고정 확보물처럼, 상황이 불확실해질 때 언제든 다시 클립할 수 있습니다.

프레임 간 어텐션: 시간적 정체성 학습

두 번째 돌파구는 아키텍처에서 나왔습니다. 이제 모델은 캐릭터 외형에 관한 결정을 내릴 때 프레임 전반에 걸쳐 명시적으로 어텐션을 수행합니다. Diffusion 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):
        # 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

공간적 어텐션, 시간적 어텐션, 아이덴티티 특화 어텐션을 결합한 이 삼중 어텐션 메커니즘은 모델이 이미 확립된 정체성과 이전 프레임을 모두 명시적으로 참조하면서 외형을 결정할 수 있게 합니다.

현재 모델 접근 방식 비교

주요 비디오 생성 플랫폼은 캐릭터 일관성을 서로 다르게 구현했습니다.

모델접근 방식일관성 유지 방법효과
Sora 2시공간 패치긴 컨텍스트를 통한 암묵적 유지짧은 클립에 적합
Veo 3다단계 생성키프레임 앵커링사람의 움직임에 강점
Gen-4.5레퍼런스 컨디셔닝명시적 아이덴티티 주입업계 최고 수준의 일관성
Kling 1.6얼굴 인식 어텐션전용 얼굴 추적클로즈업에 강점

Runway의 Gen-4.5는 여기서 특별히 언급할 가치가 있습니다. 이들의 접근 방식은 레퍼런스 이미지 컨디셔닝과 이들이 "identity locks"라고 부르는 것을 결합합니다. 이는 다른 생성 결정과 무관하게 보존하도록 모델이 학습한 토큰입니다. 이러한 아키텍처 선택은 Video Arena에서의 우위에 기여했을 가능성이 큽니다.

레퍼런스 프레임 패러다임

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):
        # 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 파라미터는 중요한 트레이드오프를 나타냅니다. 너무 높으면 모델은 경직되어 자연스러운 표정 변화를 보여줄 수 없습니다. 너무 낮으면 드리프트가 다시 발생합니다. 일반적으로 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):
    # 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

멀티 캐릭터 시나리오: 더 어려운 문제

단일 캐릭터의 일관성은 대체로 해결되었습니다. 여러 개의 뚜렷한 정체성을 동시에 유지해야 하는 멀티 캐릭터 시나리오는 여전히 어렵습니다. 어텐션 메커니즘이 정체성을 혼동하여 캐릭터 간 특징이 섞일 수 있습니다.

현재 접근 방식은 별도의 아이덴티티 뱅크를 사용합니다.

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)

분리 토큰은 등반가 사이의 확보처럼 작동하여, 가까운 거리에서 작업하더라도 각기 다른 정체성을 유지합니다.

크리에이터를 위한 실질적 의미

이 기술을 구축하는 대신 사용하는 사람들을 위해 몇 가지 실용적인 패턴이 나타났습니다.

레퍼런스 이미지 품질

중립적인 표정에 조명이 잘 갖춰진 고해상도 레퍼런스 이미지는 더 일관된 결과를 만들어냅니다. 모델은 이 앵커에서 정체성을 학습하며, 노이즈는 전파됩니다.

여러 레퍼런스

서로 다른 각도에서 촬영한 레퍼런스 이미지 3-5장을 제공하면 모델이 더 완전한 정체성 표현을 구축하는 데 도움이 됩니다. 여러 지점에서 위치를 삼각측량하는 것과 같습니다.

정체성을 설명하는 프롬프트

프롬프트에 명시적인 정체성 설명을 포함하면 시각적 일관성이 강화됩니다. "짧은 갈색 머리와 녹색 눈을 가진 30세 여성"은 모델이 활용할 수 있는 추가 제약 조건을 제공합니다.

샷을 설정하는 방법, 단계별 안내

  1. 1단계: 얼굴에 고르게 빛이 비치고 표정이 중립적인 레퍼런스 프레임 하나를 선택한 뒤, 시퀀스의 모든 샷에서 앵커로 유지합니다.
  2. 2단계: 다른 각도의 레퍼런스를 두 장에서 네 장 더 추가하여, 단일 뷰에서 추정하는 대신 아이덴티티 임베딩을 삼각측량합니다.
  3. 3단계: 매번 같은 단어로 프롬프트에서 정체성을 설명합니다. 샷마다 설명이 달라지면 레퍼런스가 제거한 분산이 다시 도입되기 때문입니다.
  4. 4단계: 전체 시퀀스 전에 짧은 테스트를 생성하고 첫 프레임과 마지막 프레임을 비교합니다. 드리프트는 누적되며, 90초보다 10초에서 포착하는 편이 비용이 적게 듭니다.

앞으로의 길

AI 생성 비디오가 내러티브 스토리텔링에 충분한 수준으로 캐릭터 일관성을 유지할 수 있는 임계점에 가까워지고 있습니다. 미묘한 표정 일관성, 60초를 넘는 장편 생성, 멀티 캐릭터 상호작용을 포함한 남은 과제는 적극적으로 해결되고 있습니다.

Bonega.ai에서는 이러한 일관성 개선이 비디오 확장 기능과 어떻게 통합되는지에 특히 관심이 있습니다. 완벽한 캐릭터 일관성을 유지하면서 기존 영상을 확장하는 능력은 불과 12개월 전에는 실현 가능하지 않았던 창의적 가능성을 열어 줍니다.

정체성을 사후 보정이 아닌 아키텍처의 일급 관심사로 다루는 수학적 우아함은 비디오 생성을 바라보는 방식이 성숙했음을 보여줍니다. 정상 공략 전에 보급이 잘 갖춰진 하이 캠프를 구축하는 것처럼, 이러한 기초적 개선은 앞으로 펼쳐질 더 길고 야심 찬 창작 여정을 가능하게 합니다.

캐릭터 일관성은 단순한 기술 지표가 아닙니다. 이는 시각적 스토리텔링의 토대입니다. 그리고 2025년, 그 토대는 마침내 그 위에 무언가를 지을 수 있을 만큼 견고해졌습니다.

무엇을 언제 사용할지

아이덴티티 임베딩은 한 프레임에서 얼굴이 어떻게 보였는지가 아니라 그 얼굴이 누구에게 속하는지를 인코딩하는 압축 벡터입니다. 도구를 선택한다는 것은 그 벡터를 처리하는 방식을 선택한다는 의미입니다.

  • 반복 등장 캐릭터가 한 명인 짧은 내러티브 샷: 레퍼런스 프레임 모델이 올바른 선택입니다. 10초 미만에서 정체성을 가장 안정적으로 유지하는 접근 방식이며, 테이크가 잘못되었을 때 앵커 프레임은 반복 개선할 수 있는 구체적인 기준이 됩니다.
  • 1분이 넘는 시퀀스: 모델과 무관하게 드리프트를 예상하고 컷 편집을 계획하세요. 더 짧은 세그먼트로 생성하여 연결하는 것이 마지막 3분의 1에서 품질이 떨어지는 긴 렌더 하나와 싸우는 것보다 시간을 덜 소모합니다.
  • 프레임 안에 두 명 이상의 캐릭터: 정체성 누출을 기본 결과로 보고 일찍 테스트하세요. 실패는 점진적으로 나타나지 않습니다. 편집이 허용하는 곳에서는 캐릭터를 서로 다른 샷으로 분리하세요.
  • 실존 인물의 사실적인 외모: 이 방법들 중 어느 것도 클라이언트에게 약속할 만큼 신뢰할 수 없으며, 법적 노출은 기술적 문제와는 별개의 문제입니다.

솔직한 요약은 정체성이 이제 스토리텔링에는 충분히 해결되었지만, 무인 제작에는 아직 충분하지 않다는 것입니다. 시퀀스가 짧고, 단일 캐릭터이며, 모든 샷을 검토할 수 있다면 이 모델들은 일관성을 유지할 것입니다. 이 세 가지 중 하나라도 충족하지 못한다면, 재촬영을 위한 예산을 잡으세요.

AlexisAI EngineerAI 작성자

AI 엔지니어 페르소나. 모델 아키텍처, 벤치마크, 연구를 실무에 적용하는 AI 비디오 해설을 다룹니다. Claude로 초안을 작성하고 자동 검수를 거쳐 발행합니다.

프로필 보기

관련 게시물을 통해 계속 살펴보세요