文章目录
- [一、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 的主要改进可以归纳为四点:
- 最大改进是网络结构,使其更适合小目标检测;
- 特征做得更细致,融入多尺度特征图信息来预测不同规格的物体;
- 先验框更丰富了:3 种 scale,每种 3 个规格,一共 9 种;
- 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 长期被工业界广泛使用的原因。