与你
86.76M · 2026-02-09
YOLOv8网络使用的模块:
Backbone负责特征提取。C2f模块是YOLOv8 Backbone的核心,它取代了YOLOv5中的C3模块,在轻量化和梯度流方面表现更优。
为什么非要Split?
结构细节:
输入 → 卷积 → 分割为两部分:
分支1: 直接传递(捷径连接)
分支2: 通过 n 个 Bottleneck 堆叠
每个Bottleneck结构:
输入 → Conv1x1(降维) → Conv3x3(特征提取) → Add(残差连接)
融合:分支1 + 分支2 → 卷积输出
这个收集中间层输出再统一融合的思想,类似于 ELAN / E-ELAN 家族(YOLOv7 里提出的高效层聚合思想),也类似 DenseNet 的“密集连接”精神:保留每个阶段的中间特征,而不是只拿最后一层。
多分支结构促进梯度反向传播,缓解梯度消失
Cross Stage Partial(跨阶段部分残差)思想:把特征分成两路,一路走残差堆叠,另一路保持相对原样,最后再合并。这可减少重复计算,又保持梯度流动。
其中的 CBL 模块就是
Conv2D + BN + LeakyReLU 的组合,这里的 bottleneck 可以根据传入的参数决定是否带有 shortcut。如果是带有 shortcut 的话,就是正统的 residual 模块了,如果没有 shortcut,就是单纯的 2 个 CBL 串联。
基于 CSP 的 Bottleneck 堆叠;在 PyTorch 化实现里叫 C3,是 YOLOv5 主干/颈部的基本块。它也会做通道分支,但中间特征的保留/聚合方式相对固定,聚合点更单一。
C3 模块因为内部有 3 个卷积模块,所以被命名为 C3 模块,去掉了 BottleneckCSP 中一些繁杂的 Conv2d 操作,并且将激活函数从 LeakyReLU 换成了 SiLU。 CBL 模块也因此变成了 CBS 模块。CBS 模块:
Conv + BatchNorm + SiLU。和 BottleneckCSP 一样,内部的 bottleneck 也分为带 shortcut 和不带 shortcut 两种。
Efficient Layer Aggregation Networks 的扩展。更激进地把中间层输出聚合在一起,强调“多分支并行 + 多阶段特征显式收集”。E-ELAN 让网络在不增加很多参数的情况下,仍能扩大有效深度和表达力,推动了 YOLOv7 的精度-速度前沿。
上图可知演变过程:
VoVNet-->CSPVoVNet-->ELAN-->E-ELAN
expand, shuffle, merge cardinality 来进一步让网络堆叠更多 block。中间特征显式保留”合体,形成一种既轻量又高梯度流效率的模块。 C3k(可定制卷积核):C3k是C3模块的一个变体,主要改进在于它允许自定义卷积核的大小(kernel size)。可以更好地适应不同尺寸的图像特征,尤其是当我们需要捕捉更大范围的上下文信息时。当k设置为3时候,C3k在功能上与C3相等。
C3k2结合了C2f的速度优势和C3k的灵活性。它允许在运行时选择是否使用C3k层来处理特征,提供了很高的可配置性。
当c3k参数设置为True时,C3k2将使用c3k层,能够利用不同卷积核大小的灵活性;否则,它将使用标准的瓶颈层,与c2f类
似。
从这个族谱你可以看出:
显式多阶段特征聚合 + 强梯度流”,但努力把它做得更规整、更轻、更适合自动缩放。YOLOv8沿用并优化了PANet结构,实现多尺度特征的有效融合。
Neck部分负责多尺度特征融合,通过将来自Backbone不同阶段的特征图进行融合,增强特征表示能力。具体来说,YOLOv8的Neck部分包括以下组件:
结构流程:
Backbone输出特征图(P3,P4,P5) →
上采样路径(自顶向下):
P5 → 上采样 → 与P4融合 → 卷积 → 上采样 → 与P3融合
下采样路径(自底向上):
融合后的P3 → 下采样 → 与P4融合 → 下采样 → 与P5融合
最终输出三个尺度的特征图
SPPF模块(Spatial Pyramid Pooling Fast): 用于不同尺度的池化操作,将不同尺度的特征图拼接在一起,提高对不同尺寸目标的检测能力。
SPP模块是何凯明大神在2015年的论文 《Spatial Pyramid Pooling in Deep Convolutional Networks for VisualRecognition》中被提出。
SPP为空间金字塔池化结构,主要是为了解决两个问题:
这个是YOLOv5 作者Glenn Jocher 基于SPP提出的,速度较SPP快很多,所以叫SPP-Fast。SPPF是空间金字塔池化的快速版本,它是一种在卷积神经网络中用于处理不同尺寸输入的技术。SPPF的核心思想是通过对输入特征图进行不同尺度的池化操作,生成固定长度的特征向量,从而使得网络能够处理任意尺寸的输入图像。
YOLOv8 中入了 PAN-FPN (Path Aggregation Network - Feature Pyramid Network) 为其特征金字塔网络,进一步增强了多尺度特征的表示能力。PAN-FPN 通过双向路径的融合,使得特征图包含更丰富的上下文信息和语义信息,增强了模型对不同尺度目标的检测能力。
相对于YOLOv5或者YOLOv6,YOLOv8将C3模块以及RepBlock替换为了C2f,同时细心可以发现,相对于YOLOv5和YOLOv6,YOLOv8选择将上采样之前的1×1卷积去除了,将Backbone不同阶段输出的特征直接送入了上采样操作。
YOLOv5的Neck部分的结构图如下:
YOLOv6的Neck部分的结构图如下:
YOLOv8的结构图:
FPN网络pytorch代码
class FPN(nn.Module):
def __init__(self, num_blocks, num_classes, back_bone='resnet', pretrained=True):
super(FPN, self).__init__()
self.in_planes = 64
self.num_classes = num_classes
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
self.bn1 = nn.BatchNorm2d(64)
BatchNorm = nn.BatchNorm2d
self.back_bone = build_backbone(back_bone)
# Bottom-up layers
self.layer1 = self._make_layer(Bottleneck, 64, num_blocks[0], stride=1)
self.layer2 = self._make_layer(Bottleneck, 128, num_blocks[1], stride=2)
self.layer3 = self._make_layer(Bottleneck, 256, num_blocks[2], stride=2)
self.layer4 = self._make_layer(Bottleneck, 512, num_blocks[3], stride=2)
# Top layer
self.toplayer = nn.Conv2d(2048, 256, kernel_size=1, stride=1, padding=0) # Reduce channels
# Smooth layers
self.smooth1 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
self.smooth2 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
self.smooth3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
# Lateral layers
self.latlayer1 = nn.Conv2d(1024, 256, kernel_size=1, stride=1, padding=0)
self.latlayer2 = nn.Conv2d( 512, 256, kernel_size=1, stride=1, padding=0)
self.latlayer3 = nn.Conv2d( 256, 256, kernel_size=1, stride=1, padding=0)
def _upsample(self, x, h, w): # upsample use 'bilinear' interpolate
return F.interpolate(x, size=(h, w), mode='bilinear', align_corners=True)
def _make_layer(self, Bottleneck, planes, num_blocks, stride):
strides = [stride] + [1]*(num_blocks-1)
layers = []
for stride in strides:
layers.append(Bottleneck(self.in_planes, planes, stride))
self.in_planes = planes * Bottleneck.expansion
return nn.Sequential(*layers)
def _upsample_add(self, x, y):
'''Upsample and add two feature maps.
Args:
x: (Variable) top feature map to be upsampled.
y: (Variable) lateral feature map.
Returns:
(Variable) added feature map.
Note in PyTorch, when input size is odd, the upsampled feature map
with `F.upsample(..., scale_factor=2, mode='nearest')`
maybe not equal to the lateral feature map size.
e.g.
original input size: [N,_,15,15] ->
conv2d feature map size: [N,_,8,8] ->
upsampled feature map size: [N,_,16,16]
So we choose bilinear upsample which supports arbitrary output sizes.
'''
_,_,H,W = y.size()
return F.interpolate(x, size=(H,W), mode='bilinear', align_corners=True) + y
def forward(self, x):
# Bottom-up
c1 = F.relu(self.bn1(self.conv1(x)))
c1 = F.max_pool2d(c1, kernel_size=3, stride=2, padding=1)
c2 = self.layer1(c1)
c3 = self.layer2(c2)
c4 = self.layer3(c3)
c5 = self.layer4(c4)
# Top-down
p5 = self.toplayer(c5)
p4 = self._upsample_add(p5, self.latlayer1(c4))
p3 = self._upsample_add(p4, self.latlayer2(c3))
p2 = self._upsample_add(p3, self.latlayer3(c2))
# Smooth
p4 = self.smooth1(p4)
p3 = self.smooth2(p3)
p2 = self.smooth3(p2)
return p2, p3, p4, p5
论文: [1612.03144] Feature Pyramid Networks for Object Detection
FPN 通过结合 深层语义信息(高层特征)和 浅层细节信息(低层特征),构建多尺度的特征金字塔,显著提升目标检测模型对不同尺寸目标的检测能力。
在YOLOv8中,FPN主要负责构建从低层到高层的多尺度特征图。其主要过程如下:
1.自顶向下路径:
2.横向连接:
FPN网络大致结构如下:一个自底向上的线路、一个自顶向下的线路、横向连接
结来说,FPN = top-down的融合 + 在金字塔各层进行prediction
FPN(Feature Pyramid Network) 通过自顶向下的路径构建特征金字塔,但存在两个关键问题:
论文:2018年在CVPR [1803.01534] Path Aggregation Network for Instance Segmentation
PANet的核心创新在于引入了自底向上的路径聚合机制,形成了双向特征融合路径,解决了FPN单向信息传递的局限性。这一改进使得低层的高分辨率特征能够更有效地传递到高层,同时高层的语义信息也能充分影响低层特征,实现了更全面的多尺度特征交互。
PAN是在FPN的基础上,进一步增强特征金字塔网络的结构,具体过程如下:
1.自底向上的路径:
2.特征融合:
FPN更适合基础目标检测任务和资源受限环境,例如轻量化移动端部署或实时视频流处理。其简单高效的结构设计使其在计算资源有限的场景下仍能保持良好的检测性能。
PANet则适用于需要高精度的场景,特别是在处理极小目标或复杂背景环境时。例如在自动驾驶系统中检测车辆周围的小障碍物,或在医学图像分中识别微小病灶时,PANet的双向特征融合和自适应特征池化技术能够显著提升检测和分割的准确性。
FPN的参数量约为25M,FLOPs约为200B;而PANet的参数量增加到32.5M,FLOPs达到235.6B。
双融合路径:
跨尺度连接:使用Concat而非Add,保留更多特征信息
适配不同尺度:针对80×80(小目标)、40×40(中目标)、20×20(大目标)特征图优化融合策略。
在YOLOv8中,PAN-FPN的实现结合了FPN和PAN的优点,具体如下:
YOLOv8将检测头改为 解耦形式,并引入了先进的损失函数。
在YOLOv8中,Head部分负责将Neck部分输出的特征进行进一步处理,以生成最终的检测结果。Head部分的主要功能是将特征图转换为目标检测所需的具体信息,包括类别、位置和置信度。
解耦头结构:
共享特征 → 三个独立分支:
1. 分类分支:Conv + Conv → 类别置信度
2. 回归分支:Conv + Conv → 边界框坐标
3. 分布焦点分支:Conv + Conv → 边界框分布(DFL)
Head部分通常包括若干卷积层和激活函数。这些卷积层用于进一步处理Neck部分输出的特征图,以提取更多的高级特征。常见的激活函数包括ReLU或Leaky ReLU,能够引入非线性,从而提升特征表达能力。
在YOLOv8中,预测层是关键组件,负责生成最终的检测结果。预测层包括三个主要输出:
传统:直接回归边界框坐标
DFL:将坐标预测建模为离散概率分布
步骤:
1. 预测边界框的分布(如y = Σ[P(i)×i])
2. 使用Focal Loss优化分布
优势:
- 更准确的小目标检测
- 对模糊边界更鲁棒
总损失 = 分类损失 + 回归损失 + DFL损失
分类损失:BCEWithLogitsLoss 或 VarifocalLoss(可选)
回归损失:CIoU Loss(考虑重叠、中心距离、长宽比)
DFL损失:监督边界框分布学习
除了上述结构外,YOLOv8还引入了一些新的优化技术,如:
(1)特征金字塔网络是啥? (2)空间金字塔池化是啥? (3)C2f是啥? (4)路径聚合网络是啥? (5)特征金字塔网络和路径聚合网络区别? (5)YOLO为什么使用两层特征金字塔结构? (7)预测层会输出什么? (8)怎么去除重复的检测框和减少误检和漏检?NMS (9)为什么检测小物体需要用大的特征图?
(10)为什么要用双分支?
(11)连接处的c和a的区别?
连接处的c通常代表"拼接/连接(concatenate)"操作
连接处的a是add(加法操作/残差连接)
(12)TD和BU是什么?
[1]什么是 C2f: YOLOv8 中引入的一种高效特征提取模块_c2f模块
[2]万字详解YOLOv8网络结构Backbone/neck/head以及Conv、Bottleneck、C2f、SPPF、Detect等模块_yolov8网络架构