赞
踩
将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍,主要内容也是在目标检测任务中介绍,其他任务也只是Head层不相同。
首先,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网络结构图。
并且Box分支由2个卷积组和1个卷积构成,前两个卷积组的通道数需要符合max((16,ch[0]//4,self.reg_max*4)),其中ch[0]表示80*80尺度特征图的通道数,在YOLOv8l中为256,另外self.reg_max*4=64,因此三个尺度的分支头中前两个卷积组的通道数均是64,最后一个卷积层的通道数也是64.
Cls分支同样也是由2个卷积组和1个卷积层构成,前两个卷积组的通道数需要符合max(ch[0],min(self.nc,100)),其中ch[0]表示80*80尺度特征图的通道数,self.nc表示预测的类别,在YOLOv8l中ch[0]为256,假设self.nc为80,因此三个尺度的分支头中前两个卷积组的通道数均是256,最后一个卷积层的通道数固定是self.nc.(我个人觉得中间卷积层的通道数都不重要,真的不用太纠结这个,反正最后都会生成固定通道数的。)
还有就是主干网络中的C2f和Neck中的C2f不一样,区别在于是否有残差连接。
最后再来对比一下n/s/m/l/x的Backbone和neck层的差异,n是最小的版本,x是最大的版本,并且目标检测、实例分割、关键点检测和旋转目标检测的主干网络都是一样的。
首先来看主干网络中的C2f层的Bottleneck个数:
n:[1,2,2,1],s:[1,2,2,1],m:[2,4,4,2],l:[3,6,6,3],x:[3,6,6,3]
通过Depth来控制其大小,比如YOLOv8n的Depth为0.33,那么以[3,6,6,3]为标准的话,n的个数就应该为[1,2,2,1],同理m的个数为[2,4,4,2]。
其次还有主干网络中每一层的输出特征图通道数:
n:[3,16,32,32,64,64,128,128,256,256]
s:[3,32,64,64,128,128,256,256,512,512]
m:[3,48,96,96,192,192,384,384,576,576]
l:[3,64,128,128,256,256,512,512,512,512]
x:[3,80,160,160,320,320,640,640,640,640]
通过Width和max_channels来控制输出特征图的最大值,比如YOLOv8l的Width为1,max_channel为512,输出的三个特征图中通道数最大不能超过max_channels*Width,即512×1.00=512;YOLOv8x中最大不能超过512×1.25=640;YOLOv8m中最大不能超过768×0.75=576。
YOLOv8目标检测网络的更多内容可以看下面的文章:
YOLOv8预测流程-原理解析[目标检测理论篇]https://blog.csdn.net/weixin_45144684/article/details/138455119YOLOv8训练流程-原理解析[目标检测理论篇]https://blog.csdn.net/weixin_45144684/article/details/138589894
实例分割的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和Prototype Mask,YOLOv8l_seg的网络结构具体如下所示:
先来了解下mask_coefficients分支,是由2个卷积组和1个卷积层构成,也就是上图中浅紫色区域的分支头,前两个卷积组的通道数需要符合c4 = max(ch[0] // 4, self.nm),ch[0]表示80*80尺度特征图的通道数,self.nm为固定值32。由图可知,YOLOv8L中80 * 80尺度特征图的通道数是256,因此三个尺度的分支头中前两个卷积层的通道数均是64,最后一个卷积输出通道数是32,这个是和Proto分支的通道数是保持一致的。
然后生成Prototype Mask特征图的Proto分支结构如下所示,结构很简单,主要是通过一个上采样层,将特征图由80×80分辨率上采样得到160×160尺度。那么为什么要选择80×80尺度特征图,而不选择其他尺度呢?是因为80×80相比其他尺度特征图更接近原图尺寸,上采样到160×160像素损失会更少,因而会有更好的分割效果,下图是不同网络各卷积层的张量变化情况,由下可知,最后输出的特征图shape都是一样的,均为(1,32,160,160),各层卷积通道数由80*80尺寸的通道数决定,比如n的Input为64,那么Conv1的通道数也是64,其他网络也是同理。
YOLOv8_seg采用的是YOLACT的方法,详细可以看一下这篇文章轻松掌握 MMDetection 中常用算法(八):YOLACT - 知乎 (zhihu.com),我在这里大概说一下YOLACT实例分割的原理:
上面是YOLACT的网络结构图,YOLOv8也是按照上面的原理来实现的,具体如下:
(1)主干网络(Feature Backabone)以及特征图金字塔(Feature Pyramid)都是用来提取特征的,然后将P3(即分辨率最大的特征图)作为Protonet的输入,Prototypes是Protonet的输出,作为网络预测的一个原生掩码;
(2)预测头除了用来生成预测框的位置、类别,还会生成Mask ceofficients作为Prototypes的掩码系数;
(3)经过NMS筛选出两个目标,Detection1和Detection2,接下来将借助原生掩码和掩码系数生成这两个目标的预测掩码,然后对预测掩码根据预测框进行Crop裁剪,再利用Threshold进行二值化得到最后的结果。
YOLOv8_seg网络的更多内容可以看下面的文章:
YOLOv8_seg预测流程-原理解析[实例分割理论篇]_yolov8seg模型推理数据怎么解析-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/138756878?spm=1001.2014.3001.5502YOLOv8_seg训练流程-原理解析[实例分割理论篇]_yolov8 seg-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/138824034?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22138824034%22%2C%22source%22%3A%22weixin_45144684%22%7D
关键点检测的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个通道数均为51用来预测人体17个关键点位置和置信度的特征图 (1,51,80,80)、(1,51,40,40)和(1,51,20,20),即网络结构图中浅绿色Head部分。其中51表示17个关键点的位置和置信度,即17*3=51。人体17个关键点keypoints、关键点间的连接线Skeleton如下所示,在关键点检测原理篇也会展开讲一下这部分内容。
YOLOv8_pose的网络结构具体如下所示,用来预测keypoint的分支头和box、cls分支头一样,通过两个Conv组和一个Conv2d将特征图的通道数变为51,其中前两个卷积组的通道数需要符合max(ch[0] // 4, self.nk),在YOLOv8l中,ch[0]为256,self.nk实际为预测关键点的维度,在人体关键点中为17*3=51,因此三个尺度的分支头中前两个卷积层的通道数均是64,最后一个卷积层的通道数为51.当然如果是像训练自己的关键点网络,通道数也是要相应发生改变的。主干网络结构部分大概就是这样,关键点主干网络后面还会发生什么,可以关注下本专栏关键点检测预测流程和训练流程理论篇的内容。
YOLOv8关键点检测网络借鉴于YOLO PoseMaji_YOLO-Pose_Enhancing_YOLO_for_Multi_Person_Pose_Estimation_Using_Object,从下图就大概可以看到其思想是:一个目标检测框对应一组关键点,关键点可能会由于截断或者遮挡而无法预测出来,也有可能预测在目标检测框外。
YOLOv8_pose网络的更多内容可以看下面的文章:
YOLOv8_pose预测流程-原理解析[关键点检测理论篇]_yolov8pose原理-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/139077739?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139077739%22%2C%22source%22%3A%22weixin_45144684%22%7DYOLOv8_pose训练流程-原理解析[关键点检测理论篇]_yolov8关节点含义-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/139196865?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139196865%22%2C%22source%22%3A%22weixin_45144684%22%7D
旋转目标检测的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个通道数均为1,用来预测旋转角度的特征图Angle(1,1,80,80)、(1,1,40,40)和(1,1,20,20),Angle分支为下图中浅蓝色部分。
Angle分支同样是由两个卷积组和一个卷积层构成,其中前两个卷积组的输出通道数遵循max(ch[0] // 4, self.ne),其中ch[0]表示80*80尺度特征图的通道数,在YOLOv8l中为256,self.ne表示number of extra parameters,即额外的参数量,默认设置为1,所以前两个卷积层的通道数均是64,而最后一个卷积层输出通道数是用来预测角度的,固定为1.
网络结构上还是很好理解的,只是在正常目标检测网络上添加了角度这个维度,并且这个角度是基于目标检测框中心进行旋转的角度。但是实际上在预测流程和训练流程中,包括标签处理这块都不是基于框的中心进行旋转的,那么他们是怎么对应上的呢?本专栏旋转目标检测的原理篇将一一介绍直到解开YOLOv8_obb的面纱。
YOLOv8_obb网络的更多内容可以看下面的文章:
高斯分布、GBB和Prob IoU[旋转目标检测理论篇]_probiou原理-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/139280640?spm=1001.2014.3001.5501YOLOv8_obb训练流程-原理解析[旋转目标检测理论篇]_yolov8obb 顶点顺序-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/139399075YOLOv8_obb预测流程-原理解析[旋转目标检测理论篇]_yolov8obb旋转框原理-CSDN博客https://blog.csdn.net/weixin_45144684/article/details/139399445
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。