自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:
其中 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分数就是:
这个Score同时编码了 BBox中出现该类物体的概率 和 BBox与GT的IOU 。

网络最终输出一个 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个全连接层。
不过论文中的模型结构省略了一部分内容,导致看起来比较费劲,我找到了一个相对正确的版本:

代码可以参考 darknet/cfg/yolov1/yolo.cfg at master · AlexeyAB/darknet
不过这些复现的代码都使用了Batch Normalization,实际YOLOv1并没有使用BN,BN是2015年提出的,那时候用的人不多。
此外代码中的 Pad=1 代表需要Padding,实际填充量为 \text{kernel size//2}
Loss Function
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} 是 一个指示函数,意义为:
在有物体时,损失函数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内容全删了又没备份,怕了
评论