二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货
作者|李秋键
出品|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] + xpos_y = offset3D[24 * 28 + j * 28 + x, y, z] + ypos_z = offset3D[24 * 28 * 2 + j * 28 + x, y, z] + zkps[j, 0] = pos_xkps[j, 1] = pos_ykps[j, 2] = pos_zelse: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 代码生成神器竟成“抄袭工具”?
相关文章:

python学习------tab补全
python学习------tab补全 python也可以进行tab键补全 123456789101112131415161718#!/usr/bin/env python# -*- coding: utf-8 -*-# python startup fileimport sys import readline import rlcompleter import atexit import os # tab completionreadline.parse_and_bind(tab:…

asp.net的Ajax学习进阶
asp.net的Ajax学习进阶 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.3 1.什么是Ajax? 2006年忽如一夜春风来,众多涉及到Web开发的站点都在谈Ajax,那么到底什么是Ajax呢?…

Windows下FFmpeg高速入门
本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视频文件转换成FLV整理 java 视频处理 mencoder java 视频处理 ffmpedmencoder Windows下FFmpeg高速入…

“香山”处理器产生背后的逻辑
作者 | 老石谈芯的老石来源 | 老石谈芯在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能RISC-V处理器。前不久我有幸和包老师就这个事情做了一次深度的交流,我们聊了关于RISC-V、还有“香山”处理器的前…

第79天:jQuery事件总结(二)
上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件、事件冒泡和事件移除等内容。 一、合成事件 jQuery有两个合成事件——hover()方法和toggle()方法,同ready()方法一样,这…

asp.net利用RAR实现文件压缩解压缩【月儿原创】
asp.net利用RAR实现文件压缩解压缩 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.13 如果服务器上安装了RAR程序,那么asp.net可以调用RAR实现文件压缩与解压缩。 不过要注意的是,由…

缺少HTML Doctype造成的样式问题
很简单的一个登陆界面: 代码: <html> <head><style type"text/css">form span {display: block;font-size: 1em;color: #787878;padding-bottom: 5px;font-weight: 600;font-family: Open Sans, sans-serif; }body{background-color: #…

快收藏!整理了 100 个 Python 小技巧
作者:小F来源: 法纳斯特目前Python可以说是非常流行,在目前的编程语言中,Python的抽象程度是最高的,是最接近自然语言的,很容易上手。你可以用它来完成很多任务,比如数据科学、机器学习、Web开发…

--single-transaction 参数对应MyISAM引擎和InnoDB引擎
结论:使用--single-transaction 备份含有MyISAM的表不会获得一致性备份,所有的innodb表可以获得事务开始时的一致性快照,但是MyISAM表获取的是备份该表时的最新快照, 测试库:test,包含表t1,t2,t3,t4,t5,t6 …

C#优化字符串操作【月儿原创】
C#优化字符串操作 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.17 开发中可以说几乎随时会涉及到字符串处理,本人觉得很有必要把平时遇到的问题和大家一起讨论,如果大家有好的见解和…

构筑超异构计算时代,英特尔 AI 全布局
作者 | 伍杏玲出品 | AI 科技大本营(ID:rgznai100)我们正值数据井喷时代,据 IDC 发布《数据时代 2025》报告显示,全球每年产生的数据将从 2018 年的 33ZB 增长到 2025 年的 175ZB。其中大部分为非结构化数据,对数据实时…

[软件推荐]电子日记本EDiary,记下您 的每一天
推荐一款电子日记本EDiary,可以记下每天的工作与生活,可支持附件上传,使用方便简单,我从08年开始使用至今,感觉非常不错,也介绍给同事朋友使用,现给大家分享一下。可以到这里下载:ht…

C#的6种常用集合类大比拼【月儿原创】
C#的6种常用集合类大比拼 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.27 说明:MSDN没有说出几种集合类其间的区别,当然欲知更多细节可参考MSDN。 一.先来说说数组的不足…

“35岁才是一个程序员成熟的开始!”
作者 | 王晓波,同程旅行机票事业群CTO【写在前面】不知道从什么时候开始,身边的“小朋友”们都开始为一件事感到焦虑,那就是:“到了35岁我还能找到一份编程的工作吗?”。坦白讲,我年轻的时候也有过迷茫的时…

centos安装easy_instal
easy_install与yum类似,使用easy_install,可以轻松在pypi软件库里面搜索python各类软件安装easy_install比较简单,如果配置好yum,就可以直接搜索python-setuptoolsyum –y install python-setuptools安装完python-setuptools之后&…

如何用xmanager远程连接centos6.0的桌面
在centos6.0系统上设置 修改custom.conf文件 vim /etc/gdm/custom.conf 在[security]下面添加 AllowRemoteRoottrue 在[xdmcp]下面添加 Port177 Enable1 修改完后效果如下: [daemon] [security] AllowRemoteRoottrue [xdmcp] Port177 Enable1 [greeter] [chooser] […

ASP.NET 3.5 企业级开发
议题 .NET Framework 3.5 和Visual Studio 2008 C# 面向对象程序设计 ASP.NET 状态管理和页面传值 ASP.NET 中的错误处理 ADO.NET与数据访问 架构与模式 安全与性能 优秀的团队开发管理功能C# 面向对象程序设计封装继承性多态性抽象类接口装箱和拆箱泛型ASP.NET 状态管理…

DEV报表之条形码
今天无意间发现DEV的报表居然自带条形码生成控件,正好要用到,省的自己手动生成图片了。前提:一张做好的报表Dev报表基础教程首先拖出XRBarCode控件,放到表头的空白位置,摆好高度宽度。选择Symbology,设置你…

Copilot 真会砸了程序员的饭碗?
作者 | 马超 责编 | 孙胜出品 | CSDN(ID:CSDNnews)最近OpenAI与GitHub联合构建的AI自动编程工具Copilot正式登场!Copilot基于自然语言处理模型GPT-3搭建而成,可在程序员编写代码时提供建议,甚至直接补…

提升城镇化质量 有利于激活智慧城市潜能
国家发展改革委副主任胡祖才指出,智慧城市建设是中国新型城镇化的重要内容,也是推进我国新型城镇化建设的一项长期的任务。如何通过智慧城市建设,促进城市发展模式向资源节约型、环境友好型转变,城市管理由粗放型、经济型向精专化…

变量的属性(全局变量、局部变量、动态变量、静态变量等)
变量的属性 1、变量的分类 l 根据作用域:可分为全局变量和局部变量。 l 根据生存周期:可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的(static)、寄…

Science论文:诺奖经济学家的经典决策模型,被AI挑战
在2019年DOTA2的顶级赛事TI8的正赛完成之后,OpenAI的人工智能战队与TI8的冠军OG举行了一场表演赛,在英雄阵容限定17个,部分道具和功能禁用的前提下,OpenAI以2:0完胜了OG,尤其值得一提的是第二场比赛仅用时1…

Canny算法源码,欢迎交流
http://blog.csdn.net/jianxiong8814/article/details/1563109 http://blog.csdn.net/assuper/article/details/6937130 存在的bug 在dsp http://bbs.csdn.net/topics/390445572

Provisioning Services 7.8 入门系列教程之十三 使用 Boot Device Management(BDM)
续Provisioning Services 7.8 入门系列教程之十二 实现高可用性 可以使用 Boot Device Management 实用程序将 IP 和引导信息(引导设备)交付给目标设备,此方法可以取代传统的 DHCP、PXE 和 TFTP 方法。 如果使用此方法,当目标设备…

Memcached深度分析
Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载, 提升性能。关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析…

【分享】 IT囧事
导读:企业的业务发展离不开信息化建设,信息系统的稳定运行更离不开IT运维的支持,许多生命期短暂或者使用效果不太好的IT系统,都是因为后期的维护和支持不到位,才导致前期投入的资金和人力付之东流,让人扼腕…

为什么掌握Linux对程序员这么重要……
人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个软件工程师岗位,都要求掌握Linux。可以说,打开 Linux 操作系统这扇门,你才是合格的软件工程师。如果不能熟练地操作 Linux,你基本上等于少…
Java并发编程有多难?这几个核心技术你掌握了吗?
本文主要内容索引 1、Java线程 2、线程模型 3、Java线程池 4、Future(各种Future) 5、Fork/Join框架 6、volatile 7、CAS(原子操作) 8、AQS(并发同步框架) 9、synchronized(同步锁) 10、并发队列࿰…

这届 AI 预测欧洲杯冠军,通通被打脸
持续了一个月的欧洲杯,终于落下帷幕。北京时间 7 月 12 日(周一)凌晨,本届欧洲杯决赛中,意大利对阵英格兰。两队在 120 分钟时间里 1-1 战平,意大利在欧洲杯中通过点球大战以 3:2击败英格兰夺冠。意大利上次…

资源的正确引用
对资源的引用应该发生在对资源的保护期间。 比如在所保护内hold住资源、local_bh_disable内hold住资源; 否则对资源的使用可能发生不一致的情况。 PS: 代码逻辑应该符合真实世界的合理逻辑。转载于:https://www.cnblogs.com/kernel521/p/4045976.html