[Dacon] 이미지 품질향상(HiNet)

2021. 7. 21. 18:20코딩연습장/Dacon

다양한 분야에 대해서 딥러닝을 실제로 이용하고, 더 알아가기 위해서 데이콘을 하기로 하였다.

 

첫번째로 도전한 프로젝트는 "이미지 품질향상"이다. 주로 빛으로 인한 번짐 현상을 제거하는 것이 문제이며 이미지의 크기는 3264 x 2448로 매우 크다.

 

데이콘의 저작권상, 관련 정보를 공유하는 것은 어렵기 때문에 내 깃허브 코드와 해결한 과정을 이야기할까한다.

 

자세한 코드 정보는 밑 github를 참조하기 바란다.

https://github.com/gihyunkim/keras-hiNet

 

GitHub - gihyunkim/keras-hiNet: Deep Learning Model which is called HiNet for Image Denoising

Deep Learning Model which is called HiNet for Image Denoising - GitHub - gihyunkim/keras-hiNet: Deep Learning Model which is called HiNet for Image Denoising

github.com


우선 image denoising을 해본 경험이 없었기 때문에 자료조사를 먼저 하였다. 주로 UNet기반encoder, decoder 방식을 많이 사용하는 것 같았다. Denosing에 관한 공부와 모델 개발 경험을 쌓기 위해서 공개된 모델을 사용하지 않고, 직접 만들기로 정하였고, papers with code for image denosing에서 SOTA 성능으로 표시된 HiNetkeras로 개발을 시작하였다.

 

https://arxiv.org/pdf/2105.06086v1.pdf

 

HiNet은 2021년도에 나온 모델로, 자료가 없었기 때문에 논문을 보고서 하나씩 개발하였다.

모델 구조에 대해서 자세히 설명은 하지 않겠지만 간략한 특징만 보자면 다음과 같다.

  • Batch Normalization을 사용하지 않고, Half Instance Normalziation을 사용한다.
  • 채널의 반만 HIN을 적용하고, 반은 하지 않은 상태로 Concat 된다.
  • HIN Block에서만 HIN을 적용하고, Residual Block은 Normalization layer를 주지 않는다.
  • LeakyRelu를 사용한다. 기울기 파라메터가 0.2.
  • Downsampling 시, filter 수를 2배 늘려준다.
  • Stage가 2개이며 Stage1이 Stage2에 영향을 준다.
  • Attention Module로써 CSFF와 SAM 두 가지를 사용한다.
  • Loss로 PSNR Loss를 사용하는데, input img + predicted matrix를 X로 두어 offset을 학습하는 방향으로 사용한다.

모델은 만들어졌고, 이제 훈련만 하면 된다. 하지만 컴퓨팅 환경이 한정되어 있는데, input과 GT의 size가 매우 크기 때문에, 메모리에 대한 문제가 많았다. 

 

첫번째 시도

input을 256, 256 size로 Resize하여 접근하였다. 이만큼 줄였는데도 불구하고, 1080 11gb 환경에서 batch size를 8밖에 주지 못했다. 여기서 loss가 nan이 나오는 문제가 발생하였는데, 여러 시도를 해보니 Batch Normalization이 없는데 Bias도 주지 않아 생기는 문제(불안정한 training 야기)라 판단하였다. 따라서 Instance Normalization 앞 단의 Conv layer를 제외하고, 모든 layer에 Bias_Add=True 옵션을 주어 해결하였다.

 

또한, Augmentation을 넣었을 때, 더 성능이 악화되어 제거하였다.

 

학습 초반에는 빛 번짐을 거의 제거하지 못하였는데, 시간이 지남에 따라 점점 성능이 향상되었고, 데이콘에서 26.2(PSNR) 점수를 얻었다(최고 점수 약 31).

 

 

두번째 시도

처음 모델이 256 사이즈의 output을 본래의 사이즈(3264 x 2448)로 Resize 시키는 데서 발생하는 품질악화가 문제라고 판단하여, Sliding Window방식으로 바꾸었다.

 

한 이미지를 여러개의 256x256 patch images로 잘라서 학습하였으며, 필터 수를 1.5배 늘렸다. 모델이 2 stage로 큰 편인데다 데이터도 크니, 학습 속도가 매우 느렸다(patch로 바꾸면서 데이터의 수가 급증하여 더 느려짐). 

 

이번에는 학습 후에 문제가 생겼는데, predict할 시에 patch 크기 단위로 predict하고 합치면 patch간에 차이가 생겨 격자 모양의 노이즈가 이미지에 나타났다. 이러한 노이즈를 최대한 줄이기 위해 patch 크기(256) 단위가 아닌, 32 단위로 이동하면서 predict하였고(겹쳐지는 부분에 대해서는 평균화), predict속도가 매우 느리긴 하지만, 최대한 격자 무늬가 안생기게 되었다. 

 

시도 중...

컴퓨팅 속도에 한계 때문에 여러 번 테스트하는 것이 매우 어려운 상태이다. Patch 별로 학습시킨 모델은 현재 학습이 덜 된 상태이고, 끝나면 Augmentation을 주어 또 테스트할 예정이다.

'코딩연습장 > Dacon' 카테고리의 다른 글

[Dacon] 교통 수신호 동작 인식 대회  (0) 2021.10.22