date
Oct 19, 2025
slug
2025-10-19-the-output-anchor-and-loss-function-of-YOLOv3
status
Published
tags
CNN
YOLO
summary
本文对YOLOv3模型在输出数据的组织格式、Anchor预测框以及损失函数的计算等方面的内容进行了总结。
type
Post
category
AI
AI summary
本文对YOLOv3模型在输出数据的组织格式、Anchor预测框以及损失函数的计算等方面的内容进行了总结。
YOLOv3模型的输出
如下图所示的YOLOv3模型的整体架构图。不同于之前的YOLOv1和YOLOv2模型仅输出一组三维张量,然后在这一组三维张量上学习和解释待检物体的位置类别等信息,YOLOv3模型最终的输出是三组独立的三维张量,分别用于对不同尺寸的待检物体进行定位和检测。

以上图输出的13x13x255的这一组三维张量为例,输入图像被分割为13x13个网格,每个网格会预置三个大小与尺寸比例不同的预测Anchor框(关于YOLOv3 Anchor框的信息参考下一节),然后通过一个长度为255的一维向量对该网格中检测到的物体信息(该物体的中心位于该网格)进行描述。也就是说,这个255长度的向量中包含了3个预测框的信息,其解释如下图所示。

每个预测框中所包含的信息与YOLOv2的单个预测框的输出没有区别,都是中心坐标位置+长宽+预测置信度+80个类别(针对COCO数据集)的识别信息。这样的话每个预测框的信息长度就是4+1+80=85,一个网格中包含的3个预测框的信息长度就是255。这就是13x13x255这个三维张量的维度解释和由来。
如果每个网格放置B个Anchor Box,模型要支持的待检物体的类别数量为C,那么每个网格输出的数据长度就是B x (4+1+C)。
YOLOv3的Anchor框
在网格的Anchor框设计方面,YOLOv3仍然沿用了在YOLOv2模型上导入的先验Anchor框。只不过,在YOLOv2模型中,每个网格会提前放置5个Anchor框,到了YOLOv3模型中,则是给每个网格放置3个Anchor框(这一点在前一节解释YOLOv3模型的张量输出时已有解释)。
至于Anchor先验框的尺寸选择,YOLOv3仍然采用YOLOv2一样的做法,在训练数据集上使用 k 均值聚类方法来得到与这个数据集相匹配的9个先验框的尺寸。
- 关于如何使用 k 均值聚类法得到数据集的先验框,可以参考YOLOv2的Anchor锚框机制详解一文,对于如何从数据集得到Anchor框的长宽比的计算流程,已经有非常详细的描述。
在YOLOv3的论文中,作者基于COCO数据集,计算出来了9个Anchor先验框的尺寸。并且面积大小排序,均匀分为3份,分别针对不同分辨率的特征图:
- 大框3个,针对13×13分辨率的特征图,共有13x13x3=507个预测框,负责大目标的检测:(116×90), (156×198), (373×326)
- 中框3个,针对26×26分辨率的特征图,共有19x19x3=2028个预测框,负责中目标的检测:(30×61), (62×45), (59×119)
- 小框3个,针对52×52分辨率的特征图,共有52x52x3=8112个预测框,负责小目标的检测:(10×13), (16×30), (33×23)

YOLOv3的损失函数优化
如以上所总结的,YOLOv3模型会输出三组独立的三维张量,用于对不同大小的待检物体进行检测。那么其损失函数也就需要针对这三组输出独立进行。三个输出计算损失值的损失函数是完全相同的,而且各个输出对于损失值的计算流程完全独立进行互不干扰,最终得到三个损失值Loss_13,Loss_26,Loss_52,整个模型总的损失值就是这三个损失值之和。
而无论是以上输出的哪个尺度,YOLOv3的损失函数都由以下三个部分构成:
- 边界框回归损失(lbox):负责评估预测框位置(中心坐标x, y)和大小(宽高w, h)的准确性。
- 置信度损失(lobj):负责判断预测框内是否包含目标物体。
- 分类损失(lcls):负责判断预测框内物体的具体类别。
因此整个模型总体的损失函数的计算流程如下图所示:

以下以13x13尺度特征图为例来解释损失函数各个部分的计算流程。
首先进行YOLOv3训练过程中样本类型的定义解释。总体来讲,YOLOv3在训练过程中进行损失函数计算时,把样本分为三种类型:正样本,负样本和忽略样本。不同类型的样本会被用于或者不用于计算不同类型的损失值。如前所述,对于13x13分辨率的模型输出而言,实际上总共会输出13x13x3=507个预测框。而对于正负以及忽略样本的判定,实际上也就是对这507个预测框进行判断和分类,然后基于分类结果决定后续是否用于不同损失值的计算。
- 正样本:对于每个训练样本标记的真值框而言,首先会计算真值框的中心位于哪个网格,然后在这个网格输出的三个预测框中,再找出来与真值框IOU最大的那个预测框作为正样本。所以每个真值框对应于一个正样本。正样本会用于所有的损失计算类型(边界框、置信度和分类)。
- 忽略样本:与任何一个真值框的IOU大于指定的阈值(如0.5),但是又不是该真值框的正样本。忽略样本不会参与任何损失计算,因此对于最终的损失值没有任何影响。
- 负样本:与所有的真值框的IOU都小于指定的阈值(如0.5),实际上也就是除了正样本和忽略样本的其他所有样本。负样本会被用于置信度损失,但是不会参与边界框和分类损失计算。
与之前的YOLO版本相同,YOLOv3的损失函数同样包含三个部分:坐标损失,置信度损失以及类别损失。
对于坐标损失的计算而言,因为只有正样本会参与坐标损失的计算,所以实际上坐标损失值就是所有正样本坐标与真值框坐标之间的损失值。因为已经有了所有真值框及其对应的正样本的中心位置坐标和长宽,那么计算坐标损失就比较简单了:

接下来是置信度损失的计算。在YOLOv3中,使用了二元交叉熵BCE来作为置信度损失的计算函数。模型为每个预测框输出一个置信度 logit 值。这个值需要通过 Sigmoid 函数激活,将其映射到 (0, 1) 区间,才能作为表示含有目标概率的置信度分数 \hat C。然后基于以下公式计算单个预测框的置信度损失,最后把所有预测框的置信度损失加起来就是总的置信度损失:
如前所述,在置信度损失计算时,需要考虑正样本和负样本,不需要考虑忽略样本。
- 对于正样本(C=1)而言,置信度损失可简化为。这意味着模型预测的 越接近1,损失越小。
- 对于负样本(C=0)而言,其损失可简化为 。这意味着模型预测的 越接近0,损失越小。
最后是类别损失的计算。类别损失的计算逻辑与置信度损失基本相同,都是采用二元交叉熵BCE来进行其损失值的计算。不过,对于类别损失的计算而言,只有正样本需要参与进来。同样的,模型会为每个预测框输出一个包含所有类别信息的原始logit向量。这个向量的长度等于数据集的类别数量(例如,COCO数据集是80类)。这些原始 logit 值需要通过Sigmoid 函数进行激活,将其映射到 (0, 1) 区间,作为类别损失计算的参数 。
- 需要注意的是,YOLOv3对于类别的判断可以允许一个框同时属于多个类别(如人+男人两个标签)。
然后使用以下公式对该正样本在所有的类别上计算类别损失,然后把所有正样本的类别损失加起来就是总的类别损失。