1. anchors是什么?
在YOLOv5目标检测模型中,anchors(锚框) 是预定义的一组边界框参考尺寸,用于引导模型学习目标物体的位置和尺度。说白了就是框。这个框它可以分为两种,第一种是预先设置的框,第二种是预测的框。
2. 预先设置的框
通过聚类算法(如k-means)在训练集上预先计算得到的固定尺寸框,代表数据集中常见目标的尺寸比例。比如yolov5在COCO数据集上聚合形成9个框 [weight, height]。
小目标锚框(P3/8):如[10,13],用于检测 COCO 中的小物体(如手机、杯子)。
中等目标锚框(P4/16):如[30,61],覆盖 COCO 中的中等尺寸物体(如狗、椅子)。
大目标锚框(P5/32):如[373,326],适配 COCO 中的大型物体(如飞机、火车)。
# YOLOv5s模型anchors配置
anchors:
- [ 10,13, 16,30, 33,23 ] # P3/8 尺度 (小目标)
- [ 30,61, 62,45, 59,119 ] # P4/16尺度 (中目标)
- [ 116,90, 156,198, 373,326 ] # P5/32尺度 (大目标)
如果我们将图片划分为80×80的小图片 (用来检测小目标),我们会将[10,13], [16,30], [33,23]这三个框的中心位置与每个小图片中心位置对齐(也就是每个小图片的中心点我都会放三个框)。中目标与大目标同理。然后配合模型得到的一些参数,从而得到预测的框,具体步骤如下:
步骤一:计算网格中心点坐标
对于输入图像(假设 640×640),每个网格的大小为 8×8 像素(640÷80=8)。网格(i,j)的中心点坐标为:
center_x = (j + 0.5) × 8 # j是列索引
center_y = (i + 0.5) × 8 # i是行索引
步骤二: 放置锚框
以网格中心点为中心,放置 3 个锚框,宽高分别为[10,13], [16,30], [33,23]。例如,网格(10,20)的中心点为(164,84),则 3 个锚框为:
锚框 1:中心(164,84),宽 10,高 13
锚框 2:中心(164,84),宽 16,高 30
锚框 3:中心(164,84),宽 33,高 23
步骤三:模型参数与预测框的生成
模型会为每个锚框预测 4 个参数(偏移量)和 1 个置信度:
4 个偏移量:(tx, ty, tw, th)
(tx, ty):中心点的偏移量(相对于网格)
(tw, th):宽高的缩放因子
1 个置信度:conf(表示该锚框包含目标的概率)
3.预测的框
预测的框是模型通过学习后输出的、用于定位目标的矩形框,是最终用于标注目标位置的结果。它并非凭空生成,而是以预设锚框为基础,通过模型预测的 “修正参数” 调整得到。
我们通过模型得到的参数(4个偏移量和1个置信度)通过修改预先设置的框来得到预测框,如何操作?往下看。
预测框的计算公式。
#预测中心点坐标
pred_x = (torch.sigmoid(tx) * 2 - 0.5 + j) * stride
pred_y = (torch.sigmoid(ty) * 2 - 0.5 + i) * stride
#预测框宽高的坐标
pred_w = anchor_w * (torch.sigmoid(tw) * 2)**2
pred_h = anchor_h * (torch.sigmoid(th) * 2)**2
这样我们找到预测框的中心点和宽高,那么找到目标物体就不是什么难事了。
4.补充
问题1:对于预先设置的框是比如说小物体三个框都要参与训练还是先筛选一个框再进行训练?
在目标检测(如 YOLO 系列)中,预设锚框(Anchor Boxes)在训练时会全部参与,但会通过 “匹配机制” 筛选出与真实框(Ground Truth)最匹配的锚框负责预测,其他锚框则作为背景或次要样本处理。具体来说,不是提前筛选掉某个锚框,而是让所有锚框参与训练,但只让 “最合适” 的锚框承担主要损失(定位、分类等),其余锚框的损失计算会被弱化或调整。
具体分析:
1.核心逻辑:锚框与真实框的 “匹配机制”
训练时,对于每张图像中的每个真实框(比如一个小物体),算法会从所有预设锚框(包括该网格的 3 个小目标锚框)中,自动匹配出 1 个(或少数几个)“最适合” 的锚框,让它负责学习这个真实框的特征(位置、类别等)。其他锚框如果与真实框匹配度低,则被视为 “背景”,只参与置信度损失(判断 “无目标”)的计算。
2.匹配机制的具体规则(以 YOLOv5 为例)
YOLOv5 中,锚框与真实框的匹配主要基于以下两个条件:
IoU(交并比)阈值匹配
计算每个锚框与真实框的 IoU,当 IoU 超过某个阈值(通常 0.25~0.5)时,认为该锚框与真实框相关;其中IoU 最大的锚框会被指定为 “主要负责锚框”。
中心位置匹配
真实框的中心点落在哪个网格内,就优先从该网格的 3 个锚框中选择匹配的锚框(比如小物体的真实框中心落在 80×80 网格的某个格子里,就优先从该格子的 3 个小目标锚框中匹配)。
3.为什么不提前筛选锚框?
保证多样性:不同小物体的形状可能差异较大(比如细长的小物体更适合[10,13],稍宽的小物体可能更适合[33,23]),保留所有锚框可以覆盖更多形状的目标。
动态适配:训练中真实框的形状是多样的,提前筛选会丢失潜在的匹配可能(比如某个小物体可能更适合[33,23]而非[10,13])。
损失平衡:所有锚框参与训练,但通过匹配机制让 “合适的锚框承担主要损失”,既能保证学习效率,又能避免漏检(如果提前筛掉某个锚框,可能刚好错过最适合的匹配)。
24万+






