详解yolov5的网络结构

转载自文章

网络结构图(简易版和详细版)

此图是博主的老师,杜老师的图

网络框架介绍

前言:

YOLOv5是一种基于轻量级卷积神经网络(CNN)的目标检测算法,整体可以分为三个部分,

backbone,neck,head。

如上图所示,我们需要先理解三个模块:Conv,C3,SPPF,以便理解网络结构图。

关于这三个模块的解释放在文章末尾。

其他我觉得有用的前置知识也会放在文章末尾。

1.backbone

作用:提取特征

backbone(主干网络)通过一系列的卷积层和池化层对输入图像进行处理,逐渐降低特征图的尺寸 同时增加通道数。这样做的目的是保留和提取图像中重要的特征。

经过backbone提取的特征图会传递给后续的特征金字塔网络(neck)和检测头(detection head)进行处理。

分辨率高、尺度大的图片更适合用于预测小目标而不是大目标。

首先,分辨率高的图片具有更多的细节信息,可以提供更丰富的特征和上下文信息。这对于识别和定位小目标非常重要,因为小目标通常具有较少的区分特征,需要更多的细节来进行准确的预测。

其次,尺度大的图片可以容纳更多的目标实例。在一个大尺度的图片中,可能存在多个小目标,而这些小目标在尺度较小的图片中可能会被压缩或截断,导致难以准确预测。因此,对于小目标的预测,使用尺度大的图片可以提供更多的目标实例,增加了模型的训练样本,有助于提高预测的准确性。

然而,对于大目标的预测,使用尺度大的图片可能并不是最佳选择。大目标通常具有明显的外观特征,而且在尺度较小的图片中也能够得到充分表示。此时,使用尺度较小的图片可以减少计算复杂

2.neck

neck(颈部)是backbone(主干网络)和detect(检测头)之间的网络模块。

作用:

在主干网络提取的特征基础上,进一步进行特征融合上采样操作(Upsample) ,以提供更高级的语义信息适应不同尺度图片的能力

更进一步讲,

在卷积神经网络中,先从浅层提取到图形特征,它们是简单的图形,语义性不够强;

再从深层提取到语义特征,语义性很强了,但却没了简单的图形。

而通过neck部分,就能实现浅层图形特征和深层语义特征的融合,(Concat就是在做这件事情)

归根到底还是为了目标检测能够更精细、准确!

以上这段话借用自记录yolov5目标检测算法学习(模型的框架学习)23/10/10_晴友读钟的博客-CSDN博客

3.head

作用:

对提取到的特征进行进一步处理,并生成最终的输出结果。

细讲一下head中作用的其中一个方面,

特征融合与转换:head可以将不同尺度的特征进行融合和转换,这有助于捕捉更高层的语义信息和上下

参考内容:特征融合与转换:head可以将不同尺度的特征进行融合和转换,这有助于捕捉更高层的语义信息和上下文关系。

我们结合网络结构图,可以看到,head接收了来自深度为第17,20,23层的特征图,

特征图分辨率越来越低,感受野越来越大,虽然可以学习到更高级的语义信息,但也会丢失细节

为了能检测到不同大小的物体,于是设计了detect模块来实现。

文关系。

我们结合网络结构图,可以看到,head接收了来自深度为第17,20,23层的特征图,

特征图分辨率越来越低,感受野越来越大,虽然可以学习到更高级的语义信息,但也会丢失细节

为了能检测到不同大小的物体,于是设计了detect模块来实现。

知识点补充

1.什么是CNN?

CNN通过模拟人类视觉系统的工作原理,通过层层堆叠的卷积层、池化层和全连接层等组件来进行图像数据的特征提取和分类。

2.什么是Conv?

Conv(卷积层)通常是由卷积(Convolution)、批标准化(Batch Normalization)和激活函数(Activation)这三个模块组成的

  1. 卷积(Convolution)

卷积是卷积神经网络最重要的操作之一,它通过在输入数据上滑动一个卷积核(filter),来提取出输入数据中的特征。卷积操作可以帮助网络捕捉到局部的空间信息,并且通过参数共享来减少模型的参数量,从而降低了过拟合的风险。

在卷积操作中,卷积核会对输入数据进行逐元素的乘法累加,从而生成输出特征图。卷积核的大小、步长、填充等超参数可以控制输出特征图的尺寸和感受野大小。此外,卷积操作还可以使用不同的卷积核来提取不同的特征,从而增强网络的表达能力。

  1. 批标准化(Batch Normalization)

批标准化是一种常用的技术,可以帮助网络更好地学习和收敛。**它通过对每个小批量数据进行归一化,来使得网络中的每一层输入分布更加稳定。**批标准化可以减少梯度消失和梯度爆炸的问题,从而使得网络更易于训练。此外,批标准化还可以增加网络的鲁棒性,使其对输入数据的变化更加稳定。

  1. 激活函数(Activation)

激活函数是卷积神经网络中非常重要的组件之一,**对输入数据进行非线性变换,从而增强网络的表达能力。**在卷积神经网络中,常用的激活函数包括ReLU、LeakyReLU、Sigmoid、Tanh等。这些激活函数都可以通过将负值置为0或者进行缩放来引入非线性变换,并且具有不同的性质和优缺点。

激活函数的作用是将卷积操作的输出映射到一个非线性空间中,从而使得网络能够更好地学习复杂的特征表示。激活函数还可以帮助网络更好地处理梯度信息,从而加速网络的收敛速度。

特点:

每经过一个Conv,原特征图大小减一半,通道数乘2。

作用:

特征提取和特征融合

k,s,p,c什么意思?

  • K: Kernel Size(卷积核大小):表示卷积核的尺寸。卷积核通常是一个二维矩阵(我将其比喻为窗口),用于提取输入数据的特征。例如:卷积核为3*3,则表示为k3,为6*6,则表示为k6。卷积核的大小通常是根据具体任务和数据的特点进行选择的。较小的卷积核可以提取更细粒度的特征,而较大的卷积核可以提取更全局的特征。同时,卷积核的大小也会影响模型的计算复杂度和参数量。
  • S: Stride(步幅):表示卷积核在输入的图像上滑动的步长。它决定了卷积操作的输出尺寸。
  • P: Padding(填充):表示在输入数据周围添加额外的像素值。填充可以使得卷积操作后输出数据的尺寸与输入数据相同或相近。例如,此时要将分辨率为3*3和9*9的图片进行特征融合,为了不改变图像原有的特征,不采用拉伸图像的方法,而是在3*3的图片四周(上下左右)填充灰度,使3*3的图片变为9*9,就可以进行特征融合了。那么要填充多少呢?我们要在四周分别填充p个像素,故为p3。padding_size = (kernel_size - 1) / 2
  • C: Channels(通道数):表示输入数据和卷积核中的通道数量。

通过调整这些参数,可以控制卷积操作的行为和输出结果的尺寸。卷积神经网络中的每一层都可以具有不同的KSPC设置,以适应不同的特征提取需求。

例如,使用3x3大小的卷积核,步幅为1,填充为0,通道数为64的卷积层,可以表示为"Conv(3, 1, 0, 64)"。这意味着在输入数据上使用3x3的卷积核进行卷积操作,步幅为1,不进行填充,并且输出通道数为64。

进一步解释Conv的完整过程,

我们可以将卷积核想象成一个窗口,而输入数据则是一张图片。卷积操作就像是将这个窗口在图片上滑动,对窗口内的像素进行一系列的计算,并生成一个新的像素值。这个新的像素值是通过将窗口内的像素与卷积核内对应位置的权重相乘,再求和得到的。

而步幅(Stride)是指卷积核在输入数据上滑动的距离。通俗地说,步幅就是每次卷积核在输入数据上移动的像素数。

想象一下,你有一张图片,而卷积核就像是一个小窗口,你把这个小窗口放在图片的左上角,然后开始滑动。步幅就是决定你每次滑动的距离。

如果步幅较大,那么你每次滑动的距离就比较长,相当于你在图片上跳跃式地移动。这样可以快速地对整个图片进行处理,但是可能会导致一些细节信息被忽略,因为你没有在每个位置都进行处理。

如果步幅较小,那么你每次滑动的距离就比较短,相当于你在图片上细致地移动。这样可以更好地捕捉到图片的细节信息,但是需要更多的计算和时间来完成整个处理过程。

那么填充有什么用呢?我们知道,经过卷积,特征图大小会减小一般,但我们要保证输出的图像大小跟输入时的大小接近,于是要填充四周。

假设图片为6*6,经过conv层变为3*3,但要保证图片依然为6*6,于是在图片四周填充,使其变回6*6。

Conv(卷积)层的通道有什么用?

通道数的概念:

通道数是指输入或输出中的特征通道数量。对于图像数据来说,通道数通常表示红色、绿色和蓝色(RGB)三个颜色通道。

注意,通道数不仅仅指的是颜色,除了RGB通道之外,还有其他类型的通道可以用于图像处理和深度学习任务。通道数通常用于表示颜色通道、灰度通道、深度通道等。

作用:

增加卷积层的通道数可以提高网络的表达能力,使其更好地适应复杂的任务。

例如:在图像分类过程中,最初的卷积层可以捕捉到低级特征,如边缘和颜色,

然而随着网络模型的深度加深,输出特征图中的模式和结构也越来越复杂。

如果网络太浅或通道数不够,则可能无法捕捉到复杂的特征,从而影响分类性能

总结:增加通道数可以使网络更加灵活和强大

3.什么是C3?

C3模块图如上。C3之所以叫C3,是因为在这个模块中有三个卷积层(Conv)

解释:

可以看到左侧卷积提取了一半的feature(特征),什么也不干,

右侧卷积也提取了一半的feature,使其经过BottleNeck(有两种)处理后,

两个部分进行Concat(拼接),然后再经过一次卷积层

作用:

从不同维度去提取特征并融合

4.什么是SPPF?

了解SPPF前,我们先要知道SPP(Spatial Pyramid Pooling),中文为空间金字塔池化

而SPPF(Spatial Pyramid Pooling Fusion)则是SPP的改进版。

什么是SPP?

在传统的CNN网络中,全连接层要求输入的特征图大小必须固定,但是图像中的物体大小和数量却是不确定的。因此,在使用全连接层之前,需要将所有的特征图resize到一个固定大小,这就会丢失掉部分信息(缺点)。

而SPP层可以通过金字塔池化的方式,在不同的尺度下进行池化操作,并将各个尺度的池化结果进行concat(拼接)作为输出,这样就可以在不改变特征图大小的情况下,得到一个固定长度的向量表示,从而解决了输入大小的问题。

SPPF和SPP的作用:

用于将不同尺度的特征进行融合,通过对特征图进行金字塔划分和池化操作,将多尺度特征整合到一个固定长度的特征向量中。

优点:

SPP可以处理任意大小的输入特征图,因此可以避免特征图大小变化对模型的影响。

SPP是如何运作的?

1.输入图像:SPP层可以接受任意大小的输入图像。

2.特征提取网络:通常使用预训练好的卷积神经网络(CNN)来提取图像特征。

3.SPP:对于不同大小的输入图像,SPP层会自动根据其大小分别生成多个不同尺度的池化区域,在这里是13*13,9*9,5*5。然后在每个池化区域内执行最大池化操作,得到固定大小的特征向量。

4.Concat:将多个尺度的特征向量(即上一步的池化结果)进行拼接

SPPF在SPP上有何改进?

与SPP相比,SPPF的池化操作由并联变为串联,且池化区域大小不变。后面两次池化是在上一次的基础上进行的。提高了效率,原理此处不展开讲。

5.什么是语义信息?

通俗地讲,语义信息是指数据中所隐含的意义和信息。

在人类语言中,一句话由多个字词组成,每一个字词都有语义信息,我们通过分析每一个词的语义信息,就能推导出整句话的含义。

类似的,在计算机视觉中,一张图片由若干个像素组成,每一个像素都有其自身的颜色和位置信息,通过分析每一个像素的颜色和位置信息,就能推导出整张图片的含义

6.什么是图形特征?

关于这个概念,简单理解即可。

图形特征,就是一张图像所含有的特征

例如:形状,纹理,颜色,边缘等,这些都是图像的特征,统称图形特征

7.什么是上采样操作?

结构图中的Upsample就是常见的上采样操作。

作用:

上采样操作会将较低分辨率的特征图进行上采样,以恢复到与较高分辨率特征图相同的尺寸

说人话就是,把较小的输入图像恢复出较大的图像。

yolov5中的Upsample操作是为了让不同尺寸的图像拼接,特征融合

8.特征图尺度,细节信息,语义信息之间有什么联系?

较浅的特征图(即较大尺度,分辨率较高的特征图)可以捕捉到更多的细节信息,例如物体的纹理等。

较深的特征图(即较小尺度,分辨率较低的特征图)则具有更高级的语义信息,例如物体的类别,姿态等。

因此,需要利用不同尺度的特征图,以保留丰富的语义信息和细节信息。

相关推荐
曼城周杰伦5 分钟前
自然语言处理:第六十三章 阿里Qwen2 & 2.5系列
人工智能·阿里云·语言模型·自然语言处理·chatgpt·nlp·gpt-3
吃肉不能购11 分钟前
Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
运维·yolo·自动化
余炜yw1 小时前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
drebander1 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
96771 小时前
对抗样本存在的原因
深度学习
威威猫的栗子1 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
如若1231 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib
YRr YRr2 小时前
深度学习:神经网络中的损失函数的使用
人工智能·深度学习·神经网络
ChaseDreamRunner2 小时前
迁移学习理论与应用
人工智能·机器学习·迁移学习