https://stable-diffusion-art.com/how-stable-diffusion-work/#Depth-to-image

 

How does Stable Diffusion work? - Stable Diffusion Art

Stable Diffusion is a deep-learning model. We will dig deep into understanding how Stable Diffusion work under the hood.

stable-diffusion-art.com

Novel view synthesis에서 자주 등장하는 depth에 대해서 공부할 필요성을 느꼈다. 가장 첫번째로 stable diffusion의 depth-to-image 기능을 알아보고자 한다.

Depth-to-image

Image-to-Image의 심화된 버전이라고 할 수 있다. (다만 depth이라는 condition이 한개 늘어났다 --> condition: input image + text prompt + depth map)

 

Step 1. Encoder로 입력 이미지를 latent space 상로 인코딩한다.

Step 2. Depth model인 MiDaS로 입력 이미지의 depth map을 예측한다. 

Step 3. Latent space 상의 이미지에 noise를 추가한다. (diffusion의 작동 원리를 보면 이해가 될 것이다.) 

Step 4. 간략하게 설명하자면, text prompt와 depth map에 condition을 두고 noise predictor을 사용하여 이전 noise를 추가한 image의 noise를 latent 상에서 예측한다.  

Step 5. Latent space 상의 이미지로부터 이전 단계에서 예측한 noise를 제거하여 새로운 latent  이미지를 획득한다. 

Steps 4 and 5은  number of sampling steps 만큼 반복된다. (이해가 가지 않는다면 diffusion model의 기전을 학습하기를 바란다.)

 

Step 6. VAE의 decode로 latent image를 decoding하여 depth-to-image를 생성한다.

그렇다면 text에만 conditioning하여 생성한 이미지보다 text+depth map에 conditioning하여 생성한 이미지가 더 좋은 점을 뭘까?

 

바로 subject와 배경을 분리하여 합성하는 것이 용이해진다는 것이다. 

 

text prompt: a photo of two men wrestling

위 사진을 보면 a photo of two men wresting이라는 text prompt가 주어졌을 때, img2img보다 depth2img가 denoising strength가 올라가도 원래의 composition을 잃지 않고 합성한다. 

 

또한 이러한 기능 말고도 이미지와 대응되는 depth map을 결합하면 입체 이미지를 획득할 수 있다 (여기에 포함하고 싶었지만....)

Abstract

 

우선 기존 논문들의 한계를 지적한다:

  • Differentiable rendering과 3D reasoning이 발전함에 따라 novel view synthesis에서 많은 성과가 있었다. 하지만 이러한 발전에도 불구하고 기존 논문들은 상대적으로 작은 view change만 다룬다는 한계가 있다.

  • Differentiable rendering:  미분가능한 rendering function을 제공하는 것이 목표이다.  미분가능한 rendering function은 많은 최적화 기법이 미분값을 사용하기 때문에 필요하며 예를 들어, gradient descent algorithm은 derivative를 사용하여 파라미터를 조정하며 신경망은 back propagation을 통해서 weights를 조정한다. 
  • 3D reasoning: 모델이 scene의 3D 구조를 이해하는 능력을 지칭한다. 
  • 3D rendering: 3D scene을 입력 받아 2D 이미지를 출력하는 함수 

이러한 한계를 극복하기 위하여 PixelSynth는 3D reasoning과 autoregressive를 결합하여 3D consistent manner로 large view change를 달성한다. 

 

Introduction

 

View synthesis와 autoregressive model의 한계를 지적한다.

  • Novel view synthesis
    • 한 single view의 여러 input views 사이를 interpolation하는 novel view synthesis에는 많은 발전이 있었다.
      • 이 중에서도 3D-aware한 모델들은 여러 각도 change에도 일관된 장소(?)의 결과를 보여준다. (예를 들어서 room에서 10도에서의 view와 20도에서의 view가 서로 다른 room을 보여주면 안 된다.)
      • 하지만 이러한 모델들은 input view에서 더 확장(extrapolation)하려는 시도를 하지 않는다.
    • Single image view synthesis에서 기존 모델들은 아주 조금의 rotation에만 확장할 수 있다. 
  • Autoregressive models
    • Autoregressive models는 이미지 확장에서 좋은 성능을 보이지만 이미지 바운더리 밖에서 생성된 영역의 일관된 3D world를 모델링하려는 시도가 없다. 

이러한 한계들을 PixelSynth논문은 3D reasoning과 autoregressive를 결합하여 극복한다. 즉, 기존 novel view synthesis의 3D reasoning에서의 강점과 autoregressive model의 이미지 확장 강점을 결합하여 각자의 한계을 보완했다고 할 수 있다.

 

PixelSynth의 결합 방법을 간략하게 설명하자면 다음과 같다.

  • extrapolation: autoregressive 모델 사용
    • 각 output view를 독립적으로 생성하면 일관되지 않은 결과가 생성되니깐 support set이라는 것을 사용.
      • Support views: novel view를 합성하기 위해서 참조하는 views. 논문에서는 intermediate views를 생성하기 위해서 먼저 support views를 생성한다. 
  • 3D consistency: Intermediate view들은 scene representation으로부터 re-render된다. (정확한 기전은 후술한다.)

Related Work

  • Novel view synthesis
    • Deep networks는 3D 정보를 depth image, multi-plane image, point cloud, voxel, mesh, multi-plane mesh, radiance field 등을 사용하여 표현한다. 
    • 해당 논문에서는 point cloud representation을 사용한다. 
      • point cloud representation은 간략하게 말해서 위치 정보를 가진 수많은 점들을 모아서 공간을 표현한 것이다. 위키피디아에 잘 정리되어 있다 (https://en.wikipedia.org/wiki/Point_cloud)
  • Image completion and outpainting
    • Autoregressive models는 각 픽셀을 sequential하게 예측한다. 
    • PixelSynth는 masked convolution approach를 사용하여 custom한 region을 outpaint한다.
      • Masked convolution은 kernel의 receptive field를 제한함으로써 local feature을 효과적으로 학습하는 데 도움을 준다. 특정 feature와 관련이 없는 영역을 가려내면서 네트워크는 더 정밀한 local information에 집중할 수 있다.

Approach

 

 

Summary: 위 그림처럼 PixelSynth는 external support views에 데이터를 생성한 뒤 point clouds 상에서 작동한다. 그 다음 autoregressive model을 사용하여 support views를 outpaint한다. Intermediate views를 reprojection하며 refinement module을 사용하여 결과를 개선한다. 그리고 그 과정에서 image들을 point clouds 상으로 self-supervised depth module을 사용하여 옮기고 다시 differentiable render을 사용하여 이미지로 되돌린다. 

 

  • 3D and Synthesis Modules

  • Depth module D
    • 주어진 이미지 I에 대해, 학습된 깊이 예측 시스템을 사용하여 이를 컬러 포인트 클라우드 C로 변환한다. 구체적으로, 픽셀 단위의 깊이는 U-Net을 사용하여 추론되며, 픽셀은 known intrinsics를 사용하여 3D로 매핑된다. PixelSynth reprojection loss을 통해 end-to-endfh depth module D를 학습한다.
  • Projector π
    • Depth module로 부터 얻은 C와 6DOF 포즈 p에 대해, Pytorch3D의 미분 가능한 렌더러를 사용하여 이미지 I = π(C, p)로 투영한다. 이 렌더러는 soft Z-버퍼를 사용하여 인접한 포인트를 혼합한다.
      • 6DOF (six degrees of freedom): 6개의 매개변수(translation:(x,y,z), rotation:(roll, pitch, yawn))를 사용하여 객체의 위치와 방향을 3차원 공간에서 표현하고 조작하는 방법. 6DOF 포즈를 정의함으로써, 객체를 좌표계와 관련하여 정확하게 위치시키고 방향을 조절할 수 있다.
      • z-buffer (or depth buffer):  3차원 장면에서 객체의 가시성과 깊이 순서를 결정하는 데 사용되는 기술. 각 픽셀의 깊이 값(카메라로부터의 거리)을 저장하는 2차원 배열이며 렌더링 중에 각 객체가 화면에 투영됨에 따라, 각 픽셀의 깊이 값은 Z-버퍼에 저장된 해당 값과 비교된다. 새로운 객체가 해당 픽셀에서 이전에 렌더링된 객체보다 카메라에 더 가까울 경우, 그 깊이 값은 Z-버퍼에 저장된 기존 값과 교체되어 해당 픽셀에서 가장 가까운 객체임을 나타낸다. Z-버퍼를 사용함으로써 객체를 올바른 깊이 순서로 렌더링하여, 가까운 객체가 먼 객체를 가리도록 할 수 있다.
  • Outpainter O 
    • viewpoint가 많이 변할 경우 생기는 large missing region을 채워 넣는 역할을 수행한다.
      • 위에서 언급한 specific region은 viewpoint 이동과 이미지 콘텐츠에 따라 결정된다.
      • image outpainting은 VQ-VAE의 latent space에서 수행된다.
        • VQ-Vector Quantized Variational Autoencoder (VAE)
          • VAE와 vector quantization을 융합한 생성 모델이다.
            • VAE는 비지도학습에 사용되는 구조로 learned latent space로부터 sample을 생성하는 것에 초점을 둔다 (encoder에 초점을 두는 AE와 차이)
            • VQ는 continuous 데이터를 latent space 상에서 유한한 개수의 discrete 벡터로 quantize한다.
            • VQ-VAE에서는 VAE의 latent space 상에 VQ가 적용된다.
          • VQ-VAE는 image generation에 있어서 여러 장점이 있는데 이건 나중에 찾아보도록 하겠다;;
      • O에서는 PixelCNN++ arhitecture을 사용해서 pixel 임베딩을 예측하고 locally masked convolution을 사용해서 image-specific custom-pixel ordering을 차용한다. 
        • 더 자세히 설명하자면, locally masked convolution은 각 이미지에 맞는 customized된 pixel의 순서를 정한다. Visible region에 가까운 정도를 기반으로 순서를 매겨 픽셀을 처리한다 . 
  • Refinement Module R
    • O이 많은 경우 불완전한 depth로 인하여 inconsistant하거나 디테일이 부족한 이미지를 생성하곤 한다.
    • 따라서 R을 사용해서 local errors를 수정한다.
    • reprojection된 원본 이미지와 outpainted된 픽셀들을 융합하여 입력 이미지의 잔여물을 예측한다. 

Inference

  • Inference에서는 다음과 같은 과정을 거친다: support view outpainting --> intermediate view rendering
  • Support View Outpainting and Refinement
    • single input image와 6DOF pose (P_1)를 입력 받아 업데이트된 point cloud (combined point cloud)를 얻는다. 
    • combined point cloud는 P_1에서 보이는 pixel들을 포함한다.

    • 첫번째로, 입력 이미지로 부터 얻은 point cloud c와 6DOF pose P_1 를 projection하여 support view (image) I'를 예측한다.

    • 위 figure처럼 projection 이후에는 (reprojection) image-specific gap이 생긴다. 

    • 두번째로, image-specific gap이 있는 이미지를 outpainting한 뒤 refinement module R에 입력한다.

    • 마지막으로, 결과적인 large-view synthesis를 Depth module D에 입력하여 point cloud 상으로 이동시킨다.
  • Intermediate View Rendering and Refinement
    • input image의 point cloud C와 앞서 구한 support view I'의 point cloud C_1을 사용하여 intermediate views p_i를 rendering한다.
    • 그 후 refinement module을 적용한다.

Experiments

  • datasets
    • Matterport3D
    • RealEstate10K (video)
  • evaluation metrics
    • Human A/B judgements
    • Frechet Inception Distance (FID)
    • PSNR and Perceptual Similarity
  • qualitative results

  • quantitative results

+ Recent posts

티스토리 친구하기