查看全课大纲(第 65 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

YOLOv3

小象实战讲义 · 基于深度学习的计算机视觉

在掌握了 YOLOv1 和 YOLOv2 的核心思想后,我们来看 2018 年发布的 YOLOv3。本节将深入剖析YOLOv3在损失函数、锚框(anchor)策略、主干网络和多尺度预测等方面的关键改进。这些改进,特别是其多尺度预测策略,使其在小目标检测上表现卓越,同时保持了YOLO系列一贯的高速优势。学完本节,你将能清晰阐述YOLOv3的核心架构及其相较于前代的进步。

💡 核心导读

  • 损失函数革新:从Softmax Loss转向Logistic Loss(二元交叉熵),以支持多标签分类任务。
  • 锚框策略升级:引入多尺度检测器,每个尺度预测3个锚框,形成“3×3”策略,显著提升了对不同大小目标的适应性。
  • 主干网络深化:采用基于残差(ResNet)机制的Darknet-53,网络深度大幅增加,特征提取能力更强。
  • 多尺度特征融合:通过特征金字塔网络(FPN)思想,融合不同尺度的特征图进行预测,极大改善了小目标检测性能。
  • 速度与精度平衡:在检测精度达到当时先进水平的同时,推理速度依然遥遥领先于其他算法。

核心改进点解析

YOLOv3在YOLOv2的基础上进行了多项实质性改进,我们可以从以下几个关键方面来理解它的进化。

损失函数与分类策略的改变

在YOLOv2中,分类任务使用Softmax函数,它假设每个目标只属于一个类别。然而,现实世界中一个物体可能同时属于多个类别(例如,“人”可能同时是“成年人”和“女性”)。为了处理这种多标签分类(multi-label classification) 问题,YOLOv3 摒弃了 Softmax,转而使用 Logistic 函数(或称 Sigmoid 函数) 为每个类别独立地预测一个概率;每个边界框的置信度(objectness)同样用 Sigmoid 单独预测,而不是在多类上做 Softmax。

相应地,损失函数也从Softmax对应的分类损失,改为对每个类别使用二元交叉熵损失(Binary Cross-Entropy Loss)。对某个锚框,其分类损失为所有类别的二元交叉熵之和:

Lcls=−∑c[yc⋅log⁡(pc)+(1−yc)⋅log⁡(1−pc)]L_{\text{cls}} = -\sum_{c} \left[ y_c \cdot \log(p_c) + (1 - y_c) \cdot \log(1 - p_c) \right]

其中,ycy_c 是类别 cc 的真实标签(0或1),pcp_c 是模型预测的该类别的概率。这种改变使得模型能够更灵活地处理复杂的现实世界标注。

锚框(Anchor Box)与多尺度检测

锚框策略是YOLOv3最显著的改进之一。

  • YOLOv2:在最终的 13×1313 \times 13 特征图上,每个网格单元(grid cell)预测 5 个锚框。这5个锚框的尺寸和宽高比是通过对训练集标注框进行k-means聚类得到的先验知识(priors)。
  • YOLOv3:采用了三个不同尺度的特征图进行预测,分别为 13×1313 \times 13、26×2626 \times 26、52×5252 \times 52(对应默认的 416×416416 \times 416 输入;若输入为 256×256256 \times 256,则对应 8×88 \times 8、16×1616 \times 16、32×3232 \times 32,两者只是输入分辨率不同)。每个尺度的特征图上,每个网格单元只预测 3 个锚框。所谓“3×3”,不是指 3×3 的网格划分,而是 3 个尺度 × 每个尺度 3 个锚框先验 = 9 个先验框。

为什么这种改变更有效?YOLOv2的5个锚框需要覆盖从大到小的所有目标,这对于极端尺寸的目标(尤其是小目标)可能匹配不佳。YOLOv3将9个聚类得到的锚框先验,按照尺寸大小分配给三个尺度:大尺寸锚框分配给低分辨率(13×1313 \times 13)的特征图,用于检测大物体;中、小尺寸锚框分别分配给中、高分辨率(26×2626 \times 26, 52×5252 \times 52)的特征图,专门用于检测中、小物体。这种“分而治之”的策略,让每个检测器更专注于特定尺度范围的目标,从而提高了先验框与真实框的平均交并比(IoU),也提升了检测精度,尤其利好小目标检测。讲师举了一个生动的例子:在领导人合影中,YOLOv3甚至能检测出每个人佩戴的领带。

# 演示YOLOv2与YOLOv3预测框数量的对比计算
# YOLOv2: 13x13网格,每个网格5个锚框
yolov2_grid = 13
yolov2_anchors_per_cell = 5
yolov2_total_boxes = yolov2_grid * yolov2_grid * yolov2_anchors_per_cell

# YOLOv3: 三个尺度 (13x13, 26x26, 52x52),每个尺度每个网格3个锚框
yolov3_scales = [13, 26, 52]
yolov3_anchors_per_cell = 3 # 每个尺度上,每个网格的锚框数
yolov3_total_boxes = sum([yolov3_anchors_per_cell * size * size for size in yolov3_scales])

print(f"YOLOv2 总预测框数量: {yolov2_total_boxes}")
print(f"YOLOv3 总预测框数量: {yolov3_total_boxes}")
print(f"YOLOv3 比 YOLOv2 多 {yolov3_total_boxes - yolov2_total_boxes} 个预测框")
YOLOv2 总预测框数量: 845
YOLOv3 总预测框数量: 10647
YOLOv3 比 YOLOv2 多 9802 个预测框

从计算结果可以看出,得益于多尺度预测,YOLOv3生成了数量远超YOLOv2的预测框,这为其高召回率,尤其是小目标召回率,奠定了基础。

主干网络:Darknet-53

为了支撑更复杂的多尺度预测任务并提取更丰富的特征,YOLOv3将主干网络从YOLOv2的Darknet-19升级为Darknet-53。

顾名思义,Darknet-53 共 53 层:52 个卷积层 + 1 个用于 ImageNet 分类的全连接层。它的核心是大量使用了残差连接(Residual Connection),其结构单元与 ResNet 类似。正是残差结构缓解了深层网络中的梯度消失/爆炸问题,使得网络能够稳定地训练到 50 多层,从而获得更强的特征表示能力。

一个容易被忽略的细节是:如果严格去数论文中给出的 Darknet-53 结构图,卷积层实际上是 52 个。第 53 层是 ImageNet 分类用的全连接层(检测任务中会被去掉),所以准确的拆法是“52 个卷积层 + 1 个全连接层 = 53 层”;论文习惯上称其为“53 层卷积网络”。这不影响我们对它作为深度残差网络的理解。

在 ImageNet 分类任务上的对比显示,Darknet-53 的层数只有 ResNet-152 的约三分之一(53 对 152),Top-1 准确率却与之接近,浮点运算量(FLOPs)更少,速度更快。这种效率与性能的平衡,使其非常适合作为实时目标检测的主干网络。

网络结构示意图(简化版Darknet-53卷积组):
输入 (416x416x3)
|
|-- 卷积层 (3x3, 32) + 批归一化 + LeakyReLU
|
|-- 残差块组1 (包含1个残差块,输出通道64, 特征图尺寸208x208)
|   |-- 卷积(1x1, 32)
|   |-- 卷积(3x3, 64)
|   `-- 残差连接
|
|-- 残差块组2 (包含2个残差块,输出通道128,特征图尺寸104x104)
|-- 残差块组3 (包含8个残差块,输出通道256,特征图尺寸52x52)   -> 52x52 检测头(小目标)
|-- 残差块组4 (包含8个残差块,输出通道512,特征图尺寸26x26)   -> 26x26 检测头(中目标)
|-- 残差块组5 (包含4个残差块,输出通道1024,特征图尺寸13x13)  -> 13x13 检测头(大目标)
|
`-- 全局平均池化 + 全连接层 (用于ImageNet分类,检测任务中不用)

多尺度预测与特征金字塔网络(FPN)

YOLOv3性能提升的关键在于其多尺度预测架构,它借鉴了特征金字塔网络(Feature Pyramid Network, FPN)的思想:同样是“自上而下 + 横向连接”,但 FPN 的横向融合用逐元素相加,YOLOv3 改用通道拼接(concatenation)。

其工作流程如下:

  1. 骨干特征提取:输入图像经过Darknet-53,得到不同深度的特征图。越深的层,特征图尺寸越小(下采样次数多),语义信息越强,但空间细节丢失越多。
  2. 第一个检测头(大目标):在Darknet-53的最后一层(特征图尺寸最小,如13×1313 \times 13)后接一系列卷积层,然后直接在此特征图上进行第一次预测。这个尺度感受野大,适合检测大物体。
  3. 特征融合与第二个检测头(中目标):将第一个检测头前面的某层特征(例如倒数第三个卷积层的输出)先经 1×11 \times 1 卷积降维到 256 通道,再进行上采样(upsampling,YOLOv3 实现中为 2 倍最近邻插值),使其尺寸扩大一倍(如从13×1313 \times 13 到 26×2626 \times 26)。然后将上采样后的特征与Darknet-53中较早层(对应26×26×51226 \times 26 \times 512)的特征图进行连接(concatenation),得到 26×26×76826 \times 26 \times 768。融合后的特征图同时包含了深层的语义信息和浅层的细节信息,经过进一步卷积后,进行第二次预测。这个尺度适合检测中物体。
  4. 特征融合与第三个检测头(小目标):重复上述过程。将第二个检测头前面的特征先经 1×11 \times 1 卷积降维到 128 通道,再上采样到 52×5252 \times 52,与Darknet-53中更早层(对应52×52×25652 \times 52 \times 256)的特征连接,得到 52×52×38452 \times 52 \times 384;再经卷积后进行第三次预测。这个尺度特征图分辨率最高,保留了最多的空间细节,专门用于检测小物体。

这种“自上而下(top-down)”的路径和横向连接(lateral connection),构建了一个特征金字塔,使得每个预测尺度都融合了高语义和高分辨率的信息,从而实现了高效的多尺度目标检测。这种“多尺度、由粗到细”的思路,与传统的图像金字塔、SIFT 尺度空间一脉相承。

YOLOv3多尺度预测数据流示意图:

Darknet-53骨干网络
      |
      v
[深层特征] 尺寸小,语义强 (例如: 13x13x1024)
      |-----------------> 检测头1 (预测大目标)
      |
      v (1x1卷积降维到256通道 -> 上采样x2)
[上采样特征] (例如: 26x26x256)
      |
      + (连接)
      |
[中层特征] 来自骨干网络 (例如: 26x26x512)
      |
      v
[融合特征] (例如: 26x26x768)
      |-----------------> 检测头2 (预测中目标)
      |
      v (1x1卷积降维到128通道 -> 上采样x2)
[上采样特征] (例如: 52x52x128)
      |
      + (连接)
      |
[浅层特征] 来自骨干网络 (例如: 52x52x256)
      |
      v
[融合特征] (例如: 52x52x384)
      |-----------------> 检测头3 (预测小目标)

性能评价与总结

在发布时,YOLOv3在COCO等标准数据集上的表现非常亮眼:

  • 精度:其平均精度(mAP)达到了当时一流水平,虽然并非最高,但稳居前列。
  • 速度:这是YOLOv3最突出的优势。在同等精度级别的模型中,其推理速度(如用Titan X测量)远超竞争对手(如RetinaNet、SSD等),通常能快数倍,真正体现了“You Only Look Once”的实时性精髓。

综合来看,YOLOv3 通过引入残差主干网络、多尺度特征金字塔检测以及针对多标签分类的损失函数,在保持 YOLO 系列超高速特性的同时,显著提升了检测精度,特别是明显改善了小目标检测,成为当时工业界和学术界都非常青睐的实用检测模型。

📝 动手练一练

  1. 概念辨析:YOLOv3将分类损失从Softmax Loss改为Binary Cross-Entropy Loss,主要是为了解决什么问题?这种改变在模型输出层和损失计算上分别带来了什么变化?
👉 点击查看参考答案

主要为了解决多标签分类(Multi-label Classification) 问题。在真实场景中,一个目标可能同时属于多个类别(例如,一个“女人”同时也是“行人”),Softmax的“互斥”假设不再适用。

输出层变化:输出层不再使用一个Softmax函数输出所有类别的概率分布(和为1),而是对每个类别独立使用一个Sigmoid函数,输出该类别存在的概率(0到1之间),各类别概率相互独立。

损失计算变化:损失函数从针对单个类别的交叉熵,变为对每个类别分别计算二元交叉熵并求和。公式为:Lcls=−∑c[yclog⁡(pc)+(1−yc)log⁡(1−pc)]L_{cls} = -\sum_{c} [y_c \log(p_c) + (1-y_c)\log(1-p_c)],其中 cc 遍历所有类别。

  1. 机制理解:简述YOLOv3中“3×3”锚框策略的具体含义。为什么这种策略相比YOLOv2的5个锚框策略,能更好地检测小目标?
👉 点击查看参考答案

“3×3”指的是:3个检测尺度 × 每个尺度3个锚框先验。

  • 3个检测尺度:网络在 13×1313\times13、26×2626\times26、52×5252\times52 三种不同分辨率的特征图上进行预测。
  • 每个尺度3个锚框:在每个尺度的每个网格单元(grid cell)上,预测3个不同尺寸/长宽比的边界框。这9个锚框尺寸是通过聚类得到的,并按大小分配给不同的尺度。

对小目标检测更有利的原因: YOLOv2只在 13×1313\times13 的特征图上预测,对于图像中的小物体,到这个尺度时其特征可能已经非常微弱甚至消失。YOLOv3增加了 26×2626\times26 和 52×5252\times52 两个更高分辨率的检测层,专门负责中小物体。高分辨率特征图保留了更多空间细节,使得小目标的特征更加明显。同时,分配给这些尺度的锚框尺寸也是专门为中小物体聚类得到的,匹配度更高,从而显著提升了小目标的召回率和检测精度。

  1. 主干回顾:YOLOv3 的 backbone 基于什么机制、叫什么名字?为什么它能把网络堆到 50 多层?
👉 点击查看参考答案

YOLOv3 的 backbone 叫 Darknet-53,核心是残差连接(ResNet 机制):每个残差块由 1×1 卷积和 3×3 卷积组成,并带一条 shortcut。残差连接让梯度可以跨层直接回传,缓解了深层网络的梯度消失/爆炸,因此才能稳定训练到 50 多层。Darknet-53 共 53 层(52 个卷积层 + 1 个 ImageNet 分类全连接层),在 ImageNet 上 Top-1 接近 ResNet-152,但层数约只有其三分之一,速度更快。

本章小结

本节我们系统学习了 YOLO 系列在 2018 年的重要版本——YOLOv3。它集前代优点与多项创新于一身:

  1. 采用基于残差连接的Darknet-53作为主干网络,增强了特征提取能力。
  2. 创新性地使用多尺度特征金字塔(FPN-like)结构进行预测,通过上采样和特征融合,使不同尺度的检测头都能获得强语义和高分辨率的特征,极大改善了小目标检测。
  3. 将锚框策略优化为“3尺度×3先验”,使检测任务更具针对性。
  4. 改用Logistic输出和二元交叉熵损失,以支持更灵活的多标签分类场景。
  5. 在检测精度达到当时一流水平的同时,保持了当时领先的推理速度,在 2018 年的实时检测领域处于领先位置。

需要说明的是,以上评价针对的是 2018 年前后的技术格局;以今天的标准看,YOLOv3 已是历史模型:YOLOv4、YOLOv5、YOLO11 等在精度和速度上已超越它,DETR 系列则提供了无需锚框和 NMS 的端到端路径;但其多尺度融合与 anchor 分配思路仍是现代检测器的重要基础。

📋 行动清单

  • 在脑海中绘制出YOLOv3的网络结构图,特别是三个检测头的特征融合路径(上采样、连接)。
  • 理解“3×3”锚框策略与多尺度检测之间的关系,并能解释其为何能提升小目标检测性能。
  • 对比YOLOv2,总结YOLOv3在损失函数、主干网络和检测策略上的核心改进点。

2026 视角

YOLOv3在2018年发布后,其多尺度预测和特征融合的思想影响深远,但目标检测领域并未止步。从今天的视角回望,YOLOv3更像是一个承前启后的关键节点。

  1. YOLO系列的工程化演进:YOLOv3之后,YOLO系列在工程优化和架构改进上持续迭代。YOLOv4(2020)在YOLOv3基础上集成了当时多种优秀的“技巧”(Bag of Freebies/Bag of Specials),如Mosaic数据增强、CIoU损失、SPP模块、PANet特征融合等,在速度和精度上取得了更好平衡。YOLOv5(2020)并非官方续作,但其基于PyTorch的工程实现非常优秀,提供了极其易用的训练和部署流程,迅速在工业界流行。此后的 YOLOv8(2023)、YOLO11(2024)等版本,进一步优化了骨干网络和 neck 结构,并集成了更先进的训练策略和任务头(如实例分割、姿态估计),形成了一个统一、强大且用户友好的算法框架家族,至今仍是工业界实时检测的首选之一。

  2. 端到端检测器的兴起:YOLOv3仍需依赖手工设计的锚框和复杂的后处理(如NMS)。以DETR(2020)为代表,基于Transformer的端到端检测器开始兴起。它利用Transformer的全局注意力机制,将目标检测视为一个集合预测问题,直接输出最终的边界框集合,无需锚框和NMS。随后,Deformable DETR等改进工作提升了小目标检测性能和训练速度。这类方法展示了全新的技术路径,但在实时性上通常仍不及高度优化的YOLO系列。

  3. 大模型时代的冲击与机遇:随着视觉基础大模型(如SAM)和多模态大模型(如CLIP)的出现,目标检测的范式也在被重新思考。SAM展示了强大的零样本分割能力,其思想可以启发新的检测框架。而CLIP等模型提供的强大语义表征,也被用于提升开放词汇检测(Open-Vocabulary Detection)的能力,使模型能够检测训练时未见过的类别。

总结来说,YOLOv3的设计思想在今天依然具有重要价值。当前的主流检测器,无论是YOLO的后续版本还是其他新架构,都在不同程度上继承了多尺度特征融合、轻量高效等核心理念。同时,端到端学习和基础大模型正在为这个领域带来新的变革动力。理解YOLOv3,是理解现代目标检测技术演进脉络的坚实基础。

—— 小象教研组