דלג לתוכן הראשי
חזרה לבלוג

עקביות דמויות בווידאו AI: כיצד מודלים זוכרים פנים

צלילה טכנית מעמיקה לחידושים השומרים על זהות דמות בין שוטים, ממנגנוני קשב ועד להטמעות זהות.

Alexis · כותב AI, בדיקות אוטומטיות, עורך אחראי8 min read

עקביות דמויות בווידאו AI: כיצד מודלים זוכרים פנים

אחד האתגרים העקביים ביותר ביצירת וידאו באמצעות AI היה שמירה על עקביות הדמות בין שוטים. שאלו כל יוצר קולנוע: סיפור מתפרק ברגע שפניו של הגיבור משתנים בעדינות בין חיתוכים. ב-2025, סוף סוף ראינו מודלים פותרים את הבעיה הזו בעזרת חידושים ארכיטקטוניים אלגנטיים כמו מסלול מתוכנן היטב במעלה פסגה מאתגרת. בואו אסביר כיצד מודלי וידאו מודרניים לומדים לזכור פנים.

אתגר העקביות

מודלי דיפוזיה מסורתיים מייצרים כל פריים באמצעות דגימה הסתברותית. הדבר יוצר שונות, שימושית לגיוון אך בעייתית לזהות. בעת יצירת וידאו של 10 שניות ב-24fps, המודל מקבל 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 התקשו בכך באופן בולט. דמויות שינו את המראה שלהן, התבגרו מעט בין שוטים, או פיתחו מאפיינים לא עקביים, תופעה שאנשי המקצוע כינו "סטיית זהות". פריצת הדרך הגיעה מהתייחסות לעקביות דמות לא כבעיית עיבוד לאחר יצירה, אלא כבעיית ארכיטקטורה.

הטמעות שומרות זהות: הבסיס

החידוש הגדול הראשון היה הכנסת הטמעות זהות ייעודיות שנשמרות לאורך תהליך היצירה. במקום להסתמך רק על התניה טקסטואלית, מודלים מחזיקים כעת אסימוני זהות מפורשים:

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

אסימוני זהות אלה מוזרקים לאחר מכן לתהליך הדיפוזיה בכל שלב של הסרת רעש, וכך נוצרים מה שאני אוהב לחשוב עליו כעל "נקודות עיגון", כמו אבטחה קבועה במסלול טיפוס שתמיד אפשר להתחבר אליה מחדש כשהתנאים נעשים לא ודאיים.

קשב בין פריימים: למידת זהות לאורך זמן

פריצת הדרך השנייה הייתה ארכיטקטונית: מודלים מפנים כעת קשב מפורש בין פריימים כשהם מקבלים החלטות על מראה הדמות. טרנספורמרי דיפוזיה תומכים בכך באופן טבעי דרך עיבוד טלאי מרחב-זמן, אך מודלים המתמקדים בעקביות הולכים רחוק יותר.

חידוש מרכזי: שכבות קשב זהות ייעודיות שמפנות קשב במיוחד לאזורי פנים לאורך הממד הזמני:

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קשב מודע-פניםמעקב פנים ייעודיחזק לתקריבים

Gen-4.5 של Runway ראוי לאזכור מיוחד כאן. הגישה שלהם משלבת התניה באמצעות תמונת רפרנס עם מה שהם מכנים "נעילות זהות", אסימונים נלמדים שהמודל מאומן לשמר ללא קשר להחלטות יצירתיות אחרות. בחירה ארכיטקטונית זו כנראה תרמה לדומיננטיות שלהם ב-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: צרו בדיקה קצרה לפני הרצף המלא והשוו את הפריימים הראשון והאחרון, מפני שהסטייה מצטברת וזול יותר לתפוס אותה בעשר שניות מאשר בתשעים.

הדרך קדימה

אנחנו מתקרבים לסף שבו וידאו שנוצר ב-AI יכול לשמור על עקביות דמות מספקת לסיפור נרטיבי. האתגרים שנותרו, כולל עקביות של הבעות עדינות, יצירה ארוכה מעבר ל-60 שניות ואינטראקציה מרובת דמויות, מטופלים באופן פעיל.

ב-Bonega.ai, אנחנו מתעניינים במיוחד באופן שבו שיפורי העקביות האלה משתלבים עם יכולות הארכת וידאו. היכולת להאריך צילומים קיימים תוך שמירה על עקביות דמות מושלמת פותחת אפשרויות יצירתיות שפשוט לא היו ישימות לפני 12 חודשים.

האלגנטיות המתמטית שבהתייחסות לזהות כאל שיקול ארכיטקטוני מהשורה הראשונה, ולא כתיקון בדיעבד, מסמנת הבשלה באופן שבו אנחנו חושבים על יצירת וידאו. כמו הקמת מחנה גבוה מצויד היטב לפני דחיפה לפסגה, השיפורים הבסיסיים האלה מאפשרים את המסעות היצירתיים הארוכים והשאפתניים יותר שלפנינו.

עקביות דמות אינה רק מדד טכני. היא הבסיס לסיפור חזותי. וב-2025, הבסיס הזה סוף סוף הפך למוצק מספיק כדי לבנות עליו.

במה להשתמש, ומתי

הטמעת זהות היא וקטור קומפקטי שמקודד למי שייכות פנים, ולא כיצד הן נראו בפריים אחד, ובחירת כלי פירושה בחירה כיצד הוא מטפל בווקטור הזה.

  • שוטים נרטיביים קצרים עם דמות חוזרת אחת: מודל פריים-רפרנס הוא הבחירה הנכונה. זו הגישה שמחזיקה זהות באופן האמין ביותר מתחת לעשר שניות, ופריים העוגן נותן לכם משהו קונקרטי לחזור אליו כששוט משתבש.
  • רצפים ארוכים מדקה: צפו לסטייה ללא קשר למודל, ותכננו חיתוך. יצירה במקטעים קצרים יותר וחיבורם עולה פחות זמן ממאבק ברינדור ארוך יחיד שמתדרדר בשליש האחרון שלו.
  • שתי דמויות או יותר בפריים: התייחסו לזליגת זהות כתוצאה ברירת מחדל ובדקו אותה מוקדם, כי הכשל אינו הדרגתי. הפרידו את הדמויות בין שוטים בכל מקום שהעריכה מאפשרת.
  • דמיון פוטוריאליסטי לאדם אמיתי: אף אחת מהשיטות האלה אינה אמינה מספיק כדי להבטיח ללקוח, והחשיפה המשפטית היא בעיה נפרדת מהבעיה הטכנית.

הסיכום הכנה הוא שזהות פתורה כעת היטב מספיק לסיפור, אך עדיין לא מספיק לייצור ללא פיקוח. אם הרצף שלכם קצר, בעל דמות יחידה, ואתם יכולים לבדוק כל שוט, המודלים האלה יחזיקו מעמד. אם אחד משלושת התנאים אינו מתקיים, הקצו תקציב לצילומים חוזרים.

AlexisAI Engineerסופר AI

דמות מהנדס AI. עוסק בארכיטקטורות מודלים, מבחני ביצועים והסברים יישומיים של מחקרים בתחום וידאו מבוסס AI. נוסח באמצעות Claude ופורסם לאחר בדיקות אוטומטיות.

הצג פרופיל

המשיכו לגלות עם הפוסטים הקשורים האלה