바깥 view를 생성하는 가장 대표적인 novel view synthesis 모델이라고 할 수 있다.

2020년 CVPR에 등재되었다.

 

Introduction

기존 방법들의 한계:

  • multiple views
    • occluded object를 추적하는 데 좋음
    • But applicability가 떨어짐 (여러 view에서 사진 찍어야 됨)
  • training a convolutional network to estimate depth from images 
    • single-image view synthesis가 가능해짐 --> 왜 그런지에 대한 추가 조사 필요
    • GT depth map이 학습에 필요함, 더불어 학습된 데이터가 실내면 실외에서는 성능이 안 좋음 (lack of generalization)
  • utilzing 3D-aware intermediate representations 
    • 학습 동안에 3D information을 사용하지 않음
      • 3D information와 3D-aware intermediate representation의 차이에 대해서 궁금해서 search를 해보았지만 정확한 정보를 얻을 수 없었다. 나의 뇌피셜이지만 두 정보의 차이는 3D cordinates 같은 full 정보를 encoding하느냐  아니면 voxel이나 point cloud처럼 3D 구조의 일부 정보를 indirectly하게 포함하느냐인 것인 거 같다.  (partiality of 3D information) --> 확인 필요
    • 대신, end-to-end 생성 모델과 3D-aware intermediate representations을 사용하여 image supervision만으로도 학습이 가능
    • single object로 이루어진 합성 scene에 대해서 좋은 성능을 보임
    • 하지만 복잡한 real-world scene에 대해서는 낮은 성능을 보임

SynSin은 end-to-end modelGT 3D supervsion 없이 학습이 가능함. 더불어 3D scene sturucture을 high-resolution point cloud로 표현함.

  • point cloud는 "3D 공간에서 점의 모음으로 3D 장면이나 객체를 나타내는 3D-aware intermediate representation" 으로 https://23min.tistory.com/8에 잘 정리되어 있다.
  •  

 

 

 

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

Receptive Field (=Field of View)

  • 아래 그림처럼 input space에서 특정 layer의 feature에 영향을 끼치는 영역을 뜻한다.
  • Receptive field는 window를 sliding하면서 image에서 중요하고 연관성이 높은 영역을 모두 포함하여야 하는데, 이는 neural network는 receptive field 외의 영역에 대하여 정보를 추출하지 못하기 때문이다.

CNN vs Transformer

  • 논문을 읽다보면 종종 transformer의 receptive field가 크다는 내용을 접할 수 있다. 따라서 큰 receptive field를 유지해야 한다면 transformer를 사용하는 것이 바람직하다. 하지만 왜 두 encoder의 receptive field에는 크기 차이가 존재하는 걸까?
  • 해답을 알기 위해서는 두 네트워크의 특성을 알아야 한다.
    • Convolutional Neural Network (CNN)
      • CNN은 여러 convolutinoal layer을 사용하여 입력 데이터로부터 spaial feature을 추출한다. 각 layer은 kernel을 사용하여 특정 영역의 feature map을 추출하는데 여러 layer로 겹겹히 쌓으므로써 CNN은 receptive field size를 점차적으로 늘릴 수 있다. (위 figure 참고) 
      • 이를 hierarchial feature extraction이라고 하는데 early layers는 작은 receptive field에서 local feature들을, deeper layers는 더 큰 receptive field로 정보를 합친다. 이러한 과정은 CNN으로서하여금 local과 global spatial information을 합침으로써 complex pattern을 학습할 수 있도록 해준다. 
    • Transformer
      • Transformer는 sequential data를 다루는 모델으로 CNN과 다르게 convolution을 사용하지 않는다. 그 대신 self-attention 매커니즘을 사용하는데 한 sequence (문장)의 한 token (단어)이 sequence 내의 모든 token에 "attend"하는 방식이다. 여기서 "attend"란 한 sequence 내의 다른 요소에 중요도 또는 weight를 매기는 행위를 뜻한다. 따라서 지엽적인 관계를 다루는 CNN과 달리 transformer는 sequence 내 요소들의 long-range interaction과 global dependency를 다룰 수 있다.
      • Transformer에서는 입력 sequence의 모든 위치가 출력 sequence의 모든 위치에 영향을 끼치기 때문에 입력 sequence를 모두 cover하는 receptive field를 가질 수 있다. 
  • 요약하자면, Transformer는 입력 sequence의 모든 element간의 interaction을 모델링하여 global dependency를 capture하기 때문에 CNN 보다 receptive field가 크다. 


'AI 배경지식' 카테고리의 다른 글

Transformer와 Autoregressive 생성 모델  (0) 2025.04.06
벡터 사이의 거리, 각도 계산  (0) 2021.08.19
벡터와 행렬 기본 개념  (0) 2021.08.19

가정

  • non lamertian surface를 처리할 수 있음
  • 고정된 카메라와 single lighting을 가정하고 있음
    • single lighting은 이전 photometric stereo 모델들의 실험환경으로 어두운 환경에서 한 방향의 광원을 사용하여 입력 이미지를 캡쳐함
  • 고정적이지 않은 개수와 순서의 입력 이미지를 처리할 수 있음
  • Training과 testing 과정에서 미리 정의되지 않은 light direction 정보를 사용

실험 환경

  • Orthograpic projection
    • 면적 형태의 빛일 때 면적이 평행인 경우를 뜻함
    • Orthograpic 하지 않은 projection의 경우 면적 빛이 마름모꼴을 가짐
  • Directional lights
    • 정확한 정의는 광원이 무한히 멀리 떨어져 있다고 가정하고 평향한 광선을 쏘는 빛임. 대표적으로 태양광선이 있음
    • 하지만 photometric stereo 논문들에서는  빛의 방향을 특정할 수 없는 natrual lighting 의 반대개념으로 빛의 방향이 명확한 illumination을 뜻하는 것으로 유추됨
  • Viewing direction pointing towards the viewer
    • 해당 조건이 결과에 무슨 의미를 가지고 있는지는 아직 모름

특징

  • 학습기반이 아닌 photomeric stereo 모델들은 image formation model에서 BRDF를 추정하여 이를 iversely하게 풀어 surface normal을 계산하였음. 반면 학습 기반의 모델은 빛의 방향과 세기를 surface normal과 직접적으로 매핑하여 surface normal을 계산함
  • 모델 구조는 multi-branch siamese network임
    • Multi-branch CNN 예시

  • siamese network 예시

  1. Shared weight feature extraction
    • 3 차원의 이미지와 q개의 light direction을 입력 받음. 이때 light direction은 1차원이지만 이미지와 같은 모양을 갖도록 3차원으로 변형됨. 
    • 각 입력 이미지에 대하여 feature map을 생성
    • 이때 CNN을 사용하여 feature을 추출하므로써 다양한 크기의 이미지를 입력으로 받을 수 있음
  2. Fusion layer
    • 다양한 개수의 이미지를 입력 받기 위한 방법으로 RNN을 사용할 수도 있음. RNN은 한번에 이미지를 입력 받는 것이 아니라 sequentially하게 이미지를 입력 받기 때문. 하지만 RNN은 순서의 영향을 받기 때문에 order agnostic하게 이미지를 처리할 수 없음
    • 다른 대안으로 order agnostic property를 가지고 있는 max-pooling과 average pooling이 있음.  
      1. max-pooling
        • 가장 salient한 정보를 추출함. 
      2. average-pooling
        • salient하거나 활성화되지 않은 feature들을 smooth out

    3. Normal Regression Network

  • 이전 단계에서 추출한 feature map을 사용하여 surface normal을 예측
  • normal regression layer은 CNN layer로 이루어져 있음

 

 

Contributions

  • Atbitrary lighting에서 캡쳐한 이미지들로 normal map을 생성할 수 있는 모델을 생성
    • Arbitary lighting은 실내 환경과 유사한 다양한 광원 환경을 뜻함
    • 기존 photometric stereo 모델들은 어두운 환경에서 single lighting을 가정하고 이미지를 캡쳐함. 하지만 이러한 이미지는 얻기도 어렵고 접근성이 떨어짐
    • 따라서 저자는 arbirary lighting에서도 높은 성능을 보이는 모델을 개발하므로써, 이러한 한계를 극복하고 photometric stereo의 유용성(usability)를 개선

 

 

'Photometric Stereo' 카테고리의 다른 글

Photometric Stereo 배경지식 정리  (0) 2022.09.16

Photometric Stereo

  • 3D computer vision problem (stereopsis, surfaces reflectance estimation 등)의 한 종류
  • Different illumination에 따른 object의 appearance variation 으로부터 surface normal을 추론

Material properties

  • Object를 이루는 것으로 object의 appearance를 결정하는 요소 중 하나

  • 위 그림처럼 동일한 camera 각도, illumination, sphere shape에도 물구하고, mateiral이 다르기 때문에 sphere마다 다른 appearance를 가짐
  • Material의 따라 빛을 받고 이를 다시 반사시키는 방향 (=Surfance reflectance)이 상이함

Surface Reflectance

  • Viweing direction과 illumination(=reflection) direction로 나타낼 수 있음

  • direction은 위와 같이 나타낼 수 있음

  •  따라서 surface reflectance도 위와 같이 표현할 수 있음

Bidirectional Reflectance Distribution Function (BRDF)

  • 다양한 material의 reflectance property를 나타내는 간단한 방법
  • Viewing direction과 illumination direction이 중요하기 때문에 bidirectional이라고 지칭

  • Surface reflectance의 2가지 direction의 ratio로 BRDF를 표현할 수 있음. 더 자세하게 표현하자면 BRDF는 theta 방향의 irradiance로 인한 r 방향의 radiance임
    • irradiance: 모든 방향에서 단위 면적으로 입사하는 복사량
    • radiance: 한 지점에서 특정 방향으로의 투영면적당 단위 입체각당 복사량

  • non-negative한 특징과 helmoholtz reciprocity한 특징을 가지고 있음
    • 각 방향(radiance이든 irradiance이든)은 non-negative하기 때문에 BRDF도 non-negative함
    • Irradiance와 raidance를 맞바꾸어도 brightness은 동일하기 때문에 helmholtz reciprocity함
  • BRDF는 4가지의 방향이 입력되기 때문에 4D 함수임. 하지만 Isotropic surface에서는 BRDF는 3D로 표현될 수 있음 

 

Isotropic Surface

  • Rotationally symmetric reflectance라고도 지칭
  • Surfance normal에 따라서 surface를 rotate하였을 때, 관심 point의 brightness의 값이 변하지 않을 때, rotationally symmetric하다고 부름

Global Illumination

  • Indirect lighting을 simulate하는 과정을 지칭함
  • 투과되는 빛도 다른 서피스를 위한 광원으로 사용될 수 있음. 이렇게 서피스에서 반사되거나 굴절되는 모든 빛을 새로운 광원으로 삼는 것을 global illimination이라고 지칭

  • direct light = 광원에서 표면으로 직접 들어 온 빛
  • indirect light = 표면에 들어 온 빛이 반사되어 새로운 광원처럼 사용되는 빛

Lambertian Surface

  • 어느 방향에서 보아도 brightness가 동일한 surface
  • 물체 표면의 brightness가 isotropic함. 예를 들어서 원목 재질은 각도에 따라서 밝기가 일정하기 때문에 isotropic하다고 볼 수 있음. 반면에 폴레우리탄 처리가 된 원목은 매끔한 표면을 가지고 있어 광원의 위치에 따라 거울면과 같은 highlight가 보이게 됨. 이는 isotropic하다고 볼 수 없음

Lambertian Cosine Law

  • Lambertian cosine law에 따르면 어떠한 빛이 들어오는 각도에 따라 반사되는 빛의 intensity가 다름
  • cos theta의 값의 분포는 반구 형태를 띄고 있기 때문에 0~90 사이에서 값이 형성
  • theta가 벌어질 수록 빛의 intensity가 작아짐

 

Isotropic Reflectance

  • Surface normal을 기준으로 한 빛 반사가 방향에 의존적이지 않음
  • 물체의 surface의 빛 반사가 surface normal을 주변으로 고르게 분포되어 있음. 따라서 물체가 회전하여도 view 위치가 고정되어 있다면 illumination은 일정

Anisotropic Refelctance

  • Surface normal을 기준으로 한 빛 반사가 방향에 의존적임
  • 물체의 surface에 따라서 빛 반사가 surface normal을 주변으로 고르지 않게 분포되어 있음. 따라서 물체가 회전할 때 view 위치가 고정되어 있더라고 illumination은 일정하지 않음

Diffuse Reflection

  • 빛 반사의 한 종류로 빛이 한 각도에서 surface에 도달하였을 때, 다양한 각도에서 확산해서 어떤 방향에서도 비교적 균등한 intensity로 볼 수 있음
  • 동일한 세기의 빛이 모든 방향으로 고르게 반사되기 때문에 카메라를 어떤 곳에 놓던지 p 점의 색상은 동일하게 보임. 이러한 난반사는 표면의 재질에 따라 결과가 달라질 수 있다.

Specular Reflection

  • 빛 반사의 한 종류로 빛이 한 각도에서 surface에 도달하였을 때, 입사되는 각도의 반사각에서만 빛을 볼 수 있음

Albedo

  • 빛이 표면을 닿았을 때 반사하는 빛의 양을 뜻함
  • 0과 1사이의 값을 가짐
  • 0의 값에 가까울 수록 material은 들어오는 빛을 대부분 흡수하게 됨
  • 1의 값에 가까울 수록 material은 들어오는 빛의 대부분을 반사하게 됨
  • 주로 햇빛의 diffuse reflection을 측정한 값에 사용됨

 

 

from skimage.io import imread
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.transform import resize
import imquality.brisque as brisque
import numpy as np
import os


Psnr = []
Ssim = []
bri=[]
index = 1

files = os.listdir(사진 목록 경로)
for file_ in sorted(files):
    # 원본
    im1 = imread(원본 사진 경로 + file_)
    im1 = resize(im1, (256, 256))
    # 예측
    im2 = imread(예측 사진 경로+ file_)
    im2 = resize(im2, (256, 256))

    # 계산
    try:
        Ssim.append(ssim(im1, im2, multichannel=True))
    except:
        im1 = np.stack((im1,)*3, axis=-1)
        # print(im1.shape, im2.shape, file_)
    Psnr.append(psnr(im1, im2))
    bri.append(brisque.score(im2))

    if np.mod(index, 100) == 0:
        print(
            str(index) + ' images processed',
            "PSNR: %.4f" % round(np.mean(Psnr), 4),
            "SSIM: %.4f" % round(np.mean(Ssim), 4),
            "BRISQUE%.4f" % round(np.mean(bri), 4)
        )
    index += 1


print("FINAL",
    "PSNR: %.4f" % round(np.mean(Psnr), 4),
    "SSIM: %.4f" % round(np.mean(Ssim), 4),
    "BRI: %.4f" % round(np.mean(bri), 4)
)

Brisque를 계산하면서 ValueError: the input array must have size 3 along `channel_axis`, got (~~~) 이런 에러가 발생할 수 있다. 그럴 때는 brisque.py 파일의 line 45를 다음 코드로 대체하면 된다.

 

if self.image.shape[-1] == 3:
    self.image = skimage.color.rgb2gray(self.image)

 

https://github.com/dvlab-research/outpainting_srn

 

GitHub - dvlab-research/outpainting_srn: Wide-Context Semantic Image Extrapolation, CVPR2019

Wide-Context Semantic Image Extrapolation, CVPR2019 - GitHub - dvlab-research/outpainting_srn: Wide-Context Semantic Image Extrapolation, CVPR2019

github.com

옛날 코드이다 보니 tensorflow로 implemeted되어 있다....

 

CUDA 10.1에서 tensorflow-gpu==1.15.0을 사용하기 위해서는 다음 코드를 실행

(tensorflow-gpu==1.15.0에서는 CUDA10.0을 요구)

conda install cudatoolkit=10.0
conda install cudnn=7.6.5

 

python 3.7

tensorflow_gpu-1.15.0

opencv-python

scipy

easydict

+ Recent posts

티스토리 친구하기