目录
一. ConvBNSiLU(特征提取模块)
1.复合模块
2.k6,s2,p2,c64的含义
二. C3(下采样层)
1.通道压缩
2.路径处理
(1)快捷通道
(2)深度处理
(3)残差网络
(4)Bottleneck结构 编辑
(5)Concat(拼接操作)和 逐元素加法
三. 多尺度目标融合
1.感受野
2.深层网络
(1) 深层网络具备强大的语义表达能力
(2) 上下文信息的整合
(3) 抑制背景噪声
(4) 总结
3.浅层网络
(1) 高分辨率特征保留更多细节
(2) 浅层提取低级特征对小目标更重要
(3) 小目标在浅层特征图中的表现更清晰
(4) 检测头对小目标有针对性优化
(5) 总结
这篇文章将深入解析太阳花大佬绘制的 YOLOv5 可视化图。该图绘制得相当出色,但整体讲解稍显简略。为了更好地帮助初学者快速入门,我决定对其内容进行更详细的阐释。
太阳花大佬的博文:YOLOv5网络详解_yolov5网络结构详解-CSDN博客
不清楚怎么去掉图片的水印,就先这样了。
把他分为骨干网络,颈部网络和检测头三个部分。
一. ConvBNSiLU(特征提取模块)
1.复合模块
表示卷积层(Conv)、批归一化层(BN,Batch Normalization)和激活函数(SiLU, Sigmoid-Weighted Linear Unit)的组合:
- Conv:卷积层,用于特征提取。
- BN:批归一化,在每个小批次数据中,将激活值归一化到均值为 0、标准差为 1 的范围,然后再引入可学习的缩放和偏移参数,加快收敛速度并防止梯度消失或爆炸。
- SiLU:称为 Swish 激活函数,相较于 ReLU,SiLU 更平滑且具有非线性优点,能提升深度网络的表现能力,对小于 0 的输入有一定抑制效果,但不会完全归零。
公式:
在P1操作中,图片从640×640×3变成640×640×64的过程中使用了64个卷积核,原因是一个卷积核会对所有输入通道(3个)进行加权计算,得到一个输出值,形成一个输出通道,故而变为640×640×64卷积核会随着层数的增加而增加,以提取更丰富的特征。
2.k6,s2,p2,c64的含义
- 卷积核大小(k6):每个卷积核是 6×6×3,会对输入的每个 6×6 区域进行加权计算。
- 步长(s2):卷积核滑动时,每次移动 2 像素,输出特征图的分辨率从 640×640 降为 320×320。
- 填充(p2):在输入图像边缘填充 2 像素,保证卷积后特征图的大小适当减少,而不会丢失边缘信息。
- 通道数(c64):使用 64 个卷积核,每个卷积核生成一个输出通道,最终输出 320×320×64 的特征图。
3.计算流程
输入尺寸:640*640*3
输出尺寸:(640+2*2-6)/2+1=320(加1是确保是为了确保输出的计数从第一个卷积位置开始,而不是漏掉最初的一个位置)
二. C3(下采样层)
它是CSP瓶颈模块的一个基础版本,他的目的是通过增加特征的传递路径来提升网络的表现。
分为两条路径,但是都会经过一个卷积核为1*1,步长为1,通道数为64的卷积模块,把原先的维度从128通道变为64通道,然后最后再用同样的方法恢复成128通道。
1.通道压缩
操作机制:使用 1×1 卷积(也称为通道混合卷积)。
- 1×1 卷积核的作用类似于一个线性变换,它为每个输出通道生成一个加权的输入通道组合。
- 卷积核的大小是 1×1×128×64(意思是有64个1*1*128的张量),这意味着对于每个输出通道,网络会从 128 个输入通道中挑选、加权并综合这些信息。
- 使用 64 个卷积核,每个卷积核大小为 1×1×128,每个输出通道的值,是从128个输出通道的特征中线性加权后得到的。
- 如果网络训练得当,1×1 卷积会学到一种有效的特征组合方式,将重要信息融入到更紧凑的通道空间中,因此不会有实际的信息损失。
- 但在极端情况下,可能会有以下情况:
- 信息冗余较多时:128 通道中可能有大量重复特征,压缩到 64 通道可以提高效率。
- 信息表达不足时:如果特征中有极其丰富的信息,强制压缩可能导致部分特征表达能力下降。
- 压缩通道后,特征图并不会直接减少,而是被重新表示为更小的通道数,例如:输出的第 1 通道可能是输入通道 1 到 128 的加权和。
2.路径处理
在C3模块中,两条路径是同时进行的,并不是选择式,一个输入特征进入C3后,会被同时传递到两条路径,我这里称为快捷通道和深度处理通道。
- 这样就可以同时保留:
- 左边路径的浅层细节特征(如边缘、纹理等)。
- 右边路径的深度特征(如语义上下文信息)。
(1)快捷通道
快捷通道直接保留输入的原始特征,保证网络在进行深度计算时,依然能保留一部分输入的细节信息(如高分辨率的纹理特征),这种保留有助于避免深度网络导致信息损失。
在深层网络中引入这种跳跃式的连接,有助于梯度流动,防止梯度消失。
快捷通道的设计思路来源于残差网络(后面有讲),目的是为了解决深度网络的训练问题,例如梯度消失和模型退化。
(2)深度处理
深度处理对输入特征进行更深层次的特征提取。
- 通过 Bottleneck 结构(后面会讲),捕获输入特征的语义信息(更高级别的特征)。堆叠多个 Bottleneck,可以逐步增强网络对局部上下文和全局模式的理解能力。
- 在这个C3模块里 Bottleneck 结构被堆叠了三次,每个 Bottleneck 1 提取一次特征,相当于通过多层卷积捕获更加复杂的特征表示,堆叠操作逐步增强特征图的语义表达能力,同时引入更高层的上下文信息。
- 可以发现Bottleneck 结构的堆叠次数会随着网络层数的加深而增加,3->6->9,因为网络越深,处理的特征越接近高层语义信息,包含更复杂的上下文关系。随着网络的加深,增加 Bottleneck 的次数可以:
- 提取更多的深层次特征。
- 增强网络对目标的语义理解能力。
- 弥补在早期浅层处理时未捕捉到的上下文信息。
- 在浅层(靠近输入端),计算量的压力主要来自于特征图的分辨率较大。因此设计Bottleneck次数较少,以减少计算量。
- 随着网络加深,特征图分辨率逐步减小,计算压力降低,增加 Bottleneck 的次数可以增强特征提取能力,简单的说就是为了增强在复杂背景下的微弱目标的检测能力,因为深层网络可以通过整合上下文信息,强化小目标与背景的区别。
- 然后进行Concat操作,两条路径的特征在通道维度上被拼接:假设左边路径的输出是 [N,C1,H,W],右边路径的输出是 [N,C2,H,W],拼接后的输出为 [N,C1+C2,H,W](通道数增加,但分辨率 H×W 不变)。
(3)残差网络
残差是指输入特征和输出特征之间的差异,即模型需要学习的部分。它的核心思想是:不要让网络直接学习复杂的映射,而是学习输入与目标之间的差「残差」。 在残差网络中,原始输入特征 x 会通过一条「快捷通道」直接加到深层网络提取的特征上:
- 其中:
- H(x) 是网络学到的残差(深度卷积处理后的特征),很多情况下,H(x)是一个相对较小的调整。
- x 是输入特征,通过「快捷通道」直接传递。
- F(x) 是最终的输出。
- 残差连接确保至少可以拟合恒等映射(F(x)=x),即使深度增加也不会影响性能,防止网络退化。
- 在传统的深度网络中,层数增加时,梯度会在反向传播中逐渐减小(尤其是激活函数如 sigmoid 会导致梯度接近 0),残差连接通过提供一条直接的梯度传递路径,确保梯度能够顺利地从后层传到前层。
(4)Bottleneck结构

输入张量为640*640*64。
第一层Conv 1*1卷积核64,用于调整通道数,但是在这个卷积中,他的通道数并没有变化,他没有升维也没有降维,作用是将输入通道上的特征重新分布,突出更重要的特征,抑制无关的特征。并且使3*3的卷积可以在更有用的特征分布上工作,避免冗余计算。
第二层Conv 3*3卷积核64,作用是学习局部特征间的关联关系,捕获更丰富的语义信息,卷积之后会经过激活函数(如 SiLU),增加特征的非线性表达能力,使模型能更好地拟合复杂特征。
最后将经过两次卷积后的特征与未经处理的特征直接相加,这就是残差连接,他要求两部分特征的张量形状必须完全一致(宽、高、通道数都相同)。
注意,这里的相加操作,和Concat操作不同并不是把通道数叠加,而是进行逐元素加法,作用在 对应位置的特征值 上,例如:比如在第一个通道(第 1 张灰度图)上,某个像素的值是,直接输入特征的像素值是10,卷积后的特征像素值是15,相加后的结果就是10+15=25,这个相加操作会对所有通道的所有像素逐一进行。
假设直接输入特征(X)是这样的:
两次卷积后的特征(F(X))是这样的:
逐元素相加的结果就是:
用公式表达就是:
假设直接输入张量为,卷积后的特征张量为
,输出张量的每个元素计算为
,其中 i,j表示像素位置,c 表示通道索引。
(5)Concat(拼接操作)和 逐元素加法
既然Concat拼接操作和逐元素加法都是对特征进行融合操作,他们都有什么作用。
Concat(拼接操作)
- 特性:
- 拼接后,特征通道数增加。
- 每条路径的特征信息都可以保留完整,不会被直接叠加或覆盖。
- 优点:
- 能够保留不同路径的特征信息(如浅层的细节和深层的语义)。
- 在网络设计中可以显式增加特征的多样性,有助于增强特征表达能力。
逐元素加法
- 特性:
- 输出的特征维度与输入一致。
- 加法会对两条路径的特征进行融合,但会引入信息“覆盖”或“互相抵消”的风险。
- 优点:
- 融合方式简单且计算高效。
- 对浅层和深层特征的直接融合效果好,适合残差连接等简单结构。
也就是说:使用逐元素加法的话,如果左边路径保留了浅层的边缘细节,而右边路径提取了深层语义特征,两者可能会因为相加而互相干扰。并且由于逐元素加法输出的通道数与输入一直,不能显式的增加特征表达能力。但是由于逐元素加法的计算效率高,所以在简单结构中使用逐元素加法更好。
三. 多尺度目标融合
在特征金字塔网络(FPN)或类似结构中,确实有许多特征从骨干网络传递到颈部网络,但并不是所有的特征都经过最深层再传递到颈部,而是浅层、中层和深层特征会分别传递到颈部网络。这种设计背后有着明确的原因,主要是为了多尺度融合和信息利用最大化。
- 检测任务需要多尺度特征:
- 小目标通常在浅层(高分辨率)特征中更容易检测,因为浅层特征保留了较多的细节信息。
- 大目标通常在深层(低分辨率)特征中更容易检测,因为深层特征包含更丰富的语义信息。
- 因此,中间层特征(如 P3 和 P4)也很重要,不能全部等到底层完成后再统一处理。
- P3:检测小目标。
- P4:检测中型目标。
- P5:检测大型目标。
这里突然发现,好像与我前面说的矛盾了啊,我前面说越深层的越容易检测小目标,这里说越浅层越容易,这不是矛盾了吗。实际上不是,深层特征通过语义增强和上下文整合,能够在复杂背景下提升小目标与背景的区分能力。但由于分辨率限制,仅依赖深层特征难以精确检测小目标,所以通常通过结合浅层特征和深层特征来解决这一问题。
但是开始讲深层和浅层网络前,要先讲一个概念,什么叫感受野。
1.感受野
首先看一张图,这是一个简单的卷积操作,假设卷积核为3*3,步长为3,经过了三次卷积。
-
左侧 (3x3):
- 浅层的一个像素(红色)只对应原图中一个非常小的区域(3×3)。
- 这个区域是感受野最初的范围,局限于非常小的局部信息。
-
中间 (9x9):
- 随着网络层数增加,第二层的像素(黄色)已经整合了第一层对应多个 3×3 区域的内容。
- 此时,感受野扩大到了 9×9,它“看”的范围更大了,包含了更多局部的信息。
-
右侧 (15x15):
- 在更深的层中,每个特征点(蓝色)对应了原图上更大的一片区域。
- 这一感受野可以覆盖 15×15,如果再进行两次卷积,感受野可以覆盖到27x27的范围,可以快速捕捉到全局信息。
感受野是当前特征图上的某一个像素点在原始图像上对应的区域范围。这个像素点包含了从该区域提取并整合的信息。
如果卷积核是 k×k,步长是 s,无池化操作,则可以通过层数递归来计算感受野:
其中 是第
层的感受野大小。
深层的感受野覆盖整个图像,适合理解目标的全局结构和上下文信息,这对大目标的检测或语义理解特别有用。
2.深层网络
(1) 深层网络具备强大的语义表达能力
深层特征通过多层卷积和非线性变换,能够提取高层语义特征。这些特征有助于明确目标类别,从而有效区分目标和复杂背景。
- 例子:小目标可能在浅层被复杂背景干扰(如树叶与小鸟的纹理相似),但深层通过语义区分(小鸟的语义类别特征)能够更好地区分。
(2) 上下文信息的整合
深层特征由于感受野的扩大,能够整合目标周围的上下文信息。这在小目标检测中尤为重要:
- 小目标通常缺乏足够的局部特征,但其上下文关系可以帮助区分它和背景。
- 例子:在复杂街道场景中,深层特征可以利用“小目标-行人”与“路面、建筑”的空间关系来区分行人和背景。
(3) 抑制背景噪声
深层特征能够过滤掉低级干扰(如纹理和噪声),聚焦于目标的全局特征。
- 这种鲁棒性(可以理解为抗干扰、抗噪声能力)对于复杂背景下的目标检测非常有帮助。
(4) 总结
总的来说,深层网络由于强大的语义表达能力,更适合检测大目标:
- 大目标在低分辨率特征图中仍然能保留足够的像素区域。
- 大感受野覆盖更大的区域,因为能覆盖整个目标,避免仅看到一部分导致误判,所以更适合检测大目标,并且可以捕捉到目标与周围背景,上下文的关系。
- 但是小目标可能会消失。
3.浅层网络
(1) 高分辨率特征保留更多细节
- 浅层特征图的分辨率较高(如 80×80),能够更好地捕捉目标的边界和纹理细节。
- 小目标占用的像素少,如果分辨率过低(如深层的 20×20 特征图),目标可能丢失甚至无法检测。
- 例子:一个小目标在原图中占 8×8 像素,浅层特征图中可能占 4×4 像素;但在深层特征图中可能仅剩 1×1 或完全消失。
(2) 浅层提取低级特征对小目标更重要
- 浅层特征提取的是低级特征(如边缘、纹理、颜色),这些特征对于小目标的检测至关重要。
- 原因:小目标往往缺乏复杂的语义信息,其辨别主要依赖边界形状或局部纹理,而这些信息在浅层特征中更为丰富。
- 对比:深层特征偏重语义抽象,可能无法准确表示小目标的精细特征。
(3) 小目标在浅层特征图中的表现更清晰
- 高分辨率的浅层特征能够更清晰地表示小目标的形状和位置,使得网络更容易定位和分类。
- 浅层特征虽容易受到背景干扰,但这些背景信息同样以高分辨率形式保留,为后续融合深层特征提供了更多信息。
(4) 检测头对小目标有针对性优化
- 在现代目标检测模型中,浅层特征会被直接用于小目标检测。
- 例子:YOLOv5 的检测头会结合浅层高分辨率特征(如 P3),专门用于检测小目标。
(5) 总结
总的来说,浅层网络拥有更强的细节捕捉信息,更适合检测小目标
- 小目标在浅层特征图中的高分辨率保留更多目标细节。
- 提取低级特征(边缘、纹理)对小目标至关重要
- 浅层特征缺乏语义信息,可能会将背景的边缘或纹理误判为目标,故而需要深层特征辅助。
特征 | 浅层卷积 | 深层卷积 |
---|---|---|
分辨率 | 80×80 | 20×20 |
感受野 | 小(如 3×3) | 大(如 81×81) |
"看到的范围" | 只看原图的小部分 | 可以看见原图的大区域 |
像素的数量 | 多,像素密集 | 少,像素稀疏 |
关注的内容 | 局部边缘、细节 | 全局语义、上下文信息 |