Frame Interpolation
Nội suy frame tổng hợp các frame mới nằm giữa những frame hiện có để tăng tốc độ khung hình hoặc tạo hiệu ứng chuyển động chậm. Các phương pháp dựa trên optical flow, kernel và mô hình sinh.
Nội suy khung hình, còn gọi là nội suy khung hình video (VFI), là tác vụ thị giác máy tính tổng hợp các khung hình mới giữa hai khung hình hiện có của video. Chèn một khung hình vào giữa mỗi cặp sẽ tăng gấp đôi tốc độ khung hình, biến cảnh quay 30 FPS thành 60 FPS; chèn nhiều khung hình sẽ tạo hiệu ứng chuyển động chậm từ cảnh quay thông thường. Phương pháp này tăng độ phân giải theo thời gian của video, tương tự như siêu phân giải trong miền thời gian, và chỉ lấp các khoảng trống giữa những khung hình hiện có, khác với dự đoán video vốn ngoại suy các khung hình sau khung hình cuối cùng.
Cách nội suy khung hình hoạt động#
Lấy trung bình hai khung hình tạo ra hiện tượng bóng ma, tức hình ảnh kép của mọi vật thể chuyển động. Thay vào đó, các phương pháp dựa trên luồng ước tính luồng quang học, tức chuyển động của từng pixel giữa hai khung hình, dịch chuyển mỗi khung hình một đoạn dọc theo chuyển động đó đến thời điểm đích, rồi hòa trộn hai kết quả. Che khuất là phần khó xử lý: vùng nền bị người đi bộ để lộ chỉ xuất hiện trong một khung hình, vì vậy các model học sâu như Super SloMo còn dự đoán bản đồ khả kiến để quyết định mỗi pixel đầu ra lấy từ khung hình nào.
Luồng quang học Farneback trong OpenCV đủ để minh họa hiệu ứng trên cảnh quay thực tế. Đoạn mã giữ lại khung hình giữa trong ba khung hình, dựng lại khung hình đó từ hai khung hình lân cận và đánh giá cả hai phương pháp bằng tỷ số tín hiệu trên nhiễu đỉnh (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")Kết quả in ra Blend: 22.3 dB, flow interpolation: 29.5 dB: dịch chuyển mỗi khung hình một nửa quãng đường theo chuyển động giúp dựng lại khung hình bị giữ lại chính xác hơn 7,2 dB so với phép lấy trung bình. Benchmark đánh giá model theo cách tương tự: tập bộ ba Vimeo-90K gồm 73.171 clip ba khung hình, trong đó model phải dự đoán khung hình giữa; kết quả được đo bằng PSNR và SSIM.
Các phương pháp nội suy dựa trên học máy#
- Mạng dựa trên luồng: Super SloMo (2018) dự đoán luồng và khả kiến tại mọi thời điểm giữa hai khung hình, còn RIFE (2022) ước tính trực tiếp luồng tại thời điểm trung gian, chạy nhanh hơn Super SloMo và DAIN từ 4 đến 27 lần.
- Mạng dựa trên kernel: SepConv (2017) dự đoán các kernel tích chập phân tách được cho từng pixel đầu ra và áp dụng chúng lên các patch của hai khung hình đầu vào, kết hợp ước tính chuyển động và hòa trộn trong một bước.
- Model chuyển động lớn: FILM của Google (2022) dùng chung trọng số giữa các tỷ lệ của tháp đặc trưng, nhờ đó chuyển động lớn ở tỷ lệ mịn được xử lý như các chuyển động nhỏ mà model học được ở tỷ lệ thô hơn; model chỉ cần huấn luyện từ các bộ ba khung hình.
- Model sinh: Các model nội suy dựa trên khuếch tán như LDMVFI (2024) tạo khung hình giữa bằng cách khử nhiễu biểu diễn tiềm ẩn được điều kiện hóa bởi hai đầu vào, thay vì biến dạng các pixel của chúng.
- Nội suy dựa trên sự kiện: Time Lens (2021) bổ sung các thay đổi độ sáng mà camera sự kiện ghi nhận giữa hai khung hình, qua đó hé lộ chuyển động thực sự trong khoảng thời gian đó.
Ứng dụng thực tế#
- Tạo khung hình game: NVIDIA DLSS Multi Frame Generation chèn tối đa năm khung hình được tạo cho mỗi khung hình kết xuất trên GPU GeForce RTX 50 Series; mỗi khung hình được tạo cần khung hình kết xuất tiếp theo, làm tăng độ trễ.
- Chỉnh sửa video: Các phần mềm biên tập tạo chuyển động chậm từ cảnh quay tiêu chuẩn và chuyển đổi video 24 hoặc 30 FPS cho màn hình 60 Hz và 120 Hz; đây cũng là kiểu nội suy chuyển động mà TV áp dụng để làm mượt chuyển động.
- Hoạt hình: Các model nội suy tạo hình vẽ trung gian cho những khung hình chính được vẽ tay, còn trình tạo video có thể tạo toàn bộ clip bắt đầu và kết thúc tại hai khung hình cho trước.
Theo dõi đối tượng áp dụng ý tưởng tương tự cho vị trí thay vì pixel. Khi một đối tượng bị che khuất trong vài khung hình xuất hiện trở lại, tracker OC-SORT trong chế độ track của Ultralytics (tracker="ocsort.yaml") nội suy tuyến tính các box ảo cho những khung hình bị bỏ lỡ và đưa chúng qua bộ lọc Kalman, khôi phục ước tính vận tốc được dùng để ghép đối tượng với phát hiện YOLO26 tiếp theo.










