基于python和unity交互的卡通角色肢体和表情驱动(深度学习)

前言

最近看到了好多卡通角色的肢体驱动的东东,感觉是时候发挥一下读研时候学的东西了,而且虽然现在不炼丹了,但是还是得保持吃丹的技能。这个项目找了很多很多代码进行测试,最终集成了一个3D姿态估计和人脸关键点提取的代码。

国际惯例,参考博客:

2D姿态估计HRNet

3D姿态估计SemGCN

人脸检测mtcnn

68人脸关键点提取

人头方向估算

Unity官方文档BS的获取和控制

再加和本博文所实现功能类似的demo网址:

效果超级好:上传视频输出同样动作的FBX模型

开源:基于单目摄像头的3D人体和手部姿态估计附带卡通角色驱动

开源:之前解析过的卡通角色驱动算法,内嵌到unity中了

开源:BS表情驱动案例

简介

先放两张结果图表明最终实现功能,分别是卡通角色肢体驱动、表情驱动。以下视频为了上传,采用了抽帧处理。

在这里插入图片描述

在这里插入图片描述

完整视频DEMO可以点击如下链接:

  • 卡通角色身体驱动:链接: https://pan.baidu.com/s/1o87W9EMDWvGboqOxjXxaiQ 提取码: rgj7
  • 卡通角色表情驱动:链接: https://pan.baidu.com/s/1R75q7wu48LwJr54BWe-RVw 提取码: 2dr6

实现方案

本文算法主要涉及两大模块:

  • 肢体驱动部分:深度学习做3D姿态估计、unity做骨骼驱动(注意动力学相关内容)
  • 表情驱动部分:深度学习做人脸关键点检测和人头方向估算以及表情系数,unityBlendShape表情驱动

找了一些方法将深度学习算法嵌入到unity中,发现有点复杂,很多库而且不宜扩展;即想到采用python+flask部署的方法将深度学习作为后台接受unity发过来的请求;而unity则是前端,发送各种请求,比如请求将视频中人的3D姿态或者人脸表情计算出来,返回结果到unity中。

流程图可以戳这里查看:https://www.processon.com/view/link/5fe5556007912910e478a6d2

服务端

主要是深度学习模块,所采用的模型全部在参考博客,但是本人做了一下合成,分别设计了四个接口:

  • 接收视频:因为算法实时性不太好,所以采用服务端上传视频,然后使用算法处理对应功能的方法
  • 3D关键点提取:结合2D姿态估计和3D姿态估计算法,直接端到端,输入视频输出3D关节坐标,目前结合的算法在2060上能达到5-10FPS,大部分时间耗费在人体检测上,用的faster-rcnn
  • 2D人脸关键点提取:最开始使用2D人脸关键点检测,发现效果不是特别好,所以加入了mtcnn进行人脸框检测,然后再输入到关键点检测模型中去,最后根据关键点计算头部的表情和方向,大约10FPS,主要耗费在人脸框检测上
  • 2D人脸关键点实时检测:当时为了测试人脸关键点与unity交互的实时性,留了一个接口,unity端不需要上传视频,直接将每帧图片发送到服务端预测,发现这样非常卡,可能交互也花费时间了,或者其他原因

客户端

主要是unity展示端和驱动端,分为三个模块:

  • 开始界面:输入请求地址、选择上传视频功能、选择肢体/表情驱动功能,选择对应功能后将会在服务端处理数据,最后返回到客户端
  • 肢体驱动界面:根据客户端接收到的关节3D数据,结合unity的lookat函数和简单的动力学修正进行肢体驱动
  • 表情驱动界面:有离线和在线的,离线版和肢体驱动一样从服务端拿到对应的表情数据后对人头进行驱动,利用颈部关节旋转量和BlendShape表情系数控制

难点技术

整个工程的设计花费了接近一个月的时间才搭起来,毕竟996嘛,你们懂得,每天还得熬会夜。

其中还是有一些技术难点的,分为深度学习部分和驱动部分。

深度学习算法部分

本来是奔着实时驱动去的,结果发现很难找到实时性较高且效果稳定的算法,最后实在没办法,抛弃了实时功能(但是保留了接口,便于大佬们测试),采用上传视频,处理视频,返回整个视频结果的模式进行交互。

难点有两块:

  • 2D姿态估计和3D姿态估计算法的集成:找算法的时候发现很多3D姿态估计的算法是在假设2D关键点坐标提供的情况下估算3D坐标的,所以必须去尝试寻找2D姿态估计算法,有的算法直接通过视频估算人体坐标如openpose,而有的是检测到人体框再去估算人体方向如最近的HRNet;但是我觉得还是先检测到人体框再去估算会靠谱点,但是速度应该没有直接端到端快。最终采用了HRNet+SemGCN的方法从视频中提取3D关节坐标
    在这里插入图片描述

  • 人脸表情:因为表情动画通常使用BS来驱动,每个BS通常代表动画的某个表情,多个BS加上不同的系数能组合出不同的表情,但是直接做表情识别的泛化性太差了,不如直接用关键点计算,所以使采用mtcnn+HRNet进行视频中人脸关键点的提取;然后网上又有很多基于关键点去计算人头朝向的算法,随便找了一个;还有就是表情,仅仅做了简单的睁眼闭眼、张嘴程度的计算,具体方法可以看源码。
    在这里插入图片描述

驱动部分

分为肢体驱动和表情驱动,所以也是两个难点:

  • 肢体驱动:最开始打算用unity自带的IK来做,但是它只能用来控制关节末端如双手双脚,无法控制肘部等中间关节,然后想到先把中间关节位置调整好,再去用IK控制末端,结果发现调整中间关节会影响到Ik的计算;实在没辙,直接全部手动控制,采用lookat函数,让每根骨骼的方向与真人的对应骨骼方向保持一致,但是人体运动不仅仅是骨骼方向一致,还要符合人体动力学,所以对每个关节的自转又进行了控制,下图就是未矫正和矫正后的肘关节案例;可能模型看的不太清楚,大概意思就是肘部不能直接朝上弯曲,必须让大臂转动一点以后再去弯曲才比较自然。

在这里插入图片描述

  • 表情驱动:这个相对来说比较简单,需要注意的是利用solvePnP、Rodrigues、decomposeProjectionMatrix计算得到的欧拉角和unity中可能有点区别,注意尝试变换一下就行了,可能是定义的标准3D模型和人脸刚好相反的原因,导致正常情况下的人头扭转角度接近180度。表情部分因为没太多的BS可控制,不然还能根据关键点细分一下各种其他的表情进行驱动。

待优化点

  • 找点好用的深度学习模型
  • 利用FABRIK动力学算法替代lookat
  • 尝试实时驱动
  • 导出BVH动作文件

与开源ThreeDPoseTracker的区别

最终效果看起来会比threeD开源效果差;但是优势如下:

  • 代码清晰度提高,threed的代码一般人很难看懂(当然我有解析博客可辅助理解threed源码)
  • 不同功能区分度高,threed的代码将深度学习和模型驱动都放到unity中造成复杂操作,我将深度学习封装到python,保留unity中的骨骼驱动,不同的人群可以优化不同内容(主要考虑同时懂深度学习和unity的人不多)
  • 代码简化了很多,threed的代码几千行,我的代码条理清晰做了很多简化,只需几百行,提供了可理解空间和优化空间

如何提升效果比ThreeDPoseTracker好

  • 自行加入平滑算法(我的其它博客有解析平滑算法),懂unity的在unity中加,懂python的在python中加,不冲突
  • 懂深度学习的,将深度学习替换为最新且效果稳定点的算法模型

后记

整个项目的内容看似少,但是细节很多,各种深度学习算法的集成、测试;unity中lookat在关节上的应用;动力学矫正;unity+flask通信等。

所有功能可以按照博客介绍的流程和算法完整复现,所以本工程代码打算便宜付费开源,找到的算法LICENSE均允许商用,后续打算攒够钱买个Kinect玩玩驱动,还有手指部分也想用买个设备试试;大家别怪我,毕竟我之前所有的博客都是免费开源的;等钱够了设备到了,再来开源其它更好玩的算法。

当然,开发过程中涉及到的知识点我会不断在博客中更新尽请关注公众号,目前打算把公众号的基础知识部分补充完毕再来折腾这篇博客涉及到的知识。

源码获取请关注微信公众号,发送“卡通角色驱动”,或者直接在CSDN上下载:卡通角色驱动的代码,若接受19.9元付费购买源码,可在https://download.csdn.net/download/zb1165048017/13693467下载,如有问题请加公众号回复的微信。


代码运行说明

环境

已测试运行环境:

Unity:2019.13.f1c1

python:3.7.6

关于python各种包的版本,可以查看piplist.txt

运行

先去\Server\HRNet\pytorch\pose_coco文件夹按照web.txt下载用于2D姿态估计的权重文件。

然后运行run_client.bat运行本地服务端。

最后进入unity运行FirstScene

如果你的client在本地运行,那么可以直接用IP地址:127.0.0.1和端口6666作为交互网址 如果是局域网内其它电脑,可以使用在服务端用ipconfig查看IP地址,一般是192.168.xx.xx。

有三个功能:

肢体驱动:需要先上传视频,当前状态显示为选择功能时,可以点击肢体驱动按钮,即可通过服务端自动计算肢体数据,然后自动进入肢体驱动界面,点击播放。
表情驱动(实时):填入视频地址后,无需点击上传视频,然后点击表情驱动(实时)按钮,进入实时表情驱动,但是这个目前很卡,因为每一帧视频都是从客户端传递给服务器计算表情相关数据再返回,算法实时性不太好
表情驱动(非实时):和肢体驱动类似,也是先上传视频,然后再进行驱动。

不负责教学python入门,不负责教学unity和C#入门,这俩语言工具不会不愿学的请绕道。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV学习——形态学

前言 继续学习图像里面的形态学知识——结构元、腐蚀、膨胀、开运算、闭运算、击中/不击中变换。以及部分基本形态学算法,包括边界提取、空洞填充、连通分量的提取、凸壳、细化、粗化、骨架、裁剪、形态学重建。 其实就是对冈萨雷斯的《数字图像处理》中第9章节《…

径向基函数RBF三维网格变形

前言 之前写过径向基函数(RBF)神经网络做分类或者拟合。然后挖了个坑说在《Phase-Functioned Neural Networks for Character Control》里面提到了用于做地形编辑,所以这篇博客就是解析一下如何用RBF做网格编辑系统。 参考博客: Noe’s tutorial on d…

OBJ可视化——UV还原(修正)

前言 前面写过一篇obj格式解析的博客,但是这篇文章中可视化的工作是参考PRNet的源码进行的,后来细细思考了一下,有点问题,具体看下面。 问题来源 在PRNet源码的render.py中有个函数render_texture,是作者用于将uv展…

Unity中BVH骨骼动画驱动的可视化理论与实现

前言 找了很久使用BVH到unity中驱动骨骼动画的代码,但是都不是特别好用,自己以前写过,原理很简单,这里记录一下。 理论 初始姿态 在BVH或者其它骨骼动画中,一般涉及到三种姿势:A-pose,T-pos…

卡通驱动项目ThreeDPoseTracker——模型驱动解析

前言 之前解析过ThreeDPoseTracker这个项目中的深度学习模型,公众号有兄弟私信一些问题,我刚好对这个项目实现有兴趣,就分析一波源码,顺便把问题解答一下。 这个源码其实包括很多内容:3D姿态估计,坐标平滑…

卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析

前言 之前对ThreeDPoseTracker的深度学习模型和unity中的驱动方法进行过解析,还有一个比较重要的就是从深度学习模型出来的3D关键点数据会有抖动,在ThreeDPoseTracker源码中有做两次平滑,一部分是卡尔曼滤波,还有一部分是低通滤波…

卡通角色表情驱动系列一

前言 分析完ThreeDPoseTracker来做卡通角色的身体驱动,接下来在卡通驱动领域还有一个是表情驱动。对这个真的是一窍不通啊,只能慢慢看论文了。 国际惯例,参考博客/论文: 《Landmark-guided deformation transfer of template f…

opencv相机标定和人头姿态估计案例

前言 头部驱动除了之前关注的表情驱动外,还有眼球驱动和头部方向驱动。本博客基于opencv官方文档和部分开源代码来研究如何基于人脸关键点获取头部的朝向。 国际惯例,参考博客: opencv:Camera Calibration and 3D Reconstruction opencv:…

卡通角色表情驱动系列二

前言 之前介绍了使用传统算法求解BS系数的表情驱动方法,其中提到过的三种方法之一是基于网格形变迁移做的,那么这篇文章就是对《Deformation Transfer for Triangle Meshes》做表情驱动的解析。 国际惯例,参考博客: 论文原文《…

UE自带重定向原理

UE自带重定向方法验证 核心源码在VS的解决方案中的位置: UE4\Source\Developer\AssetTools\Private\AssetTypeActions\AnimSequence.cpp中第3237行RemapTracksToNewSkeleton函数 跳转方法 AssetTypeActions_AnimationAsset.cpp的RetargetNonSkeletonAnimationHa…

【caffe-Windows】caffe+VS2013+Windows无GPU快速配置教程

前言 首先来一波地址: happynear大神的第三方caffe:http://blog.csdn.net/happynear/article/details/45372231 Neil Z大神的第三方caffe:https://initialneil.wordpress.com/2015/01/11/build-caffe-in-windows-with-visual-studio-2013-…

【caffe-Windows】caffe+VS2013+Windows+GPU配置+cifar使用

前言 国际惯例,先来波地址: CUDA WIN7:链接:http://pan.baidu.com/s/1nvyA3Qp 密码:h0f3 官方网址:https://developer.nvidia.com/cuda-toolkit CUDA WIN10:链接:http://pan.baidu.com/s/1…

【一些网站的收集】包含机器学习深度学习大牛主页等

数学概念部分 旋转矩阵、欧拉角、四元数的比较 欧拉角和四元数的表示 四元数与旋转 B样条曲线 非常好的概率统计学习的主页 误差方差偏差 编程语言学习 C#编程视频 OpenGL编程NeHe OpenGL官网 OpenGL“我叫MT“纯手工3D动画制作之1——基础介绍 【强大】非常好的Op…

Eureka源码分析

Eureka源码分析 Eureka server入口: Spring.factories PS: 意味着如果加载EurekaServerAutoConfiguration成功,需要 ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)需加载成功. 通过Bean注入了很多类 本质上, eureka-server包含很多事件: EurekaInstanceC…

matlab程序中,如何解决矢量长度必须相同的问题

主要原因就是画图的x和y长度不一样,我用一个例子说明。 问题代码: clear all;close all;clc;x 0 : 1: 9;y sin(x);n 2*length(x);yi interpft(y, n);xi 0 : 0.5 : 10;hold on ;plot(x, y ,ro);plot(xi, yi, b.-);plot(x, sin(x),m--);legend(原始…

matlab 功率谱分析函数psd用法

psd简介 PSD(power spectrum analysis)功率谱分析,PSD在给定频带上的积分计算信号在该频带上的平均功率。与均值-平方谱相反,这个光谱中的峰值并没有反映出给定频率的能量。 单边PSD包含了信号的总功率在频率间隔从DC到一半的奈奎斯特速率。双侧PSD包含…

linux tar (打包、压缩、解压)命令

打包程序:tar c: 创建文档t: 列出存档内容x:提取存档f: filename 要操作的文档名v:详细信息 一:打包 打包:是指把文件整合在一起,不压缩 1.将文件打包:tar cf a.tar…

虚拟机添加硬盘扩容

1.设置→添加→硬盘 2.选择磁盘类型 3.开启虚拟机 4.用ls 命令查看:ls /dev/sd* 5.最后就可以对sdb进行分区操作 这里好麻烦,等我有空,在补上! . . .

利用matlab将三维数据画成三维立体图

首先先分析对象。将数据利用matlab画出图,最开始是导入数据,然后处理数据,最后将处理的数据画出来。 所以我将它分为三个步骤。 第一步:导入数据 如果是mat数据。可以直接load如果是txt数据。可以用txtread如果是excel数据。可…

世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真

世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真 照相机是日常生活中最常见的。它能把三维的空间图片等比例缩小投影在照片上,称为一个二维图像。 以下我们就讲一讲原理,并相应的进行matlab仿真。 在学之前&#xff0…