classSRCNN(nn.Module):def__init__(self,f1=9,f2=5,f3=5,n1=64,n2=32):super(SRCNN,self).__init__() self.conv1 = nn.Conv2d(3,n1,f1,padding=f1//2) self.conv2 = nn.Conv2d(n1,n2,f2,padding=f2//2) self.conv3 = nn.Conv2d(n2,3,f3,bias=False,padding=f3//2)defforward(self,x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = self.conv3(x)return x
간단한 Model이므로 forward propagation을 쉽게 구현할 수 있다.
Dataset
#학습 데이터셋classTrainDataset(Dataset):def__init__(self,path): self.paths = glob.glob(path) self.trans = transforms.Compose([transforms.Resize((11,11)), transforms.Resize((33,33), interpolation=InterpolationMode.BICUBIC), transforms.ToTensor()])def__getitem__(self,index): x = Image.open(self.paths[index]) y = Image.open(self.paths[index]) x = self.trans(x) y = transforms.ToTensor()(y)return x,ydef__len__(self):returnlen(self.paths)#테스트 데이터셋classTestDataset(Dataset):def__init__(self,path): self.paths = glob.glob(path)def__getitem__(self,index): x = Image.open(self.paths[index]) y = Image.open(self.paths[index]) w = x.width//3*3 h = x.height//3*3 x = x.resize([w//3,h//3],resample=Image.BICUBIC) x = x.resize([w,h],resample=Image.BICUBIC) x = transforms.ToTensor()(x) y = transforms.ToTensor()(y.resize([w,h],resample=Image.BICUBIC))return x,ydef__len__(self):returnlen(self.paths)
Train Dataset은 미리 crop해둔 이미지를 불러와, Resize한다.
Test Dataset은 Set5 Dataset을 한 장씩 불러와, Scale Factor=3으로 Resize 가능하도록 이미지를 조정한다.