Paper/3D vision
Large Steps in Inverse Rendering of Geometry
침닦는수건
2025. 4. 29. 12:05
반응형
내 맘대로 Introduction
이 논문은 diff.rendering으로 target geometry를 역추정할 때 (DMTet 같은 느낌) 단순히 gradient를 vertex에 흘려보내기만 한다면 위 그림의 (b)처럼 망가지는데, 어떻게 regularization하면 효과적으로 최적화할 수 있을지 방법론을 소개하는 논문이다. 기존 방식은 vertex gradient와 laplacian regularizer 간의 trade-off 지점을 정하는 방식으로 완충했는데, 이 논문은 수학적으로 조금 더 나은 방법을 계산한다. gradient와 regularizer가 싸우도록하는 것이 아니라 gradient 자체를 regularize하는 방식이다.
구체적인 수학은 나도 모름.
메모
![]() |
mesh M이 주어졌을 때 이 mesh에 해당하는 Laplacian operator는 수식(6)과 같이 구한다. mesh의 구조가 변할 때마다 재계산하는 것이 맞다. edge 길이의 변화량으로 가득한 matrix라고 보면 된다. 이 값이 작다는 것은 형상 변화가 작다는 의미이므로 smooth하다고 볼 수 있음. |
![]() ![]() ![]() |
naive한 방식은 vertex, x를 renderer,R을 이용해 이미지로 내리고 이미지와 비교하는 loss를 통해 dx를 업데이트하는 식이다. (참고 : 이 논문에서 texture는 직접 풀지 않고 고정된 조명하에 빛 차이로 인한 음영 차이만 다룸) 수식(9)가 그걸 의미하고, 이 수식을 통해 발생하는 gradient는 총 2가지 효과를 만들어낸다. ![]() 조명 차이에 더 걸맞게 face가 회전하는 힘 (shading gradient) 실루엣이 타겟과 맞도록 확장 이동하는 힘 (silhouette gradient) ----------- 문제는 이 힘이 확실히 의미가 있긴 하지만 모든 face에 제각각 적용돼서 face 간의 연결 관계를 전혀 고려하지 않는다는 것. 따라서 형상이 망가지고 self-penetration같은 문제가 생긴다. |
![]() |
친절하게 그림으로도 설명해주는데 기울어진 직선을 수평선으로 최적화한다고 했을 때 외곽 vertex부터 gradient로 업데이트해보자. 그러면 세번째 그림처럼 끄트머리만 띡하고 업데이트될텐데, graph 구조물인 mesh에서는 그리 바람직한 업데이트는 아니다. 꺾였기 때문이다. 이 상태로 다음 업데이트를 하면 할수록 더 구불구불 업데이트만 될 뿐이다. |
![]() ![]() |
그래서 다들했던 것이 뒤에 laplacian regularizer를 "더한 것"이다. gradient로 변형하는 힘을 그대로 두고, 뒤에다 smooth하게 만드는 힘을 더해서 균형싸움을 하도록 한 것. |
![]() |
확실히 이전 상황보다, 주변 vertex를 고려하긴 해서, smooth해지려고 보상하는 힘이 발생하긴 한다. 하지만 튜닝이 어려워보인다. |
![]() ![]() |
이 균형싸움 튜닝 문제를 수학적으로 푸는 방법이 있긴 하다. 2차미분 값을 사용해서 균형을 맞춰주는 것이고 결과도 훌륭하다. 하지만 치명적인 문제로 연산량이 N^3을 웃돈다. 따라서 vertex 개수가 엄청 많은 mesh를 다룰 때는 현실적이지 않다. |
![]() |
그래서! 저자들이 제안한게 연산량이 많이 필요한 Hessian matrix 계산을 identity matrix로 바꿔치기 해버리는 것이다. ![]() mesh가 어떤 대상의 형상을 표현하는 한, smoothness는 어느정도 전제가 되는 상태일테니 1차 미분 laplacian도 그리 크지 않을텐데 2차 미분은 그보다 더 작을 것이다. -> identity로 단순 바꿔치기하는 것이 수학적으로 보지 않고 직관적으로 봐도 그리 이상하지 않음 |
![]() ![]() |
다른 시각에서 보면 newton method의 2차 파트를 수정한 것이므로 quasi-newton method라고 볼수도 있겠다. |
![]() |
이런 approximated form으로 변형하는 것이 직관을 넘어서 수학적으로도 이점을 제공한다. 어떤 형상 (graph) 위에서 열이 확산되는 수식을 풀어보면 (16)과 같다. 근데 이 때 해는 수식(17)과 같다고 밝혀져 있다. (identity가 들어있는 것이 너무 깔끔하지 않은가) ------------ 이걸 mesh 를 업데이트하는 상황으로 가져와서, mesh가 변형되어가는 것을 마치 열이 퍼져나가는 것과 같은 모양으로 가정하고 수식(16)을 가져와서 사용하겠다고 하면, 앞에서 Hessian을 identity로 변형하면서 저 모양이 같아졌기 때문에 수식(20)과 같이 최종 정리할 수 있다. 수학적인 의미도 있지만, 여기선 그냥 단순히 제곱으로 끝나기 때문에 구현적으로 연산량 관리나 메모리 관리가 쉽다는 장점이 따라온다! |
![]() ![]() |
열확산이 퍼져나가는 수식을 차용함으로써 추가로, laplacian 튜닝에서도 조금 더 자유로워진다. 열이라는 것이 퍼져나갈 때 smooth하게 퍼져나가는게 자연의 섭리이기 때문에 저 수식을 가져오는 것 자체가 smoothness를 가져온다는 뜻. 그러니 람다 튜닝에 덜 민감하게 반응하므로 튜닝이 쉬워진다. 1타3피 |
![]() |
gradient를 계산하는 것과 더불어 optimizer에 momentum을 같이 써준다면 더 안정적인 업데이트가 가능해진다. |
![]() |
실험적으로 보았을 때 수식(23)같이 쓰는게 제일 좋았다고 한다. |
![]() gradient가 아무리 좋다고 참여하는 vertex 개수가 부족하면 태생적 표현력 한계로 복잡한 형상으로는 최적화될 수 없다. 따라서 특정 스텝마다 remeshing을 해서 (edge 길이가 되도록 갖도록 remeshing) vertex를 없애거나 늘려주는 식으로 진행했다. |
|
![]() |
![]() |
![]() 람다는 99 정도 |
|
![]() |
![]() view가 많을 수록 잔되는건 당연한 일 |
|
![]() |
![]() texture는 나중에 후처리로 찾아주는 예제를 보여줌. |
![]() |
속도도 빠르다. hessian이 없으니 . |
반응형