计算机视觉(YOLO知识扫盲)

4 篇文章 0 订阅
2 篇文章 0 订阅

YOLO(You Only Look Once)是一种用于实时物体检测的深度学习模型。与传统的物体检测方法相比,YOLO通过单一的神经网络直接从输入图像预测物体的位置和类别,速度极快,精度较高

YOLOv8各配置文件及参数

目标检测:detect
图像分割:segment
图像分类:classify
关键点检测:pose
![[Pasted image 20240715165029.png]]
做不同任务所需要的模板
![[Pasted image 20240715165338.png]]

yolov8n.yaml

这是一个模型配置文件,用于定义YOLOv8网络的架构。这个文件包含了构建模型所需的详细信息,比如层的类型、卷积核的数量、下采样的方式、残差连接的使用等等。它对于从头开始构建或调整模型结构非常有用。yolov8n.yaml文件通常会被模型训练脚本读取,以创建模型的实例。

yolov8n.pt

这是一个模型权重文件,存储了已经训练好的神经网络参数。.pt是PyTorch框架常用的文件扩展名,用于保存模型的状态字典(state_dict),其中包括模型的权重和偏置等参数。这个文件允许你加载一个预训练的模型,用于推理(即检测物体)或继续训练(微调)。当你看到一个.pt文件时,通常意味着有一个已经训练过的模型可以立即使用。

yolov8.yaml文件的作用

如果在YOLOv8的训练过程中没有显式地使用 .yaml 文件,但程序仍然能够正常运行,这通常意味着程序正在使用默认的模型架构定义,或者模型架构已经被硬编码在训练脚本或框架中,不需要额外的 .yaml 文件来定义。

对于YOLOv8,它的实现可能已经内置了对特定模型(如 yolov8n)的架构定义,因此即使没有 .yaml 文件,也可以从 .pt 文件加载预训练权重,并根据框架内部的架构定义来构建模型。这种情况下,程序可以正常运行,但你需要注意以下几点:

  1. 确认模型一致性: 确保你使用的 yolov8n.pt 文件中的模型架构与框架内部定义的架构相匹配。如果不一致,可能会导致模型加载错误或性能问题。

  2. 灵活性受限: 不使用 .yaml 文件可能限制了你自定义模型架构的能力。.yaml 文件允许你更改模型的结构,例如添加或删除层,改变层参数等,这对于实验和优化模型来说是非常有用的。

  3. 数据集配置: 另外,虽然模型架构的定义可能不是必须的,但数据集的配置通常是必要的。data.yaml 文件包含了数据集的路径、类别信息和其他重要参数,这是训练过程中不可或缺的。

  4. 可复现性和文档记录: 使用 .yaml 文件有助于保持训练过程的可复现性,同时也方便其他开发人员理解模型架构和数据配置。

  5. YOLOv8特点

  6. yolo v8 姿态检测特点

高精度与高效率:YOLOv8姿态检测算法在保持实时性的同时,提高了检测精度。通过引入残差连接、多尺度特征融合和注意力机制等技术,使得模型能够更好地捕捉人体姿态的细微变化,从而提高检测精度。

多尺度适应性:YOLOv8姿态检测算法能够适应不同尺度的人体姿态检测任务。无论是大尺度的人体全身姿态检测,还是小尺度的人体局部姿态检测,YOLOv8都能表现出良好的性能。

鲁棒性强:由于YOLOv8姿态检测算法采用了深度卷积神经网络结构,使得模型具有较强的鲁棒性。即使在复杂的背景或光照条件下,也能准确地识别出人体的姿态。

易于集成与部署:YOLOv8姿态检测算法提供了丰富的API和开源代码,使得开发者能够轻松地将该技术集成到自己的应用中。同时,由于其高效的性能,也使得该算法在嵌入式设备或移动设备上得以广泛应用。

残差连接(Residual Connections)

残差连接最初是在ResNet(Residual Network)中提出的,旨在解决深度神经网络训练中的梯度消失/爆炸问题以及模型退化问题。在深度卷积神经网络中,随着网络深度的增加,训练变得越来越困难,模型性能有时反而不如浅层网络。残差连接通过引入“捷径连接”(Shortcuts)来解决这个问题,该连接直接将输入与经过几个卷积层后的输出相加。这种设计使网络能够学习残差映射,而不是原始输入到输出的映射,从而简化了学习任务,使模型更容易收敛,也能够训练更深的网络。

多尺度特征融合(Multi-Scale Feature Fusion)

在目标检测和姿态估计中,不同尺度的特征图对于捕获不同大小的对象至关重要。小尺度特征图通常携带更精细的位置信息,而大尺度特征图则保留了更多的语义信息。多尺度特征融合是一种策略,它结合了不同层次的特征图,以便模型能够同时利用这些不同尺度的信息。这通常通过上采样、下采样或跳跃连接等方式实现,确保模型在多个尺度上都能进行有效的特征提取和对象检测。

残差连接与多尺度特征融合之间的联系

在YOLOv8姿态检测中,残差连接和多尺度特征融合共同工作,以提高模型的检测精度和实时性:

  1. 残差连接有助于模型在训练过程中稳定地学习深层网络,避免梯度消失/爆炸,确保深层特征的有效提取。这为多尺度特征融合提供了坚实的基础,因为深层特征通常包含了丰富的语义信息,是多尺度特征融合的重要组成部分。

  2. 多尺度特征融合使得模型能够在不同的空间分辨率上检测物体,这对于姿态检测尤为重要,因为人体姿态的变化可能发生在多种尺度上。残差连接帮助保持了这些不同尺度特征的质量,确保了融合过程中的信息无损。

  3. 结合这两种技术,YOLOv8能够在保持实时性的前提下,利用深度网络的优势,同时处理多个尺度的特征,从而提高姿态检测的准确性。特别是在处理复杂背景和不同姿势的人体时,这种结合使得模型能够更细致地捕捉姿态的细微变化,进而提高检测精度。

yolo v8应用(视频分析,画面识别处理)

智能监控:在公共安全领域,通过安装摄像头并应用YOLOv8姿态检测算法,可以实时监控并分析人群的行为和动态。这对于预防犯罪、维护社会治安具有重要意义。

人机交互:在游戏、虚拟现实等领域,通过捕捉用户的身体动作和姿态,可以实现更加自然和直观的人机交互体验。YOLOv8姿态检测算法为这些应用提供了高效且准确的姿态识别技术支持。

运动分析:在体育训练、舞蹈教学等领域,教练可以利用YOLOv8姿态检测算法对运动员或学员的动作进行分析和指导。通过识别关键点的坐标和运动轨迹,可以帮助运动员纠正错误的动作姿势,提高训练效果。

健康监测:在医疗领域,YOLOv8姿态检测算法也可以用于监测患者的姿势和动作。例如,对于需要长期卧床的患者,可以通过监测其姿势来预防褥疮等并发症的发生;对于老年人群体,可以通过分析其日常行为姿势来评估其健康状况。

YOLO V8姿态检测训练

数据集准备:首先需要准备一个标注好的人体姿态数据集。这个数据集应该包含足够多的样本以及准确的标注信息(如关键点坐标)。可以使用公开的数据集(如COCO、MPII等)或者自己创建数据集。

环境搭建与配置:安装深度学习框架(如PyTorch、TensorFlow等)并配置相应的环境。确保硬件资源(如GPU)得到充分利用以加速训练过程。

模型选择与配置:选择合适的YOLOv8姿态检测模型(如YOLOv8n-pose、YOLOv8s-pose等)并根据需求进行配置。这些模型在速度、精度和计算资源消耗方面有所不同,因此需要根据具体应用场景进行选择。

训练过程:使用准备好的数据集对模型进行训练。在训练过程中,可以通过调整学习率、批次大小等参数来优化训练效果。同时,使用验证集对模型进行验证以确保其性能达到预期。

模型评估与优化:训练完成后,使用测试集对模型进行评估以获取性能指标(如mAP、FPS等)。根据评估结果对模型进行优化调整以提高其性能表现。优化手段可能包括调整网络结构、增加数据增强策略等。

模型部署与应用:将训练好的YOLOv8姿态检测模型部署到实际应用场景中(如智能监控、人机交互系统等)并进行测试验证其实际效果表现。

YOLO模块分析

yolov8s.yaml文件

yolov8s.yaml 文件是一个用于定义 YOLOv8 模型架构的配置文件,通常以 YAML(YAML Ain’t Markup Language)格式编写。YAML 是一种人类可读的数据序列化格式,常用于配置文件,因为它提供了清晰的方式来表达数据结构。

在 YOLOv8 的上下文中,yolov8s.yaml 文件主要用于以下目的:

  1. 模型架构定义: 这个文件详细描述了模型的每一层,包括卷积层、残差块、检测头等,以及它们之间的连接方式。每一层可以指定输入来源(from),执行操作的次数(number),模块类型(module),以及该模块的参数(args)。

  2. 超参数设置: 配置文件可能还包括一些超参数,如学习率、权重衰减、批处理大小等,尽管这些有时会在训练脚本中直接设置或通过另一个配置文件来管理。

  3. 模型规模控制: 文件中的参数可以控制模型的大小,比如 width_multipledepth_multiple 参数,它们决定了模型宽度(通道数)和深度(层数)的倍增系数,从而允许创建不同规模的模型变体,如 yolov8n(nano)、yolov8s(small)、yolov8m(medium)、yolov8l(large)和 yolov8x(extra large)。

  4. 模型修改与定制: 开发者或研究人员可以通过编辑 yolov8s.yaml 文件来微调模型架构,例如增加或减少特定层的数量,更改层的参数,或引入新的组件,从而实现模型的定制化以适应特定的应用场景。

当要从零开始构建模型,或者想要加载一个预定义的模型架构并进行训练时,yolov8s.yaml 文件会被解析,并基于其指令生成相应的模型实例。这使得模型的定义和训练过程更加灵活和模块化,便于研究和实验。

问:

yolov8s.ptyolov8n.pt 分别代表预训练的 PyTorch 模型权重文件,其中 .pt 扩展名表示这是一个 PyTorch 的权重文件。这些文件包含了模型的权重和偏置参数,它们是通过大量的数据训练得到的,因此包含了对目标检测任务有帮助的学习特征

yolov8s.yaml 文件定义了 YOLOv8 “small” 版本模型的架构。这个 YAML 文件是专门设计用来描述 yolov8s.pt 模型的结构,包括它的层、模块以及连接方式。然而,这种架构定义并不严格绑定于 .pt 文件本身。实际上,.yaml 文件可以被用来构建任何符合相同架构描述的模型实例。

当你使用 yolov8s.yaml 架构来初始化一个新的模型时,你可以选择不加载任何预训练权重,或者加载不同的预训练权重,比如 yolov8n.pt。这意味着,即使 yolov8n.pt 是一个 “nano” 版本的模型,只要它的架构能够与 yolov8s.yaml 中定义的架构兼容(即相同的层类型、相同的连接方式等),你就可以尝试使用这个 YAML 文件来构建模型,并加载 yolov8n.pt 的权重。

但是,需要注意的是,yolov8n.ptyolov8s.pt 之间的差异可能不仅仅是模型的复杂度和规模,它们可能还有不同的层结构、模块参数或者甚至不同的组件。例如,“nano” 版本可能为了减少计算量和参数量,省略了一些层或使用了更少的通道数,这可能会导致它与 “small” 版本的架构在某些细节上不匹配。

因此,在尝试将 yolov8n.pt 的权重加载到由 yolov8s.yaml 定义的模型上时,你需要确保两个模型的架构在结构上是一致的,至少在模型的主干部分。如果不一致,你可能会遇到权重形状不匹配的错误,因为预训练权重的每个层的形状必须与新模型中对应层的形状相匹配。

yolov8.yaml文件解析

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # 类别数目,nc代表"number of classes",即模型用于检测的对象类别总数。 80表示该模型配置用于检测80种不同的对象。由于默认使用COCO数据集,这里nc=80;
scales: # 模型复合缩放常数,用于定义模型的不同尺寸和复杂度。例如 'model=yolov8n.yaml' 将调用带有 'n' 缩放的 yolov8.yaml
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n概览:225层, 3157200参数, 3157184梯度, 8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s概览:225层, 11166560参数, 11166544梯度, 28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m概览:295层, 25902640参数, 25902624梯度, 79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l概览:365层, 43691520参数, 43691504梯度, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x概览:365层, 68229648参数, 68229632梯度, 258.5 GFLOPs

# YOLOv8.0n backbone 骨干层
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2 第0层,-1代表将上层的输出作为本层的输入。第0层的输入是640*640*3的图像。Conv代表卷积层,相应的参数:64代表输出通道数,3代表卷积核大小k,2代表stride步长。卷积后输出的特征图尺寸为320*320*64,长宽为初始图片的1/2
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4 第1层,本层和上一层是一样的操作(128代表输出通道数,3代表卷积核大小k,2代表stride步长)。卷积后输出的特征图尺寸为160*160*128,长宽为初始图片的1/4
  - [-1, 3, C2f, [128, True]] # 第2层,本层是C2f模块,3代表本层重复3次。128代表输出通道数,True表示Bottleneck有shortcut。输出的特征图尺寸为160*160*128。
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8 第3层,进行卷积操作(256代表输出通道数,3代表卷积核大小k,2代表stride步长),输出特征图尺寸为80*80*256(卷积的参数都没变,所以都是长宽变成原来的1/2,和之前一样),特征图的长宽已经变成输入图像的1/8。
  - [-1, 6, C2f, [256, True]] # 第4层,本层是C2f模块,可以参考第2层的讲解。6代表本层重复6次。256代表输出通道数,True表示Bottleneck有shortcut。经过这层之后,特征图尺寸依旧是80*80*256。
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16 第5层,进行卷积操作(512代表输出通道数,3代表卷积核大小k,2代表stride步长),输出特征图尺寸为40*40*512(卷积的参数都没变,所以都是长宽变成原来的1/2,和之前一样),特征图的长宽已经变成输入图像的1/16。
  - [-1, 6, C2f, [512, True]] # 第6层,本层是C2f模块,可以参考第2层的讲解。6代表本层重复6次。512代表输出通道数,True表示Bottleneck有shortcut。经过这层之后,特征图尺寸依旧是40*40*512。
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32 第7层,进行卷积操作(1024代表输出通道数,3代表卷积核大小k,2代表stride步长),输出特征图尺寸为20*20*1024(卷积的参数都没变,所以都是长宽变成原来的1/2,和之前一样),特征图的长宽已经变成输入图像的1/32。
  - [-1, 3, C2f, [1024, True]] #第8层,本层是C2f模块,可以参考第2层的讲解。3代表本层重复3次。1024代表输出通道数,True表示Bottleneck有shortcut。经过这层之后,特征图尺寸依旧是20*20*1024。
  - [-1, 1, SPPF, [1024, 5]]  # 9 第9层,本层是快速空间金字塔池化层(SPPF)。1024代表输出通道数,5代表池化核大小k。结合模块结构图和代码可以看出,最后concat得到的特征图尺寸是20*20*(512*4),经过一次Conv得到20*20*1024。

# YOLOv8.0n head 头部层
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 第10层,本层是上采样层。-1代表将上层的输出作为本层的输入。None代表上采样的size=None(输出尺寸)不指定。2代表scale_factor=2,表示输出的尺寸是输入尺寸的2倍。mode=nearest代表使用的上采样算法为最近邻插值算法。经过这层之后,特征图的长和宽变成原来的两倍,通道数不变,所以最终尺寸为40*40*1024。
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4 第11层,本层是concat层,[-1, 6]代表将上层和第6层的输出作为本层的输入。[1]代表concat拼接的维度是1。从上面的分析可知,上层的输出尺寸是40*40*1024,第6层的输出是40*40*512,最终本层的输出尺寸为40*40*1536。
  - [-1, 3, C2f, [512]]  # 12 第12层,本层是C2f模块,可以参考第2层的讲解。3代表本层重复3次。512代表输出通道数。与Backbone中C2f不同的是,此处的C2f的bottleneck模块的shortcut=False。

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 第13层,本层也是上采样层(参考第10层)。经过这层之后,特征图的长和宽变成原来的两倍,通道数不变,所以最终尺寸为80*80*512。
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3 第14层,本层是concat层,[-1, 4]代表将上层和第4层的输出作为本层的输入。[1]代表concat拼接的维度是1。从上面的分析可知,上层的输出尺寸是80*80*512,第6层的输出是80*80*256,最终本层的输出尺寸为80*80*768。
  - [-1, 3, C2f, [256]]  # 15 (P3/8-small) 第15层,本层是C2f模块,可以参考第2层的讲解。3代表本层重复3次。256代表输出通道数。经过这层之后,特征图尺寸变为80*80*256,特征图的长宽已经变成输入图像的1/8。

  - [-1, 1, Conv, [256, 3, 2]] # 第16层,进行卷积操作(256代表输出通道数,3代表卷积核大小k,2代表stride步长),输出特征图尺寸为40*40*256(卷积的参数都没变,所以都是长宽变成原来的1/2,和之前一样)。
  - [[-1, 12], 1, Concat, [1]]  # cat head P4 第17层,本层是concat层,[-1, 12]代表将上层和第12层的输出作为本层的输入。[1]代表concat拼接的维度是1。从上面的分析可知,上层的输出尺寸是40*40*256,第12层的输出是40*40*512,最终本层的输出尺寸为40*40*768。
  - [-1, 3, C2f, [512]]  # 18 (P4/16-medium) 第18层,本层是C2f模块,可以参考第2层的讲解。3代表本层重复3次。512代表输出通道数。经过这层之后,特征图尺寸变为40*40*512,特征图的长宽已经变成输入图像的1/16。

  - [-1, 1, Conv, [512, 3, 2]] # 第19层,进行卷积操作(512代表输出通道数,3代表卷积核大小k,2代表stride步长),输出特征图尺寸为20*20*512(卷积的参数都没变,所以都是长宽变成原来的1/2,和之前一样)。
  - [[-1, 9], 1, Concat, [1]]  # cat head P5 第20层,本层是concat层,[-1, 9]代表将上层和第9层的输出作为本层的输入。[1]代表concat拼接的维度是1。从上面的分析可知,上层的输出尺寸是20*20*512,第9层的输出是20*20*1024,最终本层的输出尺寸为20*20*1536。
  - [-1, 3, C2f, [1024]]  # 21 (P5/32-large) 第21层,本层是C2f模块,可以参考第2层的讲解。3代表本层重复3次。1024代表输出通道数。经过这层之后,特征图尺寸变为20*20*1024,特征图的长宽已经变成输入图像的1/32。

  - [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5) 第20层,本层是Detect层,[15, 18, 21]代表将第15、18、21层的输出(分别是80*80*256、40*40*512、20*20*1024)作为本层的输入。nc是数据集的类别数。

YOLOv8环境配置

cuda版本11.6
torch 1.12.0
torchvision 0.13.0
torchaudio 0.12.0
在ultralytics目录下直接适用pip install e .下载yoloV8配置环境
配置新环境
conda create -n myenv python=3.9 conda activate myenv conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch
/ myenv是指创建环境的名称/
下载与cuda11.6版本兼容的torch环境:
pip install torch == 1.12.0+cu116 torchvision == 0.13.0+cu116 torchaudio == 0.12.0+cu116 --extra-index-url https://download.pytorch.org/whl/cu116 -i https://pypi.tuna.tsinghua.edu.cn/simple
conda创建新环境的指令: conda create -n ‘环境名’ python == 3.9
退出当前环境:conda deactivate

YOLOv8视频处理

使用 YOLO 模型对图像进行预测时,results = model(frame) 返回的是一个 ultralytics.yolo.engine.results.Results 对象或类似的对象实例。这个对象包含了模型对给定图像的所有预测结果。
以下是一些主要属性和方法的概述:

  • results: 一个列表,其中每个元素都是一个 Results 对象,代表一张图像的预测结果。对于单个图像的预测,results 列表只有一个元素。

  • boxes: 包含检测到的对象边界框的信息。每个边界框是一个矩形区域,由左上角坐标 (x1, y1) 和右下角坐标 (x2, y2) 定义。边界框还包括其他属性,如置信度分数和类别标签。

  • names: 一个字典,将类别 ID 映射到类别名称。例如,results.names[0] 可能返回 'person',表示类别 ID 0 对应于 ‘person’ 类别。

  • probs: 如果使用的是分类模型,这将包含每个类别的概率分布。

  • scores: 包含每个检测到的对象的置信度分数。

  • labels: 包含每个检测到的对象的类别标签。

  • keypoints: 如果模型支持关键点检测,这将包含每个对象的关键点位置。

  • masks: 如果模型支持实例分割,这将包含每个对象的分割掩模。

  • plot(): 一个方法,用于在原始图像上绘制检测框和相关标签。

  • pandas(): 一个方法,用于将检测结果转换为 Pandas DataFrame 格式。

  • numpy(): 一个方法,用于将检测结果转换为 NumPy 数组格式。

results = model(frame) 
# 获取第一个结果(对于单张图像) 
result = results[0] 
# 获取边界框信息 
boxes = result.boxes 
# 获取每个边界框的坐标 
xyxy = boxes.xyxy 
# 获取每个边界框的类别标签 
labels = boxes.cls 
# 获取每个边界框的置信度分数 
scores = boxes.conf 
# 获取类别名称 
names = result.names 
# 在图像上绘制检测结果 
annotated_frame = result.plot()

YOLOv8操作步骤

![[Pasted image 20240716164513.png]]
将自己的数据集合放置到datasets文件中,注意需要配有同名的.txt文件
配置好的数据文件,在同目录下放置data.yaml文件
![[Pasted image 20240716164819.png]]
yolov8.yaml文件放在这里
![[Pasted image 20240716165205.png]]
可以直接使用

pretrained表示预训练权重
resume默认的值为false
打开resume=True的话,假如在训练十五次中断,后续的训练可以基于前面十五次训练的权重来继续训练,没有打开的话,中断之后就需要继续从原始权重开始后续的训练(从上一个检查点恢复训练)

使用模型预测单一数据集合
![[Pasted image 20240718085145.png]]

**出现numpy处理数组问题就是表明文件路径有问题,注意将path转化为当前train和val的父目录,train:train/images val:val/images

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值