Paper/Human

Neural Cloth Simulation

침닦는수건 2024. 5. 28. 13:08
반응형

내 맘대로 Introduction

 

SMPL + garment mesh sequence가 주어졌을 때, garment의 변형을 학습해서 unseen pose에서의 garment deformation을 예측할 수 있도록 하는 논문. SMPL pose 파라미터에 의존적으로 변형 가능하도록 하므로 SMPL + Garmet binding이라고 보면 된다. 

 

옷마다 따로 학습해야 하는 것이고, SMPL sequence + Garment mesh sequence가 주어져있어야 한다. 다른 말로 모든 vertex가 추적 가능한 상태여야 한다. garmet vertex, x가 매시점 tracking되어 있다는 것을 전제로 하기 때문이다. 

 

사실 상 vision task라기 보다는 graphics task다. 

 

메모


문제를 정의하길 

옷 vertex의 현 상태는 사람의 자세, 그리고 이전 옷 vertex의 위치 그리고 그 속도에 의해 결정된다. (합리적인 듯.)

이전 옷 vertex 위치는 또 역시 그 이전의 사람의 자세, 그리고 그 이전의 옷 vertex위치, 속도에 의해 결정되는 recursive한 구조

-> 네트워크를 RNN을 쓴 이유

따라서 옷의 변형을 계속해서 recursive하게 따라가다보면, 결국 옷은 초기 static shape에 사람 자세가 더해진 변형이라는 결론. 

-> 따라서 static 옷 한번 풀고 사람 자세에 대해서만 풀면 된다. 
옷의 현 상태는 옷의 초기 상태 + 사람의 자세가 결정한다는 위 가정을 그대로 수식으로 표현하면 수식(3)과 같을 것.

이 때 옷의 현 상태를 표시하는 subspace(latent)가 있다고 생각함. (subspace의 가장 큰 구심점은 static 옷 상태일 때 latent.)

옷 latent는 위 가정에 의하면, 사람 자세를 보면 알아낼 수 있을 것.

네트워크의 구조는

recursive한 가정이기 때문에 RNN 

추가적으로 static 옷 상태는 매 시점의 옷상태와 독립적으로 존재하며, 매 시점 옷 상태에 영향을 주는 공통 요소로 존재해야 하므로 

static encoder와 dynamic encoder가 나뉘어지도록 디자인함.
매시점의 옷 변화를 표현하는 값은 z_t 임. (매시점 옷 latent 값)

근데 이 값은 사람의 자세 theta_t로부터 만들어지는 것이니

시작부터 말하면 body motion을 표현하는 descriptor는 사람 자세 sequence다. (추후 encoder 통과하면 z_t가 됨)

body motion은 모든 sequence를 넣지 않고 sliding window 식으로 현 시점 기준으로 구간을 나눠서 사용함

(현 시점과 먼 자세는 사실 현 옷 상태를 결정하지 않으므로 잘라내도 됨)

사람 자세를 표현하는 theta_t를 입력으로 넣을 때 그냥 넣지 않고 전처리를 조금 해줌.

1) relative rotation을 표시하는 theta_t를 6D rotation representation으로 바꿔서 사용함 (periodic, continuous 성질을 갖도록 해서 네트워크가 다루기 쉬움)

2) relative rotation이다 보니, global 정보를 놓침. 게다가 local gradient가 조금씩만 누적되도 global gradient가 엄청 커질 수 있으므로 안정성도 구림
-> 따라서 global descriptor 추가. 다름 아닌 중력 방향. 현 joint global coordinate 상의 중력 방향.

총 static encoder에서 나온 값을 위와 같이 처리하면 9차원 static descriptor 완성


dynamic descriptor는 일단 static descriptor와 같은 방식으로 9차원 만들고. 

global descriptor(중력 방향으로 추가했던 3차원)의 2차 미분, 가속도를 추가해서 총 12차원으로 구성함.

1) static encoder

입력 : 1static pose 
출력 : 9차원 joint 개수만큼 z_t (옷 latent)

2) dynamic encoder

입력 : N sequence * pose 
출력 : 12차원 joint 개수 * N 개수 만큼 z_t (옷 latent)

-----------------
특징

dynamic encoder는 weight, bias 중 bias가 없다.

따라서 곱셈으로만 이루어진 encoder라서 zero 입력이 들어가면 zero 출력이 나온다. 

-> static pose (0값) 이 들어가면 dynamic latent는 무조건 0 나오도록 보장됨
-> static latent를 더해도 영향이 없음. 
-> dynamic latent가 static latent의 나머지만 맞추도록 유도됨.

1) cloth model loss

mass-spring model 이라는 개념이 있다는데 모르겠음.


옷을 구성하는 vertex마다 mass가 존재하고 edge에는 탄성이 있는 spring으로 연결되어있다고 가정하는 것
-> mass + 탄성에 의해 서로 간의 변형이 물리적으로 유지되도록 강제하는 무언가 인듯.

2) bending loss

이웃한 face 간의 angle(normal)이 비슷하도록 하는 loss.

3) collision loss

옷 point의 sdf를 계산해보았을 때, 양수 (외부) 가 나오도록 강제함

4) inertia loss 

옷 vertex의 현 위치는 이전 시점 옷 vertex + 속도로 계산한 값이 같도록 강제함.

주의점은 이전 시점 옷 vertex + 속도로 계산할 때 gradient를 끊어줘야 한다는 것. 

미래 옷 상태가 과거 옷 상태에 영향을 주는건 말이 안됨.

5) gravity loss

옷 vertex가 매 시점 별로 변형이 없다고 해도 외력이 1개 존재한다.

바로 중력. 사람 자세에 의해 변형이 없다 해도 중력에 의해 항상 땅으로 끌려가도록 유도하기 위해서 추가 함.

(이게 되게 매력적인 loss인 듯)

반응형