Paper/Generation

SPIn-NeRF: Multiview Segmentation and Perceptual Inpainting with Neural Radiance Fields

침닦는수건 2023. 11. 16. 20:35
반응형

내 맘대로 Introduction

이 논문은 NeRF로 이미 복원한 scene에서 선택적으로 특정 물체를 지우는 방법에 대해 생각한 논문이다. NeRF MLP가 implicit function이 un-interpretable이기 때문에 이미 학습 완료된 scene에서 특정 물체만 분리해낸다는 생각 자체가 사실 불가능한 것이라 이론적으로 풀진 않았고, 파이프라인으로 풀었다.

 

입력 이미지가 주어졌을 때 제거하고자 하는 물체를 모든 이미지에 대해서 마스킹한 뒤, NeRF를 다시 학습시키는 방법이다. 이 때 단순 마스킹할 경우 당연히 망가질 것이기 때문에 2d inpainting 알고리즘으로 빈 mask 영역을 채워서 복원한다.

 

개인적으로 task를 풀기 위해 이것저것 섞은 조립형 논문이라서 그렇게 매력적으로 보이진 않는다. 

 

메모하며 읽기

국룰. NeRF recap.

전체 파이프라인은 
1) 입력 이미지에서 마스킹
2) inpainting
3) NeRF reconstruction 이다.
----
웬만하면 1) 2) 3) 모든 과정을 SOTA를 가져와서 썼으므로 조립형 논문이다. 정말.
맨 처음 입력 이미지 별로 물체 마스크를 따는 것은 LLaMa를 사용했다. 약간의 guide(point)만 있으면 mask를 따주기 때문에 이를 이용해서 1장에서 물체 마스크를 딴다.

매 frame 해주기엔 너무 수량이 많이 드니까 또 video를 가정해서 mask를 tracking해주는 알고리즘을 붙여서 나머지 frame에서도 마스크를 따준다. 

이러고 나서 NeRF를 빈공간 있는 채로 일단 학습을 시키는데 semantic NeRF 방식을 차용해서 mask region과 unmasked region이 구분되도록 학습한다.



LLaMa + video tracking으로 딴 마스크는 3d consistent하지 않고 noisy하겠지만 NeRF 학습 과정에서 그래도 나름 multiview constraint에 의해 보정될 것이다.

따라서 학습 완료된 masked region을 각 이미지로 reproejction해서 updated mask를 얻는 것으로 최종 mask 확보를 마무리한다.

----

masked region을 구분하려고 새로 부여한 objectness는 sigmoid를 취해 0~1로 뽑아내는 값으로 masekd region이냐 아니냐만 구분하는 binary classification 용이다. 

ray 단위로 합쳐서 사용하므로 수식(3)을 보면 기존 color integral과 같다. 

binary classification이라 BCE loss가 쓰이는 모습.

----
updated mask를 얻은 뒤, updated mask로 또 NeRF학습하는 식의 iterative update를 했다고 적어두었다. (연산량, 학습 시간 따위...)


그 다음은 inpainting 알고리즘 각각 masked image에 적용해서 빈 곳을 자연스럽게 채워준다. 

그리고 다시 inpainted image로 NeRF를 학습한다. 
하나의 팁이, inpainted region, 즉 masked region같은 경우는 새로 채워져 있더라도 이게 3d consistent한지는 사실 보장할 수 없기 때문에 원래 color loss처럼 l2 loss로 학습을 하면 조금 망가진다고 한다.

따라서 이 inpainted region에 한해서는 l2 color loss가 아닌 perceptual loss를 걸어준다고 한다. 


추가적으로 inpainted region 학습을 강화하기 위해서 depth loss를 사용한다. 

inpainted image로 학습되고 있는 NeRF에서 만든 rendered depth와 inpainting(rendered depth)를 를 비교해준다.

즉 여기서 depth inpainting을 한 번 더 한 뒤 pseudo GT로 이용하는 것이다. 

(rgb inpainting, depth inpainting 다 한다는 소리...)
구조를 보면 (내용을 봐도) 연산량이 어마어마 할 것 같은데, 실제로 여러번 NeRF를 태우고 inpainting도 태우고 해야해서 한 pixel당 gradient가 계산되는 횟수가 많다.

따라서 이미지 단위로 학습 (특히 perceptual loss를 이미지 단위로) 하게 되면 메모리 이슈가 있다고 한다.

따라서 이미지 단위를 낮추어 패치 단위로 학습했다고 한다.
이건 알고리즘 한 번 더 돌리란 소리 같아서 약간 개소리 같은데

최종학습 되고 나면 depth가 있기 때문에 mask pixel들을 하나하나 multiview constraint가 맞는지 안맞는지 확인해서 보정할 수 있다는 것이다. 

그래서 mask를 좀 더 정확하게 깎을 수 있으면 inpainting 난이도도 줄어드니 성능이 좋아진다는 말.
-----
근데 source view에서 depth가 존재한다는 것은 이미 NeRF를 한 번 돌렸다는것인데 일반 NeRF를 한 번 돌려두라는 소리라서 너무 복잡해지는 듯...
데이터셋은 직접 만들어서 썼음.


반응형