从抖音视频提取游戏动作

2023-11-10 06:50

本文主要是介绍从抖音视频提取游戏动作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

姿态估计旨在 RGB 图片和 Video 中的人体像素映射到肢体的三维曲面(3D surface),其涉及了很多计算机视觉任务,如目标检测,姿态估计,分割,等等. 姿态估计的应用场景不仅包括关键点定位,如图形(Graphics),增强显示(Augmented Reality, AR),人机交互(Human-Computer Interaction,HCI),还包括 3D 目标识别的很多方面。

层出不穷的姿态检测深度网络模型,在最近两三年如雨后春笋般出现。今天我们选AlphaPose导出骨骼3D关键点位置,并在游戏引擎的去运行相关的模型。相关的代码都已提交到github, 我们提供算法解决视频2D到游戏3D骨骼的转换。算法不局限于抖音上的视频, 只是作者使用的视频都是从抖音上爬来的。

原博客地址

识别视频

首先将从抖音扒来的视频导入到模型,由AlphaPose生产识别后的运动姿势, 并使用Video3DPose中的方法渲染成视频, 如下:

在这里插入图片描述

使用工具将numpy格式的数据转换成二进制(bytes), 以供之后在unity里解析使用。我们输出的时候查看numpy对象shape是(x,17,3), 地一维x代表帧数, 第二维代表17个关节,第三维代表关键点(joint)的3d位置。

Unity 运行模型

将上一步Python环境里生成的关键点信息(二进制文件),导入到Unity里,使用IO接口解析出来,由于Video3DPose默认使用的[hunman3.6数据集]骨骼的标记是17个部位,这里我们创建了17个GameObject,代表17个关节节点, 并使用LineRender组件把相关的关节连接成线。在Mono的Update函数,我们更新导出模型的3d关键点位置信息,于是一个运动的骨骼人行动起来了。 关于[hunman3.6数据集]关节编号的详细介绍,见本文最后的附录。

在这里插入图片描述

代码如下, 在Update中插值更新17组关节的位置,pose_joint数组的顺序对应到hunman3.6数据集关节编号。

protected override void LerpUpdate(float lerp)
{Hip.position = Vector3.Lerp(Hip.position, pose_joint[0], lerp);RHip.position = Vector3.Lerp(RHip.position, pose_joint[1], lerp);RKnee.position = Vector3.Lerp(RKnee.position, pose_joint[2], lerp);RFoot.position = Vector3.Lerp(RFoot.position, pose_joint[3], lerp);LHip.position = Vector3.Lerp(LHip.position, pose_joint[4], lerp);LKnee.position = Vector3.Lerp(LKnee.position, pose_joint[5], lerp);LFoot.position = Vector3.Lerp(LFoot.position, pose_joint[6], lerp);Spine.position = Vector3.Lerp(Spine.position, pose_joint[7], lerp);Thorax.position = Vector3.Lerp(Thorax.position, pose_joint[8], lerp);Neck.position = Vector3.Lerp(Neck.position, pose_joint[9], lerp);Head.position = Vector3.Lerp(Head.position, pose_joint[10], lerp);LShoulder.position = Vector3.Lerp(LShoulder.position, pose_joint[11], lerp);LEblow.position = Vector3.Lerp(LEblow.position, pose_joint[12], lerp);LWrist.position = Vector3.Lerp(LWrist.position, pose_joint[13], lerp);RShoulder.position = Vector3.Lerp(RShoulder.position, pose_joint[14], lerp);REblow.position = Vector3.Lerp(REblow.position, pose_joint[15], lerp);RWrist.position = Vector3.Lerp(RWrist.position, pose_joint[16], lerp);
}

怎么能使游戏的Avatar的3D模型也能像输入模型那样运动起来呢? 换句话说,如何求一种解法将上一步的人形转换为游戏的绑定顶点的骨骼。我们知道3D角色的骨骼动画都是在CPU端层级计算的,上一级关节是下一节关节的原点坐标,由于关节之间的部位长度是固定的,于是问题转换成了求父关节的旋转,即四元数。当父关节的旋转固定的时候,子关节的位置随即也确定了。

对于旋转的求法, 先根据父子关节关系求一个角度, 然后在根据关键点模型里的位置算一个角度, 使用Quaternion.FromToRotation得到一个旋转四元数, 然后在当前的基础上旋转得到目标四元数,最后在Update里由当前插值到目标四元数就行了。代码实现如下:

private void UpdateBone(AvatarTree tree, float lerp)
{var dir1 = tree.GetDir();var dir2 = pose_joint[tree.idx] - pose_joint[tree.parent.idx];Quaternion rot = Quaternion.FromToRotation(dir1, dir2);Quaternion rot1 = tree.parent.transf.rotation;tree.parent.transf.rotation = Quaternion.Lerp(rot1, rot * rot1, lerp);
}

unity里运行效果如图所示:

在这里插入图片描述

如果想看更多的运行效果,参考附录视频。

TIP

一般的情况下游戏里的Avatar关节和Human3.6数据集里的骨骼不是匹配的,往往游戏或者3D Max等美术制作的工具里的骨骼设置的更多,这时候可以跟动作设计师提出跟Hum3.6数据集的骨骼蒙皮解决方案。 如果是已经导出的fbx,我们也得保证关节层级的对应,应该上述算法得到的旋转四元数是基于父节点的local坐标系的。 解决方法就是把fbx在Unity引擎转换为Prefab, 然后再更改Prefab的关节层级结构。

在这里插入图片描述

从上面视频我们可以看到, AlphaPose 虽然能很好的识别出骨骼节点的位置, 但这不包含手指等小关节的姿势, 所以从上而下手都是僵硬的, 但是从卡内基梅隆大学的OpenPose(最新版)已经能识别手指的动作,甚至还包含一些脸部的表情,真的是非常强大了。

附录1:

姿态估计开源深度学习模型汇总:

AlphaPose

AlphaPose 是上海交通大学开源的精确多人姿态估计,声称是第一个开源系统.
AlphaPose 可以同时对图片, videos,以及图片列表,进行姿态估计和姿态追踪(pose tracking). 可以得到很多不同的输出,包括 PNG,JPEG,AVI 格式的关键点图片,JSON 格式的关键点输出,便于很多应用场景.AlphaPose 采用区域多人姿态估计(regional multi-person pose estimation, RMPE)框架,以在人体边界框不准确的情况下,提升姿态估计. 其主要包括三部分:

  • Symmetric Spatial Transformer Network (SSTN)
  • Parametric Pose Non-Maximum-Suppression (NMS)
  • Pose-Guided Proposals Generator (PGPG)

在这里插入图片描述

OpenPose

OpenPose 是 CMU Perceptual Computing Lab 开源的一个实时多人关键点检测库.

OpenPose 提供了 2D 和 3D 多人关键点检测方法,以及特定参数的姿态估计的标准化工具包.
OpenPose 可以采用很多不同的输入方式,如,图片image, 视频video,IP相机camera,等等.
OpenPose 的输出也可以是很多不同形式,如图片和关键点(PNG,JPG,AVI),可读格式的关键点(JSON,XML,YML),甚至是数组类.OpenPose 的输入和输出参数,还可以根据需要进行调整. OpenPose 提供了 C++ API,可以在 CPU 和 GPU 上运行,也兼容 AMD 显卡.

在这里插入图片描述

DensePose

DensePose 出自 Facebook Research,其开源了 DensePose 实现的代码,模型和数据集.
DensePose 数据集,DensePose-COCO,用于人体姿态估计的大规模数据集.
DensePose-COCO 数据集,是在 50K COCO 图片上手工标注的图片-表面(image-to-surface)对应的大规模数据集.

在这里插入图片描述

DensePose 论文提出了 DensePose-RCNN,是 Mask-RCNN 的一个变形,针对每秒多帧的每个人体区域,其回归密集地回归特定肢体部分的 UV 坐标.
DensePose 基于 DenseReg: Fully Convolutional Dense Shape Regression In-the-Wild - 2016.
DensePose 的目标是确定每个像素点的曲面位置(surface location),以及该肢体曲面所属的对应 2D 参数化.

DensePose 采用了基于 FPN 的 Mask R-CNN 结构,RoI-Align Pooling.
此外,DensePose 在 RoI-Pooling 的输出端加入全卷积网路.
在这里插入图片描述

附录2

human3.6m关节点标注顺序

序号数据集标注顺序关节名中文名
00hip臀部
11rhip右臀部
22rknee右膝盖
33rfoot右脚踝
46lhip左臀部
57lknee左膝盖
68lfoot左脚踝
712spine脊柱
813thorax胸部
914neck颈部
1015head头部
1117lshoulder左肩
1218lelbow左手肘
1319lwrist左手腕
1425rshoulder右肩
1526relbow右手肘
1627rwrist右手腕

在这里插入图片描述


COCO数据集骨骼关节keypoint标注对应

序号数据集标注顺序关节名中文名
00nose鼻子
11L eye左眼
22R eye右眼
33L ear左耳
44R ear右耳
55L shoulder左肩
66R shoulder右肩
77L elbow左手肘
88R elbow右手肘
99L wrist左手腕
1010R wrist右手腕
1111L hip左臀部
1212R hip右臀部
1313knee左膝盖
1414R knee右膝盖
1515L ankle左脚踝
1616R ankle右脚踝

在这里插入图片描述


附录3

更多从抖音扒来的的视频姿势识别参见:

  • Alphapose 模型渲染系列
  • Unity Skeleton动画
  • Unity Avatar动画

参考文献:

  • Densepose by Facebook
  • Detectron by Facebook
  • DensePose-COCO 数据集
  • AlphaPose 上海交大
  • CMU Perceptual Computing Lab
  • OpenPose by CMU
  • Paper - DensePose: Dense Human Pose Estimation In The Wild-2018
  • human3.6m数据集骨骼关节keypoint标注对应
  • COCO数据集骨骼关节keypoint标注对应
  • VideoPose3D by Facebook
  • [目标检测] YOLO

这篇关于从抖音视频提取游戏动作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381029

相关文章

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript