일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 인공지능
- brew 권한
- 컴퓨터 보안 키분배
- 협업필터링
- cs231n
- feynman's restaurant
- Git
- 파이썬
- Readme image
- image restoration
- rust
- 페이지랭크
- 머신러닝
- 인페인팅
- 자바스크립트 비동기
- tcp
- Hits
- 커널생성
- 파인만의 식당문제
- 비동기 프로그래밍
- 메세지인증코드
- 키분배 알고리즘
- react-cookie
- computer vision
- pagerank
- 러스트
- 커널제거
- 딥러닝
- 프라미스
- recommender
- Today
- Total
Worth spreading
Image inpainting with GAN [논문참조] 본문
" 이 글은 Semantic Image Inpainting with Deep Generative Models 논문을 참조해 작성한 글입니다. "
다음 이미지들은 이 논문의 코드를 이용해 나와 지인들의 얼굴 그리고 논문에서 제공한 데이터셋의 얼굴들을 Inpainting한 결과이다.
랜덤으로 노이즈를 준 경우는 굉장히 좋은 결과를 보여준다. (포이즌블랜딩을 하고 안하고의 차이가 꽤나 있었다.)
반면 왼쪽을 통째로 날려버린 경우는 부드럽지만 원본과 차이가 있는 결과를 보여주었다.
이 글에서는 GAN을 이용해 위와 같은 결과를 얻어 내는 방법에 대해서 알아볼 것이다.
Image inpainting
with GAN
1. Introduction
Image inpainting은 긴 기간동안 수많은 학자들로부터 연구된 유서 깊은 분야이다. 이미지의 특징들을 추출해 가려진, 혹은 보이지 않는 부분을 복원,생성해 낸다는 개념의 inpainting은 편미분을 이용해 원하는 부분 주변의 기울기를 찾아내 그 방향성을 가지고 이미지를 만들어 내는 방법이 주로 사용되어왔다. 그러던 중 2014년 Ian Goodfellow가 Generative Adversarial Networks(일명 GAN)라는 머신러닝 기반 이미지 생성 모델을 제안했고 이후 GAN은 이미지처리 분야에서 가장 많이 연구되고 있는 이론 중 하나가 되었다. 생성자(Generator, 이하 G)와 구별자(Discriminator, 이하 D)로 구성된 GAN은 이미지 데이터로부터 추출한 특징들을 이용해 실제와 유사한 이미지를 생성해 내는 것이 목표다. 우리는 이러한 GAN의 특징을 inpainting에 적용해보고자 한다.
2. GAN
그 전에 GAN이 무엇인지를 알아보자. GAN은 이미지처리 분야에서 주로 사용되는 딥러닝 알고리즘의 한 종류로 실제 존재하는 이미지 데이터를 학습해서 새로운 이미지를 만들어 내는 알고리즘이다.
전체적인 구조는 아래의 그림과 같이 Generator와 Discriminator를 경쟁적으로 학습을 시켜 Generator가 만든 데이터가 진짜인지 가짜인지 구별하기 힘든 수준까지 발전시키는 구조이다.
3. Training GAN
Discriminator는 실제 학습 데이터와 Generator가 만든 가짜 데이터를 이용해 학습을 하며 입력데이터가 진짜인지 가짜인지 구별하는 역할을 하며 Generator는 실제 데이터의 확률밀도를 이용해 가짜 데이터를 만들어 내는 역할을 한다. 이 둘은 서로 경쟁적으로 학습을 해 결국 Generator는 Discriminator를 속일 수 있을 정도의 가짜 데이터를 만들어 낼 수 있게 되며, Discriminator 또한 진짜/가짜를 판별하는 능력이
점점 개선된다.
그런데 GAN은 하나의 cost function만 관리하면 되는 기존의 뉴럴넷들과 다르게Generator과 Discriminator 두 개의 function을 관리해줘야 한다. 그렇기 때문에 학습은 다음과 같은 2단계로 진행된다.
1) Generator는 고정 시키고 Discriminator를 학습 시킨다. Discriminator는 어느 것이 진짜이고 어느 것이 가짜인지 이미 알고 있기 때문에 기존의 뉴럴넷의 지도학습(supervised learning)과 동일한 방식으로 학습 시킬 수 있다.
2) Discriminator는 고정 시키고 Generator를 학습 시킨다. Generator는 Discriminator를 속일 수 있는 방향으로 학습 시킨다.
위 과정을 반복적으로 수행하다 보면 Discriminator와 Generator가 내쉬 평형상태에 도달하게 된다. 그런데 이러한 내쉬평형에 이르기 위해서는 Discriminator와 Generator가 서로 협동적으로 학습이 돼야 하는데 이것이 까다롭기 때문에 GAN의 학습은 안정성이 떨어진다.
또한 이것이 최적이라는 것을 판단할 명확한 기준이 부족하기 때문에 사람의 개입이 어느정도 필요하다.
이러한 결함에도 불구하고 GAN이 보여주는 결과는 이전의 Generative 알고리즘들에 비해 좋기 때문에 점점 더 많은 연구자들이 GAN 연구에 도전하고 있다.
4. Inpainting with GAN
우리는 이러한 특징을 가진 GAN을 Inpainting 문제에 적용시킬 것이다. 그런데 GAN을 inpainting에 직접 적용할 수는 없다. 왜냐하면 GAN이 생성하는 이미지는 랜덤이미지이기 때문에 따로 제약을 가하지 않는 이상 복원 하고싶은 그림과 다를 확률이 상당히 높기 때문이다.
이러한 문제를 해결하기 위해 Back-propagation(이하 backprop)을 사용할 것이다. 즉 backprop을 이용해 입력으로 들어온 손상된 이미지에 가까운 Encoding vector z를 찾도록 학습시키는 것이다. 이를 위해 backprop의 loss function 또한 새롭게 디자인 했다.
1) Approach
우선 손실된 부분을 채워넣기 위해서 정상적인 이미지로 학습한 GAN의 D(Discriminator)와 G(Generator)를 활용할 것이다. 학습된 G는 우리의 Backprob을 통해 입력 이미지와 유사한 이미지를 만들 수 있는 z를 구할 것이다.
위에서 말햇듯이 우리는 z를 optimization problem을 통해 구할 것이다. 가려진 이미지를 y, missing part 이미지와 동일한 사이즈의 binary mask를 M이라고 부르겠다.
Optimize된 z hat은 다음과 같다.
L_c는 이미지가 가려진 이미지 y와 마스크 M에 맞게 생성되도록 해줄 context loss를 뜻한다. L_p는 prior loss로 안좋은 결과에 패널티를 부여하기 위한 loss다.
2) L_c
Context loss는 손상되지 않은 이미지들을 이용해서 구한다. Context loss는 Gan의 G와 손상되지 않은 오리지널 이미지 간의 L2 norm을 이용해 구할 것이다. 그런데 L2 norm을 그대로 사용하면 마스크의 위치와 가깝건 멀건 동일한 가중치로 loss를 줄 것이다.
M과 같이 가운데 부분이 손상된 경우를 생각해보자. L2 norm loss를 사용하면 가운데 빈 공간과는 먼 곳의 픽셀들도 loss에 많은 영향을 줄 수 있다. 인물사진에서 얼굴이 없어져서 얼굴을 복원하려는데 뒤의 배경 때문에 loss를 증가할 수 있다는 것이다. 때문에 좀 더 올바른 encoding을 찾기 위해 손상된 부분과 가까울수록 높은 가중치를 갖도록 할 것이다.
이렇게 처리하기 위해 우리는 각 픽셀의 가중치를 그 픽셀 주변에 존재하는 손상된 픽셀의 개수와 비례하게 만들어 줄 것이다. 손상된 부분과 먼 pixel은 inpainting과정에서 적은 영향만 줄 수 있도록 하는 것이다. 그래서 우리는 각 픽셀의 가중치를 다음과 같이 줄 것이다.
i는 픽셀의 인덱스이고 W_i는 그 픽셀의 중요도를 뜻한다. N(i)는 pixel i의 이웃들이다. 이웃은 window를 이용할 것이다. 그리고 |N(i)|는 이웃 pixel의 수이다. 우리 예제에선 window size를 7로 할 것이다.
그런데 우리 모델에서 L1-norm이 L2-norm보다 좀 더 좋은 결과를 보여줬다. 따라서 G가 만든 이미지와 오리지널 이미지의 weighted L1-norm 을 다음과 같이 정의할 것이다.
☉는 element-wise 곱셈을 뜻한다.
3) L_p
prior loss는 픽셀별 차이가 아닌 high-level image feature representation에 기반한 각 클래스들의 penalty이다. 우리 모델에서 prior loss는 복원된 이미지가 학습데이터의 샘플과 비슷해질 수 있도록 도와주는 역할을 할 것이다.
이 모델의 prior loss는 비현실적인 이미지에게 높은 loss를 준다. 이는 GAN의 D가 하는 역할과 비슷하므로 prior loss는 GAN의 Discriminator loss를 그대로 사용할 것이다.
람다는 위의 두 loss 사이에서 균형을 맞혀주는 역할을 한다. z는 D를 속이는 방향으로 학습되고 생성된 이미지가 더 리얼해지도록 만든다. 만약 L_p 가 없다면 y에서 z로의 매핑된 결과가 뭔가 이상해지는 방향으로 수렴할 수 있다. 다음은 L_p가 있을 때와 없을 때를 비교한 사진이다.
5. Training Inpainting
이제 context loss와 prior loss를 가지고 손상된 이미지와 가장 유사한 z를 골라 새로운 이미지로 만들어 줄 것이다. z는 랜덤하게 초기화된 후 위에서 말했듯이 backprop을 이용해 optimize를 하도록 학습시킬 것이다.
다음 이미지는 z가 학습이 잘 됐을 학습되는 방향을 시각화 한 것이다.
Z를 optimize한 이후 inpainting 결과는 입력 이미지의 손상되지 않은 부분을 덮어 씌우기만 하면 끝이다. 그런데 여기서 생성된 부분의 픽셀 자체는 괜찮은데 주변 픽셀들과 비교했을 때 동일한 intensity를 가지지 않는 문제가 발견됐다. 이를 해결하기 위해서 poisson blending을 사용했다. 핵심 아이디어는 G(z hat)의 방향은 유지한 체 color를 입력이미지 y의 color와 같아지도록 shift해주는 것이다. 여기서 이를 위해 x hat을 정의했다.
▽는 gradient operator이다. 다음은 blend를 하기 전과 후를 비교한 이미지다.
6. Other Details
일반적으로 우리 모델은 GAN 구조와 일맥상통한다. 때문에 어떤 Generative 모델에도 적용될 수 있다. 이 예제에서는 DCGAN을 썼고 generative 모델 G는 [-1,1]의 균일분포(uniform distribution)의 100차원 랜덤백터로부터 64x64x3이미지를 생성되도록 디자인됐다. 생성 과정에선 이미지 사이즈를 반으로 만들고 channel을 두배로 늘려주는 convolution layer 여러 개와 output layer에서 2 class softmax를 사용했다.
DCGAN은 논문 [1]의 구조에 Adam optimization를 적용해 학습시켰다. 람다값은 0.0003이고 학습데이터에 data augmentation도 사용해주었다.
[1] A. Radford, L. Metz, and S. Chintala. Unsupervised representation learning with deep convolutional generative adversarial networks. arXiv preprint arXiv:1511.06434, 2015.
'ABCD > Deep Learning' 카테고리의 다른 글
Initial value (초기값) 을 모두 0으로 준다면? (0) | 2017.07.31 |
---|---|
cost를 구할 때 log를 쓰는 이유는? (0) | 2017.07.19 |