Meta Pixel
AlexisAlexis
14 min read
1147 단어

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

AI 비디오 모델이 샷 간에 캐릭터 정체성을 유지할 수 있게 해주는 아키텍처 혁신에 대한 기술적 분석. 주의 메커니즘부터 정체성 보존 임베딩까지

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

AI 비디오 생성 분야에서 가장 지속적인 도전 과제 중 하나는 샷 간에 캐릭터 일관성을 유지하는 것입니다. 어떤 영화 제작자에게 물어봐도, 주인공의 얼굴이 자막 간에 미묘하게 변하는 순간 이야기는 깨지게 됩니다. 2025년에 우리는 마침내 이 문제를 극복할 수 있는 아키텍처 혁신을 목격했으며, 이는 잘 계획된 등반로만큼 우아합니다. 현대 비디오 모델들이 어떻게 얼굴을 기억하는 법을 배우고 있는지 함께 살펴보겠습니다.

일관성 문제의 본질

전통적인 확산 모델은 확률적 샘플링으로 각 프레임을 생성합니다. 이는 분산을 도입하는데, 다양성 측면에서는 유용하지만 정체성 유지 측면에서는 문제가 됩니다. 24fps에서 10초 비디오를 생성할 때, 모델은 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

이러한 정체성 토큰은 확산 과정의 모든 노이징 제거 단계에 주입되며, 이를 "고정점"이라고 생각할 수 있습니다. 마치 등반로의 안전고정점처럼, 상황이 불확실해질 때 항상 돌아갈 수 있는 지점입니다.

프레임 간 주의: 시간적 정체성 학습

두 번째 혁신은 아키텍처 차원입니다. 모델은 이제 캐릭터 외모에 대한 결정을 내릴 때 프레임 간에 명시적으로 주의를 기울입니다. 확산 변환기는 시공간 패치 처리를 통해 자연스럽게 이를 지원하지만, 일관성에 초점을 맞춘 모델들은 더 나아갑니다.

핵심 혁신: 시간적 차원에 걸쳐 얼굴 영역에 특별히 주의를 기울이는 전용 정체성 주의 계층:

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 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):
    # 참조에 대한 프레임별 정체성 매칭
    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년에는 그 기초가 마침내 그 위에 뭔가를 만들기에 충분히 견고해졌습니다.

이 글이 도움이 되었나요?

Alexis

Alexis

AI 엔지니어

연구 깊이와 실용적 혁신을 결합하는 로잔 출신 AI 엔지니어입니다. 모델 아키텍처와 알프스 산봉우리 사이에서 시간을 보냅니다.

관련 글

관련 글을 더 살펴보세요

이 글이 마음에 드셨나요?

더 많은 인사이트를 발견하고 최신 콘텐츠 소식을 받아보세요.

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