🏡作者主页:点击!
🤖编程探索专栏:点击!
⏰️创作时间:2024年12月23日9点02分
神秘男子影,
秘而不宣藏。
泣意深不见,
男子自持重,
子夜独自沉。
基础算法介绍
YOLOv8是目标检测领域的最新进展,由ultralytics团队开发,作为YOLO系列算法的最新版本,它在多个方面进行了优化和改进,提供了更高的检测精度和速度 。以下是YOLOv8的一些关键特性和改进:
- Backbone改进:YOLOv8采用C2f模块作为backbone,结合了丰富的梯度流信息,显著提高了特征提取能力 。
- 检测头设计:引入anchor-free + Decoupled-head的设计,适应不同尺度和形状的物体,提高检测准确率 。
- 损失函数:采用分类BCE、回归CIOU + VFL的组合损失函数,引入VFL(Vision Transformer Loss)提高上下文信息捕捉能力 。
- 框匹配策略:从静态匹配改为Task-Aligned Assigner匹配方式,提高预测准确性 。
- 数据增强:关闭Mosaic操作,增加训练的总epoch数至500,提升模型泛化能力 。
YOLOv8的网络结构由骨干网络、颈部网络和检测头三部分组成,其中骨干网络引入新设计,检测头采用无锚点方式,进一步提升检测准确性和灵活性 。环境搭建需要安装CUDA、CUDNN和PyTorch等深度学习框架和库 。数据集获取后需进行预处理和标注,以满足算法训练和验证的需求 。训练过程中采用多种优化技巧,并使用多GPU并行训练以加速过程 。
YOLOv8还提供了一个全新的SOTA模型,包括不同分辨率的目标检测网络和基于YOLACT的实例分割模型。它引入了新的骨干网络、Ancher-Free检测头和新的损失函数,支持从CPU到GPU的各种硬件平台 。ultralytics定位YOLOv8为算法框架,具有高度的可扩展性,未来将支持更多算法 。
YOLOv8的模型结构设计、损失计算、训练数据增强、训练策略和模型推理过程都经过了精心设计和优化,以实现SOTA性能。尽管YOLOv8的框架还处于早期阶段,但它已经展现出强大的潜力和应用前景 。此外,YOLOv8的文档中心提供了全面的资源,以帮助用户了解和利用其特性和功能,无论是经验丰富的机器学习实践者还是新手,都能在项目中发挥YOLOv8的潜力。
模型结构
模块创新部分
GAM注意力机制
GAM(Global Attention Mechanism)注意力机制是一种新兴的注意力结构,旨在通过减少信息损失并放大全局维度互动特征来增强深度神经网络的性能。它采用了顺序的通道-空间注意力机制,并对子模块进行了重新设计 。具体来说,通道注意力子模块使用3D排列来跨三个维度保留信息,并通过一个两层的MLP(多层感知器)增强跨维度的通道-空间依赖性。空间注意力子模块则采用了两个卷积层进行空间信息融合,同时去除了可能导致信息减少的最大池化操作,通过分组卷积和通道混洗在ResNet50中避免参数数量显著增加。
GAM在CIFAR-100和ImageNet-1K上的图像分类任务评估中表明,其在ResNet和轻量级MobileNet上稳定地优于几种最新的注意力机制 。此外,GAM的实现代码展示了如何构建包含线性层、卷积和Sigmoid激活的注意力模块,用于生成注意力图 。
GAM注意力机制的另一个关键特点是其全局性,它强调在处理通道和空间信息时保持全局交互的重要性。这种机制通过对输入特征图进行处理,得到中间状态和输出状态,其中通道注意力图和空间注意力图分别用于捕获通道和空间维度的重要特征。通过元素级乘法操作,这些注意力图与输入特征图进行交互,实现全局跨维度的信息交互 。
GAM(Global Attention Mechanism)注意力机制的核心思想是同时考虑通道注意力(Channel Attention)和空间注意力(Spatial Attention),以减少信息损失并增强特征表示的全局交互。这种机制特别适用于深度学习模型中的特征增强,尤其是在视觉任务如图像分类和目标检测中。
模块结构
- 输入特征(Input features, FiFi):这是模型接收的原始输入数据的特征表示。
- 通道注意力(Channel Attention, McMc):这一部分的目的是捕获不同通道之间的相互关系和重要性。GAM通过一个多层感知器(MLP)来实现这一点。MLP首先将通道维度压缩,然后通过ReLU激活函数引入非线性,最后再映射回原始通道维度。这个过程有助于提取跨通道的全局信息。
- 空间注意力(Spatial Attention, MsMs):空间注意力关注的是特征图上的空间信息。GAM使用卷积层来实现空间注意力,通过这种方式可以捕获空间维度上的相关性。通常,这涉及到使用具有适当填充的卷积核来应用在特征图上,以保持特征的空间维度不变。
- 输出特征(Output features, FoFo):结合了通道注意力和空间注意力的结果,生成最终的特征表示。这是通过将输入特征与通道注意力和空间注意力的输出相乘来完成的。这样,模型就可以在保留重要通道和空间信息的同时,抑制不重要的特征。
添加GAM到backbone中
WIoU损失函数
WIoU(Wise-IoU)损失函数是一种先进的边界框回归损失,它被设计用来提高目标检测模型的性能。WIoU的核心在于动态非单调聚焦机制,这种机制使用“离群度”来评估锚框的质量,并据此分配梯度增益,从而减少低质量示例对模型性能的负面影响 。
WIoU损失函数的动态非单调聚焦机制与Focal Loss的单调聚焦机制不同,它允许梯度增益随着损失值的增加而呈现非单调变化。WIoU v1版本引入了基于注意力的边界框损失,而WIoU v2和v3则进一步通过计算梯度增益的方法来增强聚焦机制 。
在WIoU v2中,通过引入IoU损失的均值作为归一化因子,解决了训练后期收敛速度慢的问题。而在WIoU v3中,定义了锚框的离群度,并利用它构造了一个非单调聚焦系数,使得WIoU v3能够在每一时刻做出最符合当前情况的梯度增益分配策略 。
WIoU损失函数在实际应用中表现出显著的优势,特别是在数据集标注质量较差的情况下,WIoU相对于其他边界框损失函数表现更好。例如,在火焰检测比赛中,使用WIoU的初版使得mAP提升了1.70%。此外,WIoU的计算速度相对较快,因为它没有对纵横比进行计算,反而在实验条件下比CIoU更快,WIoU的计算耗时为CIoU的87.2% 。
小目标检测头
检测头(Detection Head)是目标检测模型中用于最终识别和定位目标的部分,它通常位于特征提取网络的末端。在深度学习的目标检测架构中,检测头负责从特征图中预测边界框和类别概率。
增加小目标检测头:
- 提高小目标识别率:专门针对小目标设计的检测头可以更有效地识别图像中较小的物体。
- 改善定位精度:通过优化锚框(anchor boxes)的尺寸和比例,可以更准确地预测小目标的位置。
- 增强模型泛化能力:小目标检测头可以帮助模型更好地泛化到不同尺寸的目标上。
- 提升模型灵活性:可以根据不同的任务需求,为模型添加或调整小目标检测头。
- 优化资源分配:小目标检测头可以专注于模型网络中对小目标更为敏感的部分,提高计算效率。
- 增强特征提取:小目标检测头可能会采用特定的特征提取策略,如特征金字塔网络(FPN),以捕获多尺度的特征。
- 提高模型鲁棒性:在复杂场景中,小目标检测头有助于减少遮挡和背景干扰的影响。
- 支持多尺度检测:小目标检测头可以与大目标检测头协同工作,实现对不同尺度目标的全面检测。
- 促进算法创新:研究者可以通过设计和优化小目标检测头来探索新的算法和技术。
- 改善特定应用性能:对于需要高精度小目标检测的应用(如卫星图像分析、医学成像等),小目标检测头可以显著提升性能。
增加检测头
新增检测4X4以上目标的检测头,提高对小目标的检测能力
训练自己的数据集
请在后端项目文件中进行以下操作
配置环境
需要的环境已在requirements.txt中声明
请在终端输入以下命令(在本项目的根目录下运行)pip install -r requirements.txt
pip install ultralytics
准备数据集
在根目录下新建一个文件夹,命名为datasets
将准备好的yolo格式的数据集放入文件夹中
目录结构应该如下:
根目录
datasets
images
train
val
labels
train
val
修改配置文件
1、配置文件基本都在ultralytics/cfg
的路径下
2、在ultralytics/cfg/datasets
下设置datasets的路径,项目文件中已有demo.yaml,如果在上面的准备数据集
的环节中你已经严格按照要求进行,那么demo.yaml的内容几乎不需要修改,若你的数据集放在了其他路径,请复制一份demo.yaml进行修改,根据真实路径模仿下列格式进行修改即可:
path: ../datasets/ # dataset root dir
train: images/train # train images
val: images/val # val images
test: # test images (optional)
同时,根据你数据集里的目标类型及其对应的id设置下方的classes
:
name:
0 : person
1 : ......
调参
模型的参数调整集中在了ultralytics/cfg/default.yaml
的文件中,请根据需要进行调整,其中前两个参数model
和data
不需要填写
开始训练
打开项目根目录下的start_train.py
内容如下:
from ultralytics import YOLO
# Load a model
#1、 model = YOLO('yolov8n.yaml') # build a new model from YAML
#2、 model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
model = YOLO('path/to/the/YAML').load(
'path/to/the/pre_trained/weights') # build from YAML and transfer weights
# Train the model
model.train(data='path/to/the/YAML/of/datasets')
提供了三种训练模式:(1)从头开始训练一个模型;(2)直接用预训练模型训练自己的数据集;(3)加载预训练权重,用修改后的yaml文件训练自己的数据集
如果没有修改模型,只是想用YOLOv8训练自己的数据集,那么请使用第2种,不建议用第1种,采用预训练模型可以加快收敛速度,而且效果比较好
如果修改了模型,那么请使用第3种,因为一般对模型的修改需要在yaml文件中重新声明模型的结构,一方面通过加载预训练模型来加快收敛提高效果,一方面需要引入修改后的模型的yaml文件
接下来只需要在对应的位置填写预训练权重/模型的yaml文件/数据集的yaml文件
的路径即可
注意
注意\
和/
的区别
预训练权重文件放在ultralytics/cfg/models/pretrained_models
下
模型的yaml文件放在ultralytics/cfg/models/v8
下
若需要使用GPU进行训练,请在default.yaml
中指定device
参数
运行start_train.py文件即可开始训练!
提示
1、项目中保留有其他修改实验的配置文件,如添加其他注意力机制的YAML文件,单独添加小目标检测头的YAML文件,可根据需要进行训练
2、需要注意的是,本项目使用的边界盒回归损失函数已经修改为Wise-IoU
3、本项目存放有使用头部数据集训练的改进版模型,并进行模型加速,结果存放于back_end
给根目录下中,分别是best.pt、best.onnx、best.engine(仅支持GPU)
完整web端展示界面
web端由Vue和Flask开发,基于目标跟踪实现了两个应用场景的简单功能,两种跟踪器可选(botsort,bytetrack)
完整web端展示界面
web端由Vue和Flask开发,基于目标跟踪实现了两个应用场景的简单功能,两种跟踪器可选(botsort,bytetrack)
启动前后端交互系统
启动后端
打开后端项目文件夹
在app.py
中指定ip地址和监听端口,需与前端一致,详情见下方前端的
if __name__ == '__main__':
socketio.run(app, host="127.0.0.1", debug=True, port=5000, allow_unsafe_werkzeug=True)
修改推理使用模型
如果想用其他模型进行推理,请在functions
下的三个py文件中修改加载模型的路径:
# Load the model
model = YOLO('yolov8n.pt')
在当前目录下终端运行python app.py
即可启动后端服务
启动前端
打开前端项目文件夹
运行环境
Vue 2.x.x
Node >= 6.0.0
Npm >= 3.0.0
在当前目录下运行以下命令进行启动
# 安装依赖
npm install
# 配置IP
npm run dev
# 构建项目
npm run build
配置代理服务
需在config/index.js中进行配置,在配置完成后请重新启动项目方可生效
proxyTable: {
'/api' : {
// target需更换为后端实际局域网内IP,目前仅支持同一网段下的服务,端口(5000)也需和后端监听的端口一致
target: 'http://127.0.0.1:5000',
ws: true,
secure: false,
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
},
界面展示
模块创新结果分析
此结果在人脸图像数据集上面进行测试,可以看出,每一个模块均有一定程度的精度提升,对于实验创新有着一定的指导作用。
功能/性能指标 | mAP50 | mAP50-95 |
YOLOv8m | 0.966 | 0.519 |
YOLOv8m + GAM | 0.966 | 0.523 |
YOLOv8m + 超小检测头 | 0.969 (+0.003) | 0.525 (+0.006) |
YOLOv8m + Wise_lou | 0.967 (+0.001) | 0.523 (+0.004) |
YOLOv8m + GAM + 超小检测头 | 0.972 (+0.006) | 0.526 (+0.007) |
YOLOv8m + GAM + Wise_lou | 0.974 (+0.012) | 0.528 (+0.009) |