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

【论文复现】基于深度学习的手势识别算法

本文所涉及所有资源均在这里可获取。

在这里插入图片描述


📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。
📗本文收录于论文复现系列,大家有兴趣的可以看一看
📘相关专栏C语言初阶、C语言进阶系列、恒川的日常汇报系列等,大家有兴趣的可以看一看
📙Python零基础入门系列,Java入门篇系列、docker技术篇系列、Apollo的学习录系列正在发展中,喜欢Python、Java、docker的朋友们可以关注一下哦!

基于深度学习的手势识别算法

  • 概述
  • 算法原理
  • 核心逻辑
  • 效果演示
  • 使用方式
  • 参考文献

本文所涉及所有资源均在这里可获取。

概述

本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。

手部姿态估计是从图像或视频帧集中找到手部关节位置的任务。近年来,姿态估计取得了显著进展。同时,姿态估计相关算法和系统的复杂性也在增加,使得算法分析和比较变得更加困难。

在这里插入图片描述
对此,该论文[1]提供了简单且有效的基线方法。具体来说,该论文所提出的姿态估计方法基于在骨干网络 ResNet 上添加的几个反卷积层,以此从深层和低分辨率特征图估计热图(Heatmap)。

算法原理

ResNet [2] 是图像特征提取中最常见的骨干网络,也常常被用于姿态估计。本文所使用的模型在 ResNet 的最后一个卷积阶段上简单添加了几个反卷积层。基于这种方式,其可以利用深层和低分辨率的特征生成热图,并基于热图估计关节位置。整个网络结构如图 2 所示,其使用了三个具有批量归一化和 ReLU 激活的反卷积层。每层有256个 4×4 内核的滤波器,步幅为 2。最后添加一个 1×1 的卷积层,以生成所有 kk 个关键点的预测热图。
在这里插入图片描述

均方误差 (MSE) 被用作预测热图和目标热图之间的损失。关节 kk 的目标热图是通过在第 kk 个关节的真实位置上应用二维高斯分布生成的。训练过程中的损失变化如图3所示。我选取了 FreiHand[3] 作为数据集,ResNet-18 作为骨干网络进行训练。FreiHand 的训练集包含 130240 张尺寸为 224 × 224 的RGB图像。
在这里插入图片描述

将训练完成后的模型应用于FreiHAND测试集,得到结果如图4所示

核心逻辑

模型结构如下所示:

import torch
import torch.nn as nn
import torchvision.models as modelsclass PoseNetwork(nn.Module):def __init__(self, joints_num=21, depth=50, pretrained=False):super(PoseNetwork, self).__init__()if pretrained:weights = 'DEFAULT'else:weights = Noneif depth == 18:resnet = models.resnet18(weights = weights)elif depth == 34:resnet = models.resnet34(weights = weights)elif depth == 50:resnet = models.resnet50(weights = weights)elif depth == 101:resnet = models.resnet101(weights = weights)elif depth == 152:resnet = models.resnet152(weights = weights)else:resnet = models.resnet50()self.encoder = nn.Sequential(*list(resnet.children())[:-2])self.decoder = nn.Sequential(nn.ConvTranspose2d(resnet.inplanes, 256, kernel_size=4, stride=2, padding=1, output_padding=0, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.ConvTranspose2d(256, 256, kernel_size=4, stride=2, padding=1, output_padding=0, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.ConvTranspose2d(256, 256, kernel_size=4, stride=2, padding=1, output_padding=0, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Conv2d(256, joints_num, kernel_size=1, stride=1))def forward(self, x):x = self.encoder(x)x = self.decoder(x)return x

以上代码仅作展示,更详细的代码文件请参见附件。

效果演示

配置环境并运行 main.py脚本,效果如图4所示。
在这里插入图片描述
此外,网站还提供了在线体验功能。用户只需要输入一张大小不超过 1MB 的单手 JPG 图像,网站就会标记出图中手的姿势,如图6所示。
在这里插入图片描述

使用方式

解压附件压缩包并进入工作目录。如果是Linux系统,请使用如下命令:

unzip hand-pose-estimation.zip
cd hand-pose-estimation

代码的运行环境可通过如下命令进行配置:

pip install -r requirements.txt

如果希望在本地运行实时手势识别程序,请运行如下命令:

python main.py

如果希望在本地运行训练模型,请运行如下命令:

python main.py -r "train"

请注意,训练前需要自行制作或下载并处理相关公开数据集,具体格式可以参考我事先基于FreiHAND制作的一个迷你的样例数据集,其位于data\datasets\mini-example。
如果希望在线部署,请运行如下命令:

python main-flask.py

参考文献

[1] Xiao B, Wu H, Wei Y. Simple baselines for human pose estimation and tracking[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 466-481.

[2] Targ S, Almeida D, Lyman K. Resnet in resnet: Generalizing residual architectures[J]. arXiv preprint arXiv:1603.08029, 2016.

[3] Zimmermann C, Ceylan D, Yang J, et al. Freihand: A dataset for markerless capture of hand pose and shape from single rgb images[C]//Proceedings of the IEEE/CVF International Conference on Computer Vision. 2019: 813-822.

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方链接获取:https://www.aspiringcode.com/content。


  如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下,谢谢大家!!!
  制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。


http://www.mrgr.cn/news/68588.html

相关文章:

  • Redis 命令
  • C#的Event事件示例小白级剖析
  • MyBatis项目的创建和增删查改操作
  • Vue2中使用firefox的pdfjs进行文件文件流预览
  • Redis在docker中的主从,哨兵配置
  • vue3项目中如何进行基础化配置
  • 2024年了,还适合入行嵌入式吗?
  • jdk17启动项目报错
  • 安装指定版本的transfomers报错ERROR: Failed building wheel for tokenizers
  • 深究JS底层原理
  • np.clip函数
  • prompt资料收集
  • 《瀚文欣赏的唐诗集》
  • 【高等数学】微分学的应用
  • 挑选BPM软件秘籍,揭秘六大必备功能
  • Python练习12
  • ResNet18模型扑克牌图片预测
  • MySQL架构原理之存储引擎
  • 以梧桐数据库为例讲解如何计算用户连续登录比率
  • 头戴式耳机百元价位推荐?2024头戴式耳机性价比推荐
  • java中函数式接口
  • Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法
  • C++:( ͡• ͜ʖ ͡• )详解类型转换运算
  • 文件内的函数的定义和调用,函数内的函数定义和调用
  • 技术路线图用什么画?10个好用的模板盘点推荐!
  • 【通义灵码】AI编码新时代