本节摘要:检测器要不要预设锚点?本节讲 anchor-based 和 anchor-free 两种范式——预测框的两种思路。
阅读完本节,你应当能够:
检测器要预测边界框,有两种范式:
这个选择决定了检测器的"预测语言":是"在参考框上做修正",还是"从零说出框"。它影响训练稳定性、超参数量、泛化能力,是 2019 年前后目标检测最热闹的范式之争。

anchor-based 预设一组锚点(不同尺度、长宽比),每个位置预测相对锚点的偏移和类别:
优点:学习稳定(有参考),精度高
缺点:需调锚点尺寸超参,锚点数量多计算大,对数据分布敏感
# anchor-based 的预测解码:预测偏移 + 锚点 = 最终框 def decode_anchor_based(pred_deltas, anchors): """pred_deltas: 预测的 [dx, dy, dw, dh]""" cx = anchors[:, 0] + pred_deltas[:, 0] * anchors[:, 2] cy = anchors[:, 1] + pred_deltas[:, 1] * anchors[:, 3] w = anchors[:, 2] * torch.exp(pred_deltas[:, 2]) h = anchors[:, 3] * torch.exp(pred_deltas[:, 3]) return cx, cy, w, h
锚点机制的代价:一张 416x416 图,13x13 特征图每位置 3 个锚点,就有 507 个框要预测,绝大多数是背景。锚点多了计算浪费,锚点少了覆盖不到目标形状。而且锚点尺寸是"先验",来自训练数据的聚类,换数据集(比如从人检测换成工业零件)要重新聚类。
anchor-free 不预设锚点,直接预测框:
优点:无锚点超参,更简洁,泛化好
缺点:早期精度略低,训练需技巧(中心采样、低质量框过滤)
FCOS(Fully Convolutional One-Stage)是 anchor-free 代表:
FCOS 证明 anchor-free 可达 anchor-based 精度,推动 anchor-free 趋势。
# FCOS 预测解码:到四边距离 -> 框 def decode_fcos(distances, grid_xy, strides): """distances: [l, t, r, b] 到四边的距离""" l, t, r, b = distances.unbind(dim=1) cx = grid_xy[..., 0] * strides cy = grid_xy[..., 1] * strides x1 = cx - l; y1 = cy - t x2 = cx + r; y2 = cy + b return x1, y1, x2, y2
FCOS 的"中心度"是个巧妙设计:距离目标中心越近的位置,中心度越高;推理时中心度与分类分数相乘,过滤掉那些"框得对但中心偏了"的低质量预测。它用 FPN 把不同尺寸的目标分散到不同层,缓解"一个特征点对应多个重叠目标"的问题。
| 维度 | anchor-based | anchor-free |
|---|---|---|
| 预测 | 相对锚点偏移 | 直接预测框 |
| 超参 | 锚点尺寸 | 无锚点超参 |
| 数量 | 锚点多 | 每位置一个 |
| 稳定性 | 学习稳定 | 需训练技巧 |
| 泛化 | 对数据敏感 | 更泛化 |
| 代表 | Faster R-CNN、YOLOv2-5 | FCOS、YOLOX、YOLOv6/8 |
anchor-free 是趋势:
但 anchor-based 仍广泛使用(YOLOv5、Faster R-CNN),两者并非替代关系,按场景选。
为什么趋势是 anchor-free?三个原因:一是少超参,anchor 的尺寸、数量、分配规则都不需要设了;二是结构简洁,不用维护"锚点表"和对应的匹配逻辑;三是对新数据更友好,不用每次换数据都重新聚类锚点。但要注意,anchor-free 并非"免费"——它把复杂度从锚点转移到了标签分配和中心采样策略上,实现细节反而更多。
| 场景 | 推荐 |
|---|---|
| 数据分布稳定 | anchor-based(调好锚点) |
| 多样化数据 | anchor-free(泛化好) |
| 简洁部署 | anchor-free(少超参) |
| 追求极致精度 | 两者都可,看工程优化 |
问:anchor-free 一定更好吗? 不一定。两者精度相当,差异来自工程细节(标签分配、训练策略)多于范式本身。选型看团队熟悉度:调过锚点的团队留在 anchor-based 也能做到同样精度,新项目从 anchor-free 起步更省心。若数据形状分布特殊(极端长宽比目标多),anchor-based 精心聚类锚点仍可能略占优。
⚠️ 常见误区:以为 anchor-free 一定更好。两者精度相当,anchor-free 优势在少超参和泛化,anchor-based 优势在稳定。按场景选,不是替代关系。
💡 关键直觉:anchor-based 预设锚点预测偏移(稳定但需调超参),anchor-free 直接预测框(简洁泛化但需训练技巧)。趋势是 anchor-free(YOLOv6/8),但两者并存按场景选。
下一节讲训练优化技术。