15 ausgewählte Computer-Vision-Interviewfragen, gruppiert nach Erfahrungsstufe. Nutzen Sie diese zur Überprüfung von Grundlagen, praktischen Abwägungen und dem produktionsrelevanten Denken auf Senior-Niveau.
1Was ist die diskrete 2D-Faltung eines Bildes, und wie hängt sie mit Filterkernen und Kreuzkorrelation zusammen?
Ein Filterkern ist eine Matrix von Gewichten. Für jede Ausgabeposition multipliziert man die Werte einer lokalen Bildumgebung mit den entsprechenden Gewichten und summiert die Produkte. Bei der mathematischen Faltung wird der Kern für das gleitende Skalarprodukt um 180 Grad gedreht: $(I*K)(i,j)=\sum_{m,n}I(i-m,j-n)K(m,n)$. Kreuzkorrelation verwendet den Kern in seiner ursprünglichen Orientierung: $(I\star K)(i,j)=\sum_{m,n}I(i+m,j+n)K(m,n)$. Beide Operationen sind bei festem Kern linear. Eine Schicht kann zusätzlich einen Bias addieren. Die in PyTorch und TensorFlow als Convolution bezeichnete Operation ist üblicherweise Kreuzkorrelation. Da das Training die Gewichte per Backpropagation lernt, kann es die benötigte Orientierung direkt in den Gewichten abbilden.
2Wann verwenden Sie RGB, HSV, Lab, YCbCr oder Graustufen in einer Bildverarbeitungspipeline?
Wählen Sie eine Darstellung, die die benötigten Signale erhält und zur Vorverarbeitung im Training passt. Die Kanalreihenfolge Rot–Grün–Blau (RGB) ist für gelernte Modelle üblich; viele OpenCV-Programmierschnittstellen (APIs) verwenden dagegen Blau–Grün–Rot (BGR). Prüfen Sie die Kanalreihenfolge, statt eine Frameworkgarantie anzunehmen. Darstellungen aus Farbton, Sättigung und Helligkeitswert (HSV) beziehungsweise Helligkeit (HSL) erleichtern die Wahl von Farbschwellen, doch der Farbton ist nahe Sättigung null instabil und allgemein weder beleuchtungs- noch weißabgleichsinvariant. Der Lab-Farbraum der Internationalen Beleuchtungskommission (CIE) trennt Helligkeit von Gegenfarbkoordinaten und ist unter festgelegten Betrachtungs- und Referenzweißannahmen ungefähr wahrnehmungsgleichmäßig. Der euklidische Abstand Delta E 1976 ist nur eine Näherung der wahrgenommenen Farbdifferenz. YCbCr trennt das Helligkeitssignal Y′ von den Blau- und Rotdifferenzkanälen Cb und Cr und unterstützt in vielen Bild-/Videoformaten eine reduzierte Abtastung der Farbinformation. Koeffizienten, Wertebereiche und Transferfunktionen hängen vom Standard ab. Graustufen sind sinnvoll, wenn Farbe irrelevant ist; bei gleicher Präzision sinkt der rohe Kanalspeicher von drei auf einen Kanal. Das garantiert aber keine Verringerung der gesamten Modellberechnung um zwei Drittel. Erhalten Sie Farbe wenn sie Informationen über die Zielklasse trägt und prüfen Sie Skalierungs- und Konvertierungskonventionen.
import cv2
import numpy as np
# Sample image: saturated red under normal and shaded lighting
img_bgr = np.zeros((100, 100, 3), dtype=np.uint8)
img_bgr[:, :50] = [0, 0, 255] # Bright Red in BGR
img_bgr[:, 50:] = [0, 0, 120] # Shaded/Dark Red in BGR
# Convert to HSV (OpenCV H: 0-179, S: 0-255, V: 0-255)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
# Red Hue wraps around 0/180; track red with single Hue range [0, 10] & high saturation
lower_red = np.array([0, 100, 50])
upper_red = np.array([10, 255, 255])
mask_hsv = cv2.inRange(img_hsv, lower_red, upper_red)
print("HSV segmented pixels:", np.count_nonzero(mask_hsv), "out of", mask_hsv.size)
3Warum sind kanalweise Bildnormalisierung, Normalisierung pro Bild und konsistente Pixelskalierung in Computer-Vision-Systemen wichtig?
Verwenden Sie in Training und Inferenz denselben vom Modell erwarteten Pixelbereich, dieselbe Kanalreihenfolge und Normalisierung. Bei 8-Bit-Bildern bildet Division durch 255 nach [0,1] ab, zentriert aber nicht um null. Abbildung nach [−1,1] zentriert den Bereich, nicht unbedingt den Datenmittelwert. Bilder können andere Ganzzahlbittiefen oder Gleitkommawerte in physikalischen Einheiten verwenden. Große unskalierte Werte können Optimierung schlecht konditionieren, verursachen aber nicht zwangsläufig explodierende Gradienten. Kanalstandardisierung verwendet (x−mu_c)/sigma_c mit Trainingsstatistiken oder vorgeschriebenen Konstanten eines vortrainierten Modells. Mittelwert null und Varianz eins gelten für die Schätzverteilung, nicht jedes neue Bild oder jeden Datensatz. Ein Z-Score pro Bild nutzt dessen Mittelwert und Standardabweichung mit Schutz vor nahezu verschwindender Varianz. Min-Max-Skalierung ist eine andere Operation. InstanceNorm ist eine Netzwerkschicht, die typischerweise je Bild und Kanal über räumliche Dimensionen normalisiert, kein Synonym für beliebige bildweise Vorverarbeitung. Bildweise Normalisierung kann Helligkeits-/Kontrastvariation reduzieren, aber auch nützliche Informationen über absolute Intensitäten entfernen. Validieren Sie sie aufgabenspezifisch.
import torch
import torchvision.transforms as T
from PIL import Image
import numpy as np
# Create a mock uint8 RGB image
raw_img = Image.fromarray(np.random.randint(0, 256, (224, 224, 3), dtype=np.uint8))
# Standard transform pipeline:
# 1. ToTensor scales uint8 [0, 255] -> float32 [0.0, 1.0] and permutes HWC -> CHW
# 2. Normalize standardizes per-channel using dataset mean and std
preprocess = T.Compose([
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
tensor_img = preprocess(raw_img)
print("Tensor shape:", tensor_img.shape)
print("Tensor dtype:", tensor_img.dtype)
print("Channel 0 min/max:", round(tensor_img[0].min().item(), 2), round(tensor_img[0].max().item(), 2))
4Wie fördern geometrische und photometrische Datenaugmentationen Invarianz, und woran erkennt man, ob ein Label erhalten bleibt?
Geometrische Transformationen wie Drehung, Verschiebung, Skalierung und Spiegelung verändern Bildkoordinaten. Photometrische Varianten wie Helligkeit, Kontrast, Farbtonänderung oder Unschärfe verändern Intensitäten, ohne die Koordinaten zu verschieben. Bei Klassifikation können Vorhersagen so gegenüber plausiblen Änderungen von Pose, Blickwinkel und Beleuchtung stabiler werden. Bei Detektion und Segmentierung müssen Boxen und Masken geometrisch mittransformiert werden, damit die Ausgabe weiterhin zur Eingabe passt. Das Label bleibt gültig, wenn das Ergebnis ein plausibles Beispiel derselben Klasse ist. Horizontales Spiegeln funktioniert oft für Autos und Tiere, kann aber Buchstaben oder Ziffern unlesbar machen oder ihre Identität ändern. Beliebige Drehwinkel können für Histologie oder manche Satellitenbilder ohne feste Ausrichtung passen. Im Straßenverkehr wären auf dem Kopf stehende Objekte häufig unrealistisch.
5Was sind Nächster-Nachbar-, bilineare, bikubische und Flächeninterpolation, und wie können Größenänderungen Aliasing oder Unschärfe verursachen?
Interpolationsmethoden schätzen Pixelintensitäten an kontinuierlichen Koordinaten, wenn auf ein neues diskretes Gitter resampelt wird:
- **Nächster-Nachbar-Interpolation:** Weist die Intensität des nächsten diskreten Pixels zu. Sie ist rechnerisch $O(1)$ und bewahrt exakte Originalwerte, erzeugt aber beim Hochskalieren (Upsampling) blockartige Artefakte und beim Herunterskalieren (Downsampling) stark gezackte Kanten.
- **Bilineare Interpolation:** Berechnet einen distanzgewichteten Durchschnitt der $2 \times 2$ (4 nächsten) Nachbarpixel unter Verwendung linearer Interpolation entlang beider Achsen, was sanfte Übergänge mit moderater Unschärfe ergibt.
- **Bikubische Interpolation:** Sampelt eine $4 \times 4$ (16 nächste) Nachbarschaft unter Verwendung kubischer Polynomkerne. Sie erfasst lokale Intensitätsgradienten und erzeugt schärfere Kanten und glattere Kurven als die bilineare Interpolation, kann aber Überschwingen/Ringing-Artefakte an scharfen Übergängen verursachen.
- **Flächeninterpolation (Area Interpolation):** Berechnet die fraktionelle Flächenüberlappung von Zielpixeln, die auf Quellpixel projiziert werden, und mittelt die zugrunde liegenden Quellintensitäten. Sie ist besonders effektiv für das Herunterskalieren ohne Moiré-Effekte.
**Mechanismen von Aliasing und Unschärfe:**
- **Aliasing** tritt beim Herunterskalieren auf, wenn hochfrequenter Inhalt die Nyquist-Frequenz ($f_s / 2$) der neuen Abtastrate ohne ausreichende Tiefpassfilterung überschreitet. Hochfrequenzen falten sich in niedrigere Frequenzbänder zurück, was zu falschen Mustern, Moiré und gezackten Kanten führt.
- **Unschärfe** tritt auf, wenn Interpolationskerne als tiefpassfilternde Glättungsfilter wirken, die legitime Hochfrequenzen dämpfen (z.B. bilineare Glättung), oder wenn hochfrequente Details beim Herunterskalieren gemittelt werden.
6Gegen welche realen visuellen Fehlermodi sollte ein Vision-System evaluiert werden, und wie verschieben diese die Eingabeverteilung?
Reale visuelle Fehlermodi fallen in mehrere Hauptkategorien: Umgebungsbedingungen (wenig Licht, direkte Blendung, Regen, Schnee, Nebel), Sensor- und optische Effekte (Bewegungsunschärfe, Unschärfe durch Defokussierung, Sensorrauschen bei hoher ISO-Empfindlichkeit, Rolling-Shutter-Verzerrung), Kompressions- und Übertragungsbeeinträchtigungen (JPEG (Joint Photographic Experts Group)-Blockbildung, Video-Bitraten-Drosselung, Downsampling) sowie semantische/räumliche Verschiebungen (teilweise Verdeckung, Abschneidung, Objektposen außerhalb der Trainingsverteilung).
Diese Fehlermodi verschieben die Eingabeverteilung auf mehreren Ebenen von den nominellen Trainingsdomänen weg. Auf Pixelebene verändern sie die Luminanz- und Chrominanz-Histogramme, zerstören den lokalen Kontrast, reduzieren das Signal-Rausch-Verhältnis (SNR) und führen künstliche Hochfrequenzartefakte oder Unschärfekerne ein. Auf struktureller und semantischer Ebene schwächen sie Kantenverläufe ab, verdecken wichtige visuelle Merkmale, verzerren Silhouetten und verbergen kritische Diagnosebereiche. Wenn Modelle, die mit sauberen Daten trainiert wurden, auf diese verschobenen Eingaben stoßen, aktivieren niederstufige Faltungs- oder Aufmerksamkeits-Merkmalsextraktoren nicht korrekt, was zu verpassten Detektionen, halluzinierten Fehlalarmen bei Rauschmustern und übertrieben selbstsicheren Fehlern führt.
7Wie beschreibt HOG die Bildstruktur, und welche Grenzen hat der Deskriptor gegenüber gelernten CNN-Merkmalen?
HOG bildet Histogramme orientierter Gradienten und erfasst damit die lokale Form von Objekten. Zuerst berechnet man horizontale und vertikale Helligkeitsgradienten, etwa mit dem Ableitungsfilter $[-1,0,1]$. Aus ihnen folgen Betrag und Richtung. In Zellen von beispielsweise $8\times8$ Pixeln sammelt man die Richtungen in Histogrammen, gewichtet mit dem Gradientenbetrag. Benachbarte Zellen werden zu überlappenden Blöcken von etwa $2\times2$ Zellen gruppiert. Normalisierung mit L2 oder L1-sqrt macht die Vektoren robuster gegen lokale Kontrast- und Beleuchtungsunterschiede. Die verketteten Blöcke ergeben den Merkmalsvektor, historisch oft mit einer linearen SVM für Fußgänger- oder Objektdetektion verwendet. HOG ist fest vorgegeben und beschreibt lokale Kantenorientierungen. Ein CNN lernt für die Zielaufgabe dagegen mehrstufige Merkmale, von einfachen Strukturen bis zu Objektteilen und semantischen Konzepten. Die räumliche Gruppierung toleriert kleine Verschiebungen, bietet aber nur begrenzte Robustheit gegen räumliche Drehungen, starke Größenänderungen, veränderte Gelenkstellungen und unruhige Hintergründe.
8Wie bestimmen Schrittweite, Padding, Dilatation und Kernelgröße die Ausgabegröße und das rezeptive Feld einer Faltung?
Für eine Achse ist die effektive Kernelgröße $k'=d(k-1)+1$, weil zwischen Kernpositionen je $d-1$ Lücken liegen. Bei Eingabegröße $I$, symmetrischem Padding $p$ und Schrittweite $s$ ist die Ausgabegröße $O=\lfloor (I+2p-k')/s\rfloor+1$. Die Schrittweite legt die Abstände der Fenster fest. Padding passt die Ränder und damit die Ausgabegröße an. Dilatation vergrößert den abgedeckten Bereich ohne zusätzliche Gewichte und kann bei unverändertem Padding auch die Ausgabegröße ändern. Das theoretische rezeptive Feld misst, welcher Eingabebereich eine Aktivierung beeinflussen kann. Setze an der Eingabe $j_0=1$ und $RF_0=1$. In Schicht $l$ gilt für den kumulativen Abstand $j_l=j_{l-1}s_l$ und für die Feldgröße $RF_l=RF_{l-1}+(k'_l-1)j_{l-1}$. Schritte und Pooling vergrößern den Abstand multiplikativ. Spätere Fenster vergrößern deshalb das Feld um mehr Eingabepixel.
9Wie hängt ein Faltungskern mit einem klassischen linearen Bildfilter zusammen, und wann ist ein 2D-Kern separierbar?
Der Faltungskern ist die räumliche Impulsantwort eines linearen, verschiebungsinvarianten Filters. Seine 2D-Fouriertransformierte ist der Frequenzgang. Die Faltung multipliziert im Frequenzraum das Bildspektrum mit diesem Frequenzgang. Gauß- und Boxfilter dämpfen hohe Ortsfrequenzen. Sobel, Laplace und Prewitt heben für die Kantenerkennung räumliche Änderungen hervor. Ein von null verschiedener $M\times N$-Kern ist separierbar, wenn $K=uv^T$ mit zwei eindimensionalen Filtern gilt. Das ist bei Rang eins der Fall. Eine Singulärwertzerlegung hat dann genau einen von null verschiedenen Singulärwert. Statt $O(HWK^2)$ Rechenoperationen für einen quadratischen Kernel mit Kantenlänge $K$ benötigt die horizontale und vertikale Filterung $O(HW\,2K)$. Bei $15\times15$ sind das etwa 7,5-mal weniger Kernbeiträge pro Pixel. Die gemessene Beschleunigung hängt auch von Implementierung und Speicherverkehr ab.
10Wie verändern direktes Skalieren, zentrales Zuschneiden, Random Resized Crop und Letterboxing die Eingabeverteilung?
Direktes Skalieren auf $(H,W)$ kann verschiedene Faktoren für die beiden Achsen verwenden. Das verformt etwa einen Kreis zur Ellipse. Ein zentraler Ausschnitt erhält die lokalen Proportionen und die ursprüngliche Skalierung, gewichtet aber die Bildmitte stärker und kann Randobjekte oder Kontext abschneiden. Random Resized Crop wählt zufällige Ausschnitte unterschiedlicher Fläche und Seitenverhältnisse und skaliert sie auf die Zielgröße. Das variiert den Objektmaßstab und kann die Erkennung anhand von Teilmerkmalen fördern. Extreme Ausschnitte können das Ziel vollständig entfernen. Letterboxing skaliert mit einem gemeinsamen Faktor, sodass beide Achsen in die Zielgröße passen. Die verbleibenden Ränder werden aufgefüllt. Objektproportionen bleiben erhalten, aber künstliche Kanten und Pixel ohne Bildinhalt kommen hinzu.
11Welche Arten von Annotationsfehlern treten in Bilddatensätzen auf, und wie lassen sie sich erkennen oder abmildern?
Klassenlabels können falsch sein, etwa wenn eine Katze als Hund markiert wird. Fehlende Annotationen lassen echte Objekte unmarkiert. Bei der Detektion können solche Objekte fälschlich als Hintergrund in den Trainingsverlust eingehen. Lokalisierungsfehler umfassen verschobene oder zu großzügige Boxen und ungenaue Schlüsselpunkte. Maskengrenzen können bei Haaren, halbtransparenten Flächen oder Bewegungsunschärfe uneinheitlich sein. Ein dauerhaft hoher Trainingsverlust ist ein Hinweis für eine gezielte Nachprüfung. Confident Learning kann wahrscheinliche Labelfehler markieren. Out-of-Fold-Vorhersagen aus der Kreuzvalidierung helfen, falsche Labels oder fehlende Boxen zu finden. Mehrfachannotation mit Cohens Kappa für Klassen oder mittlerer IoU für Positionen zeigt Fälle mit geringer Übereinstimmung, die man gemeinsam klärt. Label Smoothing, rauschrobuste Klassifikationsverluste und geeignete IoU-basierte Regressionsverluste können je nach Fehlerart die Empfindlichkeit reduzieren.
import torch
import torch.nn.functional as F
def find_label_noise_candidates(model, dataloader, device, top_k=50):
model.eval()
sample_losses = []
with torch.no_grad():
for batch_idx, (images, targets, sample_ids) in enumerate(dataloader):
images, targets = images.to(device), targets.to(device)
logits = model(images)
loss_per_sample = F.cross_entropy(logits, targets, reduction='none')
for sid, l, target, pred in zip(sample_ids, loss_per_sample.cpu(), targets.cpu(), logits.argmax(dim=-1).cpu()):
sample_losses.append({'id': sid, 'loss': l.item(), 'target': target.item(), 'pred': pred.item()})
sample_losses.sort(key=lambda x: x['loss'], reverse=True)
return sample_losses[:top_k]
12Wie beeinflussen ungleiche Klassenhäufigkeiten das Training bei Bildklassifikation, Objektdetektion und dichter Vorhersage?
Bei der Bildklassifikation können häufige Klassen den empirischen Verlust und die Gradienten dominieren. Die gelernten Entscheidungen begünstigen dann unter Umständen häufige Klassen. Hohe Top-1-Genauigkeit kann mit niedrigem Recall seltener Klassen einhergehen. Bei dichten Detektoren können über 99 % der Kandidaten Hintergrund sein. Selbst kleine Beiträge vieler leicht zu erkennender Hintergrundpositionen können sich zu einem größeren Gradienten als dem der wenigen Vordergrundobjekte summieren. Unter den Vordergrundklassen liefern seltene Kategorien zudem weniger Beispiele und schwächere Lernsignale. Bei Segmentierung belegen flächige Klassen wie Straße oder Himmel viele Pixel, während kleine Objekte wie Schilder oder Fußgänger manchmal weniger als 0,1 % des Bildes ausmachen. Ein ungewichteter pixelweiser Kreuzentropieverlust kann so von großen Klassen dominiert werden. Kleine oder dünne Strukturen werden dann unter Umständen nur teilweise oder gar nicht segmentiert.
13Wie diagnostizieren Sie ungültige Zahlenwerte (NaN) oder instabilen Verlust bei großem verteiltem Computer-Vision-Training?
Grenzen Sie bei datenparallelem verteiltem Training (DDP) fehlerhafte Eingaben, Über- und Unterläufe bei automatischer Berechnung mit gemischter Genauigkeit (AMP) und Optimierungsinstabilität zwischen Workern ein. Erfassen Sie reproduzierbare Eingaben, Seeds und Konfiguration. Aktivieren Sie torch.autograd.set_detect_anomaly(True), wobei Anomalieerkennung die Ausführung nicht selbst deterministisch macht. Gradienten-/Aktivierungshooks lokalisieren die erste NaN-Schicht. Validieren Sie im DataLoader endliche Werte, beschädigte Null-Byte-Bilder, leere Boxen und Normalisierung mit Varianz null. Loggen Sie pro Minibatch und Rank Verlust, Kennungen der Eingabedaten, Gradientennorm vor Clipping und GradScaler-Faktoren. Prüfen Sie AMP und dynamische Verlustskalierung: Gradienten in 16-Bit-Gleitkommadarstellung (FP16) über 65504 laufen über. GradScaler überspringt ungültige Updates und reduziert die Skala mit dem konfigurierten Reduktionsfaktor. Dauerhafter Skaleneinbruch ist ein Diagnosehinweis, keine normale Konvergenz gegen null. Instabile Operationen wie Softmax, LayerNorm, Focal-Loss-Exponenten oder Nenner des Verhältnisses aus Schnitt- und Vereinigungsfläche (IoU) in 32-Bit-Gleitkommadarstellung (FP32) beziehungsweise im 16-Bit-Format BF16 mit dem Dynamikbereich von FP32 stabilisieren häufig. Prüfen Sie außerdem die NaN-Ausbreitung von einem Prozess auf alle anderen durch All-Reduce sowie Anlaufphase und Skalierung der Lernrate bei großen globalen Trainingsstapeln, etwa gemäß der linearen Skalierungsregel. Begrenzen Sie Gradienten erst nach dem Rückgängigmachen der AMP-Skalierung. Leere Annotationen können gültige Negative sein. Prüfen Sie den Aufgabenvertrag, statt jedes leere Bild abzulehnen.
import torch
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)
for step, (images, targets, uris) in enumerate(dataloader):
# 1. Input sanitization
if not torch.isfinite(images).all():
print(f"Corrupt input detected from URIs: {uris}")
continue
optimizer.zero_grad(set_to_none=True)
with autocast(dtype=torch.float16):
outputs = model(images)
loss = criterion(outputs, targets)
if not torch.isfinite(loss):
print(f"NaN/Inf loss at step {step} on rank {torch.distributed.get_rank()}; skipping step.")
continue
scaler.scale(loss).backward()
# Unscale before clipping to inspect true gradient norms
scaler.unscale_(optimizer)
grad_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
if torch.isnan(grad_norm) or torch.isinf(grad_norm):
print(f"Warning: Grad norm is {grad_norm}. Scaler will adjust.")
scaler.step(optimizer)
scaler.update()
14Wie entwerfen Sie eine digitale Online-Videostabilisierung für eine Kamera mit Bildzittern?
Schätzen Sie robuste Interframe-Bewegung aus verfolgten Ecken oder einander zugeordneten Deskriptoren, verwerfen Sie Vordergrundbewegung und wählen Sie ein passendes Translations-, Ähnlichkeits-, affines oder Homografiemodell. Definieren Sie Transformationsrichtungen explizit. Bei Spaltenvektoren und H_t von Frame t−1 nach t gilt für den Referenz-zu-aktuell-Pfad P_t = H_t * P_{t−1}. Glätten Sie den Pfad zu S_t mit kausalem Filter oder begrenztem Vorausblick und korrekter Rotations-/Transformationsbehandlung statt beliebiger Mittelung von Matrixeinträgen. Die Vorwärtskorrektur vom aktuellen in das stabilisierte Bild ist C_t = S_t * inverse(P_t). Übergeben Sie sie oder ihre Inverse entsprechend der Abtastkonvention der Programmierschnittstelle (API) für die Bildtransformation. Begrenzen Sie Zuschnitt und Vergrößerung und Stärke gegen ungültige Ränder. Bei Trackingverlust oder Szenenschnitt wird zurückgesetzt oder wiederhergestellt. Starke Parallaxe und zeitversetztes zeilenweises Sensorauslesen (Rolling Shutter) können komplexere Modelle oder Trägheitssensoren erfordern. Strikt kausale Verarbeitung nutzt keine zukünftigen Frames; jeder Vorausblickframe erhöht Aufnahmelatenz. Wählen Sie Pufferung und Zuschnittsregeln anhand gemessener Qualität und Latenzanforderungen.
15Wie optimieren Sie eine Echtzeit-Vision-Pipeline, wenn der Detektor langsamer als die Zielbildrate ist?
Kann ein Detektor etwa nur 15–20 Bilder pro Sekunde (FPS) eines Streams mit 60 FPS verarbeiten, entkoppelt eine asynchrone mehrthreadige Pipeline aufwendige Detektion und Echtzeitausgabe. Ein Erfassungsthread erfasst kontinuierlich Frames. Ein Hintergrund-Worker führt den aufwendigen Detektor auf ausgewählten Keyframes aus. Ein leichter Tracker, etwa Lucas-Kanade-Fluss oder Korrelationsfilter, optional mit Kalman-Prognose, verarbeitet jeden Frame mit 60 FPS und erhält Objektzustände zwischen Detektionen. ByteTrack/BoT-SORT sind Tracking-by-Detection-Verfahren und benötigen ohne neue Detektionen eine explizite Prognose-/Visual-Tracking-Regel. Trackalter, Unsicherheit und Erkennungsrate neuer Objekte sind zu überwachen. Begrenzte Ringbuffer und Regeln zum Verwerfen alter zugunsten neuester Frames verhindern unbegrenzte Latenz bei Rückstau. Ist die Detektion für T_0 erst bei T_curr fertig, ist sie veraltet. Ordnen Sie ihr Ergebnis dem historischen Tracklet-Zustand bei T_0 zu, korrigieren Sie Identitäten und übersehene Tracks und propagieren Sie diese Korrektur über Bewegungsvektoren beziehungsweise Kalman-Vorhersageschritte bis T_curr.
import queue
import threading
frame_queue = queue.Queue(maxsize=1) # Drop stale frames, keep latest
det_result_queue = queue.Queue()
def detector_worker():
while True:
frame, frame_id, timestamp = frame_queue.get()
boxes, scores, classes = heavy_detector.infer(frame)
det_result_queue.put({'frame_id': frame_id, 'boxes': boxes, 'timestamp': timestamp})
def realtime_pipeline(video_stream):
tracker = FastTracker() # e.g. Optical flow or Kalman tracker
for frame, frame_id, timestamp in video_stream:
if frame_queue.empty():
frame_queue.put((frame, frame_id, timestamp))
if not det_result_queue.empty():
det_result = det_result_queue.get()
tracker.reconcile_and_correct(det_result, current_frame_id=frame_id)
active_tracks = tracker.update(frame)
display_or_downstream(frame, active_tracks)