卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析
前言
之前對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,公式如下:
K=P+QP+Q+RP=R×P+QP+R+Q\begin{aligned} K &= \frac{P+Q}{P + Q + R}\\ P &= R \times\frac{P+Q}{P+R+Q} \end{aligned} KP?=P+Q+RP+Q?=R×P+R+QP+Q??
隨后使用K對關鍵點進行平滑,首先得有一個中間變量X,設未平滑的姿態為C,則平滑后的姿態D:
D=X+(C?X)?KX=D\begin{aligned} D&=X+(C-X)*K \\ X&=D \end{aligned} DX?=X+(C?X)?K=D?
這就沒了,感覺跟網上的卡爾曼濾波理論完全不同,如果有哪位大佬知道這個究竟屬于什么算法,可以在評論區告知或者微信公眾號私信討論,謝謝。
低通濾波
這個和圖像里面的低通濾波差不多,不過是一維的,公式很簡單
now=prev?smooth+now?(1?smooth)now = prev*smooth + now *(1-smooth) now=prev?smooth+now?(1?smooth)
簡單的寫法是上面,論文用了一個時間軸,將歷史的6幀數據聯合起來為當前幀平滑,代碼如下
歷史第0幀為當前未平滑的幀數據,然后依次向前平滑到幀窗口的最后一幀,那么當前幀平滑后的數據就是窗口的最后一幀。
實驗
原始、unity平滑結果、python卡爾曼濾波、python卡爾曼+低通濾波三種方法平滑后的腳部z軸方向的坐標變化如下:
很清晰發現原始數據有很多小棱角的噪聲,而經過kalman濾波以后,基本去掉了大部分棱角,然后用低通濾波降低了運動幅度。最終結果與unity源碼結果相同,說明復現成功。
我們來看看動作的可視化效果:
未經平滑的可視化
經過卡爾曼和低通平滑后:
結論
論文的平滑方法雖然很少代碼就搞定,但是從效果圖可以發現,平滑效果還是不錯的。
完整的python實現放在微信公眾號的簡介中描述的github中,有興趣可以去找找。或者在公眾號回復“ThreeDPose",同時文章也同步到微信公眾號中,有疑問或者興趣歡迎公眾號私信。
總結
以上是生活随笔為你收集整理的卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行信用币怎么激活?信用币激活弱口令是怎
- 下一篇: 京东闪付怎么注销?注销后可以恢复吗?