ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 논문 리뷰 SDPS-Net : 이미지로 부터 Normal map 얻기
    Study/ML 2021. 6. 28. 23:04

    논문 : https://arxiv.org/pdf/1903.07366.pdf

    Git : https://github.com/guanyingc/SDPS-Net

     

    guanyingc/SDPS-Net

    Learning Based Uncalibrated Photometric Stereo for Non-Lambertian Surface (CVPR 2019) - guanyingc/SDPS-Net

    github.com

     

     

     

    Normal map이란 3차원 컴퓨터 그래픽스에서 튀어나온 곳과 움푹 틀어간 곳의 빛을 왜곡시키는 기법으로, 범프 매핑의 구현체이다.  즉 Normal map에 대해 알아야지 특정 위치에서 광원의 반사 각도를 알 것이고 어떻게 보여주는지 결정하는게 큰 역할을 한다.

    노말맵 예시  출처 : wiki.polycount

     

     

    그래서 이미지로부터 Normal map을 아는것은 컴퓨터비전에 있어 아주 중요한대, 임의의 자연에서 얻은 사진으로 부터 Normal map을 알아내는것을 쉽지 않은 일이다. 그래서 어떠한 객체를 여러 광원으로 찍은 이미지로부터 Normal map을 알아내는 SDPS-NET 모델을 소개하고자 한다.

    SDPS-NET은 하나의 객체를 여러 광원으로 찍은 이미지와 mask 이미지를 input으로 받고 최종적으로 normal map 이미지를 output으로 생성하는 딥러닝 모델이다. 이 과정은 하나의 모델이 이어서 진행하는것이 아닌 2개의 모델로 나누어서 진행된다. 아래 사진은 SDPS-NET의 모델 전체 사진이다. 이미지로부터 각 이미지의 광원의 정보 (각도, 세기)를 알아내는 LC-NET 모델과 그렇게 얻은 광원의 정보와 이미지로 부터 Normal map 이미지를 얻어내는 NE-NET 모델 2가지로 이루어져 있다. 아래 이미지에서 (a)가 LC-NET에 해당되고 (b)가 NE-NET에 해당된다.

     

     

    # LC-NET

    LC-NET은 결과적으로 광원의 정보각도와 세기를 output으로 내놓는다. 근데 광원의 정보를 연속적인 값으로 생각하는것보다 이산적인 값으로 생각하고 classify 문제로 접근하면 더 손쉽게 접근이 가능하다. 즉 광원의 x-y평면 각도를 0~10도, 10~20도 .... 처럼 분류 문제로 접근하는 것이다. 그래서 LC-NET은 빛의 정보를 이산적인 값으로 취급하고 광원 정보를 추측하는것을 classify 문제로 접근하였다.

     

     

    이미지는 LC-NET에서 2가지 단계를 거치게 된다. 첫번째 단계는 feature 를 추출하는 feature extractor와 classfier 단계이다. classfier 단계는 앞에서 이야기 하였듯이 분류한 광웑의 정보를 내놓는 단계이고 앞단계인 feature extractor는 여러 이미지를 처리하기위한 단계이다. 여러 이미지들을 동시에 input으로 받고 여러 convolution layer로 이루어진 feature extractor를 거쳐 feature 값을 얻는다. 모든 이미지들의 feature를 max-pooling 방법을 통해 하나로 합쳐 global-feature를 얻는다. 그리고 각 이미지의 feature과 global-feature를 concat으로 이어준 값은 classfier 단계의 input이 되는것이다.

     

     

    #NE-NET

    NE-NET도 LC-NET과 크게 다르지 않다. LC-NET의 output을 convoultion-layer를 지나게하는 FeatExtractor 과정을 거치고 각 output을 마찬가지로 max-pooling 기법으로 하나로 합쳐준다. 이 하나로 합쳐준것으로 최종 normal map을 추측하는 과정을 거친다.

     

     

     

     

    위는 여러 다른 모델들과 비교하였을때 나온 benchmark 결과표이다. 다른 모델들에 비해 뛰어난 성능을 보이지만 비교 대상인 모델들이 대부분 오래된 모델임을 고려했을때 크게 좋다고 볼수만은 없는것 같다. 

     

    내가 생각하는 이 모델의 단점으로는 앞에서 말했듯이 여러 이미지들을 동시에 input으로 올리게 때문에 GPU 메모리에 많은 부담이 간다. 그래서 전체 모델의 파라미터가 그렇기 크기 않아도 (400백만) GPU에 모델이 올라가지 않아 에러가 뜨는 경우가 많다. 그리고 딥러닝이 그렇지만, 논문을 다 읽어봤을때 각 사용한 기법에 대한 근거는 명확히 제시되어있지 않았다. testdata에 대해 성능을 때려맞춘것처럼 느껴진다.... ㅡㅡ 

     

    개선방법으로는 일단 depthwise convolution을 적용하여 전체 파라미터를 줄이고 inverted bottleneck, residual block 등 covolution 블록의 학습을 높일수 있는 기법을 사용하면 보다 benchmark가 향상될 것이라 생각된다.

     
     
     
     

    댓글

Designed by Tistory.