当前位置: 首页 > web >正文

关键点检测(10)——yolov8-pose 复现coco-pose

  前面基本将yolo_pose的代码包括模型和损失函数都学习了一下。这节课顺带将其跑过的结果展示一下。和大家交流一下。最近yolov11也出来了,这里暂时不做学习,只粘贴其结果。如果大家感兴趣,后面可以补一节关于yolov11的创新点。但是大体代码基本不变,所以这里还是以yolov8为主。

        这个博文结束后,yolo系列的关键点先补充到这里。后面有想到再补充。

  我估计很多人只看结果,我这里说一下关键点吧,使用官方的预训练模型,基本可以复现其结果,指标也大差不差。如果自己要训练的话,需要一台4090大概一天的时间

1,COCO数据集

1.1 COCO-Pose数据集简介

   COCO-Pose 数据集是 COCO(Common Objects in Context)数据集的专门版本,专为姿势估计任务而设计。它利用 COCO Keypoints 2017 图像和标签来训练 YOLO 等模型以完成姿势估计任务,该数据集包含20万张标有姿势估计任务关键点的图像。并且支持17个人体关键点,便于进行详细的姿势估计。

   与COCO一样,COCO-Pose提供了标准化的评估指标,包括姿态估计任务的对象关键点相似度(OKS),使其适合比较模型的性能。

  COCO-Pose 数据集人体关键点的顺序:

1. 鼻子 (Nose)
2. 左眼 (Left Eye)
3. 右眼 (Right Eye)
4. 左耳 (Left Ear)
5. 右耳 (Right Ear)
6. 左肩 (Left Shoulder)
7. 右肩 (Right Shoulder)
8. 左肘 (Left Elbow)
9. 右肘 (Right Elbow)
10. 左腕 (Left Wrist)
11. 右腕 (Right Wrist)
12. 左髋 (Left Hip)
13. 右髋 (Right Hip)
14. 左膝 (Left Knee)
15. 右膝 (Right Knee)
16. 左踝 (Left Ankle)
17. 右踝 (Right Ankle)

   这些关键点按照从头部到脚部的顺序排列,依次标记了人体主要的关节和重要部位。

1.1.1 flip_idx的解释

  这里顺带提一句。代码中的flip_idx的含义。防止有些人confuse。

  也就是说下面内容的含义:

  flip_idx 是用来定义左右对称部位在进行水平翻转(horizontal flip)时对应的关键点索引。进行图像翻转时,人体左右部位的关键点需要对应调整。对于COCO的17个关键点,左右对称的部位在翻转后需要交换位置,因此我们使用 flip_idx 来完成这种翻转后的索引调整。

具体的coco格式的flip_idx为:

  关键点 0(鼻子)没有左右翻转,所以索引还是 0。

  关键点 1(左眼)和关键点 2(右眼)在翻转时需要交换位置,因此 flip_idx 中左眼 (index 1) 对应翻转后的右眼 (index 2),右眼 (index 2) 对应左眼 (index 1),依此类推。

  对于所有左右对称的部位(眼、耳、肩、肘、腕、髋、膝、踝),翻转后左侧和右侧交换,所以 flip_idx 的值就表现为成对的交换关系。

详细解释:

  • flip_idx[0] = 0: 鼻子不变,保持在索引0。

  • flip_idx[1] = 2: 左眼(索引1)翻转后成为右眼(索引2)。

  • flip_idx[2] = 1: 右眼(索引2)翻转后成为左眼(索引1)。

  • flip_idx[3] = 4: 左耳(索引3)翻转后成为右耳(索引4)。

  • flip_idx[4] = 3: 右耳(索引4)翻转后成为左耳(索引3)。

  • 其他关键点的左右对称部位也是这样成对翻转。

因此,flip_idx 是为在水平翻转图像时,让左右对称的关键点正确交换位置而设定的。

1.1 COCO-Pose数据集在yolov8-pose的表现

  它的预训练模型的准确率如下,也就是我们复现的目标:

   最近yolo11也出现了,随之而来的也有其yolo-pose模型,我们也将其表现粘贴出来,但是从结果的准确率来对比,其实并没有多少优势,但是性能有提升,比如参数两下降,flops下降。

 1.2 数据集下载及其复现

  有条件的可以直接下载,我这里附属了yolo-pose的yaml文件。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO 2017 dataset https://cocodataset.org by Microsoft
# Documentation: https://docs.ultralytics.com/datasets/pose/coco/
# Example usage: yolo train data=coco-pose.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco-pose  ← downloads here (20.1 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco-pose # dataset root dir
train: train2017.txt # train images (relative to 'path') 118287 images
val: val2017.txt # val images (relative to 'path') 5000 images
test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Keypoints
kpt_shape: [17, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]# Classes
names:0: person# Download script/URL (optional)
download: |from ultralytics.utils.downloads import downloadfrom pathlib import Path# Download labelsdir = Path(yaml['path'])  # dataset root dirurl = 'https://github.com/ultralytics/assets/releases/download/v0.0.0/'urls = [url + 'coco2017labels-pose.zip']  # labelsdownload(urls, dir=dir.parent)# Download dataurls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)download(urls, dir=dir / 'images', threads=3)

   这里提醒一下,如果要复现的话,稍微修改一下数据集格式。因为yolov8仅支持YOLO格式的标签,COCO的默认标签为JSON格式,所以需要将COCO格式转换为YOLO格式。如果训练COCO数据集的话一定要按照这个格式,摆放目录images,labels这两个目录名不可以改变。因为在内部已经写好了就这么去找数据,如果不按照这个规则写就会报错:No labels found in。。。

  从我给的yaml文件也可以看到,yolo-pose官网也很贴心,帮我们转换了其格式。在coco2017labels-pose.zip里面。所以我们也不需要转换,直接下载下来,按照下面格式放数据即可。

datasets|coco|images|train2017val2017labels|train2017val2017

   一般可以使用下面代码进行运行即可。(确保你的机器不断电,不死机哈,训练实际稍微长一些。)

from ultralytics import YOLO# Load a model
model = YOLO("yolov8n-pose.pt")  # load a pretrained model (recommended for training)# Train the model
results = model.train(data="coco-pose.yaml", epochs=100, imgsz=640)

   上面代码即在COCO-Pose的数据集上训练YOLOv8-n-pose模型,100个epoch,图像大小为640*640。我是一个4090,所以使用默认参数,如果你有多个GPU可以设置device参数。比如你很有money,有四个GPU,那么使用多GPU训练的脚本如下:

from ultralytics import YOLO# Load a model
model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)# Train the model with 2 GPUs
results = model.train(data="coco-pose.yaml", epochs=100, imgsz=640, device=[0, 1, 2, 3])

   当模型训练好之后,就使用下面代码进行测试。

from ultralytics import YOLO
import glob
import os
from tqdm import tqdm"""
from ultralytics import YOLO# Load a model
model = YOLO('path/to/best.pt')  # load a custom model# Validate the model
metrics = model.val()  # no arguments needed, dataset and settings remembered
metrics.box.map    # map50-95
metrics.box.map50  # map50
metrics.box.map75  # map75
metrics.box.maps   # a list contains map50-95 of each category
"""if __name__ == '__main__':# Load a modelmodel = YOLO(r"D:\...\yolov8n-pose_custom_best.pt")  # Val the modelresults = model.val(data='cfg/datasets/coco-pose.yaml', batch=4, workers=8)print(results )

 1.3 自己的结果展示

  (注意:正如官方所说,第一个结果的mAP高一些,也是正常的话!!)

  我首先测试了官网模型的效果,然后测试自己模型的效果。并且将官网的结果截图和自己跑出来的截图如下,大家可以自行对比。

  结果依次如下

1.3.1 官方nano模型

  截图效果如下:

  运行结果如下:

 1.3.2 官方s模型

  截图效果如下:

  结果如下:

  

1.3.3 自己训练nano模型

  当未使用预训练模型的时候,效果如下:

增大epoch到150,达到的效果就是0.496。

情况2:关闭预训练模型,关闭数据增强的结果

测试关闭预训练模型,开启数据增强的模型效果

 1.3.4 自己训练s模型

         当使用预训练模型的效果如下:

2,hand-keypoints数据集

        手部关键点数据集包含 26,768 张用关键点注释的手部图像,使其适合训练 Ultralytics YOLO 等模型以执行姿势估计任务。手部关键点可以用于手势识别,AR/VR控制,机器人操作以及医疗保健领域中的手部运动分析。他们还可以应用于动画中的动作捕捉和用于安全目的的生物识别认证系统。对手指位置的详细跟踪能够实现与虚拟对象的精确交互和非接触式控制界面。

        该数据集是ultralytics官网提供的,我们可以直接去官网下载。该数据集包括用于手部检测的关键点,关键点注释如下:

  1. 手腕
  2. 拇指(4 个点)
  3. 食指(4 个点)
  4. 中指(4 个点)
  5. 无名指(4 个点)
  6. 小指(4 个点)

每只手总共有 21 个关键点。 数据集结构如下,手部关键点数据集分为两个子集:

  1. Train: 此子集包含来自手部关键点数据集的 18,776 张图像,已标注,用于训练姿势估计模型。
  2. Val:此子集包含 7,992 张图像,可在模型训练期间用于验证。

        官网的yaml文件如下,因为包含了数据集的路径,类别和下载地址,所以我也贴在这里。

# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license# Hand Keypoints dataset by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/pose/hand-keypoints/
# Example usage: yolo train data=hand-keypoints.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── hand-keypoints ← downloads here (369 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: hand-keypoints # dataset root dir
train: images/train # train images (relative to 'path') 18776 images
val: images/val # val images (relative to 'path') 7992 images# Keypoints
kpt_shape: [21, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
flip_idx:[0, 1, 2, 4, 3, 10, 11, 12, 13, 14, 5, 6, 7, 8, 9, 15, 16, 17, 18, 19, 20]# Classes
names:0: hand# Download script/URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/hand-keypoints.zip

官网的没训练,这里只贴一个我训练的数据集。结果如下:

http://www.xdnf.cn/news/17497.html

相关文章:

  • 【QT】QMainWindow:打造专业级桌面应用的基石
  • Python基础教程(七)匹配模式:隐藏在结构之美中的编程革命
  • 实用Shell高级视频课程
  • 【CVPR2025】计算机视觉|PX:让模型训练“事半功倍”!
  • Uipath Studio中邮件自动化
  • 微信小程序中实现表单自动填充功能的方法
  • ABP VNext + Apache Kafka Exactly-Once 语义:金融级消息一致性实战
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • 需求管理流程规范
  • Java-file类
  • Mybatis学习之自定义映射resultMap(七)
  • STM32CubeMX(十三)FatFs文件系统(SPI驱动W25Qxx)
  • BGP 笔记
  • 配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
  • .NET程序跨平台ARM电脑上发布的程序格式是,so还是DLL?
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • 费米问题:估算北京有多少量特斯拉汽车?
  • 等保测评-RabbitMQ中间件
  • 【线性代数】目录
  • day 16 stm32 IIC
  • STM32——时钟系统
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • Bee 2.5.2.6 发布
  • 库函数蜂鸣器的使用(STC8)
  • Typora上传图片保存到assets目录下
  • 线程池多反应堆服务器webserver(c++)
  • Web文件上传:本地与云存储实战
  • 数据分析框架从 “工具堆砌” 转向 “智能协同”
  • 每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min
  • 【JVM】深入解析Java虚拟机