状态:草稿 (2026-10-13),部分实测。 网格与 AP 示例是在笔记本电脑 CPU 上直接运行得到的值(
code/06_yolo_ap.py,1秒以内)。论文数值摘自原文及相关条件,硬件则以等级标出。许可证内容于 2026-10-13 在各仓库的 LICENSE 文件和官方说明中核实,不作为法律意见。 编写规则:以实测数据为准,未能测出的标记为“未实测”。
目录
1. 看一次就好
第 5 篇中的 Faster R-CNN 约为每秒 5 帧(fps)。这是因为需要提取候选区域(第 1 阶段),并对每个候选区域进行裁剪判定(第 2 阶段)。Redmon 等人的 YOLO(You Only Look Once, 2016)改变了问题:“难道不能将检测作为 单一回归问题来解决吗?”其核心思想是让图像通过网络一次,就能同时输出所有的边界框和类别。
YOLO v1 的规则如下:
- 将 448×448 的输入划分为 S×S = 7×7 网格。
- 物体的 中心点落入的格子负责该物体。
- 每个格子输出 B=2 个边界框(分别为 x、y、w、h、置信度)以及一套 C=20 个类别概率(VOC)。
- 因此输出为
7 × 7 × (2·5 + 20) = 7×7×30,共 1,470 个数字。
亲自动手:哪个格子负责
在 448px 的图像中,一个格子是 64px。我们将其代入乒乓球场景中进行了测试(实测)。
선수 몸 중심 (200,260) → 칸 (행 4, 열 3)
공 중심 (330,95) → 칸 (행 1, 열 5)
라켓 중심 (215,270) → 칸 (행 4, 열 3) ← 선수와 같은 칸
运动员和球拍的中心落在了同一个格子中。由于该格子只输出 一套类别概率,因此“人”和“球拍”会发生冲突。论文也将“一个格子只能预测有限数量的物体”列为缺点,并指出在鸟群等小物体密集出现的场景下表现较弱。
损失的设计
损失是边界框坐标、置信度和类别误差的平方和,其中有几个调整体现了“为什么”。
- 宽高使用 平方根进行比较。因为大箱子和小箱子各偏离 10px 不应受到相同的惩罚。
- 坐标误差乘以 λ_coord = 5,无物体的格子置信度误差乘以 λ_noobj = 0.5。由于大多数格子都是空的,如果不减小空格子的权重,训练就会向“全空”的方向倾斜。这相当于用常数权重处理了第 4 篇中的 focal loss 相同的问题。
结果(论文)
| 模型 | VOC 2007 mAP | 速度 | 条件 |
|---|---|---|---|
| YOLO | 63.4 | 45fps | 桌面 GPU,不使用批处理 |
| Fast YOLO | 52.7 | 155fps | 〃 |
在同一篇论文的误差分析中,YOLO 的 定位误差是最大的误差类型。不过,将背景误认为物体的几率比 Fast R-CNN 要低,两者结合后在 VOC 2012 上提升到了 75.0(Fast R-CNN 单独为 71.8)。由于一次性看完整张图,上下文错误较少,但由于网格较粗,定位不够精准。
2. 谱系:锚框、多分辨率、无锚框、无 NMS
| 模型(年份) | 改动内容 | 论文数值(条件) |
|---|---|---|
| SSD(2016) | 在不同分辨率的特征图上使用默认框进行预测 | SSD300 VOC 2007 74.3%, 59fps(桌面 GPU,批大小 8) |
| YOLOv2(2017) | 引入锚框。尺寸不通过人工设定,而是通过 k-means聚类出 5 个 | 在 416×416 下 VOC 2007 76.8,67fps(桌面 GPU) |
| YOLOv3(2018) | 在三个分辨率下预测(类似于 FPN),每个分辨率 3 个锚框,共 9 个 | COCO AP50 57.9,51ms(608×608,桌面 GPU)对比 RetinaNet 57.5,198ms |
| YOLOX(2021) | 无锚框,分类与定位头分离,正样本分配(SimOTA) | YOLOX-L COCO 50.0 AP,68.9fps(数据中心 GPU,FP16,640×640) |
| YOLOv10(2024) | 无 NMS:训练时同时使用多对一和一对一头,推理时仅使用一对一 | v10-S 46.3 AP 2.49ms 对比 RT-DETR-R18 46.5 AP 4.58ms(推理用数据中心 GPU,TensorRT FP16) |
一些设计原因如下:
- k-means 锚框(v2)。 就像第 5 篇实验中那样,如果人工设定的锚框与数据中的物体形状不匹配,就会产生盲区。v2 将训练框通过
1 − IoU距离聚类来确定锚框,5 个锚框的平均 IoU 为 61.0,与手动挑选的 9 个(60.9)相当。从数据中确定锚框,少量的锚框就足够了。 - 多分辨率(SSD,v3)。 在高分辨率特征图上寻找小物体,在低分辨率特征图上寻找大物体。这与第 5 篇的 FPN 思想相同。
- 无锚框(YOLOX)。 锚框增加了需要人工设定的值(数量、尺寸、IoU 阈值)。如果每个格子直接输出一个边界框,并在训练过程中动态决定哪个格子负责哪个真实标签,就不再需要锚框。
- 无 NMS(v10)。 NMS 是网络之外的后处理,需要耗费时间,并且无法仅凭一个阈值区分重叠的物体和重复项(第 5 篇)。如果在训练时让每个真实标签只匹配一个预测,就不需要 NMS,这也是第 8 篇的 DETR 首先展现的想法。v10 解决了仅使用一对一匹配会导致训练信号变少的问题,即在训练时同时保留多对一头来进行补充。
3. 亲自动手:计算 AP
检测论文中的数字几乎全都是 AP(Average Precision)。假设在一个有 5 个真实球体的场景中,检测器输出了 8 个边界框。按得分从高到低排序,与真实标签的 IoU 在 0.5 以上匹配则为正确(1),否则为错误(0)(实测)。
점수 순 맞음/틀림: [1, 1, 0, 1, 0, 1, 0, 0]
재현율: [0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8, 0.8]
정밀도: [1.0, 1.0, 0.67, 0.75, 0.6, 0.67, 0.57, 0.5]
AP = 0.683
AP 是以召回率(查找到的真实标签比例)为横轴、精确率(输出中正确的比例)为纵轴的曲线下面积。计算时会将精确率通过“从右侧看过去的最大值”进行平滑(所有点插值)。由于 5 个真实标签只找到了 4 个,因此召回率在 0.8 处停止,之后的面积为 0。
即使是相同的 8 个边界框,如果 得分顺序改变,AP 也会发生变化。
| 得分顺序 | AP |
|---|---|
| 正确的 4 个在前面 [1,1,1,1,0,0,0,0] | 0.800 |
| 原始顺序 | 0.683 |
| 正确的 4 个在后面 [0,0,0,0,1,1,1,1] | 0.400 |
AP 不仅评估“是否猜对”,还评估“是否给正确的目标赋予了更高的分数”。置信度得分一团糟的检测器,即使输出相同的边界框,其 AP 也很低。这是阅读论文 AP 时需要记住的一点。
4. 什么是实时性
“实时”是一个相对的概念。如果乒乓球视频为每秒 60 帧,则处理单张图片可用时间为 16.7ms,解码、预处理、模型、后处理和判定必须全部在这个时间内完成。阅读论文中的 fps 时,必须结合条件来看。
- 硬件等级:数据中心 GPU 和手机之间存在数十倍的差距。
- 精度与运行时:FP32 PyTorch 和 FP16 TensorRT 即使是同一个模型,速度也有数倍的差距(YOLOv10 / RT-DETR 表格使用的是 TensorRT FP16)。
- 批处理:SSD 的 59fps 是在批大小为 8 的情况下测得的,如果批大小为 1 则为 46fps。实时视频通常批大小为 1。
- 是否包含 NMS:测量的是仅网络本身的时间,还是包含了后处理的时间。
TT Score 的找球(BlurBall)在服务器 GPU 上对单个窗口(3 帧)耗时 10.5ms(实测,TT Score 模型剖析第 2 篇)。比起“多少 fps”,用“单张图片多少 ms,包含了什么”来记录才具备可比性。
5. 许可证:AGPL 在网页服务中的含义
YOLO 这个名字被多个仓库共用。不同仓库的许可证各不相同(各 LICENSE 文件,已于 2026-10-13 核实)。
| 仓库 | 许可证 |
|---|---|
| Darknet(原版 YOLO) | “YOLO LICENSE” —— 实际上接近于可做任何事的公有领域条件 |
| YOLOX(Megvii) | Apache-2.0 |
| RT-DETR(官方) | Apache-2.0 |
| Ultralytics 软件包(YOLOv8、YOLO11 等,包含 YOLO-World / YOLOE 移植) | AGPL-3.0 或付费企业许可证 |
| YOLOv10(官方,基于 Ultralytics 代码) | AGPL-3.0 |
AGPL-3.0 是在 GPL 的基础上增加了 网络条款(第 13 条)。如果修改了程序,并允许用户通过网络与该程序进行交互,则必须向该用户提供获取修改后版本源代码的途径。即使不分发、仅在服务器上运行也会产生义务,这一点与 GPL 不同。Ultralytics 在其官方指南页面中说明,若想在不受 AGPL 公开义务约束的情况下使用(如商业产品、SaaS/API、嵌入式设备、商业使用的微调模型等),则需要企业许可证,并且其立场是训练出的模型默认也遵循 AGPL-3.0。最后这一主张(权重也受 AGPL 约束)在法律上能在多大程度上成立,本文无法判定。不过,公司持有这种主张这一事实本身就已经构成了风险因素。
TT Score 是一个网页服务。因此,在找球方面选择了代码为 MIT 的 WASB/BlurBall,在球桌方面选择了 Apache-2.0 的 SAM 2.1,而由于 AGPL 条件,YOLO 系列分割模型被排除在候选之外(TT Score 模型剖析第 1 篇)。这也是在选择模型时将许可证与准确率、速度放在同等重要地位的原因。
6. 局限性与我们的项目
- 小物体。 乒乓球远小于网格的一个格子(v1 中为 64px),对单阶段检测器来说也很难。尽管通过多分辨率有所改善,但 TT Score 是用高分辨率热力图而不是边界框来寻找球的(第 3 篇)。
- NMS。 网络外部的后处理会使部署变得复杂。在 TT Score 的姿态实验中,由于 OpenCV DNN 无法读取人脸检测器(RTMDet)的 ONNX 文件中包含的 NMS 运算,我们绕过了它,改用球体周边的框代替人体框(TT Score 模型剖析第 4 篇)。这就是为什么没有 NMS 的检测器(v10、第 8 篇的 DETR 系列)如此受欢迎的原因。
- 相同的名称,不同的模型。 仅凭“YOLO”这个名称无法确定其结构或许可证。版本号和仓库必须一同标注。
下一篇文章将介绍抛弃了卷积的 Vision Transformer。
TT 寄语。 同样的八个框,仅仅改变了得分的顺序,AP 就从 0.8 变成了 0.4。自信地给正确的预测赋予高分也是一种实力。
参考文献
- Redmon, J., Divvala, S., Girshick, R., Farhadi, A. (2016). You Only Look Once: Unified, Real-Time Object Detection. CVPR 2016. https://arxiv.org/abs/1506.02640
- Liu, W. et al. (2016). SSD: Single Shot MultiBox Detector. ECCV 2016. https://arxiv.org/abs/1512.02325
- Redmon, J., Farhadi, A. (2017). YOLO9000: Better, Faster, Stronger. CVPR 2017. https://arxiv.org/abs/1612.08242
- Redmon, J., Farhadi, A. (2018). YOLOv3: An Incremental Improvement. arXiv. https://arxiv.org/abs/1804.02767
- Ge, Z., Liu, S., Wang, F., Li, Z., Sun, J. (2021). YOLOX: Exceeding YOLO Series in 2021. arXiv. https://arxiv.org/abs/2107.08430
- Wang, A. et al. (2024). YOLOv10: Real-Time End-to-End Object Detection. NeurIPS 2024. https://arxiv.org/abs/2405.14458
- Zhao, Y. et al. (2024). DETRs Beat YOLOs on Real-time Object Detection. CVPR 2024. https://arxiv.org/abs/2304.08069
- GNU Affero General Public License v3.0: https://www.gnu.org/licenses/agpl-3.0.html
- Ultralytics 许可证指南: https://www.ultralytics.com/license,仓库 https://github.com/ultralytics/ultralytics
- 示例代码与输出:此文件夹中的
code/06_yolo_ap.py,code/06_yolo_ap.out.txt