https://lukashoel.github.io/text-to-room/

 

Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

We present Text2Room, a method for generating room-scale textured 3D meshes from a given text prompt as input. To this end, we leverage pre-trained 2D text-to-image models to synthesize a sequence of images from different poses. In order to lift these outp

lukashoel.github.io

다행이도 코드가 공개되어 있다.

2023년에 arXiv에 올라온 논문이다

 

앞서 올렸던 논문과 상당히 유사하다고 판단되어서 리뷰를 한다. (실제로 비슷한 시기에 발행되었다)

https://lime-juice.tistory.com/entry/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-SceneScape-Text-Driven-Consistent-Scene-Generation

 

[논문 리뷰] SceneScape: Text-Driven Consistent Scene Generation

SceneScape: Text-Driven Consistent Scene Generation SceneScape: Text-Driven Consistent Scene Generation POV, cave, pools, water, dark cavern, inside a cave, beautiful scenery, best quality, indoor scene POV, haunted house, dark, wooden door, spider webs, s

lime-juice.tistory.com

 

Introduction

중요한 design consideration

  1. Viewpoint를 어떻게 설정할 것인가
    • 논문에서는 미리 설정된 trajectory를 따라 넓은 scene content를 다룬다.
    • 그 다음 나머지 hole들을 채우기 위해 adative한 방식으로 viewpoint를 설정한다.
  2. 기존 mesh에 새롭게 생성된 scene content를 어떻게 합칠 것인가
    • 두 depth map을 align하여 자연스러운 scene 전환을 만들어 낸다.
    • 외곡된 texture을 가진 메시의 부분을 제거한다.

Contributions

  • 아무 text input으로부터 설득력 있는 texture와 geometry의 3D mesh를 생성한다.
    • 여기서 geometry는 explicit 3D representation의 종류인 mesh이며, texture은 2D image로 3D mesh를 감싸게 된다. 이후 논문의 mesh의 공식을 보면 알겠지만 mesh에 vertex color 즉 texture가 포함된다. 그래서 mesh와 texture을 매핑하는 mapping function이 필요 없다.
  • 2D text-to-image models과 monocular depth estimation(1개의 이미지만 입력)을 활용하여 frame을 3D로 변환하는 iterative scene generation을 한다. 제안된 depth alignmentmesh fusion steps를 통해 해당 논문은 seamless하고 왜곡되지 않은 geometry과 textures을 생성할 수 있다.
  • 두 단계로 구성된 맞춤형 viewpoint selection은 최적 위치에서 카메라 포즈를 샘플링하여 1) 먼저 방 배치와 가구를 생성한 다음 2) 남은 구멍을 메워 완벽한 mesh를 만든다.

Related Works

Text-to-3D

최근의 방법들은 대규모 text-image diffusion 모델과 neural radiance fields를 결합하여 training 과정 없이 3D 객체를 생성한다. 다른 접근 방식은 비슷한 text-to-3D 작업에 대해 custom diffusion models을 훈련시킵니다. 이와 달리, 해당 논문은 fixed text-image 모델을 사용하고 벽과 같은 다양한 객체와 구조 요소를 나타내는 전체 장면을 대표하는 3D mesh를 추출한다.

3D-Consistent View Synthesis from a Single Image

  • 객체의 neural 3D representation을 최적화하여 임의의 새로운 시점에서 볼 수 있게 하는 방법
  • Perpetual view generation을 수행하며, single RGB image로부터 forward-facing camera trajectory를 따라 scene을 묘사하는 비디오를 render-refine-repeat 패턴으로 합성하는 방법 --> SceneScape가 이 task를 수행한다.
  • 최근 연구에서는 text로부터 3D scene을 생성하지만 3D-consistent한 "zoom-out" 비디오 생성에 초점을 둔다. 대신, 해당 논문에서는 임의의 경로에서 완전하고 질감이 존재하는 3D room geometry를 생성

Method

 

해당 논문은 text로부터 3D mesh를 생성한다. 이를 위해 서로 다른 포즈에서 생성된 2D text-image 모델의 frame을 지속적으로 결합하여 joint 3D mesh로 만들면서 시간의 흐름에 따라 scene을 생성한다. 논문에서 제시하는 제시하는 핵십 아이디어는 두 단계로 이루어진 맞춤형 viewpoint selection이다.

(a) 먼저 scene layout과 객체를 생성한 다음 (b) 3D geomemetry에서 남은 hole을 채운다. 

 

즉, text, camera poses가 주어졌을 때  image를 generate하고 그 image로 부터 depth를 얻는다. 그리고 depth를 사용하여 mesh를 생성하는데 mesh에는 hole이 있기 때문에 그것들을 mask로 표현하고 generative model로 mask를 매꾼 뒤 다시 새로운 mesh를 얻는다. 마지막으로 새로운 mesh를 기존 mesh에 fuse한다. 

 

1. Iterative 3D Scene Generation

 

vertices의 N은  mesh의 point 개수를 뜻한다.

selected pose의 R^(3x4)의 3x4는 transformation matrix (rotation, translation)의 크기를 나타낸다.

 

  1. generation step t (iterative generation의 time step)마다 가장 먼저 novel viewpoint로부터의 현재 scene을 렌더링한다.
  2. 그 다음 fixed text-to-image model을 사용하여 text prompt에 맞추어 관찰되지 않았던 pixel들을 inpainting하여 채워 넣는다.
  3. 그 다음 monocular depth estimator을 사용하여 관찰되지 않았던 depth를 inpainting하여 채워 넣는다.
    • 보통 monocular depth estimator은 성능이 안 좋은데 여기서는 어떻게 잘 되었나 보다...
  4. 마지막으로 새롭게 생성된 content (inpainted image, inpainted depth,  image-space mask)를 합쳐 기존 mesh와 fusion scheme을 사용하여서 합친다.
    • 여기서는 camera position을 알고 있고 inpainted depth를 얻었으니 각 pixel의 depth를 알고 있다. --> point cloud
    • 그리고 이 point cloud를 기존 mesh에 합친다. (mesh는 color와 face가 있다는 것 빼고는 vertices 즉 points로 이루어져있기 때문에 point cloud에서 mesh로 넘나드는 게 쉽다. 물론 fusion scheme에서 image-level pixel을 world-level point cloud로 backproject하는 과정이 있기는 하다.)

 

위 process는 아래 그림에 해당된다. Inpainting 모델을 사실상 outpainting task에 사용하였다.

2.  Depth Alignment Step

  • Depth는 2D 이미지를 3D로 변환하기 위해서 사용된다.  따라서 정확한 depth map을 얻기 위해서는 얻어야하기 때문에 기존의 depth map과 새롭게 inpainting된 depth map이 잘 align되어야 한다. 즉, 벽이나 가구와 같은 유사한 영역은 비슷한 depth를 가져야 한다.
  • 새롭게 inpainting된 depth map을 바로 사용할 경우 후속 viewpoint (다른 이미지들)에서 깊이가 일정하지 않아 아래와 같이 3D geometry에서 불연속성을 초래할 수 있다. 앞서 monocular depth estimation의 성능이 좋지 않다고 언급하기도 했었다.

  • 이를 극복하기 위해 depth alignment를 2단계에 걸쳐서 진행한다.
    1.  Inpainting: GT depth for known parts와 inpainted RGB image를 입력 받아 align하여 refined된 depth를 예측한다.
      • GT depth = depth from previous camera pose
      • 여기서는 inpainting이라고 표현하였지만 정확히는 rendered depth (a)를 입력 받아 전혀 새로운 depth map을 예측하는 것이다.
    2. scale과 shift parameters을 최적화한다. 
      • 다른 카메라 view에서 나온 depth image에서 position이 일정하도록 하기 위한 추가적인 조치
      • predicted depth을 scaling한 후 shift한다.
  • 5x5 Gaussian kernel을 적용하여 새롭게 aligned된 depth map을 smoothing한다. 
    • 하지만, 뾰족한 texture들을 smooth out할 수 있는 단점이 있다. 여기서는 depth가 smooth해야 한다는 가정이 포함된 것 같다. (=prior)

alignment의 두번째 step

3.  Mesh Fusion Step

a) Mesh에는 triangle 즉 face를 가지고 있다. 그리고 각 face에는 normal vector가 있다. 

b) normal vector가 정확하지 않다고 판단되면 (viewing direction과 너무 작은 사영각을 이루거나 face의 edge가 너무 길 경우, 각도와 형태를 고려) 필터링한다. 이 2가지 조건도 저자가 정의한 prior라고 할 수 있다.

c) Mesh의 vertices를 연결하여 faces를 만들고 기존 mesh에 fusion한다.

  • new content: d_t (each pixel in depth image), I_t (corresponding color), m_t (mask)
    • new content(RGBD)를 point cloud를 변환한다. 
    • camara intrinsics = a bunch of numbers that represents the camera geometry
      • camera intrinsics를 3x3 matrix로 압축한다.
      • camera extrinsics는 카메라의 위치와 rotation이고, camera intrinsics는 extrinsics로 인한 이미지의 distortion이나 appearance이다.

(b)

저자에 따르면 예측된 depth에 존재하는 많은 noise가 stretched out faces를 만든다고 한다.

이를 제거하기 위한 2가지 필터를 제안한다.

  1. face의 edge length를 기반으로한 필터링
    • 특정 threshold를 정의하여 edge의 유클리디언 거리가 threshold보다 클 시

2. 특정 threshold를 정의하여 surface normal과 viewing direction과의 angle이 threshold보다 작을 시

  • i_0, i_1, i_2는 triangle을 만드는 3 points이다.
  • n = normalized된 (unit length) normal vector
  • v = normalized view direction
  • n^(T)V가 threshold보다 클 때 face set에 포함되게 된다. 

 

(c)

  • Inpainting에 사용된 mask를 주변으로 원래 mesh의 face에 연결한다. 이때 원래 mesh의 vertex points를 사용하는데 이는 이전 mesh가 GT라는 assumption때문에 그렇다. -> 이전 mesh에 문제를 고칠 수 없다는 문제가 있다. (이후 논문에서  문제를 해결해도 좋을 듯하다)

4. Two-Stage Viewpoint Selection

1st stage: Generation stage

  • 첫 번째 단계에서는 일반적인 레이아웃과 가구를 포함한 장면의 주요 부분을 생성한다. 이를 위해 서로 다른 방향으로 여러 개의 미리 정의된 경로를 순차적으로 렌더링하여 결국 방 전체를 커버하도록 한다.
  • Closed room 레이아웃을 만들기 위해 원점을 중심으로 scene을 생성하는 경로를 사용한다.
  • Prompt engineering을 통해 원치 않는 영역에 가구를 생성하는 것을 방지
    • 예) 바닥이나 천장을 바라보는 포즈의 경우, 각각 "바닥"이나 "천장"이라는 단어만 포함된 텍스트 프롬프트를 선택

2nd stage: Completion stage

  • Generation stage에서 layout과 가구가 정의되지만 충분한 포즈를 사전에 모두 정의하는 것은 불가능하다.
  • 이로 인해 관측되지 않은 구간에 구멍이 메시에 생기게 된다.
  • 이러한 구멍을 방지하기 위해 추가적인 camera pose를 샘플링한다. 
    • 가장 많이 관측되지 않은 픽셀을 보는 pose를 선택

  • completion stage에서 mask를 정돈하는 것이 중요하다. (text-to-image generation의 특성 때문에)
  • 따라서 작은 구멍들은 고전 inpainting 알고리즘을 사용하여 채워넣고 남은 구멍들을 팽창시켜 mask를 만든다.

  • 마지막으로 poisson surface reconstruction을 mesh에 실행하여 completion 후 여전히 남은 구멍을 메우고 discontinuity를 smoothing한다.  
    • Poisson Surface Reconstruction: 포인트 클라우드의 점들을 연결하고 부드러운 표면을 생성
  • 이를 통해 watertight mesh를 만들고 이는 고전적인 resterization 방법으로 rendering을 가능케 한다.
    • watertight mesh: 메시의 구멍이나 간격 없이 모든 면이 서로 균일하게 연결되어 완전히 닫힌 형태를 가지고 있는 메시
    • rasterization: 3D 모델을 화면에 투영하고, 각 픽셀에 대해 해당 픽셀이 어떤 삼각형의 일부인지를 결정하고, 조명, 그림자, 색상 등의 속성을 계산하여 2D 이미지로 변환하는 과정 --> redering 방법의 일종

Results

Baselines

텍스트로부터 textured 3D room geometry를 직접 생성하는 기존 baseline이 없다.

  • PureClipNeRF:  text-to-3D methods for generating objects
  • Outpainting: We combine outpainting from a Stable Diffusion model with depth estimation and triangulation to create a mesh from an 큰 viewpoint. After creating the image, we then perform depth estimation and triangulation to lift the image into a 3D mesh.
  • Text2Light: 텍스트로부터 RGB 파노라마를 생성한다. 파노라마에서 3D 메시 구조를 추정하는 것은 어렵기 대문에 관련된 접근 방식으로 room layout 추정, view synthesis 또는 360° depth estimation을 수행한다. depth estimation을 수행하고, 이후에 논문에서 제시된 mesh fusion 단계를 적용한다.
  • Blockade:  RGB 파노라마를 생성. 그런 다음 메시를 유사하게 추출한다.

Metrics

  • Inception Score (IS): 인셉션 점수는 생성된 이미지의 두 가지 주요 측면인 이미지 품질과 다양성을 측정. 이를 위해 ImageNet과 같은 큰 이미지 분류 데이터셋에서 사전 훈련된 인셉션-v3 합성곱 신경망을 특징 추출기로 사용
  • CLIP Score (CS): CLIP score는 이미지-텍스트 similarity에 대한 평가를 제공

Results

Limitations

  • 임계값 설정: 모든 stretched region을 감지하지 못할 수 있으며, 이로 인해 왜곡이 남을 수 있다.
  • 두 번째 단계 이후에도 일부 구멍이 완전히 채워지지 않을 수 있으며, 이로 인해  poisson reconstruction 적용 후에 지나치게 oversmoothed한 영역이 생길 수 있다.
  • 논문의 scene representation은 조명으로부터 texture을 분리하지 않으며, 이로 인해 그림자나 밝은 램프와 같은 효과가 포함되게 된다.
  • 여기까지는 논문에서 언급한 한계이고, 다른 한계로는 위에서 언급했 듯이 이때 원래 전 mesh가 GT라는 assumption때문에 이전 mesh에 문제를 고칠 수 없는 것이 있다. 만들어진 mesh들을 합쳐서 더 나은 mesh를 만드는 방법이 있었으면 좋겠다.

+ Recent posts

티스토리 친구하기