姿态估计旨在 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关节点标注顺序

序号 数据集标注顺序 关节名 中文名
0 0 hip 臀部
1 1 rhip 右臀部
2 2 rknee 右膝盖
3 3 rfoot 右脚踝
4 6 lhip 左臀部
5 7 lknee 左膝盖
6 8 lfoot 左脚踝
7 12 spine 脊柱
8 13 thorax 胸部
9 14 neck 颈部
10 15 head 头部
11 17 lshoulder 左肩
12 18 lelbow 左手肘
13 19 lwrist 左手腕
14 25 rshoulder 右肩
15 26 relbow 右手肘
16 27 rwrist 右手腕

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

序号 数据集标注顺序 关节名 中文名
0 0 nose 鼻子
1 1 L eye 左眼
2 2 R eye 右眼
3 3 L ear 左耳
4 4 R ear 右耳
5 5 L shoulder 左肩
6 6 R shoulder 右肩
7 7 L elbow 左手肘
8 8 R elbow 右手肘
9 9 L wrist 左手腕
10 10 R wrist 右手腕
11 11 L hip 左臀部
12 12 R hip 右臀部
13 13 knee 左膝盖
14 14 R knee 右膝盖
15 15 L ankle 左脚踝
16 16 R 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

从抖音视频提取游戏动作相关推荐

  1. 怎么让抖音视频当做铃声android,抖音怎么提取视频里的音乐?怎么将抖音里的音乐用来做手机铃声?抖音视频提取音频的方法...

    虽然说抖音发展到现在,褒贬不一,但是架不住人家火啊,现在的人大都喜欢捧着个手机刷抖音,来打发一些碎片时光.抖音不仅带火了短视频,同样也带火了视频里面的背景音乐,许多我们平时并没有听过的歌曲在抖音上就慢 ...

  2. 计算机抖音怎么可以弄出音乐,抖音怎么提取视频里的音乐?怎么将抖音里的音乐用来做手机铃声?抖音视频提取音频的方法...

    虽然说抖音发展到现在,褒贬不一,但是架不住人家火啊,现在的人大都喜欢捧着个手机刷抖音,来打发一些碎片时光.抖音不仅带火了短视频,同样也带火了视频里面的背景音乐,许多我们平时并没有听过的歌曲在抖音上就慢 ...

  3. 百度指数邀请序列号_腾讯第8款社交AppHood 上线;抖音内测云游戏、直播回放等新功能;百度推出多人视频社交App一起吧| 产品挖掘机...

      互联网产品早知道. Tech星球(微信ID:tech618)文 | 陈桥辉头图 | IC Photo 编者按:"产品挖掘机",是由Tech星球策划的全新栏目,旨在为热爱酷产品的 ...

  4. Python爬虫之抖音视频批量提取术

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...

  5. uniapp怎么调起摄像头拍视频_抖音视频怎么拍?我们总结了10个手机视频拍摄小技巧...

    抖音的很多功能与小咖秀类似,但不同的是,抖音用户可以通过视频拍摄的快慢.视频编辑和特效等技术让作品更具创造性,而不是简单地对嘴型. 抖音短视频的10个拍摄技巧,帮助你方便.快捷地制作出更加优质的短视频 ...

  6. iphone短信尚未送达_潮讯:iPhone12重大升级;华为麒麟被炒价;抖音上线云游戏;骚扰短信要凉了;一加刘作虎回归OPPO...

    抖音内测云游戏 近日,有媒体报道说,抖音正在内测云游戏功能,用户可在观看的游戏短视频界面,点击"进入云游戏"的按钮,即可直接玩相关的游戏,需要注意的是,目前的游戏主要是休闲类的游戏 ...

  7. rust爱拍视频解说_抖音视频制作必备Mac神器,上热门儿不是事儿

    在当下遍地都是网红的时代,抖音作为一个短视频发布平台,成就了众多普通人的网红梦. 还是那句老话,工欲善其事必先利其器,想要玩转抖音,手里没有几款称手的工具怎么行.借助这些工具可极大的提升吸粉效率,接下 ...

  8. 【Python 字符视频】Python 实现将抖音视频转换成字符视频

    以前就在抖音上看到过字符视频,直到昨天才突然想自己动手做一个,然后就利用各种博客,自己总结 兼 借鉴,终于完成了字符视频的制作 一.思路: 众所周知,视频是一帧一帧的图片组成的,所以我想的就是将抖音的 ...

  9. Python获取抖音视频链接

    文章目录 所需软件 Fiddler配置 模拟器配置 抓包 Python提取数据 所需软件 手机模拟器,下面以安卓模拟器(雷电模拟器)为例,下载地址: 官网 Fiddler抓包工具,下载地址: 官网 编 ...

  10. xpanx原理解析 | 只要 3 秒!抖音视频无水印下载

    哈啰,这里是「xpanx」,又来给大家分享「奇技淫巧」啦! 获取更多的黑科技知识,可以点击上方的专辑目录「xpanx」查看. 抖音无水印下载方法 今天给大家分享一个不需要借助任何工具或者网站,即可下载 ...

最新文章

  1. python利器怎么编程-Python实现翻译小工具!几行代码搞定!装逼利器有没有!
  2. k8s kubectl create命令使用详解
  3. 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等
  4. 桌面云计算机的配置,Citrix桌面云实验环境的部署配置
  5. Python字符串格式:%vs.format
  6. oracle12c时间,Oracle 12c-选择冒号后的日期时间字符串
  7. mysql核心内幕_MySQL核心内幕
  8. 《半吊子全栈系列:Boostrap3》
  9. 一文读懂平衡二叉树 | 技术头条
  10. jcreator把class字节码文件转成.java源文件_如何将.JAVA文件编译成.CLASS文件.说明方法和工具,或用JCreator如何操作?...
  11. 关于EXCEL打开VBA时发生vbe6ext.olb不能被加载及内 存溢出错误的解决方法
  12. Chrome浏览器修改繁体为中文简体
  13. 图解 Kafka,画得太好了!
  14. 摄像头与成像——做图像处理必须了解的数字成像系统原理
  15. java duplicate_Duplicate spring bean id
  16. Excel单元格内换行(包括空行)for Mac
  17. 关于微信聊天与朋友圈如何快速切换 Mark
  18. 我是怎么解决微信封了我们域名的
  19. 真机测试出现INSTALL_FAILED_USER_RESTRICTED安装错误
  20. 道路交通实时流量监控预测系统

热门文章

  1. 从没衣穿到穿不完,你如何看待小区旧衣回收箱?
  2. 或许,时间的浪费源于对未知的恐惧
  3. 基于Java的通讯录中期报告_基于Java的图书馆管理系统的设计 中期报告.doc
  4. 微信小程序 封装request 方法
  5. 励志编程,Python篇
  6. 【docker系列】镜像分层原理及容器层写时复制
  7. Visual Basic 6 25 周年
  8. 实战 | 渗透某游戏、拿到充值权限
  9. Objc的底层并发API
  10. Python练习题:第14题 分解质因数