基于YOLOv8的自定义数据姿势估计

简介: 基于YOLOv8的自定义数据姿势估计

在不断发展的计算机视觉领域中,姿势估计凭借其重要的创新而脱颖而出,彻底改变了我们理解和与视觉数据交互的方式。Ultralytics YOLOv8 处于这一转变的前沿,提供了一种强大的工具,捕捉图像中物体方向和运动的微妙之处。


传统上,在图像中跟踪物体的关键点一直是复杂的,但使用 YOLOv8,这变得简便而直观。这种进步不仅令人振奋 —— 它在包括体育分析、医疗保健和零售等各个领域打开了无数可能性。


使用YOLOv8进行虎类关键点估计

在本文中,我们将探讨使用YOLOv8进行姿势估计的过程。以下是我们将涵盖的内容:

  • 使用CVAT进行姿势估计的数据注释:我们将从将数据集上传到CVAT平台开始,配置工具,注释关键点并导出数据。
  • 将注释转换为Ultralytics YOLOv8兼容的格式:在注释之后,我们将将数据转换为与YOLOv8兼容的格式,确保我们的模型能够正确解释它。
  • 数据分割:对数据进行结构化是至关重要的,因此我们将其分成训练、验证和测试集,以便进行有效的模型训练。
  • 训练用于姿势估计的YOLOv8模型:有了组织好的数据,我们将训练YOLOv8模型以识别和估计姿势。
  • 使用YOLOv8执行推断:最后,我们将使用训练好的模型对新数据进行姿势估计,看到我们努力的成果。您还可以在YouTube上查看我们关于使用Ultralytics YOLOv8进行姿势估计的视频。


使用CVAT进行姿势估计的数据注释

数据注释的过程在计算机视觉领域至关重要。在本教程中,我们将使用虎类数据集演示如何准确注释关键点,这是为了训练我们的姿势估计模型而不可或缺的步骤。

Ultralytics虎类姿势数据集

注意:可以从Ultralytics虎类姿势数据集获取的虎类数据集应当被下载并解压,为即将进行的任务做好准备。这些图像将成为我们训练过程的基础,因此确保它们被方便地存储。


如果您是CVAT的新手,花时间熟悉其功能是值得的,可以通过查阅CVAT文档来了解。这将为更加流畅的注释过程奠定基础。


上传数据集


在下载虎类图像后,请确保解压文件。接下来,将所有图像作为一个新任务上传到CVAT平台,并点击“提交并打开”。


完成后,您将被引导至下方显示的页面。

Ultralytics虎类姿势数据集上传

设置注释工具CVAT


在CVAT中打开任务后,您将被提示选择一个特定的作业,这将成为您进行注释的工作区。作业编号,例如这里提到的“作业 #391317”,对每个用户都会有所不同。这将引导您进入注释界面,设置将完成,您可以开始为数据打标签。

使用CVAT对YOLOv8虎类姿势数据集进行注释工作流程

数据注释


在CVAT中,您可以选择使用不同的格式进行注释。对于虎类数据集,我们将利用点注释来标记关键点。该过程在教程中提供的详细GIF中进行了可视化,引导您完成注释的每一步。

使用CVAT进行虎类姿势数据集的数据注释过程

数据导出


完成注释后,可以使用“CVAT for images 1:1”格式导出数据集,这将适用于后续工作流程中转换为YOLOv8格式。


将注释转换为Ultralytics YOLOv8格式

一旦从CVAT导出了注释,您将收到一个zip文件。解压缩该文件,显示出一个“annotations.xml”文件,其中包含了您分配的关键点和标签。这个文件非常关键,因为它包含了YOLOv8将学习的结构化数据。


要与YOLOv8集成,将“annotations.xml”文件放入与图像数据集相同的目录中。如果需要重新下载数据集,可以在Ultralytics虎类姿势数据集中找到。确保在下载后解压缩文件,为下一步做好准备。


现在,创建一个名为“cvat_to_ultralytics_yolov8.py”的Python脚本。将提供的代码复制到这个新文件中。运行此脚本将把您的注释转换为YOLOv8格式,为训练模型铺平道路

import ast
import os.path
from xml.dom import minidom
out_dir = './out'
if not os.path.exists(out_dir):
    os.makedirs(out_dir)
file = minidom.parse('annotations.xml')
images = file.getElementsByTagName('image')
for image in images:
    width = int(image.getAttribute('width'))
    height = int(image.getAttribute('height'))
    name = image.getAttribute('name')
    elem = image.getElementsByTagName('points')
    bbox = image.getElementsByTagName('box')[0]
    xtl = int(float(bbox.getAttribute('xtl')))
    ytl = int(float(bbox.getAttribute('ytl')))
    xbr = int(float(bbox.getAttribute('xbr')))
    ybr = int(float(bbox.getAttribute('ybr')))
    w = xbr - xtl
    h = ybr - ytl
    label_file = open(os.path.join(out_dir, name + '.txt'), 'w')
    for e in elem:
        label_file.write('0 {} {} {} {} '.format(
            str((xtl + (w / 2)) / width),
             str((ytl + (h / 2)) / height),
             str(w / width),
             str(h / height)))
        points = e.attributes['points']
        points = points.value.split(';')
        points_ = []
        for p in points:
            p = p.split(',')
            p1, p2 = p
            points_.append([int(float(p1)), int(float(p2))])
        for p_, p in enumerate(points_):
            label_file.write('{} {}'.format(p[0] / width, p[1] / height))
            if p_ < len(points_) - 1:
                label_file.write(' ')
            else:
                label_file.write('\n')

运行脚本后,删除“annotations.xml”以避免在后续步骤中可能的混淆。


数据分割(训练、验证、测试)


在对数据集进行注释和转换后,下一步是将图像和注释组织成用于训练和评估的不同集合。


  • 在项目中创建两个目录:一个命名为“images”,另一个命名为“labels”。
  • 分别将图像及其相应的注释文件分发到这些文件夹中。
  • 为了便于这个数据分割过程,创建一个名为“splitdata.py”的Python文件。
  • 将提供的代码复制并粘贴到“splitdata.py”文件中。
  • 通过运行该文件执行Python脚本。
  • 此过程确保您的数据被适当地分成训练和测试子集,为Ultralytics YOLOv8的训练做好准备。


import splitfolders
input_fol_path = "path to folder, that includes images and labels folder"
splitfolders.ratio(input_fold_path, output="output",
    seed=1337, ratio=(.8, .2, .0), group_prefix=None, move=False)


结果将是一个包含两个不同目录的输出文件夹:“train”和“test”。这些文件夹已准备好在您的YOLOv8训练过程中使用。


训练YOLOv8模型进行姿势估计

接下来的步骤涉及创建一个“data.yaml”文件,它充当YOLOv8的路线图,指导其对数据集进行训练并定义训练的类别。将必要的代码插入到 'data.yaml' 中,自定义路径以指向您的数据集目录。


有关配置虎类姿势数据集的详细指导,请参阅Ultralytics文档:https://docs.ultralytics.com/datasets/pose/tiger-pose/#dataset-yaml


请记住根据需要调整数据集目录路径。配置好 'data.yaml' 后,您就可以开始训练模型了。


path: "path to the dataset directory"
train: train
val: val 
kpt_shape: [12, 2]
flip_idx: [0,1,2,3,4,5,6,7,8,9,10,11]
names:
  0: tiger


完成后,您已经准备好开始了!您可以使用提供的命令开始训练YOLOv8模型进行虎类姿势估计。


yolo task=pose mode=train data="path/data.yaml" model=yolov8n.pt imgsz=640


训练持续时间会有所不同,取决于您的GPU设备。


使用YOLOv8进行推断

在训练完成后,通过在新数据上执行推断来测试您的模型。运行提供的命令,将您的姿势估计模型应用于检测和分析姿势。


# Run inference using a tiger-pose trained model
yolo task=pose mode=predict \
source="https://www.youtube.com/watch?v=MIBAT6BGE6U" \
show=True model="path/to/best.pt"


推断结果将显示出模型将其学到的应用于现实场景的能力。请参阅下文:

使用YOLOv8进行虎类姿势估计的姿势推断


随着我们结束本教程,我们邀请您深入探索使用Ultralytics YOLOv8进行姿势估计的潜力。我们很期待看到您如何将这些工具应用到您的项目中。


相关文章
|
机器学习/深度学习 JSON 数据可视化
YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程
本文介绍了如何将个人数据集转换为YOLO11-pose所需的数据格式,并详细讲解了手部关键点检测的训练过程。内容涵盖数据集标注、格式转换、配置文件修改及训练参数设置,最终展示了训练结果和预测效果。适用于需要进行关键点检测的研究人员和开发者。
3519 0
|
JSON 人工智能 数据格式
AI计算机视觉笔记二十六:YOLOV8自训练关键点检测
本文档详细记录了使用YOLOv8训练关键点检测模型的过程。首先通过清华源安装YOLOv8,并验证安装。接着通过示例权重文件与测试图片`bus.jpg`演示预测流程。为准备训练数据,文档介绍了如何使用`labelme`标注工具进行关键点标注,并提供了一个Python脚本`labelme2yolo.py`将标注结果从JSON格式转换为YOLO所需的TXT格式。随后,通过Jupyter Notebook可视化标注结果确保准确性。最后,文档展示了如何组织数据集目录结构,并提供了训练与测试代码示例,包括配置文件`smoke.yaml`及训练脚本`train.py`,帮助读者完成自定义模型的训练与评估。
5832 2
|
10月前
|
数据可视化 搜索推荐 程序员
低代码平台是什么?一文简述:低代码开发平台的分类、功能与构成
本文深入探讨了低代码的概念、分类及其构成,旨在为读者清晰阐述低代码的内涵与外延。文章从低代码的历史起源讲起,追溯至1982年James Martin的前瞻性预测,再到2014年Forrester正式提出“低代码”概念。文中详细解析了低代码与无代码的区别,并按代码量、适用范围、业务类型及使用者类型等多个维度进行分类。
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
机器学习/深度学习 数据可视化 自动驾驶
YOLO11-seg分割如何训练自己的数据集(道路缺陷)
本文介绍了如何使用自己的道路缺陷数据集训练YOLOv11-seg模型,涵盖数据集准备、模型配置、训练过程及结果可视化。数据集包含4029张图像,分为训练、验证和测试集。训练后,模型在Mask mAP50指标上达到0.673,展示了良好的分割性能。
6699 4
|
机器学习/深度学习 自然语言处理 数据挖掘
【LangChain系列】第七篇:工作流(链)简介及实践
【5月更文挑战第21天】LangChain是一个框架,利用“链”的概念将复杂的任务分解为可管理的部分,便于构建智能应用。数据科学家可以通过组合不同组件来处理和分析非结构化数据。示例中展示了如何使用LLMChain结合OpenAI的GPT-3.5-turbo模型,创建提示模板以生成公司名称和描述。顺序链(SimpleSequentialChain和SequentialChain)则允许按顺序执行多个步骤,处理多个输入和输出
2978 1
|
开发框架 .NET Linux
2款高效的.NET二维码生成类库
2款高效的.NET二维码生成类库
323 1
|
存储 设计模式 编译器
软件体系结构 - 复杂指令集架构 (CISC)
【4月更文挑战第18天】软件体系结构 - 复杂指令集架构 (CISC)
839 6
|
机器学习/深度学习 前端开发 Go
Golang微服务框架kratos实现SSE服务
我也是最近才知道SSE的,问了下周围的人,发现知道的人也着实不多的。我是怎么知道SSE的呢?我看了下OpenAI的API,有一个Stream模式,就是使用的SSE实现的。说白了,这就是一个HTTP长连接通过服务端持续发送数据到前端的协议。在网络不稳定的情况下,它比Websocket要更好。
1181 0