Dynamic Resolution Scaling
Il ridimensionamento dinamico della risoluzione modifica al volo la risoluzione di ogni frame per rispettare un budget di tempo per frame; viene usato nei videogiochi e nell'IA di visione in tempo reale.
Il ridimensionamento dinamico della risoluzione (DRS) è una tecnica che regola la risoluzione con cui un sistema elabora ogni fotogramma, fotogramma per fotogramma, per mantenere il tempo di elaborazione entro un budget fisso. Quando una scena richiede molte risorse, il renderer o il modello elabora meno pixel; quando c'è margine, aumenta di nuovo la risoluzione e, di solito, l'output viene ingrandito alla dimensione di visualizzazione costante. I videogiochi l'hanno reso popolare per mantenere stabile la frequenza dei fotogrammi su console e PC. Lo stesso principio si applica all'inferenza in tempo reale, dove un modello di visione artificiale può ridurre le dimensioni dell'input per rispettare il budget di latenza su hardware sotto carico o con frequenza ridotta per motivi termici.
Come funziona la scalabilità dinamica della risoluzione#
Il DRS è un ciclo di feedback. A ogni fotogramma, il sistema misura quanto tempo hanno richiesto gli ultimi fotogrammi sulla GPU, confronta il risultato con il budget e sceglie la scala di risoluzione del fotogramma successivo entro limiti fissi:
La differenza tra «oltre il limite» e «ben al di sotto» evita che la risoluzione sfarfalli tra due livelli. In Unreal Engine, per esempio, il budget predefinito è di 33,3 ms per fotogramma, ovvero 30 fotogrammi al secondo, e la percentuale dello schermo varia tra il 50% e il 100% della risoluzione di output lungo ciascun asse, perciò l'impostazione più economica esegue il rendering di un quarto dei pixel.
La fase di upscaling determina quanta qualità si perde con la risoluzione inferiore. Il semplice ridimensionamento spaziale sfoca l'immagine, quindi i giochi moderni abbinano il DRS a tecniche di upscaling apprese o temporali come NVIDIA DLSS, AMD FSR, Intel XeSS e PlayStation Spectral Super Resolution di Sony, che combinano i fotogrammi precedenti e, nella maggior parte delle versioni attuali, il deep learning per ricostruire i dettagli. Questa ricostruzione è una forma di super-risoluzione e consente al gioco di eseguire il rendering a una risoluzione molto inferiore a quella di output con una perdita visibile minima.
Risoluzione dinamica nell'IA per la visione#
Per una rete neurale convoluzionale, il calcolo e la latenza di inferenza crescono all'incirca in proporzione al numero di pixel in input; dimezzare il lato dell'input a 320 pixel riduce quindi a circa un quarto i FLOPs di un modello a 640 pixel. Un controller può così scambiare risoluzione con velocità quando un dispositivo di IA edge, come un NVIDIA Jetson, si surriscalda e riduce la frequenza di clock, un server gestisce più flussi di telecamere o un drone ha bisogno di potenza di calcolo disponibile per la navigazione. Il prezzo è una minore accuratezza sugli oggetti piccoli e lontani, che a bassa risoluzione occupano troppo pochi pixel; per questo i sistemi di rilevamento degli oggetti impongono una dimensione minima dell'input.
Ultralytics YOLO26 supporta questa funzione direttamente in modalità predict: un modello PyTorch accetta un valore imgsz diverso a ogni chiamata senza essere ricaricato, ridimensionando il lato più lungo di ciascun fotogramma a imgsz e aggiungendo padding al lato più corto solo fino al multiplo successivo del suo stride di 32 pixel; i modelli esportati in formati con forma statica mantengono invece la dimensione con cui sono stati esportati, a meno che non sia stato impostato dynamic=True. Un semplice controller passa da una dimensione consentita all'altra in base al tempo di inferenza misurato:
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] # dimensioni di input consentite, multipli dello stride di 32 pixel
level, budget_ms = len(sizes) - 1, 15.0 # inizia dalla dimensione massima con un budget di inferenza di 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
# Riduci la dimensione quando superi il budget e aumentala di nuovo solo quando sei ampiamente al di sotto, per evitare sfarfallii
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)L'output mostra il numero di fotogrammi elaborati a ciascuna dimensione; l'hardware più lento trascorre una porzione maggiore del video alle dimensioni inferiori.
Termini correlati#
- Super-risoluzione: ricostruisce un'immagine a risoluzione maggiore a partire da una a risoluzione inferiore ed è spesso la seconda metà di una pipeline DRS.
- Streaming a bitrate adattivo: modifica la qualità video in base alla larghezza di banda della rete anziché al tempo di calcolo.
- Shading a velocità variabile: riduce il livello di dettaglio dello shading in aree selezionate di un fotogramma, anziché ridimensionare il fotogramma intero.
- Addestramento multiscala: addestra un modello con dimensioni di input variabili affinché mantenga l'accuratezza quando cambia la risoluzione di inferenza.
- Risoluzione dinamica nativa nei modelli visione-linguaggio: codifica ogni immagine alla propria risoluzione in un numero variabile di token per preservare i dettagli, come nel modello Qwen2-VL di Alibaba, che chiama la propria versione Naive Dynamic Resolution.










