Paper/Human

ETCH: Generalizing Body Fitting to Clothed Humans via Equivariant Tightness

침닦는수건 2025. 3. 20. 18:43
반응형

내 맘대로 Introduction

 

Neural ICP랑 결이 비슷하긴 하지만 주어진 SCAN에 딱맞는 registration level의 SMPL를 얻는 것이 아니라, 옷 내부에 있는 skinned body만 얻어내는 논문. 어찌 보면 SMPL 표현력에 딱 맞는 최대 fitting을 찾는 논문이라 볼 수 있겠다. 옷으로 인한 displacement는 애초에 SMPL로 찾는 것이 문제기도 하니까.

outer surface를 SMPL로 찾는 것이 맞는 문제인가? 라고 보여주면서 문제 정의 확실하게 하고 시작함.

 

주어진 각 SCAN point, x에 대해 가장 가까운 SMPL point를 찾아내는 컨셉. NICP랑 방향이 반대라고 할 수 있다. 

 

이 논문은 조금 배경 지식이 필요했다. 각 3D point의 feature를 뽑을 때 단순히 transformer에 때려 넣고 "self-attention아 해줘!" 하는 방식으로 하지 않고 Equivariant point network를 써서 했다. 쉽게 말하면 EPN은 각 point 마다 O개 각도에서 바라본 feature를 뽑아 주는 네트워크인데, 이걸로 한 법 뽑고 나서 self-attention을 하든, mean pooling하든 해서 point feature를 뽑는다. O개 각도는 무한한 SO(3) 공간에서 뽑기가 애매하므로, 정20면체 (오랜만에 봐서 반갑더라)의 회전 대칭성 60개 각도를 사용했다. 

 

각 point feature는 multi head를 통해 cloth-to-body displacement direction/magnitude/confidence를 내뱉는 입력이 된다. 

 

메모

SCAN point, X (N개 surface random sampling)

SMPL point, Y (K개 대표 위치, anchor)

X->Y를 푸는 문제다.

continuous regression으로 풀면 문제가 너무 어려우니, SMPL body 상에 K개 marker를 두고

classification으로 풀었다. 

주어진 X마다 각 마커 M으로 향하는 방향/크기/신뢰도를 예측하고 weighted sum하면 끝.

SMPL을 썼다. SMPLX 아니고. 난이도가 너무 높아서 였을까.

따라서 그림들에는 손이 잘되는 것 같지만 우연히 SCAN이 쫙 핀 손이라서 그럴듯해보이는 것이지 손은 커버하고 있지 않다.





나는 이런 컨셉이 있는지 몰랐다. 3차원 공간 상에서 회전 상태에 따라 전혀 다른 FEATURE가 뽑히는 문제를 막기 위해서 rotation invariant feature 뽑는 방법 중에 하나다. 

F(TX) = TF(X) , point를 돌려서 feature를 뽑으나, feature를 뽑은 다음 돌리나 똑같도록 하는 조건으로 디자인된 point feature extractor EPN을 사용했다.
SO(3) 그룹 6개를 썼다는게 무슨 의미냐면, 옆의 정20면체를 한 꼭짓점을 잡고 돌린다고 해보자. 그러면 72도 를 돌리면 회전대칭이 만족된다. 12꼭짓점 X 5번 72도씩 회전 총 60종류의 3차원 회전에 대해서는 정20면체는 같은 상태를 유지한다. 

여기서 핵심은 정20면체가 같은 상태를 유지한다는 사실이 아니라 저 60종류의 회전을 anchor rotation으로 선별했다는 점이다. 

--------
참고로 CVPR 2019에 내가 쓴 논문에서도 정20면체를 썼는데, 그 이유가 모든 면의 크기가 같은 정다면체 중 최고 차원이고 가장 sphere에 가깝기 때문이다. SO(3)를 표현할 수 있는 다면체 중 최고 표현력인 것.
어떻게 cloth <-> SMPL body marker 매칭했는지는 뒤에 설명한다고 하고 일단 매칭 됐다 쳤을 때.

cloth to body

displacement vector
신뢰도 를 찾는 문제
신뢰도는 marker로 부터 matching 된 body point가 얼마나 떨어져 있는지 geodesis distance를 종합해서 만듦.



displacement vector는 방향과 크기를 나눠서 2 값을 찾는 식으로 추정한다.
각 point,  X -> smpl body point Y 

방향은 어떻게 찾냐

각 point feature OxC (60xC) 를 self attention으로 aggregation한 다음에 O개의 확률 값을 추정
----
여기서 self attention으로 한 이유는 각 방향 O 의 기여도를 세밀하게 분석해서 결론 내리기 위함 -> 세밀할 필요가 없으면 그냥 mean average pooling 갈겨도 상관없었음

O개의 확률 값이 추정 완료되면

O개의 회전 matrix R이 있을 텐데 이걸 weighted sum함
----

옆에 갑자기 SVD가 등장한 이유는 Rotation matrix는 알다시피 linear space가 아니기 때문에 weighted sum 하면 rotation property가 깨진다. (determinent가 1이 아니라든지, transpose가 inverse라든지 하는 것들)

이 성질을 되찾게 해주기 위해서 SVD 분해한다음 다시 조합하는 식으로 한번 후처리해주는 것.

이렇게 찾은 Rotation matrix로 001을 회전시켰을 때 가리키는 방향이 point x가 나아갈 방향이다.
방향을 찾은 뒤에 나아갈 거리(크기)는

각 방향 O가 그리 중요하진 않으므로, 걍 mean average pool 때린다음 값 직접 추정.



SMPL body marker 중 어디에 대응되는지는 확률로 예측

이 때 입력이 지금 보고 있는 point, x와 나머지 X 전체와의 상대 거리를 encoding해서 같이 넣어준다.

전체 X 중에 현 x가 어딨는지를 보고 marker 어디에 대응되는지 맞추는 느낌. 전체를 보고 맞추는게 더 유리함.


전체를 보고 어느 마커에 대응되는지 확률을 앞에서 P(x) 구했으니, 여기선 전체를 볼 필요가 딱히 없음

point. x만 입력으로 넣어서 confidence로 맵핑만 해주는 느낌.
학습이 다 끝나면 실제로 사용할 떄,



모든 SCAN point의 추정값을 각 marker단위로 다 모은다.

즉 모든 SCAN point X가 말한 k번째 위치를 weighted sum으로 종합해서 1개의 위치로 환산.

그다음 SMPL marker를 여기다가 갖다붙이도록 최적화.




요즘 같은 시대에 4090 한대로 논문 쓰다니 대단하다.



scan point X와 smpl body point Y 그리고 marker label GT만드는 방법

SMPL body point 잡고, normal 방향으로 진행하다가 SCAN과 만나는 지점을 일단 anchor point xj라고 부르고 GT로 사용

anchor point 주변 surface에서 sampling 마구마구 한다음 거리가 0.01 이하면 xi도 GT에 추가

이걸 많이 반복하면서 gt를 만들었다고 한다.

y를 뽑을 때 marker간 geodesic distance로 mareker label + confidnece GT도 만들 수 있음.


outer surface를 다루지 않는데 비교군이 NICP인건 넌센스다. NICP보다 좋다고 리포트하는 이유는 비교군이 충분하지 않아서 그런듯. 오히려 NICP가 그렇게 좋진 않다고 보인다.
 
반응형