Meta Pixel
AlexisAlexis
14 min read
430 文字

AI動画における キャラクター一貫性の維持:モデルが顔を記憶する方法

アテンション機構からアイデンティティ保存埋め込みまで、ショット間でキャラクター・アイデンティティを維持するAI動画モデルのアーキテクチャ・イノベーションに関する技術的な深掘り解説です。

AI動画における キャラクター一貫性の維持:モデルが顔を記憶する方法

AI動画生成において最も根深い課題の一つが、ショット間でのキャラクター一貫性の維持です。映画製作者に尋ねてみてください。主人公の顔がカット間でほんのわずかに変わった瞬間、物語は成り立たなくなってしまいます。2025年、ようやくこの問題に対する優雅なアーキテクチャ・イノベーションが現れました。困難な峰に向かう綿密に計画されたルートのように、これらのイノベーションは確かな基礎を提供しています。現代的な動画モデルがどのようにして顔を記憶することを学んでいるのか、その過程をご説明いたします。

一貫性の課題

従来の拡散モデルは、確率的サンプリングを用いて各フレームを生成しており、これはばらつきをもたらします。多様性には有益ですが、アイデンティティ維持には問題となります。秒速24フレームで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

これらのアイデンティティ・トークンは、脱ノイズ処理の各ステップで拡散プロセスに注入されます。これにより、いわば「アンカー・ポイント」が生成されます。登山ルートに設置された固定のプロテクションのように、状況が不確実になったときにいつでも戻ることができる位置を確保するものです。

クロス・フレーム・アテンション:時間的アイデンティティの学習

2番目のブレークスルーはアーキテクチャ的なものでした。モデルはキャラクター外観に関する判断を行う際、明示的にフレーム間でアテンションしています。拡散トランスフォーマーはその時空間パッチ処理を通じてこれを自然にサポートしていますが、一貫性に焦点を当てたモデルはさらに進んでいます。

主要なイノベーション: 時間軸にわたって顔領域に特に焦点を当てたアテンション層の専用化です。

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 は特に注目に値します。彼らのアプローチは参照画像条件付けと、「アイデンティティ・ロック」と呼ばれるものを組み合わせています。これらは、他の生成的判断に関わらずモデルが保存することを訓練される学習済みトークンです。このアーキテクチャ上の選択は、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):
        # 参照画像からアイデンティティをエンコード
        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が生成した動画がナラティブ・ストーリーテリング向けに十分なキャラクター一貫性を維持できる段階に近づいています。残る課題(微妙な表現の一貫性、秒速24フレームを超える長形生成、複数キャラクター間の相互作用)は、積極的に取り組まれています。

Bonega.aiでは、これらの一貫性改善が動画拡張機能とどのように統合されるかに特に関心を持っています。既存のフッテージを拡張し、完璧なキャラクター一貫性を維持する能力は、わずか12ヶ月前には実現不可能だった創造的な可能性を開きます。

アイデンティティを後付けの修正ではなく、第一級のアーキテクチャ上の関心事として扱うことの数学的な優雅さは、動画生成をどのように考えるかの成熟を示しています。サミット・プッシュ前に十分に備蓄された高地キャンプを確立するように、これらの基礎的な改善は、先にある、より長く、より野心的な創造的な旅を可能にします。

キャラクター一貫性は単なる技術的な指標ではありません。それはビジュアル・ストーリーテリングの基礎です。そして2025年、その基礎はついに構築を開始するのに十分な堅牢性を獲得しました。

この記事は役に立ちましたか?

Alexis

Alexis

AIエンジニア

ローザンヌ出身のAIエンジニアで、研究の深さと実践的なイノベーションを組み合わせています。モデルアーキテクチャとアルプスの頂に時間を分けています。

関連記事

これらの関連投稿で探索を続けてください

この記事はお楽しみいただけましたか?

最新コンテンツで、さらに深いインサイトを発見してください。

AI動画における キャラクター一貫性の維持:モデルが顔を記憶する方法