Detection Head
Ein Detektionskopf ist der letzte Teil eines Objektdetektors. Er wandelt die Merkmale von Backbone und Neck an jeder Gitterposition in Box- und Klassenwerte um.
Ein Detektionskopf ist der letzte Satz von Schichten in einem Netzwerk zur Objekterkennung. Er verarbeitet die von den vorherigen Schichten erzeugten Merkmalskarten und gibt an jedem möglichen Ort einen Begrenzungsrahmen sowie einen Wert für jede Klasse aus. Sein Aufbau bestimmt, wie Rahmen codiert werden – als Abstände zu Ankerrahmen oder als Entfernungen von einem Punkt –, wie viele mögliche Rahmen das Modell erzeugt und ob ein Nachbearbeitungsschritt wie die Nicht-Maximum-Unterdrückung (NMS) Duplikate entfernen muss.
Position des Detektionskopfs#
Moderne Detektoren bestehen aus drei Stufen. Ein Backbone, in der Regel ein faltendes Netzwerk oder ein Vision Transformer, wandelt Pixel in Merkmalskarten um, deren Auflösung mit zunehmender Tiefe sinkt und deren semantischer Gehalt steigt. Ein Neck, beispielsweise ein Merkmalspyramidennetzwerk (FPN), führt tiefe und flache Merkmalskarten zusammen, sodass jede Ausgabeskala sowohl feine Details als auch Kontext enthält. Der Kopf führt dann auf jeder Pyramidenstufe kleine Faltungszweige aus, typischerweise mit Schrittweiten von 8, 16 und 32. So finden die feinen Merkmalskarten kleine Objekte und die groben große.
Einstufige Detektoren haben einen einzelnen dichten Kopf, der an jeder Rasterzelle eine Vorhersage trifft. Zweistufige Detektoren wie Faster R-CNN haben zwei Köpfe: ein Region Proposal Network, das Anker an jedem Ort bewertet, und anschließend einen Region-of-Interest-Kopf, der die wenigen Hundert vorgeschlagenen Regionen klassifiziert und verfeinert.
So sagt ein Kopf Rahmen und Klassen voraus#
An jeder Rasterzelle sagt ein dichter Kopf drei Arten von Werten voraus:
- Klassenwerte: Ein Wert pro Klasse, jeweils durch eine Sigmoidfunktion geleitet, sodass ein Ort jede Klasse unabhängig bewerten kann.
- Rahmenregression: Vier Zahlen, die einen Rahmen festlegen: entweder Versätze, die einen Ankerrahmen verschieben und skalieren, oder Entfernungen vom Mittelpunkt der Zelle zu den vier Rahmenkanten.
- Qualitäts- und Aufgabenwerte: Ein Objektheitswert (YOLOv1 bis YOLOv5) oder ein Zentriertheitswert (FCOS) zur Rangordnung der Rahmen sowie aufgabenspezifische Werte wie Maskenkoeffizienten für die Instanzsegmentierung oder Schlüsselpunkte für die Posenschätzung.
Die Codierung der Rahmen unterscheidet ankerbasierte Detektoren von ankerfreien Detektoren. Jeder Zweig besteht aus einigen Faltungen und endet mit einer 1 × 1-Faltung, die für jeden vorhergesagten Wert einen Ausgabekanal hat. RetinaNet und FCOS verwendeten bereits getrennte Klassifizierungs- und Regressionszweige. YOLOX führte diesen entkoppelten Kopf 2021 bei YOLO ein und berichtete von einer deutlich schnelleren Konvergenz beim Training als bei der einzelnen gemeinsamen Ausgabeschicht von YOLOv3. Die folgende Skizze erstellt diese abschließenden 1 × 1-Schichten für die drei Pyramidenstufen eines Bildes mit 640 × 640 Pixeln und flacht ihre Ausgaben zu einer einzigen Liste möglicher Objekte ab:
import torch
from torch import nn
# Neck outputs for a 640x640 image at strides 8, 16, and 32 (80x80, 40x40, and 20x20 grids)
channels = (64, 128, 256)
features = [torch.randn(1, c, 640 // s, 640 // s) for c, s in zip(channels, (8, 16, 32))]
# Decoupled head: a box branch (4 values) and a class branch (80 scores) for every pyramid level
box_branches = nn.ModuleList(nn.Conv2d(c, 4, 1) for c in channels)
cls_branches = nn.ModuleList(nn.Conv2d(c, 80, 1) for c in channels)
# Flatten each level's grid and concatenate, giving one candidate per grid cell
boxes = torch.cat([branch(f).flatten(2) for branch, f in zip(box_branches, features)], dim=2)
scores = torch.cat([branch(f).flatten(2) for branch, f in zip(cls_branches, features)], dim=2).sigmoid()
print(f"boxes {tuple(boxes.shape)}, class scores {tuple(scores.shape)}")Ausgegeben wird boxes (1, 4, 8400), class scores (1, 80, 8400): Die 6.400 + 1.600 + 400 Rasterzellen schlagen jeweils einen Rahmen mit 80 Klassenwerten vor.
Von Rohwerten zu Detektionen#
Beim Training wird festgelegt, wie viele Vorhersagen jedes Objekt erhält. Bei der Eins-zu-viele-Zuweisung werden mehrere Zellen in der Nähe jedes Objekts als positive Beispiele markiert. Dadurch erhält der Kopf mehr Trainingssignale und gibt bei der Inferenz mehrere überlappende Rahmen pro Objekt aus. NMS behält den besten davon. Bei der Eins-zu-eins-Zuweisung, die von DETR und vom Inferenzkopf von YOLOv10 verwendet wird, wird genau eine Vorhersage pro Objekt trainiert. Daher benötigen die Ausgaben keine NMS.
Der YOLO26-Kopf sagt die Entfernungen zu den vier Kanten direkt voraus und lässt die Ausgabe mit 16 Klassen der Distribution Focal Loss pro Kante weg, die YOLOv8 und YOLO11 verwendeten. Außerdem trainiert er je eine Eins-zu-viele- und eine Eins-zu-eins-Kopie seiner Rahmen- und Klassifizierungszweige. Standardmäßig wendet YOLO26 NMS auf die Eins-zu-viele-Ausgaben an. Mit nms=False wechselst du zu den Eins-zu-eins-Zweigen, die höchstens 300 Rahmen pro Bild und keinen NMS-Schritt zurückgeben.
Praktische Aspekte des Kopfdesigns#
- Feinabstimmung auf neue Klassen: Der Klassifizierungszweig endet mit einem Ausgabekanal pro Klasse. Für das Training mit einem Datensatz, der eine andere Anzahl von Klassen hat, ist deshalb eine neue finale Klassifizierungsschicht erforderlich. Die vortrainierten Gewichte von Backbone und Neck lassen sich übernehmen.
- Bereitstellung: Jede Operation im Kopf wird auf dem Zielgerät ausgeführt. Eine einfache Decodierung der Rahmen und Ausgaben ohne NMS erleichtern daher den Export und verkürzen die Nachbearbeitungszeit.
- Kleine Objekte: Eine zusätzliche Pyramidenstufe mit Schrittweite 4 liefert dem Kopf ein feineres Raster für winzige Objekte, verursacht aber zusätzliche Rechenkosten: Bei einer Eingabe mit 640 × 640 Pixeln kommen 160 × 160 = 25.600 Zellen hinzu, viermal so viele wie auf der Stufe mit Schrittweite 8.










