手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

目录

手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

[1. 前言](#1. 前言)

2.手部关键点检测(手部姿势估计)方法

(1)Top-Down(自上而下)方法

(2)Bottom-Up(自下而上)方法:

3.手部关键点检测数据集

4.手部关键点检测模型训练

(1)项目安装

(2)准备Train和Test数据

(3)配置文件configs

(4)开始训练

(5)Tensorboard可视化训练过程

5.手部关键点检测模型效果

6.手部关键点检测(推理代码)

7.手部关键点检测(训练代码)

8.手部关键点检测C++/Android版本


1. 前言

本篇文章是项目《手部关键点检测(手部姿势估计)》系列文章之《Pytorch实现手部关键点检测(手部姿势估计)》;项目基于Pytorch深度学习框架,实现手部关键点检测(手部姿势估计)模型,其中手部检测采用YOLOv5模型,手部关键点检测是基于开源的HRNet进行改进,构建了整套手部关键点检测的训练和测试流程;为了方便后续模型工程化和Android平台部署,项目支持高精度HRNet检测模型,轻量化模型LiteHRNet和Mobilenet模型训练和测试,并提供Python/C++/Android多个版本;

轻量化Mobilenet-v2模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约50ms左右,GPU约30ms左右 ,基本满足业务的性能需求。下表格给出HRNet,以及轻量化模型LiteHRNet和Mobilenet的计算量和参数量,以及其检测精度

|--------------|----------------|---------------|------------|--------|
| 模型 | input-size | params(M) | GFLOPs | AP |
| HRNet-w32 | 192×192 | 28.48M | 5734.05M | 0.8570 |
| LiteHRNet18 | 192×192 | 1.10M | 182.15M | 0.8023 |
| Mobilenet-v2 | 192×192 | 2.63M | 529.25M | 0.7574 |

先展示一下**手部检测以及手部关键点检测(手部姿势估计)**效果:

Android**手部关键点检测(手部姿势估计)**APP Demo体验:

https://download.csdn.net/download/guyuealian/88418582

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/133277726


更多项目《手部关键点检测(手部姿势估计)》系列文章请参考:


2.手部关键点检测(手部姿势估计)方法

手部关键点检测(手部姿势估计) 的方法,目前主流的方法主要两种:一种是Top-Down (自上而下)方法,另外一种是Bottom-Up(自下而上)方法;

(1)Top-Down( 自上而下****)****方法

将手部检测和手部关键点估计分离,在图像上首先进行手部目标检测,定位手部位置;然后crop每一个手部图像,再估计每个手部的关键点;这类方法往往比较慢,但姿态估计准确度较高。目前主流模型主要有CPN,Hourglass,CPM,Alpha Pose,HRNet等。

(2)Bottom-Up( 自下而上****)****方法:

先估计图像中所有手部的关键点,然后在通过Grouping的方法组合成一个一个手部实例;因此这类方法在测试推断的时候往往更快速,准确度稍低。典型就是COCO2016年人体关键点检测冠军Open Pose。

通常来说,Top-Down具有更高的精度,而Bottom-Up具有更快的速度; 就目前调研而言, Top-Down的方法研究较多,精度也比Bottom-Up(自下而上)方法高。

本项目基于开源的HRNet进行改进,关于HRNet项目请参考GitHub

HRNet: https://github.com/leoxiaobin/deep-high-resolution-net.pytorch


3.手部关键点检测数据集

项目收集了三个手部检测数据集和三个手部关键点数据集:

  • 手部检测数据集 (Hand Detection Dataset)共收集了三个:Hand-voc1,Hand-voc2和Hand-voc3,总共60000+张图片;标注格式统一转换为VOC数据格式,标注名称为hand,可用于深度学习手部目标检测模型算法开发
  • 手部关键点数据集(Hand Keypoints Dataset,Hand Pose Estimation共收集了三个:分别为HandPose-v1,HandPose-v2和HandPose-v3,总共80000+张图片,标注了手部21个关键点,可用于深度学习手部姿态检测模型算法开发。

关于手部关键点检测数据集说明,请参考:手部关键点(手部姿势估计)数据集(含下载链接) https://blog.csdn.net/guyuealian/article/details/133277630​​


4.手部关键点检测模型训练

整套工程项目基本结构如下:

bash 复制代码
.
├── configs              # 训练配置文件
├── data                 # 一些数据
├── libs                 # 一些工具库
├── pose                 # 姿态估计模型文件
├── work_space           # 训练输出工作目录
├── demo.py              # 模型推理demo文件
├── README.md            # 项目工程说明文档
├── requirements.txt     # 项目相关依赖包
└── train.py             # 训练文件

(1)项目安装

项目依赖python包请参考requirements.txt,使用pip安装即可**,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应**

bash 复制代码
numpy==1.16.3
matplotlib==3.1.0
Pillow==6.0.0
easydict==1.9
opencv-contrib-python==4.5.2.52
opencv-python==4.5.1.48
pandas==1.1.5
PyYAML==5.3.1
scikit-image==0.17.2
scikit-learn==0.24.0
scipy==1.5.4
seaborn==0.11.2
tensorboard==2.5.0
tensorboardX==2.1
torch==1.7.1+cu110
torchvision==0.8.2+cu110
tqdm==4.55.1
xmltodict==0.12.0
basetrainer
basetrainer
pybaseutils==0.9.4
pycocotools==2.0.6

项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

(2)准备Train和Test数据

下载手部关键点检测数据集:HandPose-v1,HandPose-v2和HandPose-v3,然后解压到本地

(3)配置文件configs

项目支持HRNet以及轻量化模型LiteHRNet和Mobilenet模型训练,并提供对应的配置文件;你需要修改对应配置文件的数据路径;本篇以训练HRNet-w32为例子,其配置文件在configs/coco/hrnet/w32_adam_hand_192_192.yaml,修改该文件的训练数据集路径TRAIN_FILE(支持多个数据集训练)和测试数据集TEST_FILE的数据路径为你本地数据路径,其他参数保持默认即可,如下所示:

python 复制代码
WORKERS: 8
PRINT_FREQ: 10
DATASET:
  DATASET: 'custom_coco'
  TRAIN_FILE:
    - 'D:/dataset/HandPose-v1/train/train_anno.json'
    - 'D:/dataset/HandPose-v2/train/train_anno.json'
    - 'D:/dataset/HandPose-v3/train/train_anno.json'
  TEST_FILE: 'D:/dataset/HandPose-v1/test/test_anno.json'
  FLIP: true
  ROT_FACTOR: 45
  SCALE_FACTOR: 0.3
  SCALE_RATE: 1.25
  JOINT_IDS: [ ]
  FLIP_PAIRS: [ ]
  SKELETON: [ [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 0, 5 ], [ 5, 6 ], [ 6, 7 ], [ 7, 8 ],  [ 5, 9 ], [ 9, 10 ], [ 10, 11 ], [ 11, 12 ], [ 9, 13 ], [ 13, 14 ], [ 14, 15 ], [ 15, 16 ], [ 13, 17 ], [ 17, 18 ], [ 18, 19 ], [ 19, 20 ], [ 0, 17 ] ]

配置文件的一些参数说明,请参考

|------------------|--------|-------------|--------------------------------|
| 参数 | 类型 | 参考值 | 说明 |
| WORKERS | int | 8 | 数据加载处理的进程数 |
| PRINT_FREQ | int | 10 | 打印LOG信息的间隔 |
| DATASET | str | custom_coco | 数据集类型,目前仅支持COCO数据格式 |
| TRAIN_FILE | List | - | 训练数据集文件列表(COCO数据格式),支持多个数据集 |
| TEST_FILE | string | - | 测试数据集文件(COCO数据格式),仅支持单个数据集 |
| FLIP | bool | True | 是否翻转图片进行测试,可提高测试效果 |
| ROT_FACTOR | float | 45 | 训练数据随机旋转的最大角度,用于数据增强 |
| SCALE_FACTOR | float | 1.25 | 图像缩放比例因子 |
| SCALE_RATE | float | 0.25 | 图像缩放率 |
| JOINT_IDS | list | [ ] | [ ]表示所有关键点,也可以指定需要训练的关键点序号ID |
| FLIP_PAIRS | list | [ ] | 图像翻转时,关键点不受翻转影响的ID号 |
| SKELETON | list | [ ] | 关键点连接线的序列列表,用于可视化效果 |

(4)开始训练

修改好配置文件后,就可以开始准备训练了:

  • 训练高精度模型HRNet-w48或者HRNet-w32
bash 复制代码
# 高精度模型:HRNet-w48
python train.py  -c "configs/coco/hrnet/w48_adam_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"
# 高精度模型:HRNet-w32
python train.py  -c "configs/coco/hrnet/w32_adam_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"
  • 训练轻量化模型LiteHRNet
bash 复制代码
# 轻量化模型:LiteHRNet
python train.py  -c "configs/coco/litehrnet/litehrnet18_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"
  • 训练轻量化模型Mobilenetv2
bash 复制代码
# 轻量化模型:Mobilenet
python train.py  -c "configs/coco/mobilenet/mobilenetv2_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"

下表格给出HRNet,以及轻量化模型LiteHRNet和Mobilenet的计算量和参数量,以及其检测精度AP; 高精度检测模型HRNet-w32,AP可以达到0.8570,但其参数量和计算量比较大,不合适在移动端部署;LiteHRNet18和Mobilenet-v2参数量和计算量比较少,合适在移动端部署;虽然LiteHRNet18的理论计算量和参数量比Mobilenet-v2低,但在实际测试中,发现Mobilenet-v2运行速度更快。轻量化Mobilenet-v2模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约50ms左右,GPU约30ms左右 ,基本满足业务的性能需求

|--------------|----------------|---------------|------------|--------|
| 模型 | input-size | params(M) | GFLOPs | AP |
| HRNet-w32 | 192×192 | 28.48M | 5734.05M | 0.8570 |
| LiteHRNet18 | 192×192 | 1.10M | 182.15M | 0.8023 |
| Mobilenet-v2 | 192×192 | 2.63M | 529.25M | 0.7574 |

(5)Tensorboard可视化训练过程

复制代码
训练过程可视化工具是使用Tensorboard,使用方法,在终端输入:
bash 复制代码
# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir="work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/log"

点击终端TensorBoard打印的链接,即可在浏览器查看训练LOG信息等:


5.手部关键点检测模型效果

demo.py文件用于推理和测试模型的效果,填写好配置文件,模型文件以及测试图片即可运行测试了;demo.py命令行参数说明如下:

参数 类型 参考值 说明
-c,--config_file str - 配置文件
-m,--model_file str - 模型文件
target str - 骨骼点类型,如hand,coco_person,mpii
image_dir str data/image 测试图片的路径
video_file str,int - 测试的视频文件
out_dir str output 保存结果,为空不保存
threshold float 0.3 关键点检测置信度
device str cuda:0 GPU ID

下面以运行HRNet-w32为样例,其他模型修改--config_file或者--model_file即可

  • 测试图片
bash 复制代码
python demo.py   -c "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/w32_adam_hand_192_192.yaml"    -m "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/model/best_model_189_0.8570.pth"   --target "hand"   --image_dir "data/hand"   --out_dir "output"
  • 测试视频文件
bash 复制代码
python demo.py   -c "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/w32_adam_hand_192_192.yaml"    -m "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/model/best_model_189_0.8570.pth"   --target "hand"   --video_file "data/hand/test-video.mp4"   --out_dir "output"
  • 测试摄像头
bash 复制代码
 python demo.py   -c "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/w32_adam_hand_192_192.yaml"    -m "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/model/best_model_189_0.8570.pth"   --target "hand"   --video_file 0   --out_dir "output"

运行效果:


6.手部关键点检测(推理代码)

手部关键点检测推理代码下载地址:Pytorch实现手部关键点检测(手部姿势估计)-推理代码

手部关键点检测推理代码内容包含:

(1)手部关键点检测推理代码(Pytorch)

  1. 提供YOLOv5手部检测推理代码(不包含训练代码)
  2. 提供手部关键点检测推理代码demo.py(不包含训练代码)
  3. 提供高精度版本HRNet手部关键点检测(不包含训练代码)
  4. 提供轻量化模型LiteHRNet,以及Mobilenet-v2手部关键点检测(不包含训练代码)
  5. 提供训练好的模型:HRNet-w32,LiteHRNet和Mobilenet-v2模型,配置好环境,可直接运行demo.py
  6. 推理代码demo.py支持图片,视频和摄像头测试

如果你需要配套的训练数据集和训练代码,请查看下面部分


7.手部关键点检测(训练代码)

手部关键点检测训练代码下载地址: Pytorch实现手部关键点检测(手部姿势估计)》 含训练代码和数据集

手部关键点检测训练代码内容包含:手部检测数据集和手部关键点数据集 + 手部关键点检测训练和测试代码

(1)手部检测数据集和手部关键点数据集:

  1. 手部检测数据集:包含Hand-voc1,Hand-voc2和Hand-voc3,总共60000+张图片;标注格式统一转换为VOC数据格式,标注名称为hand,可用于深度学习手部目标检测模型算法开发。

  2. 手部关键点数据集:包含HandPose-v1,HandPose-v2和HandPose-v3,总共80000+张图片;标注了手部区域目标框box,标注名称为hand,同时也标注了手部21个关键点,标注格式统一转换为COCO数据格式,可直接用于深度学习手部关键点检测模型训练。

  3. 数据集详细说明,请查看《手部关键点(手部姿势估计)数据集(含下载链接)》https://blog.csdn.net/guyuealian/article/details/133277630

(2)手部关键点检测训练代码和测试代码(Pytorch)

  1. 提供YOLOv5手部检测推理代码(不包含训练代码)
  2. 提供整套完整的手部关键点检测项目工程代码,包含手部关键点检测的训练代码train.py和推理测试代码demo.py
  3. 提供高精度版本HRNet手部关键点检测训练和测试
  4. 提供轻量化模型LiteHRNet,以及Mobilenet-v2手部关键点检测训练和测试
  5. 根据本篇博文说明,简单配置即可开始训练:train.py
  6. 提供训练好的模型:HRNet-w32,LiteHRNet和Mobilenet-v2模型,配置好环境,可直接运行demo.py
  7. 测试代码demo.py支持图片,视频和摄像头测试

8.手部关键点检测C++/Android版本

Android手部关键点检测(手部姿势估计) APP Demo体验:https://download.csdn.net/download/guyuealian/88418582

相关推荐
一尘之中2 小时前
使用 PyTorch TunableOp 加速 ROCm 上的模型
人工智能·pytorch·学习
tianyunlinger4 小时前
rope编码代码分享
pytorch·python·深度学习
qq_2739002315 小时前
pytorch torch.Tensor.item() 方法介绍
人工智能·pytorch·python·深度学习
pumpkin8451417 小时前
Ray 和 PyTorch
人工智能·pytorch·python
狗窝超厉害20 小时前
研0找实习【学nlp】15---我的后续,总结(暂时性完结)
人工智能·pytorch·python·自然语言处理·bert
孤单网愈云20 小时前
11.22Pytorch_自动微分
人工智能·pytorch·python
zhangfeng113321 小时前
连续变量的 交叉熵 如何计算 python tensorflow
开发语言·pytorch·matlab·batch
孤单网愈云2 天前
如何理解tensor中张量的维度
pytorch·python·深度学习
爱喝热水的呀哈喽2 天前
pde_accuracy阅读【1】
人工智能·pytorch·深度学习
起名字真南2 天前
丹摩 | 基于PyTorch的CIFAR-10图像分类实现
人工智能·pytorch·分类