文章目录
- 1、前言
- 2、Backbone网络
- 3、YOLOv8模型训练代码
- 3.1、模型大小选择
- 3.2、训练参数设置
- 4、训练参数说明
- 5、目标检测系列文章
1、前言
YOLO 因为性能强大、消耗算力较少,一直以来都是实时目标检测领域的主要范式。该框架被广泛用于各种实际应用,包括自动驾驶、监控和物流。其高效、准确的物体检测能力使其成为实时识别行人和车辆等任务的理想选择;在物流方面,它有助于库存管理和包裹跟踪,通过 AI 能力帮助人们在很多工作上提高了效率。
目标检测旨在识别图像或视频中的物体并确定它们的位置,常见的目标检测算法:
- R-CNN系列(R-CNN、Fast R-CNN、Faster R-CNN):
- R-CNN(Region-based Convolutional Neural Network): 首次引入了区域建议网络(Region Proposal Network),然后对提议的区域进行分类。
- Fast R-CNN: 对R-CNN进行了加速,将区域提议和特征提取合并为一个单一的神经网络。
- Faster R-CNN: 进一步优化,将区域提议网络集成到主干网络中,提高了速度和性能。
- YOLO系列(YOLO、YOLOv2、YOLOv3、YOLOv4、YOLOv5):
- YOLO(You Only Look Once): 通过将图像划分为网格,并在每个网格中同时预测边界框和类别,实现了快速目标检测。
- YOLOv2(YOLO9000): 引入了Anchor Boxes和Darknet-19网络,提高了性能。
- YOLOv3: 进一步改进,引入了多尺度预测、跨尺度连接等特性,提高了检测性能。
- YOLOv4: 引入了CSPNet、PANet等创新,提高了速度和精度。
- YOLOv5: 通过引入更强大的骨干网络(backbone)和改进的训练策略,进一步提高了性能。
- SSD(Single Shot MultiBox Detector):
- 通过在不同尺度上预测边界框,实现了单次前向传播内的目标检测。
- RetinaNet:
- 引入了Focal Loss,解决了类别不平衡问题,提高了检测性能。
- EfficientDet:
- 结合了EfficientNet的高效网络结构和目标检测任务的特定优化,实现了高性能的目标检测。
- Mask R-CNN:
- 在Faster R-CNN的基础上,增加了对目标实例分割的支持,能够生成每个检测到的物体的二进制掩码。
这些算法具有各自的特点和适用场景,选择合适的算法通常取决于具体的应用需求、计算资源以及性能要求。
Yolov8建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,以进一步提升性能和灵活性。Yolov8具有以下特点:
- 高效性:Yolov8采用了新的骨干网络、新的Ancher-Free检测头和新的损失函数,可在CPU到GPU的多种硬件平台上运行,使得模型在运行速度和准确性方面都表现出色。
- 创新性:Yolov8借鉴了Yolov5、Yolov6、YoloX等模型的设计优点,全面提升改进了Yolov5模型结构,同时保持了Yolov5工程化简洁易用的优势。
- 易用性:Ultralytics没有直接将开源库命名为Yolov8,而是直接使用"ultralytics",将其定位为算法框架,而非某一个特定算法。这使得Yolov8开源库不仅仅能够用于Yolo系列模型,而且能够支持非Yolo模型以及分类分割姿态估计等各类任务。
- 全面性:Yolov8在目标检测、图像分割、姿态估计等任务中都表现出色,成为实现这些任务的最佳选择。
其 Yolov8 网络结构图如下:
2、Backbone网络
Backbone主干网络是深度卷积神经网络中的关键组成部分,其网络结构是由Darknet网络结构改进而来,被设计用于提取输入图像的特征,可在提高原网络的特征提取能力的同时,加快运行速度。Backbone由三种基本模块构成,包括Conv模块、C2f模块以及空间金字塔池化模块(Spatial Pyramid Pooling-Fast, SPPF)。
Conv模块: 功能多样,由卷积层(conv)、批量归一化层(Batch Normalization,BN)以及SiLU激活函数层三个部分组成。在其运算过程中,首先由卷积层对输入数据进行卷积运算,起到特征提取作用或者降采样作用,再由批量归一化层提高网络的稳定性和收敛速度,最终将激活函数层引入非线性因素并增强网络的表达能力。这些组件共同协作构成了一个可重复堆叠的Conv模块,以实现对图像特征的高效提取和学习。受益于该模块结构的较高普适性,且能作为组成单元构建其他基本模块,被广泛应用各种卷积神经网络中。
Bottleneck模块: 如下图所示,根据shortcut是否为true,分两种结构执行,Bottleneck_0 中的 shortcut 为 false,Bottleneck_1 中的 shortcut 为true。
C2f模块: 作为主干网络中主要的特征提取部分,由残差块Bottleneck和Conv模块共同构成。在其运算过程中,先将输入特征图进行11的Conv模块运算,然后经过n块残差块Bottleneck运算,n与YOLOv8模型类型相关。(对于YOLOv8n,在Backbone内的C2f一共4个,沿网络传播方向n值分别为1、2、2、1,Head结构内的C2f,它的n值全设为1)。通过两个卷积模块将输入的特征图转化为高维特征图,并将其与输入特征图进行融合,以保证输入和输出特征图具有相同的通道数,运用Bottleneck残差块可以缓解梯度消失等问题,帮助提高网络的深度,并获取更好的特征提取能力。
SPPF模块:由Conv模块、MaxPool最大池化模块以及Concat模块组成,是主干网络中的重要的特征提取模块。其借鉴并改进了SPP-Net网络结构中的SPP结构。在运算过程中,首先使用卷积核为1x1的Conv模块对输入特征图运算,然后依次经过3个步长为1,卷积核为55的最大池化层,从而获得特征图上不同尺度上的空间信息,通过Concat模块将得到的空间信息,进行沿特征图通道方向的拼接融合,最后经过卷积核为1x1的Conv模块输出结果。SPPF模块的设计使得模型可以有效地融合不同尺度的空间信息,从而提高了模型对于空间布局和物体变形的鲁棒性。
3、YOLOv8模型训练代码
我们常用的YOLOv8目标检测模型训练时使用的代码如下:
from ultralytics import YOLO
# 加载官方预训练模型
model = YOLO("yolov8n.pt")
# 模型训练
results = model.train(data="data.yaml", epochs=100, batch=4)
3.1、模型大小选择
model = YOLO("yolov8n.pt")
表示使用的是v8n模型来训练。如果想使用其他大小的模型,只需要把n改为其他大小的对应字母即可。例如:
model = YOLO("yolov8s.pt")
model = YOLO("yolov8m.pt")
model = YOLO("yolov8l.pt")
model = YOLO("yolov8x.pt")
不同模型参数大小如下,v8n是参数量最小的模型。一般情况下,模型越大,最终模型的性能效果也会越好。
可根据自己实际需求选择相应的模型大小进行训练。
3.2、训练参数设置
通过运行model.train(data="data.yaml", epochs=100, batch=4)
训练v8模型,其中(data="data.yaml", epochs=100, batch=4)
是训练设置的参数,没有添加的训练参数都是使用的默认值
。官方其实给出了很多其他相关参数,详细说明见下文。
如果我们需要自己修改其他训练参数,只需要在train
后面的括号中加入相应的参数和具体值即可。
例如加上模型训练优化器参数optimizer
,其默认值是auto
。可设置的值为:SGD, Adam, AdamW, NAdam, RAdam, RMSProp
。常用SGD
或者AdamW
。我们可以直接将其设置为SGD
,写法如下:
# 模型训练,添加模型优化器设置
results = model.train(data="data.yaml", epochs=100, batch=4, optimizer='SGD')
4、训练参数说明
YOLOv8 模型的训练设置包括训练过程中使用的各种超参数和配置
。这些设置会影响模型的性能、速度和准确性。关键的训练设置包括批量大小、学习率、动量和权重衰减。此外,优化器、损失函数和训练数据集组成的选择也会影响训练过程。对这些设置进行仔细的调整和实验对于优化性能至关重要。以下是官方给出了训练可设置参数和说明:
参数 | 默认值 | 说明 |
---|---|---|
model | None | 指定用于训练的模型文件。接受指向 .pt 预训练模型或 .yaml 配置文件。对于定义模型结构或初始化权重至关重要。 |
data | None | 数据集配置文件的路径(例如 coco8.yaml ).该文件包含特定于数据集的参数,包括训练数据和验证数据的路径、类名和类数。 |
epochs | 100 | 训练总轮数。每个epoch代表对整个数据集进行一次完整的训练。调整该值会影响训练时间和模型性能。 |
time | None | 最长训练时间(小时)。如果设置了该值,则会覆盖 epochs 参数,允许训练在指定的持续时间后自动停止。对于时间有限的训练场景非常有用。 |
patience | 100 | 在验证指标没有改善的情况下,提前停止训练所需的epoch数。当性能趋于平稳时停止训练,有助于防止过度拟合。 |
batch | 16 | 批量大小,有三种模式:设置为整数(例如,’ Batch =16 ‘), 60% GPU内存利用率的自动模式(’ Batch =-1 ‘),或指定利用率分数的自动模式(’ Batch =0.70 ')。 |
imgsz | 640 | 用于训练的目标图像尺寸。所有图像在输入模型前都会被调整到这一尺寸。影响模型精度和计算复杂度。 |
save | True | 可保存训练检查点和最终模型权重。这对恢复训练或模型部署非常有用。 |
save_period | -1 | 保存模型检查点的频率,以 epochs 为单位。值为-1 时将禁用此功能。该功能适用于在长时间训练过程中保存临时模型。 |
cache | False | 在内存中缓存数据集图像 (True /ram )、磁盘 (disk ),或禁用它 (False ).通过减少磁盘 I/O 提高训练速度,但代价是增加内存使用量。 |
device | None | 指定用于训练的计算设备:单个 GPU (device=0 )、多个 GPU (device=0,1 )、CPU (device=cpu ),或苹果芯片的 MPS (device=mps ). |
workers | 8 | 加载数据的工作线程数(每 RANK 多 GPU 训练)。影响数据预处理和输入模型的速度,尤其适用于多 GPU 设置。 |
project | None | 保存训练结果的项目目录名称。允许有组织地存储不同的实验。 |
name | None | 训练运行的名称。用于在项目文件夹内创建一个子目录,用于存储训练日志和输出结果。 |
exist_ok | False | 如果为 True,则允许覆盖现有的项目/名称目录。这对迭代实验非常有用,无需手动清除之前的输出。 |
pretrained | True | 决定是否从预处理模型开始训练。可以是布尔值,也可以是加载权重的特定模型的字符串路径。提高训练效率和模型性能。 |
optimizer | 'auto' | 为训练模型选择优化器。选项包括 SGD , Adam , AdamW , NAdam , RAdam , RMSProp 等,或 auto 用于根据模型配置进行自动选择。影响收敛速度和稳定性 |
verbose | False | 在训练过程中启用冗长输出,提供详细日志和进度更新。有助于调试和密切监控培训过程。 |
seed | 0 | 为训练设置随机种子,确保在相同配置下运行的结果具有可重复性。 |
deterministic | True | 强制使用确定性算法,确保可重复性,但由于对非确定性算法的限制,可能会影响性能和速度。 |
single_cls | False | 在训练过程中将多类数据集中的所有类别视为单一类别。适用于二元分类任务,或侧重于对象的存在而非分类。 |
rect | False | 可进行矩形训练,优化批次组成以减少填充。这可以提高效率和速度,但可能会影响模型的准确性。 |
cos_lr | False | 利用余弦学习率调度器,根据历时的余弦曲线调整学习率。这有助于管理学习率,实现更好的收敛。 |
close_mosaic | 10 | 在训练完成前禁用最后 N 个epoch的马赛克数据增强以稳定训练。设置为 0 则禁用此功能。 |
resume | False | 从上次保存的检查点恢复训练。自动加载模型权重、优化器状态和历时计数,无缝继续训练。 |
amp | True | 启用自动混合精度 (AMP) 训练,可减少内存使用量并加快训练速度,同时将对精度的影响降至最低。 |
fraction | 1.0 | 指定用于训练的数据集的部分。允许在完整数据集的子集上进行训练,这对实验或资源有限的情况非常有用。 |
profile | False | 在训练过程中,可对ONNX 和TensorRT 速度进行剖析,有助于优化模型部署。 |
freeze | None | 冻结模型的前 N 层或按索引指定的层,从而减少可训练参数的数量。这对微调或迁移学习非常有用。 |
lr0 | 0.01 | 初始学习率(即 SGD=1E-2 , Adam=1E-3 ) .调整这个值对优化过程至关重要,会影响模型权重的更新速度。 |
lrf | 0.01 | 最终学习率占初始学习率的百分比 = (lr0 * lrf ),与调度程序结合使用,随着时间的推移调整学习率。 |
momentum | 0.937 | 用于 SGD 的动量因子,或用于 Adam 优化器的 beta1,用于将过去的梯度纳入当前更新。 |
weight_decay | 0.0005 | L2 正则化项,对大权重进行惩罚,以防止过度拟合。 |
warmup_epochs | 3.0 | 学习率预热的历元数,学习率从低值逐渐增加到初始学习率,以在早期稳定训练。 |
warmup_momentum | 0.8 | 热身阶段的初始动力,在热身期间逐渐调整到设定动力。 |
warmup_bias_lr | 0.1 | 热身阶段的偏置参数学习率,有助于稳定初始历元的模型训练。 |
box | 7.5 | 损失函数中边框损失部分的权重,影响对准确预测边框坐标的重视程度。 |
cls | 0.5 | 分类损失在总损失函数中的权重,影响正确分类预测相对于其他部分的重要性。 |
dfl | 1.5 | 分布焦点损失权重,在某些YOLO 版本中用于精细分类。 |
pose | 12.0 | 姿态损失在姿态估计模型中的权重,影响着准确预测姿态关键点的重点。 |
kobj | 2.0 | 姿态估计模型中关键点对象性损失的权重,平衡检测可信度与姿态精度。 |
label_smoothing | 0.0 | 应用标签平滑,将硬标签软化为目标标签和标签均匀分布的混合标签,可以提高泛化效果。 |
nbs | 64 | 用于损耗正常化的标称批量大小。 |
overlap_mask | True | 决定在训练过程中分割掩码是否应该重叠,适用于实例分割任务。 |
mask_ratio | 4 | 分割掩码的下采样率,影响训练时使用的掩码分辨率。 |
dropout | 0.0 | 分类任务中正则化的丢弃率,通过在训练过程中随机省略单元来防止过拟合。 |
val | True | 可在训练过程中进行验证,以便在单独的数据集上对模型性能进行定期评估。 |
plots | False | 生成并保存训练和验证指标图以及预测示例图,以便直观地了解模型性能和学习进度。 |
常用的几个训练参数是数据集配置文件data
、训练轮数epochs
、训练批次大小batch
、训练使用的设备device
,模型优化器optimizer
、初始学习率lr0
。
5、目标检测系列文章
- YOLOv5s网络模型讲解(一看就会)
- 生活垃圾数据集(YOLO版)
- YOLOv5如何训练自己的数据集
- 双向控制舵机(树莓派版)
- 树莓派部署YOLOv5目标检测(详细篇)
- YOLO_Tracking 实践 (环境搭建 & 案例测试)
- 目标检测:数据集划分 & XML数据集转YOLO标签
- DeepSort行人车辆识别系统(实现目标检测+跟踪+统计)
- YOLOv5参数大全(parse_opt篇)
- YOLOv5改进(一)-- 轻量化YOLOv5s模型
- YOLOv5改进(二)-- 目标检测优化点(添加小目标头检测)
- YOLOv5改进(三)-- 引进Focaler-IoU损失函数
- YOLOv5改进(四)–轻量化模型ShuffleNetv2
- YOLOv5改进(五)-- 轻量化模型MobileNetv3
- YOLOv5改进(六)–引入YOLOv8中C2F模块
- YOLOv5改进(七)–改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU
- YOLOv5改进(八)–引入Soft-NMS非极大值抑制
- YOLOv5改进(九)–引入BiFPN模块
- 基于YOLOv10的车辆统计跟踪与车速计算应用