二维已经 OUT 了?3DPose 实现三维人体姿态识别真香

2023-11-01

作者|李秋键

出品|AI科技大本营(ID:rgznai100)

引言

人体姿态估计是计算机视觉领域很多研究工作的基础,也是研究的热点问题,在行为识别、人机交互、姿态跟踪等领域有着广泛的应用前景。

按照人体姿态维度的差异,可以将人体姿态估计任务分为二维人体姿态估计和三维人体姿态估计。2D人体姿态估计的目标是定位并识别出人体关键点,将这些关键点按照关节顺序相连形成在图像二维平面的投影,从而得到人体骨架。3D人体姿态估计的主要任务是预测出人体关节点的三维坐标位置和角度等信息。

在实际应用中,由于3D姿态估计在2D姿态估计的基础上加入了深度信息,其对于人体姿态的表述比2D更为精准,因此其应用范围和研究价值都要高于2D人体姿态估计,但是3D姿态估计的难度也更高,存在着遮挡,单视角2D到3D的映射中固有的深度模糊性、不适定性,缺少大型的室外数据集等挑战。

本项目通过使用3DPose模型实现对人体的三维实时姿态识别。其最终实现的效果如下图可见:

1、基本介绍

在深度学习方法得到广泛应用之前,3D人体姿态标注数据集和具有高运算能力的GPU还没有普及,研究人员主要通过一些应用在传统计算机视觉或机器学习领域的方法来进行3D人体姿态的估计。传统三维人体姿态估计和基于深度学习的姿态估计之间最明显的特征在于是否使用了多层神经网络的学习方法,因为建模方式不同,在估计精确性、计算复杂度等方面也有着较大的差别。其中建模是三维人体姿态估计一个很重要的方面,目的是表示从输入数据中提取的关键点和特征。在解决实际问题时由于实验个体所处环境的复杂性,很大程度上增加了模型的建立难度,因此选取适当且有效的图像特征来简化模型建立过程十分重要。

1.1 环境要求:

本次环境使用的是python3.6.5+windows平台。

主要用的库有:ONNX Runtime库、opencv-python模块、Numpy模块。

ONNX Runtime库

ONNX Runtime库是一个用于ONNX(Open Neural Network Exchange)模型推理的引擎。微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准--ONNX,顺路提供了一个专门用于ONNX模型推理的引擎。

opencv-python模块

opencv-python是一个Python绑定库,旨在解决计算机视觉问题。其使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有Opencv数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如Scipy和Matplotlib)集成更容易。

Numpy模块

Numpy是应用Python进行科学计算时的基础模块。它是一个提供多维数组对象的Python库,除此之外,还包含了多种衍生的对象(比如掩码式数组(masked arrays)或矩阵)以及一系列的为快速计算数组而生的例程,包括数学运算,逻辑运算,形状操作,排序,选择,I/O,离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等。

1.2 方法总结:

传统方法很多是采用基于人体模型的方法来描述和推断人体姿态,通过算法提取图像姿态特征,因此对特征表示和关键点的空间位置关系这两个维度有比较高的要求,除去边界、颜色这类低层次特征,典型的有尺度不变特征变换、梯度直方图等表达能力更强、可有效压缩特征空间维度的高层次特征,它们虽然在时间效率方面具有优势,但依然存在着较大的不足。

而深度学习模型操作过程相对简单且对特征的表示能力强大,对输入信息自动进行特征提取而无需人为手动提取特征。

基于深度学习的人体姿态估计可以通过建立网络模型在图像数据上进行训练和学习,直接得到最有效的表征方法,其核心是深度神经网络,主要是利用卷积神经网络从图像中提取出比人工特征语义信息更丰富、准确性更高和更具鲁棒性的卷积特征,并且网络模型的表达能力会因网络堆叠数量的增加而呈指数增长,因此相较于传统方法可以进一步提升复杂环境下的人体姿态的精度和鲁棒性。深度学习在人体姿态估计任务中的应用已经取得了显著的进展,然而像遮挡、训练数据不足和深度模糊等挑战仍然是难以克服的。

2.三维人体可视化

传统方法与深度学习方法

其中3DPose算法提供的模型架构如下图可见:

2.1 图片预处理:

其中图片处理代码如下,分别为读取图片,显示图片,BGR转RGB以及尺寸变换等:

img=cv2.imread("1.jpg")
cv2.imshow("test", img)
cv2.waitKey(1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (448, 448))
img = img.astype(np.float32) / 255.0
img = img.transpose(2, 1, 0)
img = img[np.newaxis, ...]

2.2 模型训练:

首先通过使用onnxruntime,

然后读取Resnet34_inputs_448x448_20200609.0nnx模型文件,实时需要识别的图片数据,获取每一张图片的offset图和heatmap图。通过找到第j个关节的28个特征图,并找到最大值的索引来获取个点坐标。并把坐标按照一定比例缩放。使得图像变形较为符合人体规律。

for j in range(0, 24):
    # 找到第j个关节的28个特征图,并找到最大值的索引
    joint_heat = heatMap3D[j * 28:(j + 1) * 28, ...]
    if np.max(joint_heat)>0.1:
        print(np.max(joint_heat))
        [x, y, z] = np.where(joint_heat == np.max(joint_heat))
        x = int(x[-1])
        y = int(y[-1])
        z = int(z[-1])
        # 通过heatmap的索引找到对应的offset图,并计算3D坐标的xyz值
        pos_x = offset3D[j * 28 + x, y, z] + x
        pos_y = offset3D[24 * 28 + j * 28 + x, y, z] + y
        pos_z = offset3D[24 * 28 * 2 + j * 28 + x, y, z] + z

        kps[j, 0] = pos_x
        kps[j, 1] = pos_y
        kps[j, 2] = pos_z
    else:
        try:
            kps[j, 0] = kps[j-1, 0]
            kps[j, 0] = kps[j-1, 0]
            kps[j, 2] = kps[j-1, 2]
        except:
            pass

parent = np.array([15, 1, 2, 3, 3, 15, 6, 7, 8, 8, 12, 15, 14, 15, 24, 24, 16, 17, 18, 24, 20, 21,   22, 0]) - 1;
    for i in range(len(kps)):
        if (parent[i] != -1):
            ax.plot3D(kps[[i, parent[i]], 0], -kps[[i, parent[i]], 1], -kps[[i, parent[i]], 2], 'gray')

完整代码:

链接:https://pan.baidu.com/s/1pb0uG9Uy36sOBuWNTsZUpA

提取码:0ahr

作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

在评论区留言你的看法

AI科技大本营将选出三名优质留言

携手【北京大学出版社】送出

《人工智能数学基础》一本

截至7月19日14:00点

更多精彩推荐
深度学习三巨头共同发文,聊聊深度学习的过去、现在与未来

基于 Python 的 8 种常用抽样方法

GitHub 遭抵制!AI 代码生成神器竟成“抄袭工具”?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 的相关文章

  • 使用请求验证 SSL 证书

    我正在尝试验证 SSL 但它不起作用 我在浏览器上访问了我想要访问的机密网站 在 Chrome 上 我单击了储物柜 gt 证书 gt 详细信息 gt 复制到文件 gt base64 gt cert cer 我的代码是 test reques
  • 在 Pandas 中按日期获取有效合约

    我在检测 pandas DataFrame 中的活动合约方面遇到了一些困难 假设每一行都是一个协商 对于每一行 我有两列 initial date 和 end date 我想知道的是按日期划分的活跃合约数量 到目前为止我做了一个非常低效的方
  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • Python - 用逗号分割,跳过括号内的内容

    我需要用逗号分隔字符串 但我对这种情况有一个问题 TEXT EXAMPLE THIS IS A EXAMPLE BUT NOT WORKS FOR ME SECOND THIRD 我想拆分并得到 var 0 TEXT EXAMPLE THI
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 为什么 Python 中的“pip install”会引发语法错误?

    我正在尝试使用 pip 安装软件包 我试着跑pip install从Python shell 但我得到了SyntaxError 为什么我会收到此错误 如何使用 pip 安装软件包 gt gt gt pip install selenium
  • 如果字段值在外部列表中,Django 会注释布尔值

    想象一下我有这个 Django 模型 class Letter models Model name models CharField max length 1 unique True 还有这个列表 vowels a e i o u 我想查询
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • 如何在python中检索aws批处理参数值?

    流程 Dynamo DB gt Lambda gt 批处理 如果将角色 arn 插入动态数据库 它是从 lambda 事件中检索的 然后使用submit job角色 arn 的 API 被传递为 parameters role arn ar
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 为什么我用 beautifulSoup 刮的时候有桌子,但没有 pandas

    尝试抓取条目页面转换为制表符分隔格式 主要拉出序列和 UniProt 登录号 当我跑步时 url www signalpeptide de index php sess m listspdb bacteria s details id 10
  • 如何列出 python PDB 中的当前行?

    在 perl 调试器中 如果重复列出离开当前行的代码段 可以通过输入命令返回到当前行 点 我无法使用 python PDB 模块找到任何类似的东西 如果我list如果我自己离开当前行并想再次查看它 似乎我必须记住当前正在执行的行号 对我来说
  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • 张量流:注册 numpy bfloat16 扩展

    正如我所见 tensorflow 中有 bfloat16 的 numpy 扩展 https github com tensorflow tensorflow blob 24ffe9f729160a095a5cab8f592392018280
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如

随机推荐

  • 基类(父类)private 定义的变量,子类可以使用吗

    基类 父类 private 定义的变量 子类是可以使用的 private变量是传给子类了的但是不可以直接使用 需要我们去用基类里面的函数去初始化或修改继承给子类的private变量 就这样就可以调用private变量了
  • 【camera】【ISP】Lens Shading Correction镜头阴影校正

    ISP LSC 镜头阴影校正 参考 https zhuanlan zhihu com p 389334269 https blog csdn net xiaoyouck article details 77206505 https www
  • MariaDB在Linux环境下的安装及使用

    本操作适合Debain ubuntu和deepin等 此处安装的环境为deepin V23 一 查看是否已安装MariaDB mysql V 二 安装命令 sudo apt get install mariadb server 三 修改配置
  • 第一课:LabView2015中文版安装教程

    1 下载解压缩 双击文件 2015LV WinChn exe 将 点击unzip解压 解压路径为默认为 C National Instruments Downloads LabVIEW Chinese 2015 2 软件成功解压后 自动弹出
  • 了解开发手机的各项参数之显示屏

    现在android手机越来越便宜了 所以开发的话用的最多的还是真机 作为一个程序员 如果拿着手机却在百度找手机的参数 这可不太好 所以 让我们从程序员的角度来了解一下手机显示屏的参数 public class MainActivity ex
  • 云服务器物理机配置,物理机服务器怎么配置

    物理机服务器怎么配置 内容精选 换一换 对于不同的硬件设备 通过在BIOS中设置一些高级选项 可以有效提升服务器性能 服务器上的SMMU一般用来完成设备的地址转换 并且可以实现设备隔离 在虚拟化中很实用 但是在物理机测试场景下 SMMU可能
  • 关于部署vue项目在Linux上的两种方式tomcat以及nignx(3)使用nignx进行部署

    阿丹有话说 前两篇文章主要讲解了将vue中tomcat部署研究了 解决了在后台代码中通过过滤器来解决跨域问题 后期会继续出在tomcat中的代理配置等 本篇文章来将vue项目部署在nignx上 并且通过反向代理来解决跨域请求以及请求转发 使
  • Qt自绘圆盘图控件

    本人使用QPainter自绘了一个圆盘图 下面这张图片为效果图 图片中的所有 圆 刻度线 字体 均为自绘 没有使用图片 使用方法 在Ui中拖拽一个widget控件 然后右键点击该widget控件 选择提升 话不多说 直接上代码 头文件qdi
  • 数字图像处理-基于Matlab水果识别系统(图片识别)

    文件大小 25M 代码行数 315行 主程序 开发环境 Matlab2016a 下载地址 该源码均通过亲自测试可正常运行 简要概述 图像识别主要是研究用计算机代替人去处理大量的物理信息 从而帮助人们建华劳动 机械分类耗时段的特点很符合水果的
  • 【译】用 Rust 实现 csv 解析-part1

    Rust and CSV parsing 译文 用 Rust 实现 csv 解析 part1 原文链接 https blog burntsushi net csv 原文作者 BurntSushi 译文来自 https github com
  • OSPF实验及配置---超详细

    什么是OSPF 开放式最短路径优先OSPF Open Shortest Path First 是IETF组织开发的一个基于链路状态的内部网关协议 Interior Gateway Protocol 目前针对IPv4协议使用的是OSPF Ve
  • 【改进算法】混合鲸鱼WOA和BAT算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献 1 概述 文献来源 鲸鱼优化算法 whale op
  • 接口测试开发之:Python3,订单并发性能实战

    小屌丝 鱼哥 我想写一个接口订单并发性能 能不能给我讲一下 小鱼 接口订单并发 我前篇文章不是写过常见并发框架 然后你在追加一个创建订单和生成订单不就可以了 小屌丝 鱼哥 你说的可轻松 那你能不能来一个 小鱼 好吧 那我就以我某个项目为例
  • open cvBrisk特征检测与匹配

    什么是BRISK算法 BRISK算法是2011年ICCV上 BRISK Binary Robust Invariant Scalable Keypoints 文章中 提出来的一种特征提取算法 也是一种二进制的特征描述算子 它具有较好的旋转不
  • CentOS 7下安装pptp服务

    一 检查是否支持PPTP 1 在安装之前查看系统是否支持PPTP modprobe ppp compress 18 echo success 应该输出 success 2 是否开启TUN TAP cat dev net tun 应该输出 c
  • Js中读取、移除属性及隐藏组件方法研究

    添加 移除组件属性方法 class名 attr 属性名 属性值 设置指定属性 class名 attr 属性名 读取指定属性值 or document getElementById id值 getAttribute 属性名 class名 re
  • 迪杰斯特拉算法+链式前向星+堆优化

    目录 一 基础 二 使用链式前向星 每次遍历的第一次优化 前向星 链式前向星 1 结构 2 存储边 3 遍历 第一次优化代码 三 堆优化 主要思想 数据类型 四 完整代码 一 基础 直接用邻接矩阵 每次遍历查找来进行操作 void dijk
  • Exchange Online Kiosk产品详细介绍

    目录 前言 电子邮件功能 日历和会议功能 联系人和任务管理功能 移动设备支持
  • pythonz字符串去重并排序

    项目场景 python练习题 问题描述 输入一个非空字符串 去除重复的字符后 从小到大排序输出为一个新字符串 原因分析 去重可以运用python中set数据类型的特性 然后将去重的set转为列表 再调用sort 函数进行排序即可 解决方案
  • 二维已经 OUT 了?3DPose 实现三维人体姿态识别真香

    作者 李秋键 出品 AI科技大本营 ID rgznai100 引言 人体姿态估计是计算机视觉领域很多研究工作的基础 也是研究的热点问题 在行为识别 人机交互 姿态跟踪等领域有着广泛的应用前景 按照人体姿态维度的差异 可以将人体姿态估计任务分