시작하면서..
앞서 했었던 SRGAN은 Imagenet을 통한 훈련이 되어야 하는데, Imagenet의 크기가 너무 커서 코랩을 사용하는 필자는 적은 데이터셋으로 밖에 할 수가 없었습니다. 자원 부족으로 아무리 훈련을 시켜도 흐릿한 결과가 나와서 결과 도출은 우선 뒤로 미루고자 합니다.. ㅜㅜ (1e-5 learning rate로 4000에폭 돌리는게 남았지만..)
이번에 소개드릴 EDSR, MDSR도 마찬가지입니다. MDSR, EDSR 또한 각각 훈련시키는데 보통 4일, 8일이 소요되기 때문에 코랩을 사용하는 필자는 아무래도 훈련시키기 어려운 환경입니다. 그래서 혼자 코드를 우선 짜보고 깃허브를 보면서 혹시 틀린 부분이 있으면 수정해나가는 방식으로 공부를 해볼까 합니다. 혹시 자원 관련해서 괜찮은 해결책이 있는 분이 있으시면 알려주시면 감사하겠습니다.
Abstract
논문에서는 EDSR(enhanced deep super-resolution network), MDSR(multi-scale deep super-resolution network)을 소개 할 것입니다. 이 architecture들은 기존에 발표된 convolution residual network(SRResNet)에서 불필요한 부분을 제거하여 성능을 올렸습니다.
Introduction
많은 연구에서는 High Resolution Image와 Low Resolution Image의 관계에 대해서 High Resolution Image에 bicubic down sampling 기법을 이용하여 만든 것을 Low Resolution Image이라 가정하는데, 원래는 noise, blur 등 여러 요소들이 고려되어야 합니다.
최근의 연구들은 PNSR의 수치에 대해 좋은 성능을 내고 있지만, 한계점이 있습니다.
- 복원 성능은 사소한 구조 변화에도 민감합니다.
- 기존 모델들은 SR에서 서로 다른 스케일 간의 상호 관계를 고려하지 않고 독립적이라 여깁니다.(ex_ x2 scale, x4 scale 각각은 독립적이라고 가정함.)
SRResNet은 메모리 적인 문제를 해결 했지만, Resnet 자체는 사실 classification, detection 등 high level computer vision problems를 해결하기 위한 해결책 입니다.
위의 사항들을 해결하기 위해 논문에서는 크게 두 가지를 제시합니다.
- 우선 필요없는 부분을 정리. Network가 복잡하면 훈련하기 어렵고(오컴의 면도날 효과인 듯), loss function 설정 및 모델 수정에 민감합니다.
- other scale 을 훈련한 model의 information을 transfer 할 수 있는 training model
훈련 중 각 scale(X2,X3,X4)에 대한 정보를 활용하기 위해 사전 훈련된 모델에서 다른 scale에 대한 모델을 훈련합니다. 이는 X2로 학습된 모델로 X3, X4를 학습한다고 생각하시면 됩니다. 이처럼 다른 scale간의 상호관계가 존재함을 뒤에서 experiment를 통한 결과로 증명합니다.
보통 X2에서 X3, X4를 훈련시킵니다.
Related Works
예전의 SR 방법 : interpolation (한계가 있음)
최근의 SR 방법 : 이미지를 bicubic interpolation을 통해 upsample해서 High Resolution Image와 크기를 통일하여 모델에 넣습니다. 이는 multi scale이 불가하다는 한계점이 있습니다.
loss : L2 Loss 보다 L1 이 성능이 더 좋다는 연구 결과가 있습니다.
Proposed Methods
이번 Section 에서는 EDSR과 MDSR을 소개합니다.
Residual Blocks
기존에 Residual block을 사용했던 SRResnet에서 Batch Normalization을 삭제했습니다.
Batch Normalization은 feature를 normalize하기 때문에 유동성을 해칩니다.
그리고 convolution layer와 동일한 메모리를 사용하기 때문에, Batch Normalization을 사용하지 않았을 때 훈련 동안 메모리 사용량이 40% 줄었습니다. 이는 BN을 줄임으로써 더 큰 모델을 구축 할 수 있음을 의미합니다.
Single-scale model
Performance를 높게 올릴 수 있는 가장 기본적인 방법은 무엇일까요?
바로 Parameter 수 자체를 늘리는 것 입니다. 레이어를 더 많이 쌓거나 필터의 수를 늘림으로써 파라미터를 증가시킬 수 있습니다.
General CNN Architecture에서, 레이어의 수 : B, 채널의 수 : F 일 때 rough하게 파라미터와 메모리의 상관관계를 표현하면, 파라미터가 O(BF^2) 일 때 메모리는 O(BF)가 소요됩니다.
이는 B 보다는 채널의 수 F를 늘리는게 효과적으로 보입니다.
하지만 F를 어느정도 넘게 높이면 Unstable하게 훈련이 됩니다. 이를 막기 위해 Architecture의 Residual block에서 Residual scailing factor를 0.1로 지정해줍니다.
각 residual block에서 constant scaling layers는 마지막 convolution layers 뒤에 위치 합니다.
Fig 2의 base line model을 expand하여 B = 32, F = 256, scaling factore = 0.1인 모델 아키텍쳐를 EDSR(single-scale model)로 제시합니다. 이는 Figure 3에 나와 있습니다.
다른 scale간의 상호관계가 존재
model에서 x3 scale, x4 scale에 대해 훈련 시킬 때 x2 scale에 대해 pretrain된 network의 파라미터로 초기화 시키고 훈련 시켜 보면, 아래와 같은 결과가 나옵니다.
파란색 선 (pretrained x2)가 초록색 선(random initialization) 보다 더 빨리 수렴함을 알 수 있습니다.
Multi-scal model
Fig.4. 에서 multi-scales에 있어서, 서로 연관성이 있음을 알았습니다.
그래서 multi-scale architecture을 생성할 때 위의 idea를 접목시키겠습니다.
fig.5.을 보시면 multi-scales에 대해 handle하는, scale-specific processing module (앞부분)에서 대부분의 파라미터를 공유함을 알 수 있습니다.
multi-scale architecture에서 multi scale SR을 위해 scale별 처리 모듈을 도입했습니다.
- pre-processing modules는 network의 앞에 위치해 있으며, 이는 input image의 각 다른 scale에 대해 분산을 줄이기 위함입니다.
- 각 pre-processing module은 5x5 커널을 갖는 two residual blocks을 포함합니다.
이처럼 큰 커널을 사용해서, scale-specific part를 shallow하게 유지할 수 있습니다. (depth가 깊지 않음을 의미하는 듯 하다.)
MDSR은 B = 80, F= 64의 Architecture 입니다. EDSR의 각 3 scale에 대한 모델에 대한 모든 파라미터는 4.5M인데, MDSR은 3 scale을 다룰 수 있으면서 3.2M 파라미터 개수를 가집니다. 그럼에도, MDSR은 EDSR 대비 괜찮은 성능을 갖습니다.
Experiments
Datasets
DIV2K dataset은 high quality (2K 해상도)의 이미지 데이터셋 입니다. (Image Resolution 을 위한)
train 800개, val 100개, test 100개
Training Details
Data Augmentation으로 random horizontal filps와 90 rotations를 사용합니다.
0, 90, 180, 270 회전에 horizontal flip까지 하면 각 이미지 당 8개의 이미지가 나옵니다.
(이미지의 rgb value에 대해서 mean값을 구하는 pre-processing을 실행시켜준다고 했는데, 이건 정확히 무슨말인지를 잘 모르겠다..)
Adam optimizer를 사용하며 beta_1 = 0.9, beta_2 = 0.999, $${\epsilon}$$ = 1e-8 로 지정합니다. 그리고 minibatch size는 16, learning rate = 1e-4로 initilize하고 2*10^5 minibatch uptdate마다 반으로 줄입니다.
EDSR의 훈련에 있어서, 우선 X2을 훈련시키고 다른 scale에 대해서는 이 훈련된 모델의 파라미터로 훈련 시킵니다.
Loss는 L1 loss를 사용합니다.
EDSR은 8일, MDSR은 4일 정도 소요되었습니다.
Geometric Self-ensemble
Training Deetails에서 나왔듯이, Data Augmentation을 사용하면 rotate, flip되어 한 이미지당 8개의 이미지가 나옵니다. 여기에서 평균을 구하는 과정을 포함시키는 것을 Geometric Self-ensemble이라 합니다.
Data Augmentation을 적용했던 함수의 역함수를 (flip, rotate의 역 수행) super resolved image (모델을 통해 해상도가 향상된 이미지)에 적용합니다.
역수행이 적용된 이미지들의 평균을 구한다고 생각하시면 됩니다.
이를 통해서 약간의 성능 향상을 보일 수 있습니다.
마치면서..
이런 논문을 읽을 때 개인적으로 구현하는 것은 필수라고 생각을 합니다. 하지만 자원이 부족해서 실제로 실행시켜보지 못하는 점이 너무 아쉽게 느껴졌습니다.
이번 논문에서는 특히 MDSR 부분에서 각각의 scale에 대한 parameter를 공유하면서 더 효과적으로 훈련 시키는 부분이 인상 깊었습니다. 나중에 SR에 대한 프로젝트를 하게 된다면 꼭 참고해봐야겠네요.!