本章将计划更新关于YOLOv8中可能会成为面试题的关键技术点,计划持续更新,可能想到合适的问题我就会整理下更新到本博客中。
1.YOLOv8网络结构篇
1.1简述一下YOLOv8的网络结构
YOLOv8的网络结构由三部分组成,分别为BackBone主干网络,Neck颈部网络和Head头部网络。
BackBone网络主要对输入图像进行特征提取,输入分辨率会从640x640经过5次下采样后变为20x20,输入通道会从RGB的3通道变成512维通道,并且会输出80x80、40x40和20x20三个尺度的特征图到Neck网络。
Neck网络主要对BackBone网络输出的特征图进行特征融合,自下而上通过上采样将20x20、40x40和80x80尺度特征图通道维度进行拼接并使用c2f模块进行特征提取,自上而下再次和对应的特征图在通道维度上进行拼接最后输出20x20、40x40和80x80尺度的特征图。
Head网络主要对Neck层输出的三个尺度特征图解码,使用解耦的方式来分别预测框的位置和大小,即Box分支,每个尺度的通道数为64;预测框的类别,即Cls分支,每个尺度的通道数为nc,即类别数。
1.2YOLOv8提供了几个版本的网络,每个版本有什么区别,网络的宽度和深度是怎么变化的
YOLOv8共提供了5个版本大小的网络,从小到大分别是n、s、m、l、x,即nano,small,medium,large和extra large.
这五个版本主要是网络的深度和宽度不一样,深度体现在主干网络的c2f模块中堆叠的bottleneck模块个数,宽度体现在网络每一层输出通道数上,网络越大,对应的性能越好,推理速度越慢;网络越小,性能越差,推理速度越快。
网络的宽度通过Width和max_channels共同控制,网络最大宽度(即通道数)不超过Width*max_channels(当然不包括concat层的情况),L-版本网络是v8的标准版,每一层的通道数和L-版本每一层通道数是Width倍数的关系。
网络的深度通过Depth控制,c2f模块堆叠的bottleneck个数和L-版本的是Depth倍数关系,L-版本中4个c2f分别堆叠了(3,6,6,3)个bottleneck。
1.3BackBone层的c2f模块和Neck层的c2f模块有什么区别
主要有两大区别:
第一,BackBone层的c2f层的输入和输出通道数不变,而Neck层的c2f层的输出和输出通道数改变,输出通道数为主干网络输出同一尺度特征图的通道数。
第二,BackBone层的c2f模块的bottleneck含有残差分支,而Neck层的c2f模块的bottleneck不含残差分支,并且每个c2f只堆叠了一个bottleneck。
1.4Head层的两组CBS卷积组的通道数变化有什么规律
第一,每个尺度同一分支的CBS的通道数是一样的,比如说L-版本中80x80、 40x40和20x20尺度的Box分支通道数都是64,Cls分支通道数都是256.
第二,n/s/m/l/x五个版本的网络,Box分支的CBS卷积组通道数最小不能小于64,Cls分支的CBS卷积组通道数最小不能小于类别数。
2.YOLOv8推理流程篇
2.1简单介绍下YOLOv8中的Letterbox操作
训练阶段的letterbox:目的是把任意尺寸的图片调整成640x640尺寸的图片;因此第一步需要区分输入图片的长短边,然后将长边缩放到640,再然后把短边使用同样的缩放比例进行缩放,最后使用灰边(像素值为114)对短边进行补齐到640。
预测阶段的lettebox:和训练阶段的lettebox处理基本一致,区别在于预测阶段的短边无需填充至640,只需要填充为32的最小倍数就行,这样有利于减少运算量,提升预测速度。
2.2输入尺寸为640x640的网络最后输出的Cls分支特征图的通道数是多少,如何进行解码
网络最后会输出三个不同尺度的特征图:80x80、40x40和20x20,并且这三个尺度特征图的通道数都为类别数nc,解码前会将这三个特征图展开后拼接成ncx8400,然后在第一个维度对nc个值分别经过sigmoid函数得到0~1的值,nc个0~1的值就可以理解成网络预测的nc个类别的概率。
2.3 Box分支是用来预测框的位置和大小的,为什么它的通道数是64,而不是4
v8通过预测grid cell点到预测框左边框、上边框、右边框和下边框的距离这4个值来确定预测框的大小,而这四个值不是通过网络直接预测出来的,需要借助16个数共同预测,因此通道数是4x16=64; 网络预测出这16个数,需要经过softmax()映射到0~1之间,并且16个数的和为1;并且这16个数对应着0~15的下标,最后预测出的值应该是经过softmax后的16个数和对应的下标值相乘再相加得到。
2.4YOLOv8后处理中使用torchvision.ops.nms之前做了什么处理,让不同类别的预测框各自做NMS
torchvision自带的nms只能对单个类别的框进行NMS,v8在使用该nms之前会对不同类别需要加上一个偏移量,从而让同一个类别的框在同一片区域做NMS而不会受其他类别的影响。
未完待续,先拿我柴占一下坑...