[실험] SR에 Canny를 넣으면 어떻게 될까?

고주원·2021년 6월 18일
1

새로운 SR 모델을 개발하면서 여러가지 실험을 하고 있다. 이번에는 그 중에 하나인 실험을 소개하고자 한다.

개발 모델

  • 명칭은 FACNN이다 Faster and Awesome CNN 이라는 이름으로 지었다.
  • 주안점이 몇가지 있었다.

주안점

  1. 가벼운 모델일 것

    • 이부분은 Jetson Xavier과 같은 소형 엣지 디바이스에 올릴 목적이므로 네트워크나 파라미터 수가 적은 모델이어야 했다.
  2. 엣지를 잘 살리는 모델일것

    • 가벼운 모델이고 그러므로 SR의 모든 장점을 가지고 갈 수 없기 때문에 엣지를 잘 살리는 모델로 한정했다.

시도한 것

  1. 최근 봤던 모델인 BSRGANdegradation을 보고 input에 일부러 noise를 주거나, 다양한 degradation 과정이 SR 이후에 좋은 성능을 내는 것을 보았다. 이 부분을 일부 차용하기로 했다.

  2. 앞선 아이디어에서 그렇다면 일부러 Edge 검출을 한 모델을 넣는다면 엣지를 잘 살리지 않을까? 라는 아이디어로 Canny를 활용해 검출된 부분을 씌운것을 Input으로 넣기로 했다.

모델 네트워크 구조

import torch
import torch.nn as nn
import torch.nn.functional as F

class FACNN(nn.Module):
    """Some Information about FACNN"""
    def __init__(self,scale):
        super(FACNN, self).__init__()
        self.scale = scale
        self.conv1 = nn.Sequential(
                nn.Conv2d(3,32,kernel_size=5, stride=1, padding=2, bias=True),
                nn.ReLU()
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(32,64,kernel_size=1, stride=1, padding=0),
            nn.Conv2d(64,12,kernel_size=1, stride=1, padding=0),
            nn.ReLU()
        )
        self.conv3 = nn.Sequential(
            nn.Conv2d(12,12,kernel_size=3, stride=1, padding=1),
            nn.Conv2d(12,3,kernel_size=3, stride=1, padding=1),
            nn.ReLU()
            
        )
    def forward(self, x):
        x = F.interpolate(x,scale_factor=(self.scale, self.scale), mode='bicubic',align_corners=True)
        out = self.conv1(x)
        out = self.conv2(out)
        out = self.conv3(out)
        #out = out.squeeze(0).permute(1,2,0).mul(255.0).clamp(0,255.0).type(torch.ByteTensor)
        return out
  • 엣지에 올라가는 만큼 정말 최소한의 convolution Network만 사용했다.
  • Deconvolution 연산자가 다른 환경에서 간혹 안되는 경우가 많아 interpolate를 진행 후 학습했다.

학습

학습 코드 깃허브

  • Optimizer는 Adam을 사용하고, Loss는 L1을 사용했다.
  • 그리고 Optimizer 전략(?) 중에 하나인 SAM을 사용했다. (아직 공부하지 않았지만 좋다는 결과가 있어 사용했다. 조만간 리뷰올려야지)

실험 결과

  • 실험은 앞서 Degradation과 Canny Degradation 방법을 따로 진행했다.
  1. Degradation

    • JPEG 노이즈와 일반 ISO를 랜덤하게 넣었다.
    • 결과는 모델이 깊지 않아서 그런지 Bicubic과 비교해봤을 때 더 나쁘거나 비슷한 결과만을 냈다.
  2. Canny Degradation

    • 사실 잘 될거라는 기대로 시작했다.
    • 하지만 기대와는 달리...
    • 오히려 엣지를 뭉개버리는 참사를 냈다. 자막 부분을 보면 거의 사라지다 싶이 엣지가 사라져있다.

결론

  • 이번 실험은 망했어..
  • 하지만 다음 실험의 아이디어가 또 생기고 마는데.. comming soon..
profile
Deep learning for super-resolution

0개의 댓글