最近看到了好多卡通角色的肢体驱动的东东,感觉是时候发挥一下读研时候学的东西了,而且虽然现在不炼丹了,但是还是得保持吃丹的技能。这个项目找了很多很多代码进行测试,最终集成了一个 3D 姿态估计和人脸关键点提取的代码。然后应用到unity中实现卡通角色的肢体和表情驱动。
国际惯例,参考博客:
2D 姿态估计 HRNet[1]
3D 姿态估计 SemGCN[2]
人脸检测 mtcnn[3]
68 人脸关键点提取[4]
人头方向估算[5]
Unity 官方文档 BS 的获取和控制[6]
再加和本博文所实现功能类似的 demo 网址:
效果超级好:上传视频输出同样动作的 FBX 模型[7]
开源:基于单目摄像头的 3D 人体和手部姿态估计附带卡通角色驱动[8]
开源:之前解析过的卡通角色驱动算法,内嵌到 unity 中了[9]
开源:BS 表情驱动案例[10]
先放两张结果图表明最终实现功能,分别是卡通角色肢体驱动、表情驱动。以下视频为了上传,采用了抽帧处理。
完整视频DEMO可以点击如下链接:
卡通角色身体驱动:链接: https://pan.baidu.com/s/1o87W9EMDWvGboqOxjXxaiQ 提取码: rgj7
卡通角色表情驱动:链接: https://pan.baidu.com/s/1R75q7wu48LwJr54BWe-RVw 提取码: 2dr6
本文算法主要涉及两大模块:
unity
做BlendShape
表情驱动找了一些方法将深度学习算法嵌入到unity
中,发现有点复杂,很多库而且不宜扩展;即想到采用python+flask
部署的方法将深度学习作为后台接受unity
发过来的请求;而unity
则是前端,发送各种请求,比如请求将视频中人的3D
姿态或者人脸表情计算出来,返回结果到unity
中。
主要是深度学习模块,所采用的模型全部在参考博客,但是本人做了一下合成,分别设计了四个接口:
mtcnn
进行人脸框检测,然后再输入到关键点检测模型中去,最后根据关键点计算头部的表情和方向,大约 10FPS,主要耗费在人脸框检测上主要是unity
展示端和驱动端,分为三个模块:
lookat
函数和简单的动力学修正进行肢体驱动BlendShape
表情系数控制整个工程的设计花费了接近一个月的时间才搭起来,毕竟 996 嘛,你们懂得,每天还得熬会夜。
其中还是有一些技术难点的,分为深度学习部分和驱动部分。
本来是奔着实时驱动去的,结果发现很难找到实时性较高且效果稳定的算法,最后实在没办法,抛弃了实时功能(但是保留了接口,便于大佬们测试),采用上传视频,处理视频,返回整个视频结果的模式进行交互。
难点有两块:
分为肢体驱动和表情驱动,所以也是两个难点:
肢体驱动:最开始打算用unity
自带的IK
来做,但是它只能用来控制关节末端如双手双脚,无法控制肘部等中间关节,然后想到先把中间关节位置调整好,再去用 IK 控制末端,结果发现调整中间关节会影响到 Ik 的计算;实在没辙,直接全部手动控制,采用lookat
函数,让每根骨骼的方向与真人的对应骨骼方向保持一致,但是人体运动不仅仅是骨骼方向一致,还要符合人体动力学,所以对每个关节的自转又进行了控制,下图就是未矫正和矫正后的肘关节案例;可能模型看的不太清楚,大概意思就是肘部不能直接朝上弯曲,必须让大臂转动一点以后再去弯曲才比较自然。
表情驱动:这个相对来说比较简单,需要注意的是利用solvePnP、Rodrigues、decomposeProjectionMatrix
计算得到的欧拉角和 unity 中可能有点区别,注意尝试变换一下就行了,可能是定义的标准 3D 模型和人脸刚好相反的原因,导致正常情况下的人头扭转角度接近 180 度。表情部分因为没太多的 BS 可控制,不然还能根据关键点细分一下各种其他的表情进行驱动。
lookat
整个项目的内容看似少,但是细节很多,各种深度学习算法的集成、测试;unity 中lookat
在关节上的应用;动力学矫正;unity+flask 通信等。
所有功能可以按照博客介绍的流程和算法完整复现,所以本工程代码打算便宜付费开源,找到的算法LICENSE
均允许商用,后续打算攒够钱买个Kinect
玩玩驱动,还有手指部分也想用买个设备试试;大家别怪我,毕竟我之前所有的博客都是免费开源的;等钱够了设备到了,再来开源其它更好玩的算法。
当然,开发过程中涉及到的知识点我会不断在博客中更新尽请关注公众号,目前打算把公众号的基础知识部分补充完毕再来折腾这篇博客涉及到的知识。
源码获取请关注微信公众号,发送“卡通角色驱动”
2D姿态估计HRNet: https://github.com/leoxiaobin/deep-high-resolution-net.pytorch
[2]3D姿态估计SemGCN: https://github.com/garyzhao/SemGCN
[3]人脸检测mtcnn: https://github.com/mayuanjason/MTCNN_face_detection_alignment_pytorch
[4]68人脸关键点提取: https://github.com/vlad3996/HRNet-landmarks
[5]人头方向估算: https://github.com/yinguobing/head-pose-estimation
[6]Unity官方文档BS的获取和控制: https://docs.unity3d.com/2019.3/Documentation/Manual/BlendShapes.html
[7]效果超级好:上传视频输出同样动作的FBX模型: https://xk.yunboai.com/
[8]开源:基于单目摄像头的3D人体和手部姿态估计附带卡通角色驱动: https://github.com/facebookresearch/frankmocap
[9]开源:之前解析过的卡通角色驱动算法,内嵌到unity中了: https://github.com/digital-standard/ThreeDPoseTracker
[10]开源:BS表情驱动案例: https://github.com/rwsarmstrong/strongtrack