Anchor Boxes
锚框是预设尺寸和纵横比的框,检测器会移动并调整这些框的大小以贴合物体。本文介绍锚框的尺寸设定、匹配和使用方法。
锚框是预先定义的矩形,具有固定尺寸和宽高比,并平铺在检测器特征图的每个位置,作为对目标位置和形状的初始猜测。基于锚框的检测器会为每个锚框计算各类别的分数,并预测用于移动和调整锚框尺寸的小幅偏移量,使锚框适配目标;这种做法比从零开始预测边界框更容易学习。Faster R-CNN在每个位置放置 9 个锚框:3 种面积(128²、256² 和 512² 像素)乘以 3 种宽高比(1:1、1:2 和 2:1),对于 1000 × 600 的图像,总计约 20,000 个锚框。
锚框的定义方式#
一组锚框是在特征图的每个单元格重复使用的尺寸和宽高比列表,因此锚框数量等于单元格数 × 每个单元格的形状数。采用特征金字塔网络(FPN)的检测器会将小锚框分配给精细、高分辨率层,将大锚框分配给粗糙层:RetinaNet在五个层级的每个位置使用 9 个锚框,每张图像约有 100,000 个。SSD将它们称为默认框,而 SSD300 会平铺 8,732 个默认框。
人工挑选的形状未必适合某些数据集,因此 YOLOv2对训练边界框的宽度和高度运行了k-means 聚类,以 1 − IoU 作为距离,并保留 5 个聚类中心作为锚框。YOLOv3聚类出 9 个锚框,并将它们平均分配到三个输出步幅上,从步幅为 8 的层级上的 10 × 13 像素,到步幅为 32 的层级上的 373 × 326 像素。
将锚框与目标匹配#
训练期间,每个锚框都会通过交并比(IoU)与每个标注框进行比较。与目标重叠足够多的锚框会成为正样本,并学习目标类别以及其边界框的偏移量;重叠很少的锚框会成为负样本并学习“背景”,而介于两者之间的锚框则会被忽略。Faster R-CNN 的区域提议网络将 IoU 不低于 0.7 的锚框标记为正样本,将低于 0.3 的标记为负样本;它还会将每个目标匹配度最高的锚框设为正样本,因此不会有目标缺少对应锚框。
import torch
from torchvision.ops import box_iou
# Nine anchors centered on one feature-map cell at (200, 200): 3 sizes x 3 aspect ratios (height / width)
shapes = [(size, ratio) for size in (64, 128, 256) for ratio in (0.5, 1.0, 2.0)]
anchors = []
for size, ratio in shapes:
w, h = size / ratio**0.5, size * ratio**0.5
anchors.append([200 - w / 2, 200 - h / 2, 200 + w / 2, 200 + h / 2])
# A labeled pedestrian box (x1, y1, x2, y2): tall and narrow
person = torch.tensor([[160.0, 110.0, 240.0, 290.0]])
# Faster R-CNN RPN rule: IoU >= 0.7 is positive, below 0.3 is negative, anything between is ignored
iou = box_iou(torch.tensor(anchors), person).squeeze(1)
for (size, ratio), value in zip(shapes, iou.tolist()):
label = "positive" if value >= 0.7 else "negative" if value < 0.3 else "ignored"
print(f"size {size}, ratio {ratio}: IoU {value:.2f} -> {label}")只有高 128 像素的锚框(宽高比 2.0)与行人的重叠程度足以成为正样本,IoU 为 0.88。另外两个 128 像素锚框的 IoU 分别为 0.31 和 0.50,因此会被忽略;六个尺寸不匹配的锚框则为负样本。随后,正锚框会按标准参数化方式学习偏移量:中心点按锚框宽度和高度的比例移动,宽度和高度则按预测值的指数进行缩放。
为数据集选择锚框尺寸#
与数据集目标形状匹配的锚框能让更多目标获得正锚框,从而提高检测器可达到的召回率。Ultralytics YOLOv5以 YOLOv3 的 9 个锚框为起点,并在训练前通过 AutoAnchor 检查这些锚框:它会测量这些锚框在训练标注上的理论最佳召回率;除非该值超过 0.98,否则就会用 k-means 和 1,000 代遗传演化重新拟合锚框,并且只有召回率提高时才保留新锚框。
局限性与无锚框检测器#
锚框会带来三方面的成本。图像中数万个锚框几乎都覆盖背景,容易负样本会使损失占据主导,因此 RetinaNet 引入了焦点损失来降低这些样本的权重。多个相邻锚框可能匹配同一个目标,因此输出需要经过非极大值抑制(NMS),为每个目标保留一个边界框。尺寸、宽高比和 IoU 阈值也都是会随数据集和图像尺寸变化的超参数。
无锚框检测器通过从点或关键点预测边界框,去除了这些超参数;自 2021 年 YOLOX 发布以来,大多数实时检测器都采用了无锚框设计。基于锚框的检测器仍包括 Faster R-CNN、Mask R-CNN和 RetinaNet 等模型。通过比较 RetinaNet 与无锚框的 FCOS,ATSS发现,只要两者采用相同的正样本选择方式,每个位置使用 9 个锚框的 RetinaNet 并不比使用 1 个锚框更准确。










