动作识别/驱动项目全流程回顾
包括最简单的2D动作识别,复杂一些的2D 3D数字人驱动,单目/多目数字人工程方案。
全景思维导图
(隐去生产部署细节
动作识别
动作识别用于健身大屏、虚拟拜佛等生产场景,依托于大屏(一张RTX3080,双RGB摄),深度学习+UE4的组合来实现一些生产的互娱需求,由于UE4占用比较多的计算资源,动作识别的核心痛点在于利用单目RGB做一些准确率达标的实时应用。
作为应用基础,也在其上开发了一些滑雪/切水果等互娱应用,复用一套算法pipeline、API接口即可。
实现的思路很简单,单帧提取动作,多帧做滑动窗口,提取feature通过分类器进行动作分类,分类器实现了包括NN,Linear SVM,RandomForest,XGBoost等机器学习方法,,MLP等深度学习网络,也包括基础的模型集成,投票选举等功能。
一些tricks包括noise的添加(data aug),nan的处理逻辑(前帧),feature包括哪些信息(pose 位移 速度 增加了joint angle)。
项目是我中间接手的,接手后做的主要工作包括mediapipe替代老旧的openpose提速(保证精度损失);data处理代码重构,进行提速,保留重复处理数据,减少存盘环节;增加关节角度信息丰富feature的组成等等,最终效果是数据采集完成后,单卡20min训练一个动作识别模型,提速数倍。
动作识别效果:
数字人驱动基础概念
一些基础的数学概念,思维导图:
相机模型
相机内参 外参 畸变系数
张正友标定法 ChArUco 对极约束 PnP (Perspective n point Homography matrix(单应矩阵
三角化 Triangulation DLT(Direct Linear Transform) SVD求解 RANSAC
IK
IK Solver IK Net IK algorithm
Param Model
SCAPE SMPL SMPL-X STAR
其他
Filter(smooth滤波器) Rotation(4种形式和变换 ) 优化方法(梯度下降 牛顿 L-BFGS SGD EM)
2D数字人驱动
竞品公司
deepmotion,基于几年自研的运动估计模型(大量cpu集群做运动优化),用户上传单目video返回bvh,效果业内领先,偶发失误;
TDPT/VseeFace/Kalidokit 一类伪开源项目,主要通过2D关键点lift到3D关键点,或者直接IKNet计算出关节旋转角度,缺点是关节翻转问题严重;
Pose提取
coco wholebody
ref AI_Power
3D数字人驱动
竞品公司
国内在单目3D数字人驱动上做的比较好的是北京的聚力维度,主打人脸表情丰富和单目动作驱动。
英国的move.ai在多目数字人驱动上效果较好,是多目的竞品对象。
其他一些竞品公司:
手部估计
手部的估计模型有两种,第一种是MANO,本质上是SMPL+H,61个参数(15*3 + 10 shape + 3 cam + 3 rot),MANO又分为两种,一种是获取MANO params,也就是hand 3d pose数据,另一种是直接回归mesh。
MANO params 相关:
Minimal-Hand,以速度提升为主,为了达到实时,采用2D lift的方案,使用DetNet+IKNet,先检测2d+3d关键点,然后通过IK获得MANO参数,实际使用中速度是满足要求的,但是受限于训练数据和2D lift的方案,准确度不高,达不到生产级别;
MobileHand,也是以移动端部署为核心,所以选择了MobileNetV3这样的轻量级backbone,做end2end的推理,image2mano,使用23个自由度代替MANO+PCA的方案,问题仍然是数据集,FreiHand几乎都是手部近景数据,这种paperwork在生产上效果很差;
S2HAND采用自监督方式,但只要数据摆在那,无论网络结构还是训练方式玩出什么花,都无法解决生产问题。
MANO mesh 相关:
MobRecon,通过2D lifting 3D,然后通过spatial conv回归hand mesh;
HandOccNet,主要针对手部遮挡的问题,使用FPN结构,通过改进transformer网络结构克服遮挡;
手部估计另一种是SMPLX params,毕竟SMPLX里面也包含手部参数。
FrankHand,实际上是从FrankMocap里面扒出来的手部估计模型,类HMR encoder-decoder结构,end2end从image中提取feature,然后获取SMPLX参数,FrankHand的优势在于训练数据足够丰富,几乎采用了市面上开源的所有手部数据,并将其统一格式,效果实测也是最好的。
人脸估计
没有较好的开源方案,主要有两条路线,一条是通过landmark或者face mesh驱动,效果不会很好,另一条是通过人脸3D重建获得3D系数,通过算法或网络转换到blendshape驱动,是工业界常用的方法。
身体估计
身体估计的参数模型主要有SCAPE SMPL SMPLX STAR等,围绕这些参数模型,又可以将身体估计分为pose估计和mesh估计,从估计方法上,可以分为回归方法、混合方法、基于时序的方法等。围绕身体参数,引入外部硬件的又有基于IMU的身体估计,使用运动学算法优化的physical方法等。
几乎阅读并复现了这个领域所有效果看起来可以的论文,大部分是通过魔改结构或者数据增强在human3.6m数据集上刷榜。
回归方法
HMR是人体姿态估计的开山之作,通过2D joints回归SMPL param;
PyMAF使用spatial feature pyramid学习pose的dense特征,使用HRNet提取grid feature,通过反馈网络精细化mesh;
Mesh Transformer使用transformer结构来学习pose特征,不经过SMPL参数,直接回归3D关键点和mesh;
ROMP解决了多人实时估计的问题,使用HRNet+CoordConv,输入尺寸达到512;
混合方法
SPIN在HMR基础上加入了SMPLify先验(由CMU pose数据学习,通过不断迭代回归来逼近SMPL参数);
ETF使用比SPMLify更好的回归方式,构建大规模训练集
PARE着力解决人体姿态估计中的遮挡问题,做occlusion sensitivity analysis;
DynaBOA通过test-time-augmentation在Human3.6M上刷榜;
HybrIK解决了3D-mesh的问题,为了提高IKNet效果,将旋转分为twist+swing两个部分处理(额外标注);
LVD使用新颖的视角,通过vertex descent从image回归mesh;
基于时序的方法
VIBE是开山之作,通过AMASS学习先验,通过GRU实现时序encoder(工程上优化到实时);
TCMR首先用r50 backbone提取所有frame的静态特征,然后基于GRU回归pose参数,通过前后帧监督调整当前帧,时间序列上更加平滑;
DeciWatch解决了时间序列pose估计的效率问题,使用frame sample,类似于插帧算法,sample系数就是加速倍数;
基于运动学优化/传感器的方法
PhysCap使用openpose提取人体2d joints,基于RBDL做运动学优化,特别是GRF(ground reaction force)的计算,优化接地效果;
PIP结合IMU与RBDL运动学优化,效果较好但毕竟引入了惯性传感器;
UnderPressure为了解决脚部接地的问题,建立了GRF数据集,并通过网络预测GRF,优化脚部接地效果;
TransPose直接基于noitom的IMU做运动估计;
rgbd-kinect使用kinect相机获取深度信息(API出pose),mediapipe估计人脸,minimal-hand估计手部,效果差;
Stanford团队的contact-human-dynamics部分借鉴CMU的MTC,引入TOWR做运动学优化,优化人物的接地效果;
后续又提出HuMor使用vposer做先验,在测试时进行增强,不适用于实时驱动的场景;
Full Body估计
SMPL-X是full body估计的主要参数模型,原因是融合了脸部的FLAME和手部的参数,真正实现了全身模型,也包括提出了vposer的先验。
但是工程上很难使用SMPLX做出成果,最大的原因就是缺少数据,不像SMPLX的普朗克实验室一样可以去3D scan一些数据集,开源的数据集大部分还是在2d joints数据,即使human3.6m也是在通过mosh取的的3D pose先验。
开源比较好的全身估计包括meta的FrankMocap,Hand4Whole ,等等。
FrankMocap的创造性在于将身体和手部分开预测,然后结合在一起,来解决手部姿态预测困难的问题,这部分模型也是私有数据train的,开源的EFT也证明了meta在开源数据整合上走了很远,生产的数据生成也采用了ETF的方式。
在手部和身体的结合上,frankmocap提出了两种,一种是简单的copy&paste,另一种是通过2d joints优化,耗时较长。
能够获得全身3D关键点的比较多,即使mediapipe加入了大量私有数据集也做不好,失误较多。
人体shape估计
基于 shapy
Text2Motion
一个奇怪的paper分支,大概是基于HumanML3D KIT等几个text2motion数据集,做一些基于BERT/CLIP理解文本,VAE/diffusion/attention推理的方案,不出意外效果都很差。