卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析
前言
之前對ThreeDPoseTracker的深度學(xué)習(xí)模型和unity中的驅(qū)動(dòng)方法進(jìn)行過解析,還有一個(gè)比較重要的就是從深度學(xué)習(xí)模型出來的3D關(guān)鍵點(diǎn)數(shù)據(jù)會(huì)有抖動(dòng),在ThreeDPoseTracker源碼中有做兩次平滑,一部分是卡爾曼濾波,還有一部分是低通濾波。這次就是對這部分類型進(jìn)行解析。
國際慣例參考博客:
ThreeDPoseTracker源碼VNectBarracudaRunner.cs
理論與代碼復(fù)現(xiàn)
在源工程的VNectBarracudaRunner.cs腳本中,有一個(gè)函數(shù)KalmanUpdate便是用于卡爾曼濾波的,而后續(xù)有這樣一行代碼:
jp.PrevPos3D[i] = jp.PrevPos3D[i] * Smooth + jp.PrevPos3D[i - 1] * (1f - Smooth);便是低通濾波器。
卡爾曼濾波
其實(shí)這部分和我在網(wǎng)上搜到的卡爾曼濾波的方法公式很不相同,不過我們還是按照源碼來實(shí)現(xiàn)解析吧,因?yàn)榭柭鼮V波的真正理論貌似有點(diǎn)復(fù)雜,暫時(shí)不準(zhǔn)備去看。
在源碼中,預(yù)定義了兩個(gè)參數(shù):KalmanParamQ、KalmanParamR,為了簡寫公式就簡記為Q和R,隨后按照時(shí)間推移不斷迭代求解兩個(gè)數(shù)組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對關(guān)鍵點(diǎn)進(jìn)行平滑,首先得有一個(gè)中間變量X,設(shè)未平滑的姿態(tài)為C,則平滑后的姿態(tài)D:
D=X+(C?X)?KX=D\begin{aligned} D&=X+(C-X)*K \\ X&=D \end{aligned} DX?=X+(C?X)?K=D?
這就沒了,感覺跟網(wǎng)上的卡爾曼濾波理論完全不同,如果有哪位大佬知道這個(gè)究竟屬于什么算法,可以在評論區(qū)告知或者微信公眾號私信討論,謝謝。
低通濾波
這個(gè)和圖像里面的低通濾波差不多,不過是一維的,公式很簡單
now=prev?smooth+now?(1?smooth)now = prev*smooth + now *(1-smooth) now=prev?smooth+now?(1?smooth)
簡單的寫法是上面,論文用了一個(gè)時(shí)間軸,將歷史的6幀數(shù)據(jù)聯(lián)合起來為當(dāng)前幀平滑,代碼如下
歷史第0幀為當(dāng)前未平滑的幀數(shù)據(jù),然后依次向前平滑到幀窗口的最后一幀,那么當(dāng)前幀平滑后的數(shù)據(jù)就是窗口的最后一幀。
實(shí)驗(yàn)
原始、unity平滑結(jié)果、python卡爾曼濾波、python卡爾曼+低通濾波三種方法平滑后的腳部z軸方向的坐標(biāo)變化如下:
很清晰發(fā)現(xiàn)原始數(shù)據(jù)有很多小棱角的噪聲,而經(jīng)過kalman濾波以后,基本去掉了大部分棱角,然后用低通濾波降低了運(yùn)動(dòng)幅度。最終結(jié)果與unity源碼結(jié)果相同,說明復(fù)現(xiàn)成功。
我們來看看動(dòng)作的可視化效果:
未經(jīng)平滑的可視化
經(jīng)過卡爾曼和低通平滑后:
結(jié)論
論文的平滑方法雖然很少代碼就搞定,但是從效果圖可以發(fā)現(xiàn),平滑效果還是不錯(cuò)的。
完整的python實(shí)現(xiàn)放在微信公眾號的簡介中描述的github中,有興趣可以去找找?;蛘咴诠娞柣貜?fù)“ThreeDPose",同時(shí)文章也同步到微信公眾號中,有疑問或者興趣歡迎公眾號私信。
總結(jié)
以上是生活随笔為你收集整理的卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行信用币怎么激活?信用币激活弱口令是怎
- 下一篇: 卡通角色表情驱动系列一