새로운 SR 모델을 개발하면서 여러가지 실험을 하고 있다. 이번에는 그 중에 하나인 실험을 소개하고자 한다.
가벼운 모델일 것
엣지를 잘 살리는 모델일것
최근 봤던 모델인 BSRGAN의 degradation을 보고 input에 일부러 noise를 주거나, 다양한 degradation 과정이 SR 이후에 좋은 성능을 내는 것을 보았다. 이 부분을 일부 차용하기로 했다.
앞선 아이디어에서 그렇다면 일부러 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
Degradation
Canny Degradation