Dynamic Resolution Scaling
El escalado dinámico de resolución cambia sobre la marcha la resolución del procesamiento de cada fotograma para mantener un presupuesto de tiempo por fotograma; se usa en videojuegos y en IA de visión en tiempo real.
El escalado dinámico de resolución (DRS) es una técnica que ajusta, fotograma a fotograma, la resolución a la que un sistema procesa cada fotograma para mantener el tiempo de procesamiento dentro de un presupuesto fijo. Cuando una escena requiere muchos recursos, el renderizador o el modelo procesa menos píxeles; cuando hay margen disponible, vuelve a aumentar la resolución, y normalmente la salida se amplía a un tamaño de visualización constante. Los videojuegos popularizaron esta técnica para mantener una frecuencia de fotogramas estable en consolas y PC. La misma idea se aplica a la inferencia en tiempo real, donde un modelo de visión artificial puede reducir el tamaño de la entrada para respetar un presupuesto de latencia en hardware con mucha carga o limitado térmicamente.
Cómo funciona la resolución dinámica#
El DRS es un bucle de realimentación. En cada fotograma, el sistema mide cuánto han tardado los fotogramas anteriores en la GPU, lo compara con el presupuesto y elige una escala de resolución para el siguiente fotograma dentro de unos límites fijos:
La diferencia entre «superarlo» y «quedar bastante por debajo» evita que la resolución oscile entre dos niveles. Por ejemplo, en Unreal Engine, el presupuesto predeterminado es de 33,3 ms por fotograma, es decir, 30 fotogramas por segundo, y el porcentaje de pantalla oscila entre el 50 % y el 100 % de la resolución de salida en cada eje, por lo que el ajuste más ligero renderiza una cuarta parte de los píxeles.
El paso de escalado determina cuánto afecta la menor resolución a la calidad. El escalado espacial sencillo emborrona la imagen, así que los juegos modernos combinan el DRS con técnicas de escalado aprendidas o temporales, como NVIDIA DLSS, AMD FSR, Intel XeSS y PlayStation Spectral Super Resolution de Sony, que combinan fotogramas anteriores y, en la mayoría de las versiones actuales, aprendizaje profundo para reconstruir los detalles. Esa reconstrucción es una forma de superresolución y permite renderizar un juego muy por debajo de su resolución de salida con una pérdida visual mínima.
Resolución dinámica en IA de visión#
En una red neuronal convolucional, el cómputo y la latencia de inferencia aumentan aproximadamente en proporción al número de píxeles de entrada, por lo que reducir a la mitad el lado de la entrada, hasta 320 píxeles, reduce a aproximadamente una cuarta parte los FLOP de un modelo de 640 píxeles. Por tanto, un controlador puede intercambiar resolución por velocidad cuando un dispositivo de IA en el borde, como NVIDIA Jetson, se calienta y reduce la frecuencia de reloj, un servidor recibe más flujos de cámara o un dron necesita capacidad de cálculo adicional para la navegación. El coste es la precisión con objetos pequeños y lejanos, que ocupan muy pocos píxeles a baja resolución; por eso, los sistemas de detección de objetos establecen un tamaño mínimo para la entrada.
Ultralytics YOLO26 admite esta función directamente en el modo de predicción: un modelo PyTorch acepta un imgsz distinto en cada llamada sin necesidad de volver a cargarse, redimensiona el lado más largo de cada fotograma a imgsz y solo rellena el lado más corto hasta el siguiente múltiplo de su stride de 32 píxeles. Los modelos exportados a formatos con dimensiones estáticas mantienen el tamaño con el que se exportaron, salvo que se haya definido dynamic=True. Un controlador sencillo recorre los tamaños permitidos según el tiempo de inferencia medido:
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] # tamaños de entrada permitidos, múltiplos del stride de 32 píxeles
level, budget_ms = len(sizes) - 1, 15.0 # empieza con el tamaño completo y un presupuesto de inferencia de 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
# Reduce el tamaño si se supera el presupuesto y vuelve a aumentarlo solo cuando quede bastante por debajo para evitar oscilaciones
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)La salida muestra cuántos fotogramas se han procesado en cada tamaño; el hardware más lento procesa una mayor parte del vídeo con los tamaños más pequeños.
Términos relacionados#
- Superresolución: Reconstruye una imagen de mayor resolución a partir de otra de menor resolución y suele constituir la segunda mitad de un proceso DRS.
- Streaming con tasa de bits adaptativa: Cambia la calidad del vídeo para adaptarla al ancho de banda de la red, en lugar del tiempo de cálculo.
- Sombreado de tasa variable: Reduce el nivel de detalle del sombreado en regiones concretas de un fotograma, en lugar de escalar el fotograma entero.
- Entrenamiento multiescala: Entrena un modelo con distintos tamaños de entrada para que mantenga la precisión cuando cambia la resolución de inferencia.
- Resolución dinámica nativa en modelos de visión y lenguaje: Codifica cada imagen a su propia resolución en un número variable de tokens para conservar los detalles, como hace Qwen2-VL de Alibaba, que denomina a su versión Naive Dynamic Resolution.










