Dynamic Resolution Scaling
O escalonamento dinâmico de resolução altera em tempo real a resolução usada para processar cada quadro, a fim de manter o orçamento de tempo por quadro. É usado em jogos e em IA de visão em tempo real.
O escalonamento dinâmico de resolução (DRS) é uma técnica que ajusta a resolução na qual um sistema processa cada quadro, quadro a quadro, para manter o tempo por quadro dentro de um limite fixo. Quando uma cena exige mais recursos, o renderizador ou o modelo trabalha com menos pixels; quando há capacidade disponível, aumenta novamente a resolução, e a saída costuma ser ampliada para voltar a um tamanho de exibição constante. Os jogos de vídeo popularizaram essa técnica para manter uma taxa de quadros estável em consoles e PCs, e a mesma ideia se aplica à inferência em tempo real, na qual um modelo de visão computacional pode reduzir o tamanho da entrada para respeitar um limite de latência em hardware sobrecarregado ou com a frequência reduzida por temperatura.
Como funciona a escala dinâmica de resolução#
O DRS é um ciclo de retroalimentação. A cada quadro, o sistema mede quanto tempo os quadros anteriores levaram na GPU, compara esse valor com o limite e escolhe uma escala de resolução para o próximo quadro dentro de limites fixos:
A diferença entre «acima do limite» e «bem abaixo» impede que a resolução oscile entre dois níveis. No Unreal Engine, por exemplo, o limite padrão é de 33,3 ms por quadro, ou 30 quadros por segundo, e a porcentagem da tela varia entre 50% e 100% da resolução de saída em cada eixo. Assim, a configuração mais econômica renderiza um quarto dos pixels.
A etapa de ampliação determina quanto de qualidade se perde com a resolução mais baixa. O simples redimensionamento espacial desfoca a imagem, por isso os jogos modernos combinam o DRS com técnicas de ampliação aprendidas ou temporais, como NVIDIA DLSS, AMD FSR, Intel XeSS e PlayStation Spectral Super Resolution da Sony, que combinam quadros anteriores e, na maioria das versões atuais, aprendizado profundo para reconstruir detalhes. Essa reconstrução é uma forma de super-resolução e permite que um jogo renderize bem abaixo da resolução de saída com pouca perda visível.
Resolução dinâmica em IA para visão#
Para uma rede neural convolucional, o custo computacional e a latência de inferência aumentam aproximadamente em proporção ao número de pixels da entrada; assim, reduzir o lado da entrada pela metade, para 320 pixels, reduz para cerca de um quarto os FLOPs de um modelo de 640 pixels. Portanto, um controlador pode trocar resolução por velocidade sempre que um dispositivo de IA de borda, como um NVIDIA Jetson, aquece e reduz a frequência do clock, quando um servidor recebe mais fluxos de câmeras ou quando um drone precisa de capacidade computacional disponível para navegação. O custo é a perda de precisão em objetos pequenos e distantes, que ocupam poucos pixels em baixa resolução; por isso, os sistemas de detecção de objetos estabelecem um limite mínimo para o tamanho da entrada.
Ultralytics YOLO26 oferece suporte direto a isso no modo de predição: um modelo PyTorch aceita um imgsz diferente a cada chamada sem precisar ser recarregado, redimensionando o lado mais comprido de cada quadro para imgsz e preenchendo o lado mais curto somente até o próximo múltiplo do stride de 32 pixels. Já os modelos exportados para formatos com formato estático mantêm o tamanho com o qual foram exportados, a menos que dynamic=True tenha sido definido. Um controlador simples percorre os tamanhos permitidos com base no tempo de inferência 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] # tamanhos de entrada permitidos, múltiplos do stride de 32 pixels
level, budget_ms = len(sizes) - 1, 15.0 # começa no tamanho máximo com um limite de inferência 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
# reduz o tamanho quando ultrapassa o limite e só aumenta novamente quando estiver bem abaixo dele, para evitar oscilações
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)A saída impressa contabiliza os quadros processados em cada tamanho, e o hardware mais lento processa uma proporção maior do vídeo nos tamanhos menores.
Termos relacionados#
- Super-resolução: Reconstrói uma imagem de maior resolução a partir de outra de menor resolução e costuma ser a segunda etapa de um fluxo de DRS.
- Transmissão por taxa de bits adaptável: Ajusta a qualidade do vídeo à largura de banda da rede, em vez de ao tempo de processamento.
- Sombreamento de taxa variável: Reduz os detalhes de sombreamento em regiões selecionadas de um quadro, em vez de redimensionar o quadro inteiro.
- Treinamento multiescala: Treina um modelo com tamanhos de entrada variados para que ele mantenha a precisão quando a resolução de inferência mudar.
- Resolução dinâmica nativa em modelos de visão e linguagem: Codifica cada imagem em sua própria resolução, gerando um número variável de tokens para preservar os detalhes, como no Qwen2-VL da Alibaba, que chama sua versão de Naive Dynamic Resolution.










