Frame Interpolation
프레임 보간은 기존 프레임 사이에 새로운 프레임을 생성해 프레임 레이트를 높이거나 슬로 모션을 만듭니다. 광학 흐름 기반, 커널 기반, 생성형 방법을 다룹니다.
프레임 보간(비디오 프레임 보간, VFI)은 기존 비디오 프레임 두 개 사이에 새 프레임을 합성하는 컴퓨터 비전 작업입니다. 모든 프레임 쌍 사이에 프레임 하나를 삽입하면 프레임 레이트가 두 배가 되어 30 FPS 영상을 60 FPS로 변환할 수 있으며, 여러 프레임을 삽입하면 일반 영상을 슬로 모션으로 만들 수 있습니다. 프레임 보간은 시간 축의 해상도인 비디오의 시간 해상도를 높이며, 시간 축에서 초해상도에 해당합니다. 기존 프레임 사이의 간격만 채우며, 마지막 프레임 이후의 프레임을 외삽하는 비디오 예측과는 다릅니다.
프레임 보간 작동 방식#
두 프레임의 평균을 구하면 움직인 모든 대상이 두 겹으로 보이는 고스팅 현상이 발생합니다. 광학 흐름 기반 방식은 대신 두 프레임 사이에서 모든 픽셀의 움직임인 광학 흐름을 추정하고, 각 프레임을 해당 움직임을 따라 목표 시점까지 일부 이동시킨 다음 두 결과를 혼합합니다. 가림 현상이 어려운 부분입니다. 걸어가는 사람에 의해 가려졌다가 드러난 배경 영역은 두 프레임 중 하나에만 존재하므로, Super SloMo와 같은 딥러닝 모델은 각 출력 픽셀을 어느 프레임에서 가져올지 결정하는 가시성 맵도 예측합니다.
OpenCV의 Farneback 광학 흐름을 사용하면 실제 영상에서 이러한 효과를 확인하기에 충분합니다. 다음 코드 조각은 프레임 세 개 중 가운데 프레임을 제외한 뒤 양옆 프레임으로 복원하고, 두 방법을 최대 신호 대 잡음비(PSNR)로 평가합니다.
import cv2
import numpy as np
# Read three consecutive frames of people walking and hold out the middle one
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov")
f0, f1, f2 = (cap.read()[1] for _ in range(3))
g0, g2 = (cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) for f in (f0, f2))
# Estimate dense optical flow in both directions between the outer frames
flow02 = cv2.calcOpticalFlowFarneback(g0, g2, None, 0.5, 3, 15, 3, 5, 1.2, 0)
flow20 = cv2.calcOpticalFlowFarneback(g2, g0, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Warp each outer frame halfway along its flow, then average the two warps
h, w = g0.shape
grid = np.dstack(np.meshgrid(np.arange(w), np.arange(h))).astype(np.float32)
warp0 = cv2.remap(f0, grid - 0.5 * flow02, None, cv2.INTER_LINEAR)
warp2 = cv2.remap(f2, grid - 0.5 * flow20, None, cv2.INTER_LINEAR)
middle = cv2.addWeighted(warp0, 0.5, warp2, 0.5, 0)
# Score both against the real middle frame: flow interpolation vs. plain blending
blend = cv2.addWeighted(f0, 0.5, f2, 0.5, 0)
print(f"Blend: {cv2.PSNR(blend, f1):.1f} dB, flow interpolation: {cv2.PSNR(middle, f1):.1f} dB")출력은 Blend: 22.3 dB, flow interpolation: 29.5 dB입니다. 각 프레임을 움직임을 따라 절반만큼 이동하면 가운데 프레임을 단순 평균보다 7.2 dB 더 정확하게 복원합니다. 벤치마크도 같은 방식으로 모델을 평가합니다. Vimeo-90K 트리플릿 데이터셋에는 가운데 프레임을 모델이 예측해야 하는 3프레임 클립 73,171개가 포함되어 있으며, PSNR과 SSIM으로 측정합니다.
학습 기반 보간 방법#
- 흐름 기반 네트워크: Super SloMo(2018)는 두 프레임 사이의 임의 시점에 대한 흐름과 가시성을 예측하며, RIFE(2022)는 중간 시점의 흐름을 직접 추정하여 Super SloMo와 DAIN보다 4~27배 빠르게 실행됩니다.
- 커널 기반 네트워크: SepConv(2017)는 모든 출력 픽셀에 대한 분리 가능한 컨볼루션 커널을 예측하고 두 입력 프레임의 패치에 적용하여, 움직임 추정과 혼합을 한 단계로 결합합니다.
- 대규모 움직임 모델: Google의 FILM(2022)은 특징 피라미드의 여러 스케일에 가중치를 공유합니다. 따라서 세밀한 스케일의 큰 움직임을 더 거친 스케일에서 학습한 작은 움직임처럼 처리하며, 프레임 트리플릿만으로 학습합니다.
- 생성 모델: LDMVFI(2024)와 같은 확산 기반 보간 모델은 픽셀을 워핑하는 대신 두 입력을 조건으로 하는 잠재 표현을 디노이징하여 가운데 프레임을 생성합니다.
- 이벤트 기반 보간: Time Lens(2021)는 이벤트 카메라가 두 프레임 사이에서 기록한 밝기 변화를 추가하여, 간격 중 실제 움직임을 드러냅니다.
실제 적용 사례#
- 게임 프레임 생성: NVIDIA DLSS Multi Frame Generation은 GeForce RTX 50 Series GPU에서 렌더링된 프레임 하나마다 생성 프레임을 최대 다섯 개 삽입합니다. 각 생성 프레임에는 다음 렌더링 프레임이 필요하므로 지연 시간이 늘어납니다.
- 비디오 편집: 편집기는 일반 영상을 슬로 모션으로 만들고 24 또는 30 FPS 비디오를 60 Hz 및 120 Hz 디스플레이용으로 변환합니다. 이는 TV가 모션 스무딩에 적용하는 것과 동일한 모션 보간입니다.
- 애니메이션: 보간 모델은 손으로 그린 키프레임 사이의 중간 그림을 생성하며, 비디오 생성기는 주어진 두 프레임으로 시작하고 끝나는 전체 클립을 만들 수 있습니다.
객체 추적은 픽셀 대신 위치에 같은 아이디어를 적용합니다. 여러 프레임 동안 가려졌던 객체가 다시 나타나면, Ultralytics의 추적 모드 (tracker="ocsort.yaml")에 있는 OC-SORT 추적기는 누락된 프레임의 가상 박스를 선형 보간한 뒤 칼만 필터에 다시 입력하여, 객체를 다음 YOLO26 감지 결과와 매칭하는 데 사용하는 속도 추정치를 보정합니다.










