crop하되, 매우 많은 양이므로 multiprocessing한다. crop 후, rotation, flip을 랜덤하게 한 후 섞은 후 데이터 개수에 맞춰 선출한다.
Dataset
classTrainDataset(Dataset):def__init__(self,xs,noise_level) ->None:super(TrainDataset, self).__init__() self.isBlind =type(noise_level)==list self.sigma = noise_level self.xs = xsdef__getitem__(self,index): t = transforms.ToTensor()(self.xs[index])if self.isBlind: x = t y = (t + torch.randn(t.shape)*np.random.randint(self.sigma[0],self.sigma[1])/255.0)else: x = t y = (t + torch.randn(t.shape)*self.sigma/255.0)return x, ydef__len__(self):returnlen(self.xs)
noise를 추가한 뒤 clamp한다. x는 깨끗한 이미지, y는 noisy 이미지이다.
Result
CImageNet400을 grayscale로 변환한 이미지를 crop해 Train data로 사용하고 BSD68을 Test data로 사용한다.
Batch size는 128, 총 배치 수는 1600개이며 50 epoch 학습한다.
Optimizer는 Adam이고** learning rate를 1e-3으로 하되, 30epoch에서 1e-4로** 스케줄링한다.
Test Data에 대한 epoch에 따른 평균 PSNR의 곡선은 위와 같이 나타나며, 논문의 29.2까지 도달하지는 못했으나 29.02dB를 기록했다.
추가적으로, SSIM을 평가 지표로 사용했다.
복원된 이미지 예시이다.
DnCNN의 출력 이미지를 보면, 분명 노이즈를 제거하나 이미지 본래의 자글자글한 부분의 패턴이 사라진다. 나무의 풀잎, 모래 부분을 보면 내부의 무늬가 감소함을 알 수 있다. MSE loss는 이미지 전체에 대해 오차를 평균내므로 '평균적으로' loss가 작으면 그만이다. 따라서 인간의 시각적 인식을 그대로 반영하지 않기 때문에, loss function에 SSIM 항을 추가하는 방법도 존재한다.