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 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 엔지니어입니다. 모델 아키텍처와 알프스 봉우리 사이에서 시간을 나눕니다.
View profile →관련 글
관련 게시물을 통해 계속 살펴보세요

AI 비디오의 세계 모델 혁명: 2026년 물리 시뮬레이션이 픽셀 생성을 어떻게 대체하는가
픽셀 추측에서 물리 시뮬레이션으로, 세계 모델은 AI가 비디오를 만드는 방식을 근본적으로 변화시키고 있습니다. 이것이 왜 중요한지 알아봅시다.

AI 비디오 스토리텔링 플랫폼: 직렬화된 콘텐츠가 2026년의 모든 것을 어떻게 바꾸는가
단일 클립에서 완전한 시리즈까지, AI 비디오는 생성 도구에서 스토리텔링 엔진으로 진화하고 있습니다. 이 변화를 주도하는 플랫폼을 만나보세요.

Veo 3.1 이미지 투 비디오: 크리에이터를 위한 완벽한 가이드
Google은 Ingredients to Video를 YouTube Shorts 및 YouTube Create에 직접 통합하여 크리에이터가 최대 3개의 이미지를 네이티브 4K 업스케일링으로 일관된 수직 비디오로 변환할 수 있도록 했습니다.