Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 三维姿态估计+Unity3d 实现 3D 虚拟现实交互游戏

Python 三维姿态估计+Unity3d 实现 3D 虚拟现实交互游戏

作者头像
AI科技大本营
发布于 2023-04-14 04:44:26
发布于 2023-04-14 04:44:26
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

作者 | 李秋键

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

引言

随着人机交互技术飞速发展,人体姿态估计技术越来越受到重视。姿态估计作为人体行为识别的重要组成部分,近年来逐渐成为计算机视觉领域的一个重要的研究热点。由于人体结构和姿态的复杂性以及视觉理论的局限性,最初人体姿态估计算法仅从图像或者视频当中预测人体二维骨架节点的坐标位置。2015年马普所提出了由姿态与体型参数驱动的蒙皮多人线性模型,由于该模型具有出色的建模效果与快速的计算效率,许多团队提出了利用该模型进行人体姿态估计的方法。目前基于人体形变模型的姿态估计方法可以根据两个标准进行分类:一类是基于优化的方法,另一类是基于回归的方法。而最终发展到现在三维人体姿态估计也随之发展越来越成熟。

今天我们就将使用Python+Unity3d实现一个基于ThreeDPoseUnityBarracuda(Digital-  Standard Co., Ltd.)的3D虚拟现实交互游戏。这里通过Unity3d结合python三维姿态估计模型,实时获取人体三维坐标,然后将坐标与人体模型骨骼绑定从而达到控制3D角色的目的。在这步基础上加入3D模型,设置基本的触碰逻辑即可达成我们设置的简单游戏的目的。这里使用到的模型可以通过3Dmax和Blender进行绘制,最终的演示效果如下:

三维姿态控制介绍

在三维姿态估计的基础上,使用unity对实时获取的三维骨骼坐标和角色骨骼绑定,控制角色动画,达到交互的效果。

1.1  三维姿态估计介绍

人体姿态估计的主要任务是预测出人体关节点的三维坐标位置和角度等信息。由于人体姿态标记数据集的缺乏,使得大多数研究方法都基于2D人体姿态估计方法之上,因此2D人体姿态估计研究的发展也为3D人体姿态估计奠定了基础,使得3D人体姿态估计研究有着巨大的潜力。

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

在目前的研究中,三维人体姿态估计方法可以划分为传统方法和深度学习方法两类。在深度学习方法得到广泛应用之前,3D人体姿态标注数据集和具有高运算能力的GPU还没有普及,研究人员主要通过一些应用在传统计算机视觉或机器学习领域的方法来进行3D人体姿态的估计。传统三维人体姿态估计和基于深度学习的姿态估计之间最明显的特征在于是否使用了多层神经网络的学习方法,因为建模方式不同,在估计精确性、计算复杂度等方面也有着较大的差别。其中建模是三维人体姿态估计一个很重要的方面,目的是表示从输入数据中提取的关键点和特征。在解决实际问题时由于实验个体所处环境的复杂性,很大程度上增加了模型的建立难度,因此选取适当且有效的图像特征来简化模型建立过程十分重要。传统方法很多是采用基于人体模型的方法来描述和推断人体姿态,通过算法提取图像姿态特征,因此对特征表示和关键点的空间位置关系这两个维度有比较高的要求,除去边界、颜色这类低层次特征,典型的有尺度不变特征变换、梯度直方图等表达能力更强、可有效压缩特征空间维度的高层次特征,它们虽然在时间效率方面具有优势,但依然是由人工设计的传统特征,存在着较大的不足。

1.2  ThreeDPoseUnityBarracuda介绍

ThreeDPoseUnityBarracuda通过读取Barracuda的onnx三维姿态估计模型,可以在Unity上做三维姿态估计。

程序设计

这里三维姿态估计使用Resnet34_3inputs_448x448_20200609.onnx模型,unity3D是对onnx模型的调用,同时搭建三维场景和设计逻辑规则。

2.1 三维姿态估计模型解析

这里需要使用的三维姿态估计在之前文章“3DPose实现三维人体姿态识别”有所介绍,不进行太多描述。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:                passparent = 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')

2.2 unity3D程序设计

Unity3D这里主要使用到了三维场景搭建和CS脚本制定逻辑,这里场景搭建,在搭建好模型后手动规划即可。主要介绍程序部分。

1、读取模型,按照下图配置即可:

2、随机从天空掉落物体CS脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Randomoccurs : MonoBehaviour{    //随机产生的物体    private static GameObject sphere;    private static GameObject cube;    private static GameObject cylinder;    private static GameObject capsule;    public GameObject[] gameobject =    {        sphere,        cube,        cylinder,        capsule};    //想要产生几波    public int waves;    //每波产生的数量    public int values;    //产生之后延迟时间    public float spawnwait ;    // Use this for initialization    void Start()    {        StartCoroutine(test01());    }    void Update()    {    }    // Update is called once per frame    IEnumerator test01()    {        for (int j = 0; j < waves; j++)        {            for (int i = 0; i < values; i++)            {                Instantiate(gameobject[Random.Range(0, 4)], transform.position, transform.rotation);            }            yield return new WaitForSeconds(spawnwait);        }    }}3、制定触碰规则,碰到门,门对应ID设置为销毁,碰到掉落物体,分数加分:using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class hit_obj : MonoBehaviour{    // Start is called before the first frame update    static public int score = 0;    void Start()    {    }    // Update is called once per frame    void Update()    {    }    // 碰撞开始    void OnTriggerEnter(Collider collider)    {        var tag = collider.tag;        if (collider.tag == "body_center")        {            score += 1;            GameObject.Destroy(gameObject);            //GameObject.Destroy(gameObject, 2.0f);//摧毁自身        }        Debug.Log(score);        GameObject.Find("Canvas/Score").GetComponent<Text>().text = "得分:"+score.ToString();        if (collider.tag == "ground")        {            //Debug.Log("销毁" + gameObject.tag);            GameObject.Destroy(gameObject);        }    }    // 碰撞结束    void OnTriggerStay(Collider collider)    {    }    // 碰撞持续中    void OnTriggerExit(Collider collider)    {    }}

完整代码:

链接:

https://pan.baidu.com/s/1hZ5f-4Vv12rpJXK5XL_t5A

提取码:7q6o

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

资讯

2021 PS 进入人工智能P图时代|赠书

调查

我们需要什么样的低代码平台?

资讯

Q版老黄带着硬核技术再次登场!

图像

深度学习视频理解之图像分类

分享

点收藏

点点赞

点在看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货
作者|李秋键 出品|AI科技大本营(ID:rgznai100) 引言 人体姿态估计是计算机视觉领域很多研究工作的基础,也是研究的热点问题,在行为识别、人机交互、姿态跟踪等领域有着广泛的应用前景。 按照人体姿态维度的差异,可以将人体姿态估计任务分为二维人体姿态估计和三维人体姿态估计。2D人体姿态估计的目标是定位并识别出人体关键点,将这些关键点按照关节顺序相连形成在图像二维平面的投影,从而得到人体骨架。3D人体姿态估计的主要任务是预测出人体关节点的三维坐标位置和角度等信息。 在实际应用中,由于3D姿态估计在2D
AI科技大本营
2023/05/08
1.5K0
二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货
Python 实现三维姿态估计遮挡匹配预测
引言:随着计算机技术的飞速发展以及人们对智能化设备需求的提高,人体行为识别已经成为计算机视觉领域热门研究方向之一,其广泛应用于公共安防、人机交互、虚拟现实、体育运动和医疗健康等领域,具有极高的理论研究价值。早期的方法主要针对于 RGB 视频图像,由于易受复杂背景、光照强度的影响,很难达到理想效果。但随着深度传感器技术的发展,高精度获取三维骨架关节点信息变得方便可行。对比传统 RGB 视频图像数据,骨架姿势信息对行为的描述有其内在优势,它不仅能够更准确地描述人体姿态和运动状态而且不受背景复杂度及光照强度等因素的影响,同时骨架信息也可以被广泛应用于行为识别。
AI科技大本营
2022/05/19
7900
Python 实现三维姿态估计遮挡匹配预测
3D人体姿态估计
Coarse-to-Fine Volumetric Prediction for Single-Image 3D Human Pose
用户1148525
2019/05/26
2K0
Unity3D游戏开发初探—2.初步了解3D模型基础
  简而言之,3D模型就是三维的、立体的模型,D是英文Dimensions的缩写。
Edison Zhou
2018/08/20
1.8K0
Unity3D游戏开发初探—2.初步了解3D模型基础
Unity3D制作3维立体小游戏
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化的多平台综合游戏开发工具,是一个全面整合的专业的游戏引擎,Unity类似Director,Blender game engine,Virtools或Torque Game Builder等利用交互的图形化开发环境为首要方式的软件。下面通过Unity做这2件事:
全栈程序员站长
2022/08/24
8210
Unity3D制作3维立体小游戏
unity3d的入门教程_3D网课
一、Unity下载与安装 参考博客:Unity Hub、unity、PlasticSCM安装
全栈程序员站长
2022/09/22
4.3K0
unity3d自学教程_3D技巧
Unity3D软件是由Unity Technologies公司提供的综合开发环境,主要面向游戏开发人员、虚拟现实设计师等,可用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型的多媒体内容,并支持这些内容在Windows、iOS、Android等多种平台的发布,功能非常强大。
全栈程序员站长
2022/09/22
3.6K0
unity3d自学教程_3D技巧
3D 人体姿态估计简述
3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置。3D HPE 的应用非常广泛,包括人机交互、运动分析、康复训练等,它也可以为其他计算机视觉任务(例如行为识别)提供 skeleton 等方面的信息。关于人体的表示一般有两种方式:第一种以骨架的形式表示人体姿态,由一系列的人体关键点和关键点之间的连线构成;另一种是参数化的人体模型(如 SMPL [2]),以 mesh 形式表示人体姿态和体型。
OpenMMLab 官方账号
2022/02/15
3.4K0
3D 人体姿态估计简述
unity3d之核心类介绍
Unity3D的最基本的核心类型。包括Object、GameObject、Component、Transform、Behaviour、Renderer、Collider、Rigidbody、Camera、Light、MonoBehaviour等。
李小白是一只喵
2020/11/12
1.2K0
Unity3D OpenVR 虚拟现实 保龄球打砖块游戏开发
据说水哥买了 Valve Index 设备,既然这个设备这么贵,不开发点有(zhi)趣(zhang)游戏就感觉对不起这个设备。本文将来开始着手开发一个可玩性不大,观赏性极强的保龄球打砖块游戏。这仅仅只是一个入门级的游戏,代码量和制作步骤都超级少,适合入门
林德熙
2021/05/18
1.5K0
Unity3D OpenVR 虚拟现实 保龄球打砖块游戏开发
【学习笔记】Unity3D官方游戏教程:Survival Shooter tutorial
2017-06-25 by Liuqingwen | Tags: Unity3D | Hits
IT自学不成才
2019/01/08
2.9K0
Unity 3D初学入门教程,7天玩转游戏开发VR虚拟现实1
本套游戏开发教程是基于C#语言进行开发的。没有C#基础的同仁可以查看我写的C#的教程。关注做全栈攻城狮公众号,回复“.net目录”就能获取全套教程目录。
做全栈攻城狮
2018/12/20
1.3K0
DOPE:基于蒸馏网络的全身三维姿态估计
本论文提出一种检测和估计全身三维人体姿态的方法(身体,手,人脸),该方法的挑战主要在于带标签的3D全身姿态。大多数之前的工作将标注好的数据单独应用于身体,人手,或者人脸当中。在这项工作中,本文提出利用这些数据集来训练各个部分的独立专家模型,即身体、手和脸的模型,并将他们的知识提取到一个单一的深度网络中,用于全身的2D-3D位姿检测。在实际应用中,针对一幅有部分标注或没有标注的训练图像,各部分专家模型分别对其二维和三维关键点子集进行检测,并将估计结果结合起来得到全身伪真实标注姿态。蒸馏损失引导整个身体的预测结果尽量模仿专家模型的输出。
AIWalker
2020/12/03
9490
DOPE:基于蒸馏网络的全身三维姿态估计
用于单目3D人体姿态估计的局部连接网络,克服图卷积网络限制
本文是被人工智能领域的顶级期刊 IEEE Transactions on Pattern Analysis and Machine Intelligence(TPAMI)于2020年8月接收的论文《用于单目3D人体姿态估计的局部连接网络(Locally Connected Network for Monocular 3D Human Pose Estimation)》的解读。
AI科技评论
2020/10/27
1K0
用于单目3D人体姿态估计的局部连接网络,克服图卷积网络限制
日本中二少年教你用姿势估计把自己变成3D人物,动作实时同步,iOS上也能实现
不知道从什么时候开始,3D动画就热起来了,但是很多经典动画3D化后就变味了,人物的肢体动作看上去僵硬了不少。并且,传统3D靠一帧一帧制作,费时费力。
大数据文摘
2019/11/13
1.3K0
日本中二少年教你用姿势估计把自己变成3D人物,动作实时同步,iOS上也能实现
从零开始制作Roll-a-ball tutoria滚动的小游戏(Unity3D)
&emsp; 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧。
恬静的小魔龙
2022/08/07
1.7K0
从零开始制作Roll-a-ball tutoria滚动的小游戏(Unity3D)
Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏
  (1)如何在游戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePrimitive()
Edison Zhou
2018/08/20
1.7K0
Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏
理解Unity3D中的四种坐标体系
2017-07-31 by Liuqingwen | Tags: Unity3D | Hits
IT自学不成才
2019/01/08
5.8K0
使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现。原本在C#中很方便地就可以完成的一个小场景,使用Unity3D的设计思想(即一切游戏对象皆空对象,拖拽组件才使其具有了活力)来实现却需要花费大量时间与精力,究竟它神奇在什么地方?本文通过实现这个小例子来看看。
Edison Zhou
2018/08/20
1.8K0
使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
移动平台Unity3D 应用性能优化
作 者 陈星百,腾讯移动客户端开发 工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 WeTest 导读 做了大概半年多VR应用了,VR由于双眼double渲染的原因,对性能的优化要求比较高,在项目的进展过程中,总结了一些关于移动平台上Unity3D的性能优化经验,供分享。 一 移动平台硬件架构 移动平台无论是Android 还是 IOS 用的都是统一内存架构,GPU和CPU共享一个物理内存,通常我们有“显存”和“内存”两种叫法,可以认为是这块物理内存的所有者不同,当这段映射到cp
WeTest质量开放平台团队
2023/05/04
1K0
移动平台Unity3D 应用性能优化
推荐阅读
相关推荐
二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档