在上一篇我们从整体出发,初步了解了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次方,因此函数公式可写作如下:
接着我们介绍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每次扩大一倍,故特征图虽然变小了,但其中单个像素点包含的特征信息在不断增大(但信息损失是不可避免的),通过这种方式来下采样特征图,同时提取到目标特征。