YOLOv3 核心原理详解:Darknet-53 架构、多尺度预测与 FPN 特征融合

文章目录

  • [一、YOLOv3 整体改进概览](#一、YOLOv3 整体改进概览)
  • [二、多尺度预测:为什么要设计 3 个 scale](#二、多尺度预测:为什么要设计 3 个 scale)
  • [三、核心网络架构 Darknet-53](#三、核心网络架构 Darknet-53)
    • [3.1 设计原则](#3.1 设计原则)
    • [3.2 Darknet-53 主体结构](#3.2 Darknet-53 主体结构)
    • [3.3 检测头与特征融合(FPN 思想)](#3.3 检测头与特征融合(FPN 思想))
  • 四、输入到输出的张量映射
  • [五、先验框设计:9 种尺度的先验框](#五、先验框设计:9 种尺度的先验框)
  • [六、Softmax → Logistic 分类器:支持多标签任务](#六、Softmax → Logistic 分类器:支持多标签任务)
    • [6.1 为什么要替换](#6.1 为什么要替换)
    • [6.2 Logistic 分类器的工作方式](#6.2 Logistic 分类器的工作方式)
    • [6.3 多标签分类示例](#6.3 多标签分类示例)
  • [七、YOLOv3 与前两代对比总结](#七、YOLOv3 与前两代对比总结)

一、YOLOv3 整体改进概览

YOLOv3 最大的亮点是重构了网络结构(Darknet-53)并引入多尺度特征融合,显著提升了小目标检测能力;同时将 Softmax 替换为多个独立的 Logistic 分类器,支持多标签分类任务。

YOLOv3 的主要改进可以归纳为四点:

  1. 最大改进是网络结构,使其更适合小目标检测;
  2. 特征做得更细致,融入多尺度特征图信息来预测不同规格的物体;
  3. 先验框更丰富了:3 种 scale,每种 3 个规格,一共 9 种;
  4. Softmax 改进:用 Logistic 分类器替代 Softmax,支持多标签任务。

背景补充 :YOLOv3 发表于 2018 年,论文标题为 YOLOv3: An Incremental Improvement(Joseph Redmon 与 Ali Farhadi)。作者自己也说它相对 v2 是"渐进式改进"(incremental improvement),没有像 v1→v2 那样的颠覆性重构,但在小目标检测和多标签场景上提升明显。

二、多尺度预测:为什么要设计 3 个 scale

传统单尺度检测器(如 YOLOv2)只在一个特征图上做预测,容易顾此失彼:

  • 特征图太小(如 13×13):感受野大、语义强,但空间分辨率低,小物体在其中可能只占 1~2 个像素,容易漏检;
  • 特征图太大(如 52×52):空间分辨率高,但经过的卷积层数少、语义弱,对大物体的分类能力不足。

为了能同时检测到不同大小的物体,YOLOv3 设计了 3 个 scale 的输出:

Scale 特征图尺寸 下采样倍率 适合检测的目标
Scale 1(最深) 13×13 32 倍 大目标
Scale 2(中间) 26×26 16 倍 中等目标
Scale 3(最浅) 52×52 8 倍 小目标

每个 scale 上输出一个 3D tensor,每个 tensor 包含 Box1、Box2、Box3 三个先验框的预测结果。输入图像被划分为网格(Grid Cells),物体中心落在哪个网格,就由哪个网格负责预测。

这种做法借鉴了 FPN(Feature Pyramid Network) 的思想------通过上采样(UpSampling)把深层强语义的特征图与浅层高分辨率的特征图融合,从而在多个尺度上都获得"既强语义又高分辨率"的特征。这也是 YOLOv3 小目标检测能力大幅提升的根本原因。

三、核心网络架构 Darknet-53

3.1 设计原则

YOLOv3 的核心网络架构(Backbone)称为 Darknet-53,遵循以下原则:

  • 没有池化层和全连接层,全部是卷积层;
  • 下采样通过 stride=2 的卷积实现(而不是 MaxPool),可以避免池化带来的信息损失;
  • 大量使用 残差块(Residual Block);
  • Conv Block 表示普通的卷积模块(Conv + BN + LeakyReLU);
  • Residual Block 表示残差模块。

补充说明 :Darknet-53 之所以叫 53,是因为整个 Backbone 包含 53 个卷积层。作者设计时参考了 ResNet 的思路,让网络可以做得更深(53 层)而不退化,同时比 Darknet-19 在 ImageNet 分类上精度更高、计算量却更低。

3.2 Darknet-53 主体结构

输入尺寸为 416×416×3,经过一系列卷积和残差块后,依次输出三个分支特征图:

层 输出尺寸(batch_size, H, W, C) 说明
Inputs (416, 416, 3) 输入图像
Conv2D 32 filters, 3×3 (416, 416, 32) 初始卷积
Residual Block 1×64 (208, 208, 64) 1 个残差块,stride=2 下采样
Residual Block 2×128 (104, 104, 128) 2 个残差块
Residual Block 8×256 (52, 52, 256) 8 个残差块 → 分支 3
Residual Block 8×512 (26, 26, 512) 8 个残差块 → 分支 2
Residual Block 4×1024 (13, 13, 1024) 4 个残差块 → 分支 1

其中每个 Residual Block 内部结构大致为:

复制代码
1×1 卷积(降维) → 3×3 卷积(升维) → shortcut 相加

3.3 检测头与特征融合(FPN 思想)

Darknet-53 输出三个尺度的特征图后,进入检测头部分。以 416×416 输入为例:

Scale 1(13×13,最深层):

  • 从 Residual Block 4×1024 出来后,经过 Conv2D Block 5L 1024(5 个卷积层);
  • 最后通过 Conv2D 3×3 + Conv2D 1×1,输出 (13, 13, 75)。

Scale 2(26×26,中间层):

  • 将 Scale 1 经过 Conv2D + UpSampling2D 上采样 2 倍,得到 (26, 26, 256);
  • 与 Backbone 中的 Residual Block 8×512 输出 (26, 26, 512) 进行 Concat ,得到 (26, 26, 768);
  • 经过 Conv2D Block 5L 256,最后 Conv2D 3×3 + Conv2D 1×1 输出 (26, 26, 75)。

Scale 3(52×52,最浅层):

  • 将 Scale 2 经过 Conv2D + UpSampling2D 上采样 2 倍,得到 (52, 52, 128);
  • 与 Backbone 中的 Residual Block 8×256 输出 (52, 52, 256) 进行 Concat ,得到 (52, 52, 384);
  • 经过 Conv2D Block 5L 128,最后 Conv2D 3×3 + Conv2D 1×1 输出 (52, 52, 75)。

为什么是 75? 75 = 3(每个网格 3 个先验框)× 25,其中 25 = 4(边框坐标 x, y, w, h)+ 1(边框置信度)+ 20(PASCAL VOC 类别数)。如果是 COCO 数据集,类别数是 80,则输出通道数变为 3×(4+1+80) = 255。

四、输入到输出的张量映射

输入图像 416×416×3 经过 CNN 卷积后,分别在 32 倍、16 倍、8 倍下采样的位置引出三个分支,并通过上采样 + Concat 进行特征融合,最终输出:

复制代码
input: 416×416×3
        │
        ├─→ 32 倍下采样 → 13×13 特征图
        │                  └─ output: 13×13×3×(4+1+80) = 13×13×255
        │
        ├─→ 2 倍上采样
        │        │
        ├─→ 16 倍下采样 → 26×26 特征图
        │                  └─ output: 26×26×3×(4+1+80) = 26×26×255
        │
        ├─→ 2 倍上采样
        │        │
        └─→ 8 倍下采样 → 52×52 特征图
                   └─ output: 52×52×3×(4+1+80) = 52×52×255

输出张量每个元素的含义:

维度 含义
13×13 / 26×26 / 52×52 网格数(grid cell 的数量)
3 每个网格对应 3 个先验框
4 边框坐标 (x, y, w, h)
1 边框置信度(objectness)
80 COCO 数据集的对象类别数

一个预测目标对应的输出向量长度为 (4+1+80) = 85。

补充说明:416 是 32 的整数倍(416 = 32×13),这样经过 5 次 stride=2 下采样后正好得到 13×13 的特征图。如果输入 608×608,则输出为 19×19、38×38、76×76 三个尺度,精度会进一步提升但速度会变慢。

五、先验框设计:9 种尺度的先验框

YOLOv2 中只用了 5 个先验框,YOLOv3 把先验框数量增加到了 9 种(3 个尺度 × 3 个规格)。

YOLOv3 延续了 YOLOv2 的 K-means 聚类 方法来自动学习先验框尺寸,为每种下采样尺度设定 3 种先验框。在 COCO 数据集上,这 9 个先验框是:

复制代码
(10×13), (16×30), (33×23),
(30×61), (62×45), (59×119),
(116×90), (156×198), (373×326)

分配原则(大的先验框在感受野大的特征图中检测):

特征图 感受野 先验框(宽×高) 适合检测
13×13 大 (116×90), (156×198), (373×326) 较大的对象
26×26 中 (30×61), (62×45), (59×119) 中等大小的对象
52×52 小 (10×13), (16×30), (33×23) 较小的对象

为什么这样分配?

  • 13×13 特征图经过了最深的网络,感受野最大,能够"看到"整幅图像的上下文,适合判断大物体;
  • 52×52 特征图只经过少量卷积,感受野最小,但空间分辨率最高,小物体在其中占据的像素更多,更容易被识别出来。

补充说明 :416×416 输入下,YOLOv3 总共会预测 3 × (13² + 26² + 52²) = 3 × (169 + 676 + 2704) = 10647 个边界框。相比 YOLOv2 的 13×13×5 = 845 个,预测框数量大幅增加,这也是 YOLOv3 召回率更高的原因之一。

六、Softmax → Logistic 分类器:支持多标签任务

YOLOv3 用多个独立的 Logistic 分类器 替代了传统目标检测模型中常用的 Softmax 分类器。

6.1 为什么要替换

Softmax 函数的特点:

  • 将神经网络的输出转换为概率分布,所有类别的概率之和为 1;
  • 它假设每个样本只属于一个类别(互斥)。

但在更复杂的目标检测场景中,一个物体可能同时属于多个类别。例如:一张图像中可能同时出现"猫"、"狗"和"动物"。这种情况下,Softmax 就不再适用,因为它会强制每个样本只属于一个类别。

6.2 Logistic 分类器的工作方式

在 Logistic 分类器(逻辑回归)中,每个类别的预测是独立进行的。对于输入样本,分类器会为每个类别计算一个概率值,表示该样本属于该类别的可能性。

Logistic 分类器通常使用 Sigmoid 函数(也称为 Logistic 函数)作为激活函数,将神经网络的原始输出映射到 (0, 1) 区间:

σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1

其中 z z z 是神经网络的原始输出。

6.3 多标签分类示例

假设一个图像分类任务,需要识别图像中是否包含"猫"、"狗"和"动物"三种动物。使用 Logistic 分类器时,模型会为每个类别分别计算一个概率值:

图像 A:

  • 猫的概率 = 0.8
  • 狗的概率 = 0.3
  • 动物的概率 = 0.7

图像 B:

  • 猫的概率 = 0.2
  • 狗的概率 = 0.7
  • 动物的概率 = 0.6

设定阈值为 0.5,则:

  • 图像 A 会被标记为"猫 "(因为猫的概率 > 0.5)和"动物"(动物的概率 > 0.5),而不会被标记为"狗"(狗的概率 < 0.5);
  • 图像 B 会被标记为"狗 "和"动物"(它们的概率都 > 0.5),而不会被标记为"猫"(猫的概率 < 0.5)。

补充说明 :在 YOLOv3 中,损失函数里的分类损失也相应地从 Softmax + 交叉熵改为 二元交叉熵(Binary Cross-Entropy),对每个类别独立计算。这也是 YOLOv3 在开源数据集(如 Open Images,一张图有多个标签)上表现更好的原因。

七、YOLOv3 与前两代对比总结

维度 YOLOv1 YOLOv2 YOLOv3
Backbone 自建 24 卷积 + 2 全连接(类 GoogLeNet) DarkNet-19 Darknet-53(残差)
输入尺寸 448×448 416×416 416×416 / 608×608
输出特征图 7×7 单尺度 13×13 单尺度 13×13、26×26、52×52 三尺度
先验框数量 无 anchor,每格 2 个框 5 个 anchor 9 个 anchor(每尺度 3 个)
预测框总数 7×7×2 = 98 13×13×5 = 845 3×(13²+26²+52²) ≈ 10647
池化层 有(MaxPool) 有(MaxPool) 无,全卷积 stride=2 下采样
全连接层 有 无 无
分类器 Softmax Softmax 多个独立 Logistic(Sigmoid)
小目标检测 差 一般 显著提升(多尺度融合)
多标签支持 不支持 不支持 支持

一句话总结:

YOLOv3 的核心贡献就是把"更强大的 Backbone(Darknet-53)+ FPN 式多尺度特征融合 + 更丰富的先验框 + 支持多标签的 Logistic 分类器"这四样当下的经典做法全部整合进了一个端到端的 one-stage 检测器中。虽然它没有像 v2 那样在速度上取得突破,mAP 相比同时期的两阶段方法也不是最高,但它在速度、精度、灵活性三者之间取得了极佳的平衡,这也是 YOLOv3 长期被工业界广泛使用的原因。

相关推荐
MoRanzhi12031 小时前
122.四平方和(暴力枚举)
python·数学·算法·蓝桥杯·完全平方数·暴力枚举·四平方和定理
倒头就睡的小比特1 小时前
贪心算法介绍
算法·贪心算法
万少2 小时前
Qoder sonus模型 20分钟,复刻 马斯克 飞天汽车
前端·后端·算法
七牛云行业应用2 小时前
Muse Spark Open 发布:Meta 称其为美国最强开放权重模型,816B 参数如何落地
算法
esop轻Mes看板亮灯分拣ESD静电安2 小时前
产线“最后一米”的破局密码:ESOP与MES的区别与深度协同
算法
陈天伟教授2 小时前
《数据处理和标注技术》课程能力图谱
人工智能·算法
LMT_Lanmantech2 小时前
HyperWorks许可:almutil显示Unit满了,数据到底准不准?
运维·服务器·算法
禁默3 小时前
论文解读与思考:基于场所地图的标识感知机器人探索方法及工程参考的价值
人工智能·深度学习·算法·机器人
维克兜率天3 小时前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin