Super Resolution

프로젝트 ①

4x Super Resolution SwinIR을 활용한 이미지 4배 업스케일링

개요

   한 번쯤은 20여 년 전 찍어놓은 소중한 사진들을 지금 발전된 기술로 다시 찍고 싶은 생각이 들 때가 있습니다. 그런 아쉬움을 조금이나마 보완해 보고 싶은 마음에 이 프로젝트를 진행하게 되었습니다.

   이 프로젝트는 Transformer 기반의 SwinIR 모델을 활용해 이미지를 4배 스케일업하는데 목적을 두었습니다. 또한 FastAPI와 GCP 서버를 이용해 데모를 체험할 수 있도록 웹으로 구현했습니다.

   이 프로젝트로 멈추는 것이 아니라 이러한 기반을 토대로 의료 자료, 저화질의 CCTV, 위성 이미지등 다양한 컴퓨터 비전 분야에서도 발전시키는 데 유용할 것입니다.

사용 기술

활용 모델 SwinIR
프레임워크 PyTorch, TorchVision
백엔드 FastAPI
클라우드 Google Cloud Platform
배포 Docker
이미지 처리 Pillow

데이터 수집 및 처리 과정

ㆍ 약 25,000장의 고해상도 이미지로 이뤄진 Unsplash 공개 데이터셋 사용

ㆍ 데이터 증강 → RandomCrop, ColorJitter, Flip, RandomRotation

모델 구조

ㆍ First Conv Layer

ㆍ Transformer Blocks
          └   3 × RSTB (Residual Swin Transformer Block)
          └   내부 : Window Attention + Shifted Window + Residual Connection

ㆍ Upsampling
          └  PixelShuffle × 2 → 4배 확대

ㆍ Output Layer
          └  고해상도 이미지 생성

성능 지표

PSNR   :  27.69 dB

SSIM   :  0.8351

L1 Loss   :  0.1267

Training Curve   :
    

결과

Before
After

체험해 보기

고찰

ㆍ 데이터 수집 과정
      - 0. SwinIR 학습을 위해 해상도 512×512 이상, 수 만장 이상 데이터셋 필요
      - 1. DIV2K, Flickr2K → 수 천장 이미지의 데이터셋으로 학습하기엔 적은 데이터 규모
      - 2. Open Image v4, v6, v7 시도 → 대량 다운로드 제한으로 접근 비허용 이슈 발생
      - 3. Unsplash → 약 25,000장의 다양한 주제, 고해상도, 다운로드 이슈 없음 → 선택

ㆍ 초기 모델 구성
      - 고해상도 이미지, 높은 Batch Size 및 Embed dim 값 설정 → Out of Memory 발생
      - 증강으로 RandomRotation (0º, 90º, 180º, 270º 중 무작위 선택) 적용
      - 초기 학습 시 웜업 스케쥴 미적용

ㆍ 개선 과정
      - HR Size에 맞게 입력 이미지 축소, Train Batch Size=16, Embed dim=256 설정
      - 학습 불안정 발생 → RandomRotation 90º 단일로 증강 축소
      - 초기 Loss값 불안정으로 인한 Early Stopping 발생 → 웜업 스케줄 적용

ㆍ 최종 결과
      - 100에포크 시점 모델을 최종 결과로 선정
      - Dice Score : 72.96%

ㆍ 느낀 점
      - 웜업 스케줄의 중요성 확인
      - 메모리 부족, 학습 시간, 제한적인 PC 환경 등으로 다양한 실험이 어려웠음
        └ 모델이 수렴 과정이기 때문에 추가 학습 시 더 나은 성능 기대되었음
      - Bicubic, L1 Loss의 한계 → 해상도를 올라가지만 디테일 적으로 뭉게짐 발생
        └ GAN Loss 등을 적용하여 추가 실험 및 비교 해보지 못한 점이 아쉬움