SMPL 是一個低維度的引數化人體模型,SMPL系數有pose和shape,在訓練基于SMPL的3Dmesh重建任務時候,一般需要進行資料增強 例如旋轉,鏡像等,那當GT 中有pose和3d點的時候,怎么處理?

一 :關于3d點的資料增強:
這里設定3d點坐標表示為(x,y,z),如圖紅色箭頭表示x方向,
注意在進行3d點監督的時候,使用的是相對于根節點的相對3d值,
(1) 旋轉,當影像發生旋轉,3d點只需要全部乘以相應的旋轉矩陣即可:

(2) 鏡像,當影像沿著x軸方向進行鏡像的時候,主要影響3d點的x方向的數值,
第一步:將x方向向量乘以-1
第二步:將左右四肢的關節點交換,

可以發現只有x方向發生了變化,因為各個3d點是相對根節點的相對值,即根節點的坐 標是(0,0,0),當影像發生鏡像后,x只有方向發生了變換,絕對值沒有影響,
二 關于pose的資料增強:
pose一般采用旋轉向量表示,向量旋轉公式最早由 Rodrigues(羅德里格斯) 提出,用一個三維向量來表示三維旋轉變換,該向量的方向是旋轉軸,其模則是旋轉角度,pose 通常采用旋轉向量,因為旋轉矩陣和旋轉向量之間是可以通過Rodrigues,
設旋轉向量的單位向量為 r,模為 θ,三維點(或者說三維向量)p 在旋轉向量 r 的作用下變換至 p′,則:
設旋轉向量為(x,y,z)
1 旋轉操作,當對含有目標人體的影像進行旋轉操作的時候,只需要對SMPL的根節點做相應的旋轉操作即可,類似相機外參操作,
先將根節點旋轉向量轉為旋轉矩陣,然后進行旋轉操作,再還原到旋轉向量,
![]()
2 鏡像操作,當對含有目標人體的影像進行鏡像操作的時候,則需要小心處理:
2.1 第一步: 直接交換左右雙方的值
2.2 第二步:需要將每一個pose的旋轉向量的第2和第3個值乘以-1,
具體實作代碼:

為什么需要執行第二步?
如下圖,x方向為紅色,y方向為綠線,z方向為黃線,圖1經過鏡像得到圖2


圖1 圖2
每一次旋轉前均為初始T-pose

T-Pose
動作1: 讓左右手腕以x方向為軸方向,逆時針旋轉90,可以發現旋轉后方向一直,說明x向量是等價的,交換后不需要進行額外操作,

左右手均繞x向量方向旋轉相同角,發生鏡像,也不會影響這個旋轉結果,
動作2:讓左右手腕以y方向為軸方向,向順時針旋轉90

動作3:讓左右手腕以y方向為軸方向,向逆時針旋轉90
可以發現如果發生鏡像,上面兩個操作的結果將存在變化,這是因為盡管他們都是繞著y軸進行相同方向的旋轉,但是因為初始方向相反,導致結果不一樣,
動作4:讓左右手腕以z方向為軸方向,順時針旋轉120,

動作5:讓左右手腕以z方向為軸方向,逆時針旋轉120
可以發現如果發生鏡像,上面兩個操作的結果將存在變化,這是因為盡管他們都是繞著z軸進行相同方向的旋轉,但是因為初始方向相反,導致結果不一樣,
動作6 讓3號點繞x軸逆/順時針旋轉60度


動作7 讓3號點繞y軸旋轉逆時針60度

動作8 讓3號點繞z軸順時間旋轉60度

附上:旋轉矩陣和旋轉向量之間的轉換,opencv自帶該函式Rodrigues()

或者:
from scipy.spatial.transform import Rotation as R
alxe_pose= np.zeros((24, 3))
rotmat_pose = R.from_rotvec(alxe_pose).as_matrix()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357262.html
標籤:其他
