YOLOv8网络结构介绍

发布于:2024-05-10 ⋅ 阅读:(19) ⋅ 点赞:(0)

         将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍,主要内容也是在目标检测任务中介绍,其他任务也只是Head层不相同。

1.YOLOv8_det网络结构

         首先,YOLOv8网络分成了三部分,分别是主干网络、Neck层网络还有一个是Head层网络,下面将按照这三个顺序来介绍下YOLOv8的网络结构,先以YOLOv8l的网络架构来说明。

         主干网络是对输入图片进行特征提取的,主干网络主要由CBS模块、C2f模块和SPPF模块构成,其中CBS模块表示Conv、BN和SILU,一般用来对输入图像或者特征图进行卷积,卷积的结果是分辨率下降和通道数增加,由上图可以看到,一共有5个CBS模块,输入图像分辨率从640*640变成了20*20,输入通道数从3变成了512。

        C2f是设计用来深度提取特征的一个模块,其输出特征图和输入特征图的大小保持不变,但是在他内部会有多个分支,如下图所示,torch.chunk将(1,128,160,160)特征图分成了两部分,前半部分,即(1,:64,160,160)输出为第一个分支;后半部分,即(1,32:,160,160)除了作为输出的第二个分支外,还会经过n个bottleneck模块,每经过一个Bottleneck都会输出一个通道为64的特征图,所以最后concat得到的通道数为0.5*in_ch*(n+2),其中in_ch表示输入的通道数,即128,n为bottleneck的个数,当n为3时,concat得到的通道数为320。

        SPPF模块这里就看一下就行了,和YOLOv5中的是一样的,并且也是输出特征图和输入特征图的大小保持不变,详细可以看下图的shape表示。经过主干网络,会有三个不同尺度的特征图会输出给下一部分的Neck层网络,分别是80*80、40*40以及20*20。

         Neck层网络是用来对主干网络输出的特征图进行特征融合的,也就是把这三个不同的尺度提取到的特征通过上采样的方式进行Concat,经过两次上采样后输出第一个特征图(80*80)给Head层,然后通过CBS模块对特征图进行下采样输出剩下两个特征图(40*40和20*20)给Head层。详细可以看YOLOv8网络结构图。

         Head层网络是根据类别数来设计生成特定的特征图,YOLOv8采用的是解耦头的方式来生成,解耦的意思就是说分别生成用来预测CLs和Box的特征图,比如输入尺度为(1,256,80,80)特征图P3,生成Box预测特征图的分支会通过两个CBS模块以及一个Cov2d生成(1,64,80,80)的特征图,生成Cls预测特征图的分支会通过两个CBS模块以及一个Cov2d生成(1,nc,80,80)的特征图,nc表示预测的类别。经过Head层会生成3个预测Box的特征图(1,64,80,80)、(1,64,40,40)和(1,64,20,20);以及生成3个预测CLs的特征图(1,nc,80,80)、(1,nc,40,40)和(1,nc,20,20)。详细可以看YOLOv8网络结构图。

         此外这里再说一下YOLOv8共提供了4个不同的版本,分别为n/s/m/l/x,n是最小的版本,x是最大的版本。这里和YOLOv5有一点区别,每个版本有一个max_channels来控制输出特征图的最大值,比如YOLOv8l中,输出的三个特征图中通道数最大不能超过max_channels*Width,即512*1.00=512,YOLOv8x中最大不能超过512*1.25=640。Depth是用来控制主干网络中C2f中bottleneck的个数的,比如YOLOv8l的depth为1,那么主干网络中的4个C2f的bottleneck个数分别为(3,6,6,3),YOLOv8n的depth为0.33,那么其个数分别为(1,2,2,1)。

        还有就是主干网络中的C2f和Neck中的C2f不一样,区别在于是否有残差连接。

2.YOLOv8_seg网络结构

        实例分割的backbone网络和Neck网络完全一致,只是Head层会有区别,区别有两点:第一点,三个尺度的特征图在head层除了生成3个预测Box的特征图(1,64,80,80)、(1,64,40,40)和(1,64,20,20);以及3个预测CLs的特征图(1,nc,80,80)、(1,nc,40,40)和(1,nc,20,20);还会另外生成3个通道数均为32用来当成Mask系数的特征图mask_coefficients(1,32,80,80)、(1,32,40,40)和(1,32,20,20);第二,还会通过80*80特征图生成一个大小为(1,32,80,80)Prototype Mask特征图,作为原生分割的特征图。

        先来了解下mask_coefficients分支,也就是上图中浅紫色区域的分支头,由图可知,三个尺度的分支头通道数都是32,这个是和Prototype分支的通道数是保持一致的,并且也是通过两个卷积组和一个卷积层生成的。

        然后Prototype层的结构如下所示,通过一个上采样,将特征图由80*80分辨率上采样得到160*160尺度。为什么要选择80*80尺度特征图,因为80*80相比其他尺度特征图更接近原图尺寸,上采样后能有更好的分割效果。