记录yolov5目标检测算法学习(主要模块学习之conv模块)23/10/14

本文详细介绍了Yolov5模型中conv模块的内部结构,包括Conv2d卷积操作、BatchNorm2d的批量归一化作用、激活函数Silu,以及参数k、s、p、c的含义。通过实例解释了这些组件如何协同工作以提取和处理图像特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇我们从整体出发,初步了解了yolov5的整体框架模型,在整个模型中涉及到诸多模块,那么本篇就来细谈其中的conv模块的内部结构

conv

conv是框架中出现的,次数最多的模块。由一个Conv2d、一个BatchNorm2d和激活函数构成。

可以理解为:在整个模型框架中,每经过一个conv模块,就需要经过一次Conv2d,一次BatchNorm2d以及一次激活函数,其中——

Conv2d是卷积神经网络中的一种操作,用于提取图像特征,它是指在二维图像上进行的卷积操作。

BatchNorm2d是PyTorch中的一个函数,用于对输入的4D张量([b,c,h,w])进行批量归一化。这里涉及到一个知识点batchnormalization(批标准化),能够有效地加速神经网络的训练过程,提高模型的泛化能力。举一个形象的例子,在学校上课,老师经常给学生做思想工作,无非是说些要好好学习努力上进之类,总之目的就是让你持续保持在认真学习的正路上,batchnormalization(批标准化)进行的就是这样一步类似的操作,及时纠正、控制模型的学习方向,往我们需要的方向进行。

激活函数用于引入非线性因素,增强模型的表达能力,很好理解——曲线自然比单一的直线能表达更多的东西。conv模块中的激活函数是一个名为silu的非线性函数,具体表达式:Silu (x)=x∗ sigmoid(x),其中sigmoid(x)=1/(1+exp(−x)),exp是自然对数e的指数函数,exp(-x)即exp的-x次方,因此函数公式可写作如下:

                                                Silu(x) = x*sigmoid(x) = x*\frac{1}{1+e^{-x}}

接着我们介绍conv的参数:k,s,p,c

在yolov5的模型结构图中,可以看见conv下面有4个参数kspc,例如backbone部分中深度为1的conv模块,其参数为k3,s2,p1,c128

k:指的是kernel_size,即卷积核的大小,通常用3*3,6*6这种左右两个数相同的卷积核,因此k只有一个数字,k3或k6这样

s:指的是stride,即步长,用来控制卷积核在图像窗口上每次平移的间隔

p:指的是padding,即灰度填充,对图像的分辨率处理时,为了不改变它原有的特征,不采取拉拽某边的方式而是在其外部填充灰度,需要注意的是这里的填充包括图像的上下左右。举一个例子,要将分辨率分别为2*2和4*4的两张图片进行特征融合,则对2*2的图片进行padding为1的灰度填充,这样它就变成分辨率为4*4的图片(长宽各加2),也就能和第二张图片进行特征融合了

c:指的是channels,即输出通道数,通道数是图像的一个很重要的概念(参考这篇博客学习),按个人理解简单总结成一个例子——现有一个3*3的矩阵,如果矩阵中的每个元素有n种取值,就说这个矩阵的通道数为n。比如一张图片,显示器大都是采用了RGB颜色标准,也就是说每个像素点需要有3种取值分别是红绿蓝,故通道数为3

经过对conv模块的进一步分析,相信你对yolo的模型及原理也有了更深刻的理解。

比如在backbone部分neck部分的右支路中conv模块(不包括c3模块里的)的kernel均为3,stride全部为2,padding全部为1(yolov5的6.0版本之后的第一个conv模块除外,6.0之前backbone部分的第一个模块原本是focus模块,6.0后替换为k6,s2,p2,c64的conv模块)即k3,s2,p1,因此Conv每次会将特征图的宽高减半,channels每次扩大一倍,故特征图虽然变小了,但其中单个像素点包含的特征信息在不断增大(但信息损失是不可避免的),通过这种方式来下采样特征图,同时提取到目标特征。

### YOLOv5 中的 C3 模块详解 #### C3 模块的功能与作用 C3 模块作为 YOLOv5 的核心组成部分之一,在提高模型性能方面起到了至关重要的作用。此模块专为增强特征提取效率而设计,旨在优化计算资源的同时保持甚至超越原有检测精度[^2]。 #### 结构特点 具体而言,C3 是 BottleneckCSP 的简化变体,内部仅包含三个卷积操作单元而非完整的瓶颈结构[Bottleneck][^4]。这种精简不仅降低了参数量,还使得整个网络更加轻量化并加速了推理过程。此外,相较于传统方法,它具备更好的融合特性,有助于多尺度信息的有效传递和整合。 #### 工作原理 当输入数据流经 C3 层时,会经历一系列精心安排的操作: 1. 首先应用一次标准卷积来调整通道维度; 2. 接着将输出分为两路分支处理——一路继续沿用常规路径前进;另一路由多个重复执行的小型残差连接构成; 3. 最终两条支路上的结果会被重新组合在一起并通过最后一个卷积完成最终输出准备进入下一层级。 ```python class C3(nn.Module): # Standard bottleneck def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion super().__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(2 * c_, c2, 1) # act=FReLU(c2) self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n))) def forward(self, x): return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)) ``` 上述代码片段展示了如何构建一个典型的 C3 单元实例化对象 `c` 表示中间层宽度比例因子,默认设置为 0.5 。通过这种方式定义后即可轻松嵌入到更大的神经网络框架内参与训练或预测任务中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值