自2016年YOLOv1发布至今的十年里,YOLO的核心版本已一路演进到了v26——不过这其中包含了一次版本大跳跃:官方为了统一命名规范,直接跳过了v13到v25。

回想起我使用YOLO的历程:从只会用官方的COCO数据集训练,到使用MMLab的各种训练框架,再到自己修改数据集、魔改模型结构,最后进行TensorRT的量化部署。一路走来,我竟没有仔细读过YOLO的论文,只是一味地用最新版。今天,我决定趁着这几个月集中读论文的契机,把整个YOLO系列论文好好读一遍。

YOLOv1由YOLO之父Joseph Redmon在2016年发布,v1到v3的更新也由他完成。但2020年他宣布退出CV领域,具体原因不再赘述。2020年4月,YOLO项目的一名长期开发者Alexey Bochkovskiy发表了YOLOv4论文,代码被合并到Joseph Redmon的官方代码库中,YOLO就这样传承了下去。

2020年6月,Ultralytics团队发布了YOLOv5。这个版本没有发表论文,而是更偏重工程优化:放弃了官方DarkNet框架,完全采用PyTorch实现,并提供了极易使用的训练、推理和部署方案。自此,YOLO走向了Ultralytics一枝独秀、但仍百花齐放的时代。

2022年6月,中国团队美团发布了YOLOv6,主打高效工程落地。2022年7月,YOLOv4的作者Alexey Bochkovskiy发布了YOLOv7。

2023年,Ultralytics发布了YOLOv8,统一了多任务框架,成为应用最广泛的版本——不过依然没有论文。2024年,YOLOv9延续了v4/v7的学术风格;清华团队提出的YOLOv10实现了实时端到端。

同样在2024年,Ultralytics在YOLOv8基础上发布了YOLOv11,属于迭代升级版本,依旧没有论文。

2025年,YOLOv12发布,它摒弃了CNN、拥抱Transformer,同时尽可能保持实时性。

2026年,Ultralytics发布了YOLO26,为了统一版本名称,采用了年份作为版本号——那明年就是YOLO27了?也不知道其他团队是否会跟进这种命名方式。

期间还有大量YOLO衍生版本,比如YOLOX、YOLOR、PP‑YOLO和FastYOLO等,本文就不一一介绍了

YOLOv1

之前类似R-CNN的方法都是先使用一个 Region Proposal Network 生成潜在 BBox,然后再对 Proposal BBox 使用分类器,需要单独训练2个网络。这类方法被称作 Two-Stage Method。

YOLO 则是直接回归 BBox 和类别置信度,也就是后来的 One-Stage Method。

Method

把画面分成一个 S × S 的Grid,如果一个物体中心落在某个Grid中,那么就由这个Grid负责检测这个物体。

每个Grid会预测 B(B=2) 个BBox (x ,y, w, h)

  • \text{x, y}:BBox中心点相对于Grid左上角的坐标
  • \text{w, h}:BBox相对于整张图像的宽度和高度

以及预测 B 个置信度分数Confidence:

\text{Confidence} = \Pr(\text{Object}) \times \text{IOU}_{\text{pred}}^{\text{truth}}

其中 Pr(Object) 代表当前网格中是否存在目标物体的中心:

  • 有物体:值为 1,模型学习让无物体处的BBox置信度趋近于 0
  • 无物体:值为 0,模型学习让置信度等于BBox与GT框的 IOU

\text{IOU}_\text{pred}^\text{truth} 表示BBox与真实框的交并比(IOU),范围 [0,1],衡量预测框的位置准确度

每个Grid还预测出 C(C=20) 个类别条件概率 \Pr(\text{Class}_i \mid \text{Object}) ,条件类别概率在每个Grid中仅预测一组,和 B 的数值无关。

注意这个条件类别概率和BBox的Confidence是独立的两部分,Confidence反映Grid中存在BBox时预测框和GT框的IOU;条件类别概率是Grid中包含某个类别物体的情况下,物体属于 \text i 类的概率。

最终的Score分数就是:

\text{Score = } \Pr(\text{Class}_i \mid \text{Object}) \cdot \Pr(\text{Object}) \cdot \mathrm{IOU}_{\text{pred}}^{\text{truth}} = \Pr(\text{Class}_i) \cdot \mathrm{IOU}_{\text{pred}}^{\text{truth}}

这个Score同时编码了 BBox中出现该类物体的概率BBox与GT的IOU

YOLOv1-Model.webp

网络最终输出一个 S × S × (B × 5 + C) 维度的Tensor,把参数带进去就是 7 × 7 × 30 的张量。

7 × 7 的维度上是最终输出特征图的维度,30 这个维度是在描述每个Grid中的 2 个BBox的XYWH + Confidence + 20个类别的条件概率。

输入尺寸为 448 × 448,32倍下采样后,得到最终 7 × 7 个 Grid,每个Grid对应一块 64 × 64的区域,最多检测98个BBox,得到49个目标。

Network

网络设计上受GoogLeNet启发,整体结构包含 24个卷积层 + 2个全连接层

不过论文中的模型结构省略了一部分内容,导致看起来比较费劲,我找到了一个相对正确的版本:

YOLOv1-Structure.webp

代码可以参考 darknet/cfg/yolov1/yolo.cfg at master · AlexeyAB/darknet

不过这些复现的代码都使用了Batch Normalization,实际YOLOv1并没有使用BN,BN是2015年提出的,那时候用的人不多。

此外代码中的 Pad=1 代表需要Padding,实际填充量为 \text{kernel size//2}

Loss Function

\begin{aligned} \text{Loss} = & \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] \\ & + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] \\ & + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (C_i - \hat{C}_i)^2 \\ & + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (C_i - \hat{C}_i)^2 \\ & + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 \end{aligned}

YOLOv1的损失函数可以看做由3部分组成:

位置损失: 前两项。中心点 \text{(x, y)} 使用均方误差。宽高 \text{(w, h)} 使用平方根误差,这样可以使小BBox获得更大Loss。

置信度损失: 第三四项。对包含物体的BBox,预测置信度 {\hat {C}_i} 应与真实 IOU 尽可能接近;对不包含物体的BBox,预测置信度应趋近于 0。

分类损失: 最后一项。每个Grid预测一组条件类别概率 \hat{p}_i(c),与GT标签计算MSE。

公式中出现的 1_{ij}^{obj} 是 一个指示函数,意义为:

\mathbb{1}_{ij}^{\text{obj}} = \begin{cases} 1, & \text{如果第 } i \text{ 个网格的第 } j \text{ 个边界框“负责”预测某个物体} \\ 0, & \text{否则} \end{cases}

在有物体时,损失函数1、2、3、5项参与运算;无物体时,只有第4项参与运算。有物体的另一个非负责框(同Grid中IOU较低的那个)也只有第4项参数运算。

关于权重的选择:

  • \lambda_{\text{coord}} = 5 的原因在于一张图像中大多数Grid没有物体(起码当时的Pascal VOC数据集是这样的),如果不加权,网络会把位置预测的比较随意,较大的位置坐标权重有利于学习到更准确的位置信息。
  • \lambda_{\text{noobj}} = 0.5 是作者调超参调出来的。在有物体时,让负责预测物体的那个框输出的置信度尽可能等于IOU;在没有物体时,预测的置信度要尽可能趋近于0(IOU就是0)。如果让每个空框的损失权重和正样本一样大,网络会只顾着把所有置信度压到 0,而不愿去学习少数有物体的框。

YOLOv2

TODO
文章先发了,之前不小心把YOLOv1内容全删了又没备份,怕了