一、yolov5的网络结构,官方给出的不同版本的yolov5模型区别在哪,这些区别会带来那些改变。
yolov5 5.0 的结构,输入会经过Focus结构,上图:
backbone 主要包含:Focus,C3,conv等结构,现在分别讲解:
Focus 网络:Focus 网络是对输入图片进行切片操作,假设输入图片的大小为640×640×3,间隔一个元素提取,每个通道整合输出320×320×4的数据,四个通道以此进行此操作。将每个通道相同位置的元素提取整合concat在一起。这样做的目的就是输入数据大小减小一半,但没有特征的损失,
Conv 结构包括:2d卷积、BN层、SILU层。
BN层:BN层的提出,主要是为了解决大部分的数据落入非线性饱和区,导致模型训练过程梯度消失,一方面增加模型训练时间,还有很大的可能模型到最后无法收敛。通过计算模型批次训练数据的均值和方差,对训练数据进行均值为0,方差为1的归一化处理。如果激活函数采用的是sigmoid 函数,可让大部分的训练数据落入线性区域内,加快模型的训练收敛速度,同时考虑到归一化处理后,对数据分布的变化比较大,引入缩放平移参数对数据进行仿射变换,尽可能保持数据的原始分布,又不至于让数据完全落入饱和区域内。
BN层的计算在training和testing阶段是不一样的。
trainning 阶段
testing 阶段,采用全局统计量,滑动平均的方法计算得出均值和方差。
running_mean = momentum * running_mean + (1 - momentum) * x_mean
running_var = momentum * running_var + (1 - momentum) * x_var
SILU层,激活函数层,也被称为 Swish 激活函数。他的定义为:
f(x)=x*sigmoid(x),它结合了非线性和线性函数的两种特征。他能够解决梯度消失的问题,在x小于0的时候保留了负梯度的特点。
C3结构
C3 结构包含了卷积结构,bottleneck 结构,从而增加网络深度和感受野,更好的提取数据特征。
class C3(nn.Module):
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
"""
:param c1: 整个 C3 的输入channel
:param c2: 整个 C3 的输出channel
:param n: 有n个Bottleneck
:param shortcut: bool Bottleneck中是否有shortcut,默认True
:param g: C3中的3x3卷积类型 =1普通卷积 >1深度可分离卷积
:param e: expansion ratio
"""
super(C3, self).__init__()
c_ = int(c2 * e)
self.cv_1 = Conv(c1, c_, 1, 1)
self.cv_2 = Conv(c1, c_, 1, 1)
self.m = nn.Sequential(*[Bottleneck(c_, c_, e=1, shortcut=True, g=1) for _ in range(n)])
self.cv_3 = Conv(2*c_, c2, 1, 1)
def forward(self, x):
return self.cv_3(torch.cat((self.m(self.cv_1(x)), self.cv_2(x)), dim=1))
深度可分离卷积包含两部分,由Depthwise Convolution和Pointwise Convolution两部分组成。
继续盗图讲解:
从图上分析,相比与普通卷积神经网络,这样做的好处是减少计算量,加快模型训练推理速度。
Neck 网络采用的是SPP、SPPF和FPN
SPP结构 将特征图分别经过不同大小的卷积核操作,然后再进行concat操作,实现在不同尺度下的特征融合。
FPN网络是特征金子塔网络,通过在不同的特征尺度上,进行模型的推理和预测,能够兼顾大目标、中目标、小目标。
二、yolov5性能提升的一些技巧。
1.数据增强
马赛克:四张图像随机裁剪,随机缩放,随机排布拼接成一张图片。具体详见博客:
『数据增强』yolov5 数据增强 与 红外数据增强_yolov5数据增强-CSDN博客
2.loss函数的设计
损失函数由三部分组成,分类损失函数+置信度损失函数+定位损失函数
定位损失用的是CIOU loss
置信度和分类损失用的是BCE loss
损失函数基本内容参考损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU超详细精讲及Pytorch实现-CSDN博客