Objektdetektion verstehen
Lies die Ausgabe eines Detektors aus – Klasse, Box, Konfidenz – und lege anhand der Kosten der einzelnen Fehler die Schwellenwerte für Konfidenz und IoU fest.
Die meisten produktiven Bildverarbeitungssysteme basieren auf Detektion und ergänzender Logik: Zähler, Tracker, Zonenwarnungen und Unschärfe zur Wahrung der Privatsphäre. Wenn sich eines dieser Systeme unerwartet verhält, liegt die Ursache meist nicht am Modell, sondern an einem Schwellenwert, den niemand bewusst festgelegt hat. Wenn du genau weißt, was ein Detektor zurückgibt und welche beiden Stellschrauben diese Liste beeinflussen, kannst du fast alles debuggen, was darauf aufbaut.
Praxisnah
Was ein Detektor zurückgibt#

Jede Beschriftung in diesem Bild entspricht einer Ausgabezeile: einem Klassennamen, einem Konfidenzwert und der Box um das Objekt. Ein Detektionsmodell gibt genau diese Liste zurück:
- Klasse – ein ganzzahliger Index, der über
result.nameseinem Namen zugeordnet wird (0istperson,5istbus). - Box – vier Zahlen, die das Objekt lokalisieren;
xyxygibt die Koordinaten der linken oberen und rechten unteren Ecke in Pixeln an. - Konfidenz – ein Wert zwischen 0 und 1, mit dem Detektionen sortiert und gefiltert werden.
Zählen, Warnmeldungen, Tracking und Unschärfe sind Funktionen, die du auf Basis dieser Ausgabezeilen programmierst.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
for box in result.boxes:
name = result.names[int(box.cls)]
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")bus conf=0.88 box=(0, 230, 803, 751)
person conf=0.87 box=(49, 398, 240, 902)
person conf=0.86 box=(223, 405, 345, 861)
person conf=0.85 box=(670, 395, 810, 880)
person conf=0.65 box=(0, 553, 60, 871)Zeile für Zeile: Die Busbox beginnt bei x=0, weil der Bus am linken Bildrand angeschnitten ist; drei Personen erhalten Werte zwischen 0.85 und 0.87; die vierte Person, die am linken Rand abgeschnitten ist, erreicht nur 0.65 – das Modell sieht nur den halben Körper. Eine geringe Konfidenz bei angeschnittenen Objekten ist normal; hier macht sich ein Schwellenwert oft zuerst bemerkbar.
Jede Box liegt in vier Formaten vor; verwende das Format, das dein nachgelagerter Code erwartet:
| Attribut | Format | Typische Verwendung |
|---|---|---|
boxes.xyxy | Eckpixel (x1, y1, x2, y2) | Zuschneiden, Zeichnen, Überlappungsregeln |
boxes.xywh | Mittelpunkt in Pixeln sowie Breite und Höhe | Größenfilter, Bewegung |
boxes.xyxyn | Auf 0–1 normierte Eckkoordinaten | Regeln, die bei geänderter Auflösung weiterhin gelten |
boxes.xywhn | Auf 0–1 normierter Mittelpunkt und normierte Größe | YOLO-Labeldateien |
Von Kandidaten zur endgültigen Liste#
Intern bewertet das Modell viele Boxkandidaten pro Objekt. Zwei Filter wandeln sie in die angezeigte Liste um:
Konfidenzfilter. conf verwirft Boxen unterhalb eines Schwellenwerts; der Standardwert für Vorhersagen ist 0.25. Im Busbild ändert sich die Anzahl schnell:
conf | Boxen auf bus.jpg |
|---|---|
| 0.10 | 7 |
| 0.25 | 5 |
| 0.50 | 5 |
| 0.75 | 4 |
Duplikatfilter. Nichtmaximale Unterdrückung (NMS) behält die Box mit der höchsten Konfidenz und verwirft andere Boxen derselben Klasse, die sie um mehr als iou überlappen (Standardwert 0.7). Die Überlappung wird als Schnittmenge über Vereinigung gemessen: die gemeinsame Fläche geteilt durch die Gesamtfläche.

iou | Boxen auf bus.jpg | Auswirkung |
|---|---|---|
| 0.3 | 5 | Strikt: Überlappende Boxen werden zusammengeführt |
| 0.7 | 5 | Standard |
| 0.95 | 8 | Tolerant: Beinahe-Duplikate bleiben erhalten |
Wähle die Schwellenwerte anhand der Fehlerkosten#
| Wenn … | Dann … |
|---|---|
| Ein übersehenes Objekt ist teuer (Sicherheitswarnungen, Defekte) | Senke conf und nimm einige Fehlalarme in Kauf |
| Ein Fehlalarm ist für Nutzer sichtbar (Suche, Verschlagwortung) | Erhöhe conf |
| Du meldest die Anzahl | Teste verschiedene Werte für conf mit Validierungsbildern und behalte den Wert mit dem kleinsten Zählfehler bei |
| Echte Nachbarn verschwinden in Menschenmengen | Erhöhe iou, z. B. von 0.7 auf 0.8 |
| Dasselbe Objekt erhält zwei Boxen | Senke iou |
| Die Klassen unterscheiden sich im Schwierigkeitsgrad | Verwende beim Vorhersagen den niedrigsten benötigten Wert für conf und filtere anschließend die einzelnen Klassen im Code |
Die Überwachung der Sicherheit in Lagerhallen ist der klassische Anwendungsfall für einen niedrigen Schwellenwert; im Vorhersagemodus findest du alle Argumente für die Inferenz.
Stolperfallen#
Symptom: „Das Modell ist zu 88 % sicher, dass dies ein Bus ist“ und Schwellenwerte, die nach Gefühl gewählt werden. Lösung: Betrachte die Konfidenz als Rangwert. Bei YOLO26 deckt ein Wert sowohl „da ist ein Objekt“ als auch „es gehört zu dieser Klasse“ ab und ist nicht kalibriert – wähle den Schwellenwert anhand von Validierungsdaten, nicht anhand der Bedeutung des Zahlenwerts.
Wenn zwei Personen Schulter an Schulter stehen, überlappen sich ihre Boxen stark, und NMS kann eine tatsächliche Person als „Duplikat“ entfernen. Erhöhe iou, dann erscheint die zweite Box wieder. YOLO26 enthält außerdem einen End-to-End-Kopf, der ganz ohne NMS auskommt. Übergib nms=False, um ihn zu verwenden.
Symptom: Ein Schwellenwert, der auf dem Demobild perfekt aussieht, versagt bei der echten Kamera. Lösung: Teste verschiedene Schwellenwerte auf einem Validierungssatz von der Einsatzkamera. Ein einzelnes Bild zeigt dir nur, was die Regler bewirken.
Vier Arten, falschzuliegen#
| Fehler | Was ist fehlerhaft? | Typische Lösung |
|---|---|---|
| Richtige Klasse, ungenaue Box | Lokalisierung | Engere, einheitliche Regeln für Boxen; höherer Wert für imgsz bei kleinen Objekten |
| Gute Box, falsche Klasse | Klassifizierung | Mehr Beispiele für das verwechselte Klassenpaar oder die Klassen zusammenführen |
| Überhaupt keine Box | Trefferquote | Mehr Beispiele für diese Bedingungen: Beleuchtung, Größe, Verdeckung |
| Box auf dem Hintergrund | Präzision | Bilder mit schwierigen Negativbeispielen, die das Modell in die Irre geführt haben |
Zwei Listen machen die Fehlerdiagnose einfach: echte positive Treffer mit niedriger Konfidenz (das Modell ist sich bei echten Objekten unsicher) und falsche positive Treffer mit hoher Konfidenz (das Modell ist sich bei der falschen Sache sicher). Sie weisen auf unterschiedliche Lösungen hin.
Lösung anzeigen
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]
for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
name, conf = result.names[int(box.cls)], float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")0.88 bus (0, 230, 803, 751)
0.87 person (49, 398, 240, 902)
0.86 person (223, 405, 345, 861)
0.85 person (670, 395, 810, 880)
0.65 person (0, 553, 60, 871)
0.18 person (0, 600, 40, 871)
0.12 stop sign (0, 252, 35, 326)
0.08 handbag (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag (225, 634, 291, 705)Jede Box unter 0.5 ist ein falsch positiver Treffer. Der Wert 0.18 für person dupliziert die Person mit dem Wert 0.65, die am linken Bildrand abgeschnitten ist. Der Wert 0.12 für stop sign gehört zu einem echten Verkehrsschild mit der falschen Klasse. Die Handtaschen und das Skateboard liegen auf Händen und Schuhen. Alle echten Objekte erzielen mehr als 0.6. Daher behält conf=0.5 für einen Fußgängerzähler alle vier Personen bei und verwirft alle Fehlalarme – so wird eine doppelte Zählung vermieden. Überprüfe den Wert vor dem Einsatz anhand eines Validierungsdatensatzes der echten Kamera: Die abgeschnittene Person mit dem Wert 0.65 zeigt, wie nah echte Objekte am Schwellenwert liegen können.