Detection Head
检测头是目标检测器的最后一部分,负责将骨干网络和颈部网络的特征转换为每个网格位置上的边界框和类别分数。
检测头是目标检测网络最后的一组层。它读取前面各层生成的特征图,并在每个候选位置输出一个边界框以及每个类别的分数。检测头的设计决定边界框如何编码:是相对于锚框的偏移量,还是相对于某个点的距离;还决定模型会生成多少个候选框,以及是否需要使用非极大值抑制 (NMS)等后处理步骤来去除重复框。
检测头的位置#
现代检测器由三个阶段组成。骨干网络通常是卷积网络或视觉 Transformer,它会将像素转换为特征图;随着网络加深,特征图分辨率会降低,语义信息则会增强。颈部网络(例如特征金字塔网络 (FPN))会融合深层和浅层特征图,使每种输出尺度都同时包含精细细节和上下文信息。随后,检测头会在金字塔的每个层级上运行小型卷积分支,通常对应步幅 8、16 和 32,因此精细特征图可以检测小物体,较粗的特征图则可以检测大物体。
单阶段检测器有一个密集检测头,会在每个网格单元上进行预测。两阶段检测器,例如 Faster R-CNN,有两个检测头:一个区域候选网络会在每个位置为锚框评分,随后一个感兴趣区域检测头会对它提出的几百个区域进行分类和细化。
检测头如何预测边界框和类别#
在每个网格单元中,密集检测头会预测三类数值:
- 类别分数:每个类别对应一个分数,每个分数都会经过 sigmoid 函数处理,因此一个位置可以分别获得每个类别的分数。
- 边界框回归:用于确定边界框位置的四个数值,可以是平移和调整锚框大小的偏移量,也可以是从网格单元中心到边界框四条边的距离。
- 质量分数和任务输出:用于对边界框排序的 objectness 分数(YOLOv1 到 YOLOv5)或中心度分数(FCOS),以及实例分割中的掩码系数、姿态估计中的关键点等任务专属数值。
边界框的编码方式决定了基于锚框的检测器与无锚框检测器的区别。每个分支由几个卷积层组成,并以一个 1 × 1 卷积层结束;每个预测值对应一个输出通道。RetinaNet 和 FCOS 已经采用了彼此独立的分类分支和回归分支;YOLOX于 2021 年将这种解耦检测头引入 YOLO,并报告称其训练收敛速度远快于 YOLOv3的单个共享输出层。下面的示意代码为 640 × 640 图像的三个金字塔层级构建这些最终的 1 × 1 层,并将输出展平为一个候选框列表:
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)}")它会输出 boxes (1, 4, 8400), class scores (1, 80, 8400):6,400 + 1,600 + 400 个网格单元各自提出一个边界框,并为其提供 80 个类别分数。
从原始输出到检测结果#
训练过程会决定每个物体对应多少个预测结果。一对多分配会将每个物体附近的多个网格单元标记为正样本,为检测头提供更多训练信号;推理时,每个物体也会对应多个重叠框,因此需要使用 NMS 保留最佳结果。DETR和 YOLOv10的推理检测头采用一对一分配,为每个物体只训练一个预测结果,因此输出无需经过 NMS。
YOLO26检测头会直接预测四条边的距离,省去了 YOLOv8和 YOLO11使用的每条边 16 个分箱的 Distribution Focal Loss输出,并分别训练一对多和一对一的边界框分支与分类分支副本。YOLO26 默认对一对多输出应用 NMS;传入 nms=False 后则会切换到一对一分支,该分支每张图像最多返回 300 个边界框,且无需执行 NMS。










