AI-апскейл видео: super resolution с сохранением temporal consistency
Архивное видео в 720p не тянет современные 4K-экраны — простое интерполирование кадров даёт размытость, а per-frame AI-модели — мерцание из-за разрыва temporal consistency. Мы решаем эту проблему с помощью видеоспецифичных архитектур: Real-BasicVSR и BasicVSR++. Из практики: клиент с OTT-платформой перевёл 180 минут 720p в 4K. BasicVSR++ на двух RTX A6000 обработал видео за 14 часов, VMAF вырос с 72 до 89 — платформа приняла контент без ручного ретуширования. Экономия времени составила 40% по сравнению с per-frame методами, а один из клиентов сэкономил до $12 000 на ручной обработке, перейдя на наш pipeline. Мы занимаемся AI-увеличением разрешения видео (super resolution) с помощью нейросетей, переводим SD, 720p, 1080p в 4K.
Ограничения per-frame моделей для видео
Применение Real-ESRGAN к каждому кадру по отдельности нарушает temporal consistency: шум на однородных поверхностях меняется от кадра к кадру, появляется мерцание. В результате даже при высоком PSNR видео выглядит неестественно. Видеомодели, такие как BasicVSR++, используют bidirectional propagation — информацию из прошлых и будущих кадров, что обеспечивает плавные переходы.
Temporal consistency: определение и метрики
Temporal consistency — плавность перехода между соседними кадрами. Измеряется через метрики, такие как ST-RRED или разница в оптическом потоке. Для апскейла видео критично сохранять одинаковый шум и текстуру на одних и тех же объектах в течение всего ролика. BasicVSR++ оптимизирован именно на эту метрику.
Как мы это делаем: стек и реализация
Основной инструмент — BasicVSR++ на PyTorch. Для длинных видео используем чанкованную обработку с overlap-кадрами, чтобы бесшовно сшивать куски. Ниже — пример кода для загрузки модели и апскейла одного чанка:
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
Для длинных видео реализуем чанкованную обработку с перекрытием (overlap), чтобы сшивать куски без видимых границ. Каждый чанк размером 50 кадров, перекрытие 5 кадров. Это позволяет обрабатывать видео любой длины, ограниченные только временем.
Какую модель выбрать: BasicVSR++ или Real-BasicVSR?
| Модель | PSNR Vid4 4x | Temporal consistency | Скорость 1080p→4K | VRAM |
|---|---|---|---|---|
| Real-ESRGAN (per-frame) | 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 и даёт отличную temporal consistency. Если приоритет — скорость, выбираем 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 (параметр -deblock). В сложных случаях — дополнительный AI-denoiser. Это входит в стандартный pipeline.
Процесс работы над проектом
- Аналитика — изучаем исходное видео, определяем целевой формат, выбираем модель (BasicVSR++ / Real-BasicVSR / RVRT). Оцениваем время обработки на доступном GPU. Анализируем необходимость fine-tuning под специфический тип контента (аниме, спорт, видео с камер наблюдения).
- Проектирование pipeline — настраиваем препроцессинг, чанкование, постобработку. Оптимизируем batch size и используем mixed precision.
- Реализация — разворачиваем скрипты, интеграция с вашей инфраструктурой (S3, API). При необходимости обучаем модель на вашем датасете (срок от 8 до 14 недель).
- Тестирование — прогоняем на репрезентативном отрезке, замеряем VMAF, проверяем отсутствие мерцания и temporal consistency.
- Деплой — переносим в production, настраиваем мониторинг, передаём документацию.
Что входит в работу
- Документация: описание архитектуры, инструкции по запуску, рекомендации по GPU.
- Исходный код: репозиторий с pipeline, Docker-образ, скрипты деплоя.
- Обучение вашей команды: сессия по использованию и адаптации.
- Гарантия: техническая поддержка 1 месяц после сдачи.
Ориентировочные сроки
| Задача | Срок |
|---|---|
| Сервис апскейла видео (Real-BasicVSR) | 2–3 недели |
| Pipeline с препроцессингом + BasicVSR++ | 4–6 недель |
| Fine-tuning под специфический тип контента | 8–14 недель |
Технические детали пайплайна
Для оптимизации памяти используем gradient checkpointing и CPU offloading. Mixed precision (FP16) ускоряет инференс на ~30%. При работе с несколькими GPU — DataParallel или DistributedDataParallel.
Почему выбирают нас?
Мы — команда AI-инженеров с многолетним опытом в computer vision. Выполнили 15+ проектов по апскейлу видео для OTT-платформ, архивов, спортивных трансляций. Используем лицензионное ПО, гарантируем результат по метрикам VMAF/PSNR. Мы предлагаем видеоапскейл под ключ — от анализа до деплоя. Свяжитесь с нами для оценки вашего проекта — мы подберём оптимальное решение и рассчитаем сроки. Закажите консультацию, чтобы узнать, как наш pipeline впишется в вашу инфраструктуру.







