ShapePoseOptimizer是一切的基石
也即一个好的NodeGraph,不重叠,好的NodeGraph可以生成好的KNN。实际中可以采取顶点数从1000到击200个点都可以用于表达人体的局部旋转场,比如下图是由998个点,
NodeGraph构成HesssianReg,并且会决定最终系统矩阵的条件数
NodeGraph 节点图在腿部不是很好可以额外加一个顶点
updateTwist时候注意采用严格的se3,虽然在旋转和平移都比较小的时候,se3中的与平移项近似相同,但是在旋转项较大时候就不同了,需要用准确的SE3变换,其中平移项计算公式如下: 。
如果增大时候,左雅克比矩阵会变小,导致对应平移项减少或者产生改变,改变本来的移动位置,提高系统的稳定性。
从smpl生成NodeGraph和NodeGraph计算各种项能量的公式如图所示:
此时条件数大约为10^7.3253;
而正常情况下,如果全身1:5:end 的顶点只取五分之一,均匀分布,则最终的系统矩阵的条件数大约为10^5.6857
条件数为 10^5.6857
如果这时候采用6*6的block来求解系统方程:
6*6block 3*3block
论速度还是6*6更快,但是3*3的收敛比较平稳。
如果条件数过大时候,会出现求解不稳定的情况!!!!!!!!!!!!尤其是6*6block时候。
如果条件数低于特定值时候,对角线可以求解出来,
ShapePoseOptimization是关键,一个坏的形状估计和初始姿态估计会影响后续的fusion,可能造成一些身体的变形,但是其实影响没有想象中的那么大,只要两腿不要估计
SMPL人体模板的关节链求解采用线性化最好的方式来做;(这一点没有严格证明过)。
就是于涛在bodyfusio上提出来的Taylor展开形式。扰动法或是求导法的效果都要差一些。
DBQ/Fusionn等等各个环节都不能有问题
每个关节点的twist都应该单独提取出公共旋转和平移,这样对于Reg矩阵有帮助,可以降低整体Hessian矩阵的条件数,提高数值求解的稳定性和精度,提取出来的方式从L1 reg那篇文章看,应该是在CPU上进行的。
Reg项的数值大小、鲁棒惩罚函数的参数等都是实现的要点。
高效运行的要点:
此外对于整体的实现来说: GPU、CPU混合程序并不比纯GPU弱,因为有很多操作很难并行,或者并行的收益不大,比如链式求导之类的,尤其是数据量不大,并不适合GPU做,可以在CPU算完拷贝到GPU上面。
此外高效算法的基石是稀疏化,比如Fusion时候是Hash,TSDF是Hash表示,系统矩阵是CSR表示,这样可以最高效的实现Fusion和warpField的求解之类的操作。 可以提高10倍左右的速度。
将公共旋转平移提取出来应该也可以极大地提高求解的效率,比如减少GS迭代次数之类的。
可以参考
https://github.com/chenguowen/NodeGraphMake-NodeGraph
https://github.com/chenguowen/HessianTest-NodeGraphConditionNumber
这是两个文件