AI Video Upscale: סופר-רזולוציה עם קוהרנטיות זמנית בין פריימים
וידאו ארכיוני ב-720p לא מחזיק מעמד על מסכי 4K מודרניים—אינטרפולציית פריימים פשוטה גורמת לטשטוש, ומודלי AI לכל פריים בנפרד יוצרים הבהובים עקב קוהרנטיות זמנית שבורה. אנחנו פותרים זאת עם ארכיטקטורות ייעודיות לוידאו: Real-BasicVSR ו-BasicVSR++. מניסיון: לקוח עם פלטפורמת OTT המיר 180 דקות מ-720p ל-4K. BasicVSR++ על שני RTX A6000 עיבד את הווידאו ב-14 שעות, VMAF עלה מ-72 ל-89—הפלטפורמה קיבלה את התוכן ללא ריטוש ידני. חיסכון בזמן היה 40% לעומת שיטות לכל פריים, ולקוח אחד חסך עד $12,000 על עיבוד ידני במעבר לפייפליין שלנו. התמחור שלנו להגדלת רזולוציה מתחיל ב-$500 לשעת וידאו מקור. אנחנו מתמחים בסופר-רזולוציית וידאו ב-AI, המרת SD, 720p, 1080p ל-4K.
מגבלות מודלים לכל פריים עבור וידאו
הפעלת Real-ESRGAN על כל פריים בנפרד שוברת קוהרנטיות זמנית: רעש על משטחים אחידים משתנה מפריים לפריים, וגורם להבהוב. גם עם PSNR גבוה, הווידאו נראה לא טבעי. מודלי וידאו כמו BasicVSR++ משתמשים בהפצה דו-כיוונית—מידע מפריימים עתידיים ועבריים—המבטיחה מעברים חלקים.
קוהרנטיות זמנית: הגדרה ומדדים
קוהרנטיות זמנית היא חלקות המעברים בין פריימים סמוכים. היא נמדדת על ידי מדדים כמו ST-RRED או הפרש זרימה אופטית. להגדלת רזולוציית וידאו, שמירה על רעש ומרקם עקביים על אותם אובייקטים לאורך הקליפ היא קריטית. BasicVSR++ מותאם ספציפית למדד זה.
איך אנחנו עושים את זה: מחסנית ויישום
הכלי העיקרי שלנו הוא BasicVSR++ על PyTorch. לוידאו ארוך, אנחנו משתמשים בעיבוד מנות עם פריימים חופפים כדי לתפור חלקים בצורה חלקה. להלן דוגמת קוד לטעינת המודל והגדלת רזולוציה של מנה אחת:
import torch
import numpy as np
import cv2
from basicsr.archs.basicvsrpp_arch import BasicVSRPlusPlus
def upscale_video_basicvsr(
frames: list[np.ndarray], # список кадров (H, W, 3) BGR
scale: int = 4,
num_feat: int = 64,
num_propagation_blocks: int = 7,
cpu_cache_length: int = 100 # кадры в памяти GPU одновременно
) -> list[np.ndarray]:
"""
BasicVSR++ использует bidirectional propagation: информацию из прошлых И будущих кадров.
cpu_cache_length: при длинных видео часть кадров выгружаем на CPU.
"""
model = BasicVSRPlusPlus(
mid_channels=num_feat,
num_blocks=num_propagation_blocks,
is_low_res_input=True,
spynet_path='weights/spynet_20210409-c6c1bd09.pth'
)
state_dict = torch.load(
f'weights/BasicVSR++_reds4_vimeo90k.pth'
)['params']
model.load_state_dict(state_dict, strict=True)
model.eval().cuda()
# Нормализация и конвертация BGR→RGB
tensor_frames = []
for frame in frames:
f_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
t = torch.from_numpy(f_rgb).float() / 255.0
t = t.permute(2, 0, 1).unsqueeze(0) # (1, C, H, W)
tensor_frames.append(t)
# Batch всех кадров → (1, T, C, H, W)
video_tensor = torch.stack(
[f.squeeze(0) for f in tensor_frames], dim=0
).unsqueeze(0).cuda()
with torch.no_grad(), torch.cuda.amp.autocast():
output = model(video_tensor) # (1, T, C, 4H, 4W)
result = []
for i in range(output.shape[1]):
frame_t = output[0, i].float().cpu()
frame_np = (frame_t.permute(1,2,0).numpy() * 255).clip(0,255)
result.append(
cv2.cvtColor(frame_np.astype(np.uint8), cv2.COLOR_RGB2BGR)
)
return result
לוידאו ארוך, אנחנו מיישמים עיבוד מנות עם חפיפה כדי לתפור חלקים ללא גבולות נראים. כל מנה היא 50 פריימים עם חפיפה של 5 פריימים. זה מאפשר עיבוד וידאו בכל אורך, מוגבל רק בזמן.
איזה מודל לבחור: BasicVSR++ או Real-BasicVSR?
| מודל | PSNR Vid4 4x | קוהרנטיות זמנית | מהירות 1080p→4K | VRAM |
|---|---|---|---|---|
| Real-ESRGAN (לכל פריים) | 27.4 | נמוכה (הבהוב) | ~8fps RTX3080 | 6GB |
| BasicVSR | 31.4 | טובה | ~2fps RTX3080 | 12GB |
| BasicVSR++ | 32.4 | מצוינת | ~1.5fps RTX3080 | 16GB |
| RVRT | 32.8 | מצוינת | ~0.8fps RTX3080 | 20GB |
| Real-BasicVSR | 31.0 | טובה | ~3fps RTX3080 | 10GB |
כפי שהטבלה מראה, BasicVSR++ עולה על Real-ESRGAN ב-5 נקודות ב-PSNR ומספק קוהרנטיות זמנית מצוינת. BasicVSR++ עקבי זמנית פי 3 יותר משיטות לכל פריים לפי מדדי ST-RRED. אם מהירות היא בראש סדר העדיפויות, בחרו ב-Real-BasicVSR. מודל BasicVSR++ מוצג ב-BasicVSR++: Improving Video Super-Resolution with Enhanced Propagation and Alignment (https://github.com/ckkelvinchan/BasicVSR_PlusPlus).
טיפול בפגמי דחיסה
דחיסת H.264 עם QP > 28 מוגברת על ידי מודל ה-SR—חסימות הופכות לבולטות בפלט 4K. בכל פרויקט, אנחנו מוסיפים עיבוד מקדים: פילטר deblock של FFmpeg (פרמטר import torch import numpy as np import cv2 from basicsr.archs.basicvsrpp_arch import BasicVSRPlusPlus def upscale_video_basicvsr( frames: list[np.ndarray], # список кадров (H, W, 3) BGR scale: int = 4, num_feat: int = 64, num_propagation_blocks: int = 7, cpu_cache_length: int = 100 # кадры в памяти GPU одновременно ) -> list[np.ndarray]: """ BasicVSR++ использует bidirectional propagation: информацию из прошлых И будущих кадров. cpu_cache_length: при длинных видео часть кадров выгружаем на CPU. """ model = BasicVSRPlusPlus( mid_channels=num_feat, num_blocks=num_propagation_blocks, is_low_res_input=True, spynet_path='weights/spynet_20210409-c6c1bd09.pth' ) state_dict = torch.load( f'weights/BasicVSR++_reds4_vimeo90k.pth' )['params'] model.load_state_dict(state_dict, strict=True) model.eval().cuda() # Нормализация и конвертация BGR→RGB tensor_frames = [] for frame in frames: f_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) t = torch.from_numpy(f_rgb).float() / 255.0 t = t.permute(2, 0, 1).unsqueeze(0) # (1, C, H, W) tensor_frames.append(t) # Batch всех кадров → (1, T, C, H, W) video_tensor = torch.stack( [f.squeeze(0) for f in tensor_frames], dim=0 ).unsqueeze(0).cuda() with torch.no_grad(), torch.cuda.amp.autocast(): output = model(video_tensor) # (1, T, C, 4H, 4W) result = [] for i in range(output.shape[1]): frame_t = output[0, i].float().cpu() frame_np = (frame_t.permute(1,2,0).numpy() * 255).clip(0,255) result.append( cv2.cvtColor(frame_np.astype(np.uint8), cv2.COLOR_RGB2BGR) ) return result ). במקרים מורכבים, אנחנו מוסיפים מסיר רעשים AI נוסף. זה חלק מהפייפליין הסטנדרטי שלנו.
תהליך עבודה
- ניתוח—לימוד הווידאו המקור, קביעת הפורמט היעד, בחירת המודל (BasicVSR++ / Real-BasicVSR / RVRT). הערכת זמן עיבוד על GPU זמין. הערכת צורך בכיוונון עדין לסוג תוכן ספציפי (אנימה, ספורט, מעקב).
- עיצוב פייפליין—הגדרת עיבוד מקדים, מנות, עיבוד לאחר. אופטימיזציה של גודל batch ושימוש בדיוק מעורב.
- יישום—פריסת סקריפטים, אינטגרציה עם התשתית שלך (S3, API). במידת הצורך, אימון מודל על הנתונים שלך (לוח זמנים 8-14 שבועות).
- בדיקות—ריצה על קטע מייצג, מדידת VMAF, אימות ללא הבהוב וקוהרנטיות זמנית.
- פריסה—מעבר לייצור, הגדרת ניטור, מסירת תיעוד.
מה כלול
- תיעוד: תיאור ארכיטקטורה, הוראות ריצה, המלצות GPU.
- קוד מקור: מאגר עם פייפליין, תמונת Docker, סקריפטי פריסה.
- הכשרת הצוות שלך: סשן על שימוש והתאמה.
- אחריות: תמיכה טכנית לחודש אחד לאחר המסירה.
לוחות זמנים משוערים
| משימה | לוח זמנים |
|---|---|
| שירות הגדלת רזולוציית וידאו (Real-BasicVSR) | 2–3 שבועות |
| פייפליין עם עיבוד מקדים + BasicVSR++ | 4–6 שבועות |
| כיוונון עדין לסוג תוכן ספציפי | 8–14 שבועות |
פרטי פייפליין טכניים
לאופטימיזציית זיכרון, אנחנו משתמשים ב-gradient checkpointing ו-CPU offloading. דיוק מעורב (FP16) מאיץ אינפרנס בכ-30%. בעבודה עם מספר GPUs, אנחנו משתמשים ב-DataParallel או DistributedDataParallel.
למה לבחור בנו?
אנחנו צוות של מהנדסי AI עם שנים של ניסיון בראייה ממוחשבת. השלמנו 15+ פרויקטים בהגדלת רזולוציית וידאו לפלטפורמות OTT, ארכיונים ושידורי ספורט. אנחנו משתמשים בתוכנה מורשית ומבטיחים תוצאות לפי מדדי VMAF/PSNR. אנחנו מציעים הגדלת רזולוציית וידאו מקצה לקצה—מניתוח ועד פריסה. צרו קשר להערכת הפרויקט שלכם—נמצא את הפתרון האופטימלי ונחשב לוחות זמנים. התמחור שלנו מתחיל ב-$500 לשעת וידאו מקור. בקשו ייעוץ כדי לראות איך הפייפליין שלנו יכול להשתלב בתשתית שלכם.







