YOLOv2的Anchor锚框机制详解

2025-10-12|2026-3-10
Pavel Han
Pavel Han
date
Oct 12, 2025
slug
2025-10-12-the-Anchor-concept-in-YOLOv2
status
Published
tags
CNN
YOLO
summary
本文总结了YOLOv2模型基于Faster R-CNN的理论,在其模型网格预测框设计上增加的Anchor机制的来源、在YOLOv2模型中的计算和训练流程,尝试更清楚的认识YOLOv2模型的工作原理。
type
Post
category
AI
AI summary
本文总结了YOLOv2模型基于Faster R-CNN的理论,在其模型网格预测框设计上增加的Anchor机制的来源、在YOLOv2模型中的计算和训练流程,尝试更清楚的认识YOLOv2模型的工作原理。

Anchor锚框的概念

首先给出Anchor框的定义:所谓的Anchor就是在每一个图像分割网格中,在训练之前提前固定放置一些尺寸大小和长宽比例不同的边界框,通常情况下,对于每一个网格而言,提前放置的边界框的大小和数量都是相同的。在推理的时候,模型基于输入图像中待检物体的情况,对每一个提前放置的边界框预测出若干的偏移量(中心位置的偏移量,宽高的偏移量等),然后基于这些偏移量调整之前放置的边界框,得出最终的预测边界框。因此,在每个网格处提前放置的边界框就是anchor框,其本质就是提供边界框的尺寸预计,然后用模型在推理过程中计算出来的偏移量来调整其位置和尺寸,从而得到最终的边界框尺寸。
从下图中可以直接的看出所谓的Anchor框究竟是什么:下图中把整幅图像分成与YOLOv1一样的7x7网格,然后在每个网格上提前放置了三个大小和比例不同的anchor框。为了方便演示,下图中仅对每六个网格放一组anchor框,实际中应该是每个网格都有一组anchor框,全画出来密密麻麻,演示反而不够直观。
notion image
从Anchor框这个概念来讲,YOLOv1版本并没有提前放置anchor框的设计,而只是为每个网格定义了两个BOX,这两个BOX的中心位置和尺寸大小都是需要模型在基于输入图像推理的过程在预测出来的。所以从这个角度上讲,YOLOv1就是典型的Anchor-free(不依赖于Anchor)的模型。
每个网格提前预设Anchor框的设计,首先来源于另外一种目标检测模型:Faster R-CNN Faster R-CNN是一个两阶段的目标检测模型,在第一个阶段定位物体,第二个阶段识别物体的类别。其对物体定位检测的思路与YOLOv1是类似的,也是把输入图像分为多个网格,然后逐网格找物体,只不过Faster R-CNN的第一阶段只查找哪个网格中有物体,不关注该物体的类别,在第二个阶段再去识别检测到的物体的具体类别,而YOLOv1则是同时定位物体和识别物体的类别。这就是Faster R-CNN与YOLO各版本的目标查找和预测流程的最大差异所在。
对于Faster R-CNN模型而言,首先会把输入分割为多个网格,然后为每个网格预置 k 个不同尺寸和不同宽高比的ancher框(如上图所示)。在YOLOv2版本中,也把这个预置Anchor框的机制导入了进来,显著的提升了模型的mAP指标。增加Anchor框以后,在推理阶段,模型就不需要从头直接预测待检物体的尺寸与坐标,而只需要预测Anchor框到真实物体的偏移量即可,这样就降低了预测的难度。

YOLOv2锚框的k均值聚类算法

但问题是,如果确定每个网格应该放几个Anchor框,以及各个Anchor框的大小和长宽比又如何确定呢? 对于Faster R-CNN模型而言,其Anchor框的数量、尺寸等参数都是作为超参数由人工设定的。这种设计很难确保人工指定的Anchor框的参数与数据集之间是相互匹配的,所以对于不同数据集的输入,其网络性能的表现很难稳定。
对于以上问题,YOLOv2模型的做法,是采用 k 均值聚类算法,从指定的数据集中提取出来最适合的Anchor框
首先把整个训练集中图片的所有真值标记框(GT,Ground Truth)全部提取出来,然后缩放到统一的输入尺寸(416x416):该算法只关心真值框的width和height信息,也就是长宽比。
notion image
传统的K-means聚类算法在进行聚类计算的过程中使用的是欧氏距离,但是这样也就意味着较大尺寸的Anchor框相比较小尺寸会产生更多的错误,聚类计算的结果也就会发生偏离。而YOLOv2聚类计算的目的,是让预先选定的Anchor框的尺寸与其接近的真值框有更大的IoU,与Anchor框和真值框的尺寸大小无关。因此YOLOv2模型定义了以下距离公式执行聚类算法:
notion image
从以上统计出来的所有真值框列表中随机挑选出来5个做为初始Anchor框,执行以下所描述的k均值聚类算法:
  • 基于以上所描述的聚类算法,计算数据集中所有真值框与5个Anchor框之间的dist值,每个真值框与哪个Anchor框之间的dist值最大,就把这个真值框与该Anchor框归为一类。直到所有的真值框按照以上逻辑计算完毕,被分为以Anchor框为标准的5个集合。
  • 对每个集合中所包含的真值框列表进行以下计算:
    • 取出所有真值框的width(之前已经统一缩放真值框的分辨率为416x416),计算出来所有width的几何平均值,把该组合Anchor框的width替换为计算出来的这个几何平均值。
    • 同样的,取出所有真值框的height,计算出来所有height的几何平均值,把该组合Anchor框的height替换为计算出来的这个几何平均值。
  • 经过以上运算以后,就得到5个新的Anchor框的(width,height)。
  • 然后基于这5个新的Anchor框重新从头执行这个聚类算法,得到新的Anchor框的(width,height)。经过以上的反复迭代计算,最终新Anchor框的width和height基本不再变化,这就是最终由算法自动基于数据集所自动生成的Anchor框。
以上的整个k均值聚类算法的执行流程可以简化为下图所示:
notion image
基于以上逻辑和流程计算出来5个Anchor框的长宽参数以后,就可以按照其面积大小为顺序,写入YOLOv2模型的cfg文件中,后续在模型的训练和推理过程中,每个网格都会放置5组以上长宽比例的Anchor框用于对图像的中物体进行检测。
不过从以上计算逻辑也可以看出来这个算法存在的严重局限性:通过以上算法选出来的Anchor框是基于指定的数据集的,那么也就只能在这个数据集上有良好的表现。如果新的数据集的待检对象尺寸等与训练数据集存在较大差异化的,初选的anchor框就不合适了。

基于Anchor的Bounding Box预测

经过如上所述的Anchor框的聚类计算以后,在模型开始正式训练之前,就得到了5组长宽比确定下来的Anchor框。在训练过程中有了这个Anchor边界框的先验尺寸信息,网络就不必再从头去学习整个目标框的宽高了。
假设预定义Anchor框的尺寸为 p_w 和 p_h , 待检物体中心所在网格的左上角坐标位置为 grid_x,grid_y ,网络推理输出的中心偏移量是 (t_x,t_y) ,网络输出宽高的偏移量是 (t_w,t_h) 。那么YOLOv2模型使用以下公式计算待检物体的中心坐标和边界框:
notion image
YOLOv2模型预测输出的中心偏移量 (t_x,t_y) ,是其相对所在网格左上角位置的相对偏移量。而且在计算实际中心位置时,还会使用Sigmoid函数限制叠加到 grid_x,grid_y 之上的偏移量在0-1之间,这样就可以使得预测出来的bounding box的中心点保持在该网格内部,不会偏移很多超出到网格之外。
可基于下图来理解上面的公式:虚线框为Anchor框,蓝色框为模型预测输出计算出来的Bounding box。
notion image

参考资料

  • 《YOLO目标检测》杨建华,李瑞峰 第6章 YOLOv2
  • 《深度学习之Pytorch物体检测实战》 董洪义 6.2 依赖锚框:YOLOv2
YOLOv2特性总结-从YOLOv1的进化YOLOv1模型的损失函数与训练过程解读
Loading...