Dynamic Resolution Scaling
动态分辨率缩放会实时调整每帧的处理分辨率,以满足帧耗时预算,常用于游戏和实时视觉 AI。
动态分辨率缩放(DRS)是一种逐帧调整系统处理分辨率的技术,目的是将每帧耗时控制在固定预算内。场景开销较大时,渲染器或模型会处理更少的像素;有余量时,则会再次提高分辨率。输出通常会放大回固定的显示尺寸。电子游戏率先普及了这项技术,以便在主机和 PC 上保持稳定的帧率。同样的思路也适用于实时推理:在繁忙或因过热而降频的硬件上,计算机视觉模型可以缩小输入尺寸,以满足延迟预算。
动态分辨率缩放的工作原理#
DRS 是一个反馈回路。每处理一帧,系统都会测量 GPU 处理前几帧所用的时间,将其与预算进行比较,然后在固定范围内为下一帧选择分辨率比例:
“超出预算”和“远低于预算”之间的间隔可以避免分辨率在两个级别间闪烁。例如,在 Unreal Engine 中,默认预算为每帧 33.3 ms,即每秒 30 帧;屏幕百分比会沿每个轴在输出分辨率的 50% 到 100% 之间变化,因此最低设置只会渲染四分之一的像素。
放大步骤决定了降低分辨率会带来多大的画质损失。简单的空间缩放会模糊图像,因此现代游戏会将 DRS 与学习式或时域放大器搭配使用,例如 NVIDIA DLSS、AMD FSR、Intel XeSS 和 Sony 的 PlayStation Spectral Super Resolution。这些技术会结合先前的帧,并在大多数当前版本中使用深度学习来重建细节。这种重建属于超分辨率,因此游戏可以远低于输出分辨率进行渲染,同时几乎不产生可见损失。
视觉 AI 中的动态分辨率#
对于卷积神经网络,计算量和推理延迟大致会随输入像素数量增长,因此将输入边长减半至 320 像素,会把 640 像素模型的 FLOPs 降至约四分之一。因此,当 NVIDIA Jetson 等边缘 AI设备升温并降低时钟频率、服务器接入更多摄像头视频流,或无人机需要为导航留出额外算力时,控制器都可以通过降低分辨率来换取速度。代价是小物体和远处物体的精度会下降,因为它们在低分辨率下所占像素太少,所以目标检测系统会为输入尺寸设定下限。
Ultralytics YOLO26 在 predict 模式中直接支持这一功能:PyTorch 模型每次调用时都可以接受不同的 imgsz,无需重新加载;系统会将每帧较长的一边缩放至 imgsz,较短的一边只填充到下一个 32 像素步长的倍数。导出为静态形状格式的模型则会保持导出时的尺寸,除非设置了 dynamic=True。一个简单的控制器会根据测得的推理时间,在允许的尺寸之间逐步调整:
import cv2
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov")
sizes = [320, 416, 512, 640] # 允许的输入尺寸,均为 32 像素步长的倍数
level, budget_ms = len(sizes) - 1, 15.0 # 从完整尺寸开始,推理预算设为 15 ms
frames_at = dict.fromkeys(sizes, 0)
while True:
ok, frame = cap.read()
if not ok:
break
result = model(frame, imgsz=sizes[level], verbose=False)[0]
frames_at[sizes[level]] += 1
# 超出预算时降低尺寸,只有远低于预算时才调高,以避免闪烁
if result.speed["inference"] > budget_ms and level > 0:
level -= 1
elif result.speed["inference"] < 0.6 * budget_ms and level < len(sizes) - 1:
level += 1
print("Frames processed at each input size:", frames_at)打印结果会统计每种尺寸处理的帧数;硬件越慢,视频中以较小尺寸处理的部分就越多。










