简介
YOLO(you only look once)是一阶段目标检测模型的开山之作,在图像目标检测领域一向以响应速度快著称,它同是兼顾了模型的准确性,在速度与准确性之间做到很好的平衡。经过多版本迭代,到YOLOv8,是一个功能强大,受到广大开发者欢迎与喜爱的目标检测模型,另外,在同一套代码中,它可以分别实现图像分类、目标检测、旋转边界框检测、姿势识别、图像分割,并且在目标检测、旋转边界框检测、姿势识别、图像分割模型基础上实现视频跟踪功能。通过在超参数指定如下参数:
task: segment 可选项:detect, obb, segment, classify, pose,指定任务目标类型
mode: train 可选项:train, val, predict, export, track, benchmark 指定模式
model: # (str, optional) path to model file, i.e. yolov8n.pt, yolov8n.yaml 模型文件路径或模型配置文件路径
data: # (str, optional) path to data file, i.e. coco128.yaml 数据文件路径或数据配置文件路径
YOLOv8网络结构
上图为架构图,图最上面从左到右,包含Backbone(主干), Neck(颈部), Head(头部)三大部分.
Backbone由5个卷积模块,4个C2f模块, 1个SPPF模块组成,激活函数为SiLU。
整个卷积模块的作用为:
1 降采样:每个卷积模块中的卷积层都采用步长为2的卷积核进行降采样操作,以减少特征图的尺寸并增加通道数
2 非线性表示:每个卷积层之后都添加了batch normalization(批标准化)层和激活函数,以增强模型的非线性表示能力
SiLU(Sigmoid-weighted Linear Unit)函数的定义为f(x) = x * sigmoid(x),其中sigmoid(x)表示对x进行sigmoid运算。它是一个将输入值映射到0到1之间的非线性函数,且具有平滑和连续性质。
与ReLU相比,SiLU在保持非线性特性的同时,具有类似于Sigmoid函数的非饱和性、平滑性、梯度饱和性较低等优点。这些特性使得SiLU函数能够更好地处理梯度问题,并且在某些深度学习任务中可以取得更好的性能。在一些实验中,SiLU被证明可以提供更高的模型准确性和更快的收敛速度。
batch normalization的基本思想是:对每个小批量数据进行标准化,使得每个特征的均值为0,方差为1,然后再通过一个可学习的缩放因子和平移因子来调整数据的分布,从而使得神经网络更容易训练。
在YOLOv8的网络结构中C2f模块算是YOLOv8的一个较大改变,与YOLOv5的C3模块相比,C2f模块具有更少的参数量和更优秀的特征提取能力。下图为C2f结构图:
在C2f模块中我们可以看到,输入首先经过一个k=1,s=1, p=0, c=c_out的卷积模块进行了处理,然后经过一个split处理(在这里split和后面的concat的组成其实就是所谓的残差模块处理)经过数量为n的DarknetBottleneck模块处理以后将残差模块和主干模块的结果进行Concat拼接在经过一个卷积模块处理进行输出。