日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析

發(fā)布時(shí)間:2023/12/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

之前對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)前幀平滑,代碼如下

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幀為當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。