GenRecon: Bridging Generative Priors for Multi-View 3D Scene Reconstruction

GenRecon: Bridging Generative Priors for Multi-View 3D Scene Reconstruction
  • 2605 arxiv
  • 뮌헨 공대와 화웨이 스위스
  • reconstruction without learned priors
    • colmap, mvs, nerf, monosdf, 3dgs 등
    • 특징은 이미지에 실제로 보이는 정보만 사용한다는 것
    • 장점: metric acc 좋고, hallucination 좋음
    • 단점: 안 보이는 영역은 못 채움, sparse view에는 약함, occlusion에 약함
  • reconstruction with learned priors
    • vggt, dust3r, mast3r, depth anything 3
    • 특징: 이미 학습된 geometry prior 사용 - feed forward로
    • 장점: 관측 부족한 부분도 어느정도 복원
    • 단점: 결국 regression이기 때문에, 진짜 안보이는 부분을 생성 못함
      • 멀티뷰라서 gt가 많음 → gt를 최대한 맞추는데 학습이 집중됨
  • generative prior 기반
    • trellis, hunyuan3d 등
    • 특징: 3d 생성 모델의 prior 사용
      • latent distribution을 학습하는 것이 목표
    • 기존 object level의 생성 모델을 scene level로 확장, multi view로 확장

Method

  • overview
    • 입력: sparse, unordered N개의 posed rgb 이미지들, 카메라 intrinsics와 extrinsics
    • 출력: scene-level의 메쉬, pbr material
    • 본 방법은 멀티뷰 recon과 강한 3d 생성 prior를 엮어서 사용 → 씬 복원을 씬을 커버하는 겹치는 씬 청크들을 생성하는 방법으로 치환함
    • 3d prior로 Trellis.2를 사용 → 이건 object-level 3d prior이라서, 씬 청크 생성에 기반한 **멀티뷰 conditioning**을 도입함
  • 전체 흐름

    image.png

    • 입력 이미지들에서 카메라 포즈와 sparse point cloud 얻기
      • colmap
      • 학습 시에는 posed rgb 이미지를 사용함 (camera intrinsics와 extrinsics 존재)
    • scene을 청크 단위로 분할

      gpt 생성 이미지

      • 하나의 청크는 고정된 사이즈 ([0, L]^3)
      • 이 청크는 해당 청크를 바라보는 입력 view의 집합과 연관됨 (해당 청크가 보이는 view)
      • 청크끼리는 일부 겹침 → 경계를 자연스럽게 잇기 위함
      • Scene ├── Chunk 1 │ ├── Voxel │ ├── Voxel │ └── … ├── Chunk 2 │ ├── Voxel │ └── … └── …
    • 3d 생성 모델의 입력: {(In, Kn, T⁻¹n Tc)}n∈Vc
      • In : n번째 RGB 이미지
      • Kn : 카메라 intrinsic
      • Tn : n번째 카메라 pose
      • Tc : chunk 위치 (world 좌표에서 어디 있는지)
      • T⁻¹n Tc : chunk 위치를 현재 카메라 기준으로 변환해서 이 이미지에서 이 청크가 어디 보이는지를 알려줌
      • 어떤 카메라가 특정 청크를 보는지 결정 → 그 카메라들만 사용해서 T⁻¹n Tc 결정
        • 어떤 카메라가 특정 청크를 보는가?
          • chunk bbox 8개 corner → projection → 일부라도 image 내부인가?를 통해 확인함
    • DINO 피처 추출
      • 입력 이미지(해당 청크가 보이는/앞에서 구한)의 DINO 피처를 추출
      • 이 피처맵에서 해당 복셀이 보이는 영역에 해당하는 부분을 추출
        • 각 복셀이 이미지 피처맵의 어디에 해당하는지 구함
        • “이 voxel이 이미지 몇 번째 픽셀에 보이는가?”
        1
        2
        3
        4
        5
        
          Voxel A
            projection
          피처맵의 (120,80) 위치
            lookup
          DINO feature
        
        • 2d feature가 3d 공간으로 올라가는 2d → 3d lifting
      • 해당 청크가 보이는 멀티뷰를 사용하므로 멀티피처가 구해짐
    • multi-view aggregation
      • 여러 뷰의 피처를 하나로 합침
      • IBRNet-style
      • 먼저 멀티뷰 피처의 평균과 분산을 구함
      • 각 멀티뷰 피처마다 mlp에 (멀티뷰 피처 i, 평균, 분산) 을 넣음 → _보정된 피처_를 얻음
      • mlp는 보정된 피처를 얻는 mlp와 신뢰도를 얻는 mlp 2개로 이루어짐
      • weight x 보정된 피처의 sum + 평균 피처로 최종 피처를 구함
        • 최종 피처 = μ + Σ αi f’i
      • residual connection 방식으로 처음에는 zero-초기화 → 평균부터 학습 시작

      _**→ 품질이 좋은 뷰는 많이 반영하고, 품질이 안좋은 뷰는 적게 반영하도록**_

    • trellis에 conditioning
      • trellis.2 → sota 3d shape gen model
        • coarse occupancy를 예측한 다음, shape과 pbr texture를 생성하는 방식
      • 본 연구에서는 single unposed image를 입력으로 받는 trellis를 scene recon에 맞게 조정함 → **multi-view를 인식하고, multi-view가 하나의 일관된 set으로 들어가도록, 생성된 결과를 전체 좌표계 상에서 배치할 수 있도록**
      • 기존 trellis는 image → cross attn → 3d generation
      • 3d condition grid → dit block마다 residual injection → flow denoising
        • 각 복셀별로 대응되는 피처를 넣음
      • residual injection
        • h (hidden vec) = h + condition
    • 학습
      • lora 사용, 나머지 trellis weight는 frozen
      • 합성 씬 데이터로 학습 - gt chunk latent랑 생성된 청크 사이의 차이 학습
  • 추론 과정
    • 입력: 순서 없는 rgb 이미지의 집합
    • 출력: scene-level pbr mesh
    • scene calibration and chunking
      • 이미지의 pose를 모르기 때문에 sfm (colmap)을 돌림 → camera intrinsic과 extrinsic, sparse point cloud를 얻음
      • 이 sparse point cloud에 outlier 필터링을걸음
      • scene의 공간적 범위 B를 추정함
      • B를 가지고 장면을 청크로 분할함 - cube, 월드 좌표계로 돌아올 수 있는 translation matrix
      • 이웃한 청크는 조금씩 겹치게 해서 생성할 때 연결성 유지 - 경계에서 geometry가 끊어지지 않도록
    • global 3d conditioning
      • 매번 피처 lifting을 해서 복셀의 피처를 구하지 않음
      • 멀티뷰 이미지들을 dino 피처를 먼저 구하고, 3d lifting을 통해 voxel에 매핑하고, 각 voxel은 멀티뷰 피처를 aggregation한 global conditioning grid G를 구축함
      • occupancy 생성 시에는 낮은 해상도를 가지고 dense함 → 0 or 1
      • shape, texture 생성 시에는 더 높은 해상도를 가지고 sparse함 - 유효 복셀만 보기 때문, 디테일을 포착하기 위해서 높은 해상도 사용
    • joint chunk generation

      1. 현재 step의 Global latent zt 유지

      2. 각 chunk 영역을 crop (z(A), z(B), z(C), …)

      3. 각 chunk에 대해 TRELLIS denoiser 수행 (z(A) → ẑ(A), z(B) → ẑ(B), z(C) → ẑ(C))

      4. 다시 Global latent로 merge

        • overlap 영역: 여러 chunk 예측의 평균
        • boundary voxel: 평균 계산에는 참여 X, 평균 결과로 업데이트는 O
      5. 새로운 Global latent zt-1 생성

      6. 다음 denoising step 반복

This post is licensed under CC BY 4.0 by the author.