Dynamic Resolution Scaling
Dynamische Auflösungsskalierung passt die Auflösung der Arbeit für jedes Frame spontan an, um ein Zeitbudget pro Frame einzuhalten. Sie kommt in Spielen und Echtzeit-Vision-KI zum Einsatz.
Die dynamische Auflösungsskalierung (DRS) passt die Auflösung, mit der ein System jedes Einzelbild verarbeitet, Bild für Bild an, damit die Verarbeitungszeit pro Einzelbild ein festgelegtes Budget nicht überschreitet. Wird eine Szene aufwendig, arbeitet der Renderer oder das Modell mit weniger Pixeln; bleibt Spielraum, erhöht es die Auflösung wieder. Die Ausgabe wird üblicherweise auf eine konstante Anzeigegröße hochskaliert. Videospiele machten diese Technik populär, um auf Konsolen und PCs eine stabile Bildrate zu halten. Dasselbe Prinzip gilt für Echtzeitinferenz, bei der ein Computer-Vision-Modell seine Eingabe verkleinern kann, um auf ausgelasteter oder thermisch gedrosselter Hardware ein Latenzbudget einzuhalten.
Funktionsweise der dynamischen Auflösungsskalierung#
DRS ist eine Rückkopplungsschleife. Bei jedem Einzelbild misst das System, wie lange die Verarbeitung der letzten Einzelbilder auf der GPU gedauert hat, vergleicht die Dauer mit dem Budget und wählt innerhalb fester Grenzen eine Auflösungsskalierung für das nächste Einzelbild:
Der Abstand zwischen „zu hoch“ und „deutlich darunter“ verhindert, dass die Auflösung zwischen zwei Stufen flackert. In der Unreal Engine beträgt das Standardbudget beispielsweise 33,3 ms pro Einzelbild, also 30 Einzelbilder pro Sekunde. Der Bildschirmanteil bewegt sich auf jeder Achse zwischen 50 % und 100 % der Ausgabeauflösung, sodass bei der niedrigsten Einstellung nur ein Viertel der Pixel gerendert wird.
Der Hochskalierungsschritt bestimmt, wie stark die niedrigere Auflösung die Bildqualität beeinträchtigt. Einfache räumliche Skalierung lässt das Bild unscharf wirken. Deshalb kombinieren moderne Spiele DRS mit lernbasierten oder zeitlichen Hochskalierern wie NVIDIA DLSS, AMD FSR, Intel XeSS und Sonys PlayStation Spectral Super Resolution, die vorherige Einzelbilder und in den meisten aktuellen Versionen Deep Learning nutzen, um Details zu rekonstruieren. Diese Rekonstruktion ist eine Form der Superauflösung. Dadurch kann ein Spiel deutlich unterhalb seiner Ausgabeauflösung rendern, ohne dass sichtbare Qualität verloren geht.
Dynamische Auflösung in Vision-KI#
Bei einem Convolutional Neural Network steigen Rechenaufwand und Inferenzlatenz ungefähr proportional zur Anzahl der Eingabepixel. Wird die Eingabeseite auf 320 Pixel halbiert, sinken die FLOPs eines Modells mit 640 Pixeln daher auf etwa ein Viertel. Eine Steuerung kann somit Auflösung gegen Geschwindigkeit eintauschen, wenn sich ein Edge-KI-Gerät wie ein NVIDIA Jetson erhitzt und seine Taktfrequenz drosselt, ein Server mehr Kamerastreams übernimmt oder eine Drohne zusätzliche Rechenleistung für die Navigation benötigt. Der Nachteil ist eine geringere Genauigkeit bei kleinen und weit entfernten Objekten, die bei niedriger Auflösung zu wenige Pixel einnehmen. Deshalb legen Objekterkennungssysteme eine Mindestgröße für die Eingabe fest.
Ultralytics YOLO26 unterstützt dies direkt im Vorhersagemodus: Ein PyTorch-Modell akzeptiert bei jedem Aufruf einen anderen Wert für imgsz, ohne neu geladen zu werden. Dabei wird die längere Seite jedes Einzelbilds auf imgsz skaliert und die kürzere Seite nur bis zum nächsten Vielfachen des 32-Pixel-Schritts aufgefüllt. Modelle, die in Formate mit statischer Form exportiert wurden, behalten ihre beim Export festgelegte Größe bei, sofern dynamic=True nicht gesetzt wurde. Eine einfache Steuerung durchläuft anhand der gemessenen Inferenzzeit zulässige Größen:
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] # zulässige Eingabegrößen, Vielfache des 32-Pixel-Schritts
level, budget_ms = len(sizes) - 1, 15.0 # mit voller Größe und einem Inferenzbudget von 15 ms beginnen
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
# Bei Überschreitung des Budgets eine Stufe heruntergehen und erst dann wieder hochgehen, wenn die Auslastung deutlich unter dem Budget liegt, um Flackern zu vermeiden
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)Die Ausgabe zählt die bei jeder Größe verarbeiteten Einzelbilder. Langsamere Hardware verarbeitet einen größeren Teil des Videos mit den kleineren Größen.
Verwandte Begriffe#
- Superauflösung: Rekonstruiert aus einem Bild mit niedriger Auflösung ein Bild mit höherer Auflösung und bildet häufig die zweite Hälfte einer DRS-Pipeline.
- Adaptives Bitraten-Streaming: Passt die Videoqualität an die Netzwerkbandbreite statt an die Rechenzeit an.
- Variable Rate Shading: Verringert die Schattierungsdetails in ausgewählten Bereichen eines Einzelbilds, statt das ganze Einzelbild zu skalieren.
- Training mit mehreren Auflösungen: Trainiert ein Modell mit variierenden Eingabegrößen, damit es auch bei geänderter Inferenzauflösung genau bleibt.
- Native dynamische Auflösung in Vision-Sprachmodellen: Kodiert jedes Bild mit seiner eigenen Auflösung in eine variable Anzahl von Tokens, um Details zu erhalten, wie etwa Alibaba Qwen2-VL, dessen Variante „Naive Dynamic Resolution“ heißt.










