免费的网页网站,动画网站模板,门户类网站的主页设计,宁皓 wordpress前言
之前对ThreeDPoseTracker的深度学习模型和unity中的驱动方法进行过解析#xff0c;还有一个比较重要的就是从深度学习模型出来的3D关键点数据会有抖动#xff0c;在ThreeDPoseTracker源码中有做两次平滑#xff0c;一部分是卡尔曼滤波#xff0c;还有一部分是低通滤波…前言
之前对ThreeDPoseTracker的深度学习模型和unity中的驱动方法进行过解析还有一个比较重要的就是从深度学习模型出来的3D关键点数据会有抖动在ThreeDPoseTracker源码中有做两次平滑一部分是卡尔曼滤波还有一部分是低通滤波。这次就是对这部分类型进行解析。
国际惯例参考博客
ThreeDPoseTracker源码VNectBarracudaRunner.cs
理论与代码复现
在源工程的VNectBarracudaRunner.cs脚本中有一个函数KalmanUpdate便是用于卡尔曼滤波的而后续有这样一行代码
jp.PrevPos3D[i] jp.PrevPos3D[i] * Smooth jp.PrevPos3D[i - 1] * (1f - Smooth);便是低通滤波器。
卡尔曼滤波
其实这部分和我在网上搜到的卡尔曼滤波的方法公式很不相同不过我们还是按照源码来实现解析吧因为卡尔曼滤波的真正理论貌似有点复杂暂时不准备去看。
在源码中预定义了两个参数KalmanParamQ、KalmanParamR为了简写公式就简记为Q和R随后按照时间推移不断迭代求解两个数组K和P公式如下 KPQPQRPR×PQPRQ\begin{aligned} K \frac{PQ}{P Q R}\\ P R \times\frac{PQ}{PRQ} \end{aligned} KPPQRPQR×PRQPQ 随后使用K对关键点进行平滑首先得有一个中间变量X设未平滑的姿态为C则平滑后的姿态D: DX(C−X)∗KXD\begin{aligned} DX(C-X)*K \\ XD \end{aligned} DXX(C−X)∗KD 这就没了感觉跟网上的卡尔曼滤波理论完全不同如果有哪位大佬知道这个究竟属于什么算法可以在评论区告知或者微信公众号私信讨论谢谢。
低通滤波
这个和图像里面的低通滤波差不多不过是一维的公式很简单 nowprev∗smoothnow∗(1−smooth)now prev*smooth now *(1-smooth) nowprev∗smoothnow∗(1−smooth) 简单的写法是上面论文用了一个时间轴将历史的6帧数据联合起来为当前帧平滑代码如下
jp.PrevPos3D[0] jp.Pos3D;
for (var i 1; i NOrderLPF; i)
{jp.PrevPos3D[i] jp.PrevPos3D[i] * Smooth jp.PrevPos3D[i - 1] * (1f - Smooth);
}
jp.Pos3D jp.PrevPos3D[NOrderLPF - 1];历史第0帧为当前未平滑的帧数据然后依次向前平滑到帧窗口的最后一帧那么当前帧平滑后的数据就是窗口的最后一帧。
实验
原始、unity平滑结果、python卡尔曼滤波、python卡尔曼低通滤波三种方法平滑后的脚部z轴方向的坐标变化如下 很清晰发现原始数据有很多小棱角的噪声而经过kalman滤波以后基本去掉了大部分棱角然后用低通滤波降低了运动幅度。最终结果与unity源码结果相同说明复现成功。
我们来看看动作的可视化效果
未经平滑的可视化 经过卡尔曼和低通平滑后 结论
论文的平滑方法虽然很少代码就搞定但是从效果图可以发现平滑效果还是不错的。
完整的python实现放在微信公众号的简介中描述的github中有兴趣可以去找找。或者在公众号回复“ThreeDPose同时文章也同步到微信公众号中有疑问或者兴趣欢迎公众号私信。