├── README.md ├── data └── dataset.py ├── models ├── GR.py ├── GT.py └── encoder_build.py ├── result ├── real20 │ ├── 0_b.png │ ├── 0_gt.png │ ├── 0_pretr.png │ ├── 0_t.png │ ├── 10_b.png │ ├── 10_gt.png │ ├── 10_pretr.png │ ├── 10_t.png │ ├── 11_b.png │ ├── 11_gt.png │ ├── 11_pretr.png │ ├── 11_t.png │ ├── 12_b.png │ ├── 12_gt.png │ ├── 12_pretr.png │ ├── 12_t.png │ ├── 13_b.png │ ├── 13_gt.png │ ├── 13_pretr.png │ ├── 13_t.png │ ├── 14_b.png │ ├── 14_gt.png │ ├── 14_pretr.png │ ├── 14_t.png │ ├── 15_b.png │ ├── 15_gt.png │ ├── 15_pretr.png │ ├── 15_t.png │ ├── 16_b.png │ ├── 16_gt.png │ ├── 16_pretr.png │ ├── 16_t.png │ ├── 17_b.png │ ├── 17_gt.png │ ├── 17_pretr.png │ ├── 17_t.png │ ├── 18_b.png │ ├── 18_gt.png │ ├── 18_pretr.png │ ├── 18_t.png │ ├── 19_b.png │ ├── 19_gt.png │ ├── 19_pretr.png │ ├── 19_t.png │ ├── 1_b.png │ ├── 1_gt.png │ ├── 1_pretr.png │ ├── 1_t.png │ ├── 2_b.png │ ├── 2_gt.png │ ├── 2_pretr.png │ ├── 2_t.png │ ├── 3_b.png │ ├── 3_gt.png │ ├── 3_pretr.png │ ├── 3_t.png │ ├── 4_b.png │ ├── 4_gt.png │ ├── 4_pretr.png │ ├── 4_t.png │ ├── 5_b.png │ ├── 5_gt.png │ ├── 5_pretr.png │ ├── 5_t.png │ ├── 6_b.png │ ├── 6_gt.png │ ├── 6_pretr.png │ ├── 6_t.png │ ├── 7_b.png │ ├── 7_gt.png │ ├── 7_pretr.png │ ├── 7_t.png │ ├── 8_b.png │ ├── 8_gt.png │ ├── 8_pretr.png │ ├── 8_t.png │ ├── 9_b.png │ ├── 9_gt.png │ ├── 9_pretr.png │ └── 9_t.png └── real45 │ ├── 0_b.png │ ├── 0_pretr.png │ ├── 0_t.png │ ├── 10_b.png │ ├── 10_pretr.png │ ├── 10_t.png │ ├── 11_b.png │ ├── 11_pretr.png │ ├── 11_t.png │ ├── 12_b.png │ ├── 12_pretr.png │ ├── 12_t.png │ ├── 13_b.png │ ├── 13_pretr.png │ ├── 13_t.png │ ├── 14_b.png │ ├── 14_pretr.png │ ├── 14_t.png │ ├── 15_b.png │ ├── 15_pretr.png │ ├── 15_t.png │ ├── 16_b.png │ ├── 16_pretr.png │ ├── 16_t.png │ ├── 17_b.png │ ├── 17_pretr.png │ ├── 17_t.png │ ├── 18_b.png │ ├── 18_pretr.png │ ├── 18_t.png │ ├── 19_b.png │ ├── 19_pretr.png │ ├── 19_t.png │ ├── 1_b.png │ ├── 1_pretr.png │ ├── 1_t.png │ ├── 20_b.png │ ├── 20_pretr.png │ ├── 20_t.png │ ├── 21_b.png │ ├── 21_pretr.png │ ├── 21_t.png │ ├── 22_b.png │ ├── 22_pretr.png │ ├── 22_t.png │ ├── 23_b.png │ ├── 23_pretr.png │ ├── 23_t.png │ ├── 24_b.png │ ├── 24_pretr.png │ ├── 24_t.png │ ├── 25_b.png │ ├── 25_pretr.png │ ├── 25_t.png │ ├── 26_b.png │ ├── 26_pretr.png │ ├── 26_t.png │ ├── 27_b.png │ ├── 27_pretr.png │ ├── 27_t.png │ ├── 28_b.png │ ├── 28_pretr.png │ ├── 28_t.png │ ├── 29_b.png │ ├── 29_pretr.png │ ├── 29_t.png │ ├── 2_b.png │ ├── 2_pretr.png │ ├── 2_t.png │ ├── 30_b.png │ ├── 30_pretr.png │ ├── 30_t.png │ ├── 31_b.png │ ├── 31_pretr.png │ ├── 31_t.png │ ├── 32_b.png │ ├── 32_pretr.png │ ├── 32_t.png │ ├── 33_b.png │ ├── 33_pretr.png │ ├── 33_t.png │ ├── 34_b.png │ ├── 34_pretr.png │ ├── 34_t.png │ ├── 35_b.png │ ├── 35_pretr.png │ ├── 35_t.png │ ├── 36_b.png │ ├── 36_pretr.png │ ├── 36_t.png │ ├── 37_b.png │ ├── 37_pretr.png │ ├── 37_t.png │ ├── 38_b.png │ ├── 38_pretr.png │ ├── 38_t.png │ ├── 39_b.png │ ├── 39_pretr.png │ ├── 39_t.png │ ├── 3_b.png │ ├── 3_pretr.png │ ├── 3_t.png │ ├── 40_b.png │ ├── 40_pretr.png │ ├── 40_t.png │ ├── 41_b.png │ ├── 41_pretr.png │ ├── 41_t.png │ ├── 42_b.png │ ├── 42_pretr.png │ ├── 42_t.png │ ├── 43_b.png │ ├── 43_pretr.png │ ├── 43_t.png │ ├── 44_b.png │ ├── 44_pretr.png │ ├── 44_t.png │ ├── 4_b.png │ ├── 4_pretr.png │ ├── 4_t.png │ ├── 5_b.png │ ├── 5_pretr.png │ ├── 5_t.png │ ├── 6_b.png │ ├── 6_pretr.png │ ├── 6_t.png │ ├── 7_b.png │ ├── 7_pretr.png │ ├── 7_t.png │ ├── 8_b.png │ ├── 8_pretr.png │ ├── 8_t.png │ ├── 9_b.png │ ├── 9_pretr.png │ └── 9_t.png ├── solver.py ├── test.py ├── testsets ├── real20 │ ├── blended │ │ ├── 103.jpg │ │ ├── 107.jpg │ │ ├── 110.jpg │ │ ├── 12.jpg │ │ ├── 15.jpg │ │ ├── 22.jpg │ │ ├── 23.jpg │ │ ├── 25.jpg │ │ ├── 29.jpg │ │ ├── 3.jpg │ │ ├── 39.jpg │ │ ├── 4.jpg │ │ ├── 46.jpg │ │ ├── 47.jpg │ │ ├── 58.jpg │ │ ├── 86.jpg │ │ ├── 87.jpg │ │ ├── 89.jpg │ │ ├── 9.jpg │ │ └── 93.jpg │ └── transmission_layer │ │ ├── 103.jpg │ │ ├── 107.jpg │ │ ├── 110.jpg │ │ ├── 12.jpg │ │ ├── 15.jpg │ │ ├── 22.jpg │ │ ├── 23.jpg │ │ ├── 25.jpg │ │ ├── 29.jpg │ │ ├── 3.jpg │ │ ├── 39.jpg │ │ ├── 4.jpg │ │ ├── 46.jpg │ │ ├── 47.jpg │ │ ├── 58.jpg │ │ ├── 86.jpg │ │ ├── 87.jpg │ │ ├── 89.jpg │ │ ├── 9.jpg │ │ └── 93.jpg └── real45 │ ├── 19-input.png │ ├── qingnan-new2-1-input.jpg │ ├── qingnan-new2-11-input.jpg │ ├── qingnan-new2-13-input.jpg │ ├── qingnan-new2-14-input.jpg │ ├── qingnan-new2-15-input.jpg │ ├── qingnan-new2-18-input.jpg │ ├── qingnan-new2-2-input.jpg │ ├── qingnan-new2-20-input.jpg │ ├── qingnan-new2-21-input.jpg │ ├── qingnan-new2-22-input.jpg │ ├── qingnan-new2-24-input.jpg │ ├── qingnan-new2-26-input.jpg │ ├── qingnan-new2-27-input.jpg │ ├── qingnan-new2-29-input.jpg │ ├── qingnan-new2-3-input.jpg │ ├── qingnan-new2-31-input.jpg │ ├── qingnan-new2-36-input.jpg │ ├── qingnan-new2-37-input.jpg │ ├── qingnan-new2-38-input.jpg │ ├── qingnan-new2-39-input.jpg │ ├── qingnan-new2-4-input.jpg │ ├── qingnan-new2-40-input.jpg │ ├── qingnan-new2-45-input.jpg │ ├── qingnan-new2-46-input.jpg │ ├── qingnan-new2-47-input.jpg │ ├── qingnan-new2-49-input.jpg │ ├── qingnan-new2-5-input.jpg │ ├── qingnan-new2-52-input.jpg │ ├── qingnan-new2-53-input.jpg │ ├── qingnan-new2-54-input.jpg │ ├── qingnan-new2-55-input.jpg │ ├── qingnan-new2-59-input.jpg │ ├── qingnan-new2-6-input.jpg │ ├── qingnan-new2-61-input.jpg │ ├── qingnan-new2-63-input.jpg │ ├── qingnan-new2-64-input.jpg │ ├── qingnan-new2-69-input.jpg │ ├── qingnan-new2-74-input.jpg │ ├── qingnan-new2-75-input.jpg │ ├── qingnan-new2-8-input.jpg │ ├── qingnan-new2-80-input.jpg │ ├── qingnan-new2-82-input.jpg │ ├── qingnan-new2-86-input.jpg │ └── qingnan-new2-9-input.jpg ├── train.py └── utils ├── index.py ├── padding.py └── utils.py /README.md: -------------------------------------------------------------------------------- 1 | # RAGNet 2 | - The implementation of "Two-Stage Single Image Reflection Removal with Reflection-Aware Guidance". 3 | 4 | # Prerequisites 5 | - The code has been test on a PC with following environment 6 | - Ubuntu 18.04 7 | - Python 3.7.5 8 | - PyTorch 1.2.0 9 | - cudatoolkit 10.0 10 | - NVIDIA RTX 2080Ti 11 | 12 | # Datasets 13 | ### Training datasets 14 | - Synthetic: 7643 images from [Pascal VOC dataset](http://host.robots.ox.ac.uk/pascal/VOC/), image choices and the data synthesis protocol are same as [ERRNet](https://github.com/Vandermode/ERRNet). 15 | - Real: 90 real-world images from [Berkeley real dataset](https://github.com/ceciliavision/perceptual-reflection-removal). 16 | ### Testing datasets 17 | - Real20: 20 real testing images from [Berkeley real dataset](https://github.com/ceciliavision/perceptual-reflection-removal). 18 | - Real45: 45 real testing images from [CEILNet dataset](https://github.com/fqnchina/CEILNet). 19 | - SIR dataset: three sub-datasets (Solid, Postcard, Wild) from [SIR dataset](https://sir2data.github.io/). 20 | 21 | We provide Real20 and Real45 in `./testsets` folder, the SIR dataset is not provided due to their policy, [download here](https://sir2data.github.io/) and put it under `./testsets` folder. Please organize the SIR dataset according to our code implementation. 22 | 23 | # Test 24 | 25 | - Download our [pre-trained model](https://drive.google.com/drive/folders/1qRyDQmh4mccejjK6A4OuWsy-L2ELyu0F?usp=sharing) and put the `pretrain.pth` into `./checkpoint` folder 26 | 27 | ### Test with the pre-trained model 28 | ```shell 29 | $ cd RAGNet 30 | $ python test.py 31 | ``` 32 | 33 | # Train 34 | 35 | - Download the [vgg19-pretrained model](https://drive.google.com/drive/folders/1qRyDQmh4mccejjK6A4OuWsy-L2ELyu0F?usp=sharing) and put it into `./checkpoint` folder. 36 | - Organize the training dataset according to our code implementation, i.e., 37 | ```shell 38 | $ cd synthetic 39 | $ mkdir transmission_layer 40 | $ mkdir blended 41 | ``` 42 | 43 | ### Start training 44 | ```shell 45 | $ cd RAGNet 46 | $ python train.py 47 | ``` 48 | -------------------------------------------------------------------------------- /data/dataset.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | import random 4 | from torch.utils.data.dataset import Dataset 5 | from utils.utils import syn 6 | import torchvision.transforms as transforms 7 | 8 | def Crop_img(img): 9 | crop_w = img.shape[0] - 224 10 | crop_h = img.shape[1] - 224 11 | if crop_w == 0: 12 | random_w = 0 13 | else: 14 | random_w = int(np.random.randint(0,crop_w)/2) 15 | if crop_h == 0: 16 | random_h = 0 17 | else: 18 | random_h = int(np.random.randint(0,crop_h)/2) 19 | 20 | return img[random_w:random_w+224,random_h:random_h+224] 21 | 22 | to_tensor = transforms.ToTensor() 23 | 24 | 25 | class MyDataset(Dataset): 26 | def __init__(self,dir_b_list,dir_t_list,dir_r_list,is_ref_syn,crop=Crop_img): 27 | 28 | self.dir_b_list=dir_b_list 29 | self.dir_t_list=dir_t_list 30 | self.dir_r_list=dir_r_list 31 | self.is_ref_syn=is_ref_syn 32 | self.crop = Crop_img 33 | 34 | 35 | def __getitem__(self, index): 36 | 37 | t_img = self.dir_t_list[index] 38 | 39 | if self.is_ref_syn: 40 | r_img=self.dir_r_list[index] 41 | 42 | oh = t_img.shape[0] 43 | ow = t_img.shape[1] 44 | new = int(np.random.randint(224,448)/2)*2 45 | neww = round((new / t_img.shape[0]) * t_img.shape[1]) 46 | newh = round((new / t_img.shape[1]) * t_img.shape[0]) 47 | if ow >= oh: 48 | r_img = cv2.resize(np.float32(r_img), (neww, new), cv2.INTER_CUBIC) 49 | t_img = cv2.resize(np.float32(t_img), (neww, new), cv2.INTER_CUBIC) 50 | if oh > ow: 51 | r_img = cv2.resize(np.float32(r_img), (new, newh), cv2.INTER_CUBIC) 52 | t_img = cv2.resize(np.float32(t_img), (new, newh), cv2.INTER_CUBIC) 53 | 54 | r_img = self.crop(r_img) 55 | t_img = self.crop(t_img) 56 | 57 | t_img,r_img,b_img= syn(t_img,r_img) 58 | 59 | 60 | else: 61 | b_img = self.dir_b_list[index] 62 | oh = t_img.shape[0] 63 | ow = t_img.shape[1] 64 | new = int(np.random.randint(224,480)/2)*2 65 | neww = round((new / t_img.shape[0]) * t_img.shape[1]) 66 | newh = round((new / t_img.shape[1]) * t_img.shape[0]) 67 | if ow >= oh: 68 | t_img_ = cv2.resize(np.float32(t_img), (neww, new), cv2.INTER_CUBIC)/255.0 69 | b_img_ = cv2.resize(np.float32(b_img), (neww, new), cv2.INTER_CUBIC)/255.0 70 | if new == 224: 71 | randh = 0 72 | else: 73 | randh = int(np.random.randint(0,new-224)) 74 | if neww == 224: 75 | randw = 0 76 | else: 77 | randw = int(np.random.randint(0,neww-224)) 78 | t_img = t_img_[randh:randh+224,randw:randw+224] 79 | b_img = b_img_[randh:randh+224,randw:randw+224] 80 | if oh > ow: 81 | t_img_ = cv2.resize(np.float32(t_img), (new, newh), cv2.INTER_CUBIC)/255.0 82 | b_img_ = cv2.resize(np.float32(b_img), (new, newh), cv2.INTER_CUBIC)/255.0 83 | if new == 224: 84 | randw = 0 85 | else: 86 | randw = int(np.random.randint(0,new-224)) 87 | if newh == 224: 88 | randh = 0 89 | else: 90 | randh = int(np.random.randint(0,newh-224)) 91 | t_img = t_img_[randh:randh+224,randw:randw+224] 92 | b_img = b_img_[randh:randh+224,randw:randw+224] 93 | r_img=t_img.copy() 94 | 95 | 96 | b_img = to_tensor(b_img) 97 | r_img = to_tensor(r_img) 98 | t_img = to_tensor(t_img) 99 | 100 | return b_img,t_img,r_img,self.is_ref_syn 101 | 102 | def __len__(self): 103 | return len(self.dir_t_list) 104 | 105 | class FusionDataset(Dataset): 106 | def __init__(self, datasets, fusion_ratios=None): 107 | self.datasets = datasets 108 | self.size = sum([len(dataset) for dataset in datasets]) 109 | self.fusion_ratios = fusion_ratios or [1. / len(datasets)] * len(datasets) 110 | print('[i] using a fusion dataset: %d %s imgs fused with ratio %s' % ( 111 | self.size, [len(dataset) for dataset in datasets], self.fusion_ratios)) 112 | 113 | def reset(self): 114 | for dataset in self.datasets: 115 | dataset.reset() 116 | 117 | def __getitem__(self, index): 118 | residual = 1 119 | for i, ratio in enumerate(self.fusion_ratios): 120 | if random.random() < ratio / residual or i == len(self.fusion_ratios) - 1: 121 | dataset = self.datasets[i] 122 | return dataset[index % len(dataset)] 123 | residual -= ratio 124 | 125 | def __len__(self): 126 | return self.size 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /models/GR.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | class up(nn.Module): 6 | def __init__(self, in_ch, out_ch, conv_num): 7 | super(up, self).__init__() 8 | 9 | self.up = nn.ConvTranspose2d(in_ch//2, in_ch//2, 2, stride=2) 10 | if conv_num == 2: 11 | self.conv = double_conv(in_ch, out_ch) 12 | if conv_num == 4: 13 | self.conv = forth_conv(in_ch, out_ch) 14 | 15 | def forward(self, x1, x2): 16 | x1 = self.up(x1) 17 | 18 | diffY = x2.size()[2] - x1.size()[2] 19 | diffX = x2.size()[3] - x1.size()[3] 20 | 21 | x1 = F.pad(x1, (diffX // 2, diffX - diffX//2, 22 | diffY // 2, diffY - diffY//2)) 23 | 24 | x = torch.cat([x2, x1], dim=1) 25 | x = self.conv(x) 26 | return x 27 | 28 | class outconv(nn.Module): 29 | def __init__(self, in_ch, out_ch): 30 | super(outconv, self).__init__() 31 | self.conv = nn.Conv2d(in_ch, out_ch, 1) 32 | 33 | def forward(self, x): 34 | x = self.conv(x) 35 | return x 36 | 37 | class double_conv(nn.Module): 38 | def __init__(self, in_ch, out_ch): 39 | super(double_conv, self).__init__() 40 | self.conv = nn.Sequential( 41 | nn.Conv2d(in_ch, in_ch, 3, padding=1), 42 | nn.BatchNorm2d(in_ch,track_running_stats=False), 43 | nn.ReLU(inplace=True), 44 | nn.Conv2d(in_ch, out_ch, 3, padding=1), 45 | nn.BatchNorm2d(out_ch,track_running_stats=False), 46 | nn.ReLU(inplace=True) 47 | ) 48 | 49 | def forward(self, x): 50 | x = self.conv(x) 51 | return x 52 | 53 | class forth_conv(nn.Module): 54 | def __init__(self, in_ch, out_ch): 55 | super(forth_conv, self).__init__() 56 | self.conv = nn.Sequential( 57 | nn.Conv2d(in_ch, in_ch, 3, padding=1), 58 | nn.BatchNorm2d(in_ch,track_running_stats=False), 59 | nn.ReLU(inplace=True), 60 | nn.Conv2d(in_ch, in_ch, 3, padding=1), 61 | nn.BatchNorm2d(in_ch,track_running_stats=False), 62 | nn.ReLU(inplace=True), 63 | nn.Conv2d(in_ch, in_ch, 3, padding=1), 64 | nn.BatchNorm2d(in_ch,track_running_stats=False), 65 | nn.ReLU(inplace=True), 66 | nn.Conv2d(in_ch, out_ch, 3, padding=1), 67 | nn.BatchNorm2d(out_ch,track_running_stats=False), 68 | nn.ReLU(inplace=True), 69 | ) 70 | 71 | def forward(self, x): 72 | x = self.conv(x) 73 | return x 74 | 75 | class GR_Model(nn.Module): 76 | def __init__(self, encoder): 77 | super(GR_Model, self).__init__() 78 | self.encoder = encoder 79 | 80 | self.upz1 = up(1024, 256, 4) 81 | self.upz2 = up(512, 128, 4) 82 | self.upz3 = up(256, 64, 2) 83 | self.upz4 = up(128, 64, 2) 84 | self.outzc = outconv(64, 3) 85 | 86 | def forward(self, x): 87 | for index in range(0,4): 88 | x = self.encoder.features[index](x) 89 | x1 = x #torch.Size([1,64,224,224]) 90 | for index in range(4,9): 91 | x = self.encoder.features[index](x) 92 | x2 = x #torch.Size([1,128,112,112]) 93 | for index in range(9,18): 94 | x = self.encoder.features[index](x) 95 | x3 = x #torch.Size([1,256,56,56]) 96 | for index in range(18,27): 97 | x = self.encoder.features[index](x) 98 | x4 = x #torch.Size([1,512,28,28]) 99 | for index in range(27,36): 100 | x = self.encoder.features[index](x) 101 | x5 = x #torch.Size([1,512,14,14]) 102 | 103 | z4 = self.upz1(x5, x4) 104 | z3 = self.upz2(z4, x3) 105 | z2 = self.upz3(z3, x2) 106 | z1 = self.upz4(z2, x1) 107 | out_R = self.outzc(z1) 108 | 109 | return F.sigmoid(out_R) 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /models/GT.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | from utils.padding import Conv2d 5 | 6 | class up(nn.Module): 7 | def __init__(self, in_ch, out_ch, conv_num,fea_ch): 8 | super(up, self).__init__() 9 | 10 | self.up = nn.ConvTranspose2d(in_ch//2, in_ch//2, 2, stride=2) 11 | # partial conv 12 | self.cv = nn.Conv2d(in_ch, in_ch, 3, padding=1, bias=False) 13 | self.bn = nn.BatchNorm2d(in_ch,track_running_stats=False) 14 | self.ac = nn.ReLU(inplace=True) 15 | self.pooling = torch.nn.AvgPool2d(3,stride=1,padding=1) 16 | self.mask_gene = MASK_GENE(fea_ch) 17 | if conv_num == 2: 18 | self.conv = double_conv(in_ch, out_ch) 19 | if conv_num == 4: 20 | self.conv = forth_conv(in_ch, out_ch) 21 | 22 | def forward(self, x1, x2, x3): 23 | x1 = self.up(x1) 24 | 25 | diffY = x2.size()[2] - x1.size()[2] 26 | diffX = x2.size()[3] - x1.size()[3] 27 | 28 | x1 = F.pad(x1, (diffX // 2, diffX - diffX//2, 29 | diffY // 2, diffY - diffY//2)) 30 | 31 | x = torch.cat([x2-x3, x1], dim=1) 32 | mask, mask_e, mask_d = self.mask_gene(x3, x2, x1) 33 | x = self.cv(x*mask) #mask = [mask_x2_e, mask_x1_d] 34 | mask_avg = torch.mean(self.pooling(mask),dim=1,keepdim=True) 35 | mask_avg[mask_avg ==0] = 1 36 | x = x*(1/mask_avg) 37 | x = self.bn(x) 38 | x = self.ac(x) 39 | 40 | x = self.conv(x) 41 | return x, mask, mask_e, mask_d 42 | 43 | 44 | class outconv(nn.Module): 45 | def __init__(self, in_ch, out_ch): 46 | super(outconv, self).__init__() 47 | self.conv = nn.Conv2d(in_ch, out_ch, 1) 48 | 49 | def forward(self, x): 50 | x = self.conv(x) 51 | return x 52 | 53 | class DOWN(nn.Module): 54 | def __init__(self): 55 | super(DOWN, self).__init__() 56 | self.downsample = nn.Sequential( 57 | nn.MaxPool2d(2), 58 | ) 59 | 60 | def forward(self, x): 61 | x2 = self.downsample(x) 62 | x3 = self.downsample(x2) 63 | x4 = self.downsample(x3) 64 | return x,x2,x3,x4 65 | 66 | class double_conv(nn.Module): 67 | def __init__(self, in_ch, out_ch): 68 | super(double_conv, self).__init__() 69 | self.conv = nn.Sequential( 70 | nn.Conv2d(in_ch, out_ch, 3, padding=1), 71 | nn.BatchNorm2d(out_ch,track_running_stats=False), 72 | nn.ReLU(inplace=True) 73 | ) 74 | 75 | def forward(self, x): 76 | x = self.conv(x) 77 | return x 78 | 79 | class forth_conv(nn.Module): 80 | def __init__(self, in_ch, out_ch): 81 | super(forth_conv, self).__init__() 82 | self.conv = nn.Sequential( 83 | nn.Conv2d(in_ch, in_ch, 3, padding=1), 84 | nn.BatchNorm2d(in_ch,track_running_stats=False), 85 | nn.ReLU(inplace=True), 86 | nn.Conv2d(in_ch, in_ch, 3, padding=1), 87 | nn.BatchNorm2d(in_ch,track_running_stats=False), 88 | nn.ReLU(inplace=True), 89 | nn.Conv2d(in_ch, out_ch, 3, padding=1), 90 | nn.BatchNorm2d(out_ch,track_running_stats=False), 91 | nn.ReLU(inplace=True), 92 | ) 93 | 94 | def forward(self, x): 95 | x = self.conv(x) 96 | return x 97 | 98 | class Encoder(nn.Module): 99 | def __init__(self,encoder): 100 | super(Encoder, self).__init__() 101 | self.encoder = encoder 102 | 103 | def forward(self,x): 104 | for index in range(0,4): 105 | x = self.encoder.features[index](x) 106 | x1 = x #torch.Size([1,64,224,224]) 107 | for index in range(4,9): 108 | x = self.encoder.features[index](x) 109 | x2 = x #torch.Size([1,128,112,112]) 110 | for index in range(9,18): 111 | x = self.encoder.features[index](x) 112 | x3 = x #torch.Size([1,256,56,56]) 113 | for index in range(18,27): 114 | x = self.encoder.features[index](x) 115 | x4 = x #torch.Size([1,512,28,28]) 116 | for index in range(27,36): 117 | x = self.encoder.features[index](x) 118 | x5 = x #torch.Size([1,512,14,14]) 119 | return x1, x2, x3, x4, x5 120 | 121 | class MASK_GENE(nn.Module): 122 | def __init__(self, io_ch): 123 | super(MASK_GENE, self).__init__() 124 | self.mask_conv0 = nn.Conv2d(io_ch*3, io_ch*3, 1) 125 | self.mask_ac = nn.ReLU(inplace=True) 126 | self.mask_conv1 = nn.Conv2d(io_ch*3, io_ch*2, 1) 127 | self.io_ch = io_ch 128 | 129 | def forward(self, x1, x2, x3): 130 | x = torch.cat([x3, x2, x1], dim=1) 131 | mask = F.sigmoid(self.mask_conv1(self.mask_ac(self.mask_conv0(x)))) 132 | mask_e, mask_d = torch.split(mask,self.io_ch,dim=1) 133 | return mask,mask_e,mask_d 134 | 135 | class GT_Model(nn.Module): 136 | def __init__(self, encoder_I, encoder_R): 137 | super(GT_Model, self).__init__() 138 | 139 | self.Encoder_I = Encoder(encoder_I) 140 | self.Encoder_R = Encoder(encoder_R) 141 | 142 | self.upy1 = up(1024, 256, 4, 512) 143 | self.upy2 = up(512, 128, 4, 256) 144 | self.upy3 = up(256, 64, 2, 128) 145 | self.upy4 = up(128, 64, 2, 64) 146 | self.outTc = outconv(64, 3) 147 | self.down = DOWN() 148 | 149 | def forward(self, input_I, input_R, map_thr=None, map_encoder=None): 150 | I_x1, I_x2, I_x3, I_x4, I_x5 = self.Encoder_I(input_I) 151 | R_x1, R_x2, R_x3, R_x4, R_x5 = self.Encoder_R(input_R) 152 | 153 | y4, mask4,mask4_e,mask4_d= self.upy1(I_x5, I_x4, R_x4) 154 | y3, mask3,mask3_e,mask3_d = self.upy2(y4, I_x3, R_x3) 155 | y2, mask2,mask2_e,mask2_d = self.upy3(y3, I_x2, R_x2) 156 | y1, mask1,mask1_e,mask1_d = self.upy4(y2, I_x1, R_x1) 157 | y = self.outTc(y1) 158 | if not self.training: 159 | return F.sigmoid(y), 160 | 161 | map_1, map_2, map_3, map_4 = self.down(map_thr) 162 | map_1e, map_2e, map_3e, map_4e = self.down(map_encoder) 163 | list_map = [map_1, map_2, map_3, map_4] 164 | list_R = [R_x1, R_x2, R_x3, R_x4] 165 | list_mask = [mask1, mask2, mask3, mask4] 166 | list_mask_encoder = [mask1_e, mask2_e, mask3_e, mask4_e] 167 | list_map_encoder = [map_1e, map_2e, map_3e, map_4e] 168 | 169 | return F.sigmoid(y), list_map, list_R, list_mask, list_mask_encoder, list_map_encoder 170 | 171 | 172 | class Discriminator(nn.Module): 173 | def __init__(self): 174 | super(Discriminator,self).__init__() 175 | 176 | self.layers=nn.Sequential( 177 | # layer_1: [batch, 256, 256, 3 * 2] => [batch, 128, 128, 64] 178 | Conv2d(6, 64, kernel_size=4, stride=2), 179 | nn.BatchNorm2d(num_features=64), 180 | nn.LeakyReLU(0.2,inplace=True), 181 | 182 | # layer_2: [batch, 128, 128, 64] => [batch, 64, 64, 64] 183 | Conv2d(64, 64, kernel_size=4, stride=2), 184 | nn.BatchNorm2d(num_features=64), 185 | nn.LeakyReLU(0.2, inplace=True), 186 | 187 | # layer_3: [batch, 64, 64, 64] => [batch, 32, 32, 64 ] 188 | Conv2d(64, 64, kernel_size=4, stride=2), 189 | nn.BatchNorm2d(num_features=64), 190 | nn.LeakyReLU(0.2, inplace=True), 191 | 192 | # layer_4: [batch, 32, 32, 64] => [batch, 32, 32, 1] 193 | Conv2d(64, 1, kernel_size=4, stride=1), 194 | nn.Sigmoid() 195 | ) 196 | 197 | def forward(self, blended, transmission): 198 | input = torch.cat([blended, transmission], dim=1) 199 | return self.layers(input) 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | -------------------------------------------------------------------------------- /models/encoder_build.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | 3 | def make_layers(cfg, batch_norm=False): 4 | layers = [] 5 | in_channels = 3 6 | for v in cfg: 7 | if v == 'M': 8 | layers += [nn.MaxPool2d(kernel_size=2, stride=2)] 9 | else: 10 | conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1) 11 | if batch_norm: 12 | layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)] 13 | else: 14 | layers += [conv2d, nn.ReLU(inplace=True)] 15 | in_channels = v 16 | return nn.Sequential(*layers) 17 | 18 | cfgs = { 19 | 'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512], 20 | } 21 | 22 | 23 | class VGG(nn.Module): 24 | def __init__(self,features): 25 | super(VGG, self).__init__() 26 | self.features = features 27 | 28 | def forward(self, x): 29 | x = self.features(x) 30 | 31 | def _vgg(arch, cfg, batch_norm, pretrained, progress, **kwargs): 32 | model = VGG(make_layers(cfgs[cfg], batch_norm=batch_norm), **kwargs) 33 | return model 34 | 35 | def encoder(pretrained=False, progress=True, **kwargs): 36 | return _vgg('vgg19', 'E', False, pretrained, progress, **kwargs) 37 | -------------------------------------------------------------------------------- /result/real20/0_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/0_b.png -------------------------------------------------------------------------------- /result/real20/0_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/0_gt.png -------------------------------------------------------------------------------- /result/real20/0_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/0_pretr.png -------------------------------------------------------------------------------- /result/real20/0_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/0_t.png -------------------------------------------------------------------------------- /result/real20/10_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/10_b.png -------------------------------------------------------------------------------- /result/real20/10_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/10_gt.png -------------------------------------------------------------------------------- /result/real20/10_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/10_pretr.png -------------------------------------------------------------------------------- /result/real20/10_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/10_t.png -------------------------------------------------------------------------------- /result/real20/11_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/11_b.png -------------------------------------------------------------------------------- /result/real20/11_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/11_gt.png -------------------------------------------------------------------------------- /result/real20/11_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/11_pretr.png -------------------------------------------------------------------------------- /result/real20/11_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/11_t.png -------------------------------------------------------------------------------- /result/real20/12_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/12_b.png -------------------------------------------------------------------------------- /result/real20/12_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/12_gt.png -------------------------------------------------------------------------------- /result/real20/12_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/12_pretr.png -------------------------------------------------------------------------------- /result/real20/12_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/12_t.png -------------------------------------------------------------------------------- /result/real20/13_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/13_b.png -------------------------------------------------------------------------------- /result/real20/13_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/13_gt.png -------------------------------------------------------------------------------- /result/real20/13_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/13_pretr.png -------------------------------------------------------------------------------- /result/real20/13_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/13_t.png -------------------------------------------------------------------------------- /result/real20/14_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/14_b.png -------------------------------------------------------------------------------- /result/real20/14_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/14_gt.png -------------------------------------------------------------------------------- /result/real20/14_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/14_pretr.png -------------------------------------------------------------------------------- /result/real20/14_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/14_t.png -------------------------------------------------------------------------------- /result/real20/15_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/15_b.png -------------------------------------------------------------------------------- /result/real20/15_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/15_gt.png -------------------------------------------------------------------------------- /result/real20/15_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/15_pretr.png -------------------------------------------------------------------------------- /result/real20/15_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/15_t.png -------------------------------------------------------------------------------- /result/real20/16_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/16_b.png -------------------------------------------------------------------------------- /result/real20/16_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/16_gt.png -------------------------------------------------------------------------------- /result/real20/16_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/16_pretr.png -------------------------------------------------------------------------------- /result/real20/16_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/16_t.png -------------------------------------------------------------------------------- /result/real20/17_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/17_b.png -------------------------------------------------------------------------------- /result/real20/17_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/17_gt.png -------------------------------------------------------------------------------- /result/real20/17_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/17_pretr.png -------------------------------------------------------------------------------- /result/real20/17_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/17_t.png -------------------------------------------------------------------------------- /result/real20/18_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/18_b.png -------------------------------------------------------------------------------- /result/real20/18_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/18_gt.png -------------------------------------------------------------------------------- /result/real20/18_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/18_pretr.png -------------------------------------------------------------------------------- /result/real20/18_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/18_t.png -------------------------------------------------------------------------------- /result/real20/19_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/19_b.png -------------------------------------------------------------------------------- /result/real20/19_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/19_gt.png -------------------------------------------------------------------------------- /result/real20/19_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/19_pretr.png -------------------------------------------------------------------------------- /result/real20/19_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/19_t.png -------------------------------------------------------------------------------- /result/real20/1_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/1_b.png -------------------------------------------------------------------------------- /result/real20/1_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/1_gt.png -------------------------------------------------------------------------------- /result/real20/1_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/1_pretr.png -------------------------------------------------------------------------------- /result/real20/1_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/1_t.png -------------------------------------------------------------------------------- /result/real20/2_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/2_b.png -------------------------------------------------------------------------------- /result/real20/2_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/2_gt.png -------------------------------------------------------------------------------- /result/real20/2_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/2_pretr.png -------------------------------------------------------------------------------- /result/real20/2_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/2_t.png -------------------------------------------------------------------------------- /result/real20/3_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/3_b.png -------------------------------------------------------------------------------- /result/real20/3_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/3_gt.png -------------------------------------------------------------------------------- /result/real20/3_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/3_pretr.png -------------------------------------------------------------------------------- /result/real20/3_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/3_t.png -------------------------------------------------------------------------------- /result/real20/4_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/4_b.png -------------------------------------------------------------------------------- /result/real20/4_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/4_gt.png -------------------------------------------------------------------------------- /result/real20/4_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/4_pretr.png -------------------------------------------------------------------------------- /result/real20/4_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/4_t.png -------------------------------------------------------------------------------- /result/real20/5_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/5_b.png -------------------------------------------------------------------------------- /result/real20/5_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/5_gt.png -------------------------------------------------------------------------------- /result/real20/5_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/5_pretr.png -------------------------------------------------------------------------------- /result/real20/5_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/5_t.png -------------------------------------------------------------------------------- /result/real20/6_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/6_b.png -------------------------------------------------------------------------------- /result/real20/6_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/6_gt.png -------------------------------------------------------------------------------- /result/real20/6_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/6_pretr.png -------------------------------------------------------------------------------- /result/real20/6_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/6_t.png -------------------------------------------------------------------------------- /result/real20/7_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/7_b.png -------------------------------------------------------------------------------- /result/real20/7_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/7_gt.png -------------------------------------------------------------------------------- /result/real20/7_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/7_pretr.png -------------------------------------------------------------------------------- /result/real20/7_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/7_t.png -------------------------------------------------------------------------------- /result/real20/8_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/8_b.png -------------------------------------------------------------------------------- /result/real20/8_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/8_gt.png -------------------------------------------------------------------------------- /result/real20/8_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/8_pretr.png -------------------------------------------------------------------------------- /result/real20/8_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/8_t.png -------------------------------------------------------------------------------- /result/real20/9_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/9_b.png -------------------------------------------------------------------------------- /result/real20/9_gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/9_gt.png -------------------------------------------------------------------------------- /result/real20/9_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/9_pretr.png -------------------------------------------------------------------------------- /result/real20/9_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real20/9_t.png -------------------------------------------------------------------------------- /result/real45/0_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/0_b.png -------------------------------------------------------------------------------- /result/real45/0_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/0_pretr.png -------------------------------------------------------------------------------- /result/real45/0_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/0_t.png -------------------------------------------------------------------------------- /result/real45/10_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/10_b.png -------------------------------------------------------------------------------- /result/real45/10_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/10_pretr.png -------------------------------------------------------------------------------- /result/real45/10_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/10_t.png -------------------------------------------------------------------------------- /result/real45/11_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/11_b.png -------------------------------------------------------------------------------- /result/real45/11_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/11_pretr.png -------------------------------------------------------------------------------- /result/real45/11_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/11_t.png -------------------------------------------------------------------------------- /result/real45/12_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/12_b.png -------------------------------------------------------------------------------- /result/real45/12_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/12_pretr.png -------------------------------------------------------------------------------- /result/real45/12_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/12_t.png -------------------------------------------------------------------------------- /result/real45/13_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/13_b.png -------------------------------------------------------------------------------- /result/real45/13_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/13_pretr.png -------------------------------------------------------------------------------- /result/real45/13_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/13_t.png -------------------------------------------------------------------------------- /result/real45/14_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/14_b.png -------------------------------------------------------------------------------- /result/real45/14_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/14_pretr.png -------------------------------------------------------------------------------- /result/real45/14_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/14_t.png -------------------------------------------------------------------------------- /result/real45/15_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/15_b.png -------------------------------------------------------------------------------- /result/real45/15_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/15_pretr.png -------------------------------------------------------------------------------- /result/real45/15_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/15_t.png -------------------------------------------------------------------------------- /result/real45/16_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/16_b.png -------------------------------------------------------------------------------- /result/real45/16_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/16_pretr.png -------------------------------------------------------------------------------- /result/real45/16_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/16_t.png -------------------------------------------------------------------------------- /result/real45/17_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/17_b.png -------------------------------------------------------------------------------- /result/real45/17_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/17_pretr.png -------------------------------------------------------------------------------- /result/real45/17_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/17_t.png -------------------------------------------------------------------------------- /result/real45/18_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/18_b.png -------------------------------------------------------------------------------- /result/real45/18_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/18_pretr.png -------------------------------------------------------------------------------- /result/real45/18_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/18_t.png -------------------------------------------------------------------------------- /result/real45/19_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/19_b.png -------------------------------------------------------------------------------- /result/real45/19_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/19_pretr.png -------------------------------------------------------------------------------- /result/real45/19_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/19_t.png -------------------------------------------------------------------------------- /result/real45/1_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/1_b.png -------------------------------------------------------------------------------- /result/real45/1_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/1_pretr.png -------------------------------------------------------------------------------- /result/real45/1_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/1_t.png -------------------------------------------------------------------------------- /result/real45/20_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/20_b.png -------------------------------------------------------------------------------- /result/real45/20_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/20_pretr.png -------------------------------------------------------------------------------- /result/real45/20_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/20_t.png -------------------------------------------------------------------------------- /result/real45/21_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/21_b.png -------------------------------------------------------------------------------- /result/real45/21_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/21_pretr.png -------------------------------------------------------------------------------- /result/real45/21_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/21_t.png -------------------------------------------------------------------------------- /result/real45/22_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/22_b.png -------------------------------------------------------------------------------- /result/real45/22_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/22_pretr.png -------------------------------------------------------------------------------- /result/real45/22_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/22_t.png -------------------------------------------------------------------------------- /result/real45/23_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/23_b.png -------------------------------------------------------------------------------- /result/real45/23_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/23_pretr.png -------------------------------------------------------------------------------- /result/real45/23_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/23_t.png -------------------------------------------------------------------------------- /result/real45/24_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/24_b.png -------------------------------------------------------------------------------- /result/real45/24_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/24_pretr.png -------------------------------------------------------------------------------- /result/real45/24_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/24_t.png -------------------------------------------------------------------------------- /result/real45/25_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/25_b.png -------------------------------------------------------------------------------- /result/real45/25_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/25_pretr.png -------------------------------------------------------------------------------- /result/real45/25_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/25_t.png -------------------------------------------------------------------------------- /result/real45/26_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/26_b.png -------------------------------------------------------------------------------- /result/real45/26_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/26_pretr.png -------------------------------------------------------------------------------- /result/real45/26_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/26_t.png -------------------------------------------------------------------------------- /result/real45/27_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/27_b.png -------------------------------------------------------------------------------- /result/real45/27_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/27_pretr.png -------------------------------------------------------------------------------- /result/real45/27_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/27_t.png -------------------------------------------------------------------------------- /result/real45/28_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/28_b.png -------------------------------------------------------------------------------- /result/real45/28_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/28_pretr.png -------------------------------------------------------------------------------- /result/real45/28_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/28_t.png -------------------------------------------------------------------------------- /result/real45/29_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/29_b.png -------------------------------------------------------------------------------- /result/real45/29_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/29_pretr.png -------------------------------------------------------------------------------- /result/real45/29_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/29_t.png -------------------------------------------------------------------------------- /result/real45/2_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/2_b.png -------------------------------------------------------------------------------- /result/real45/2_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/2_pretr.png -------------------------------------------------------------------------------- /result/real45/2_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/2_t.png -------------------------------------------------------------------------------- /result/real45/30_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/30_b.png -------------------------------------------------------------------------------- /result/real45/30_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/30_pretr.png -------------------------------------------------------------------------------- /result/real45/30_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/30_t.png -------------------------------------------------------------------------------- /result/real45/31_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/31_b.png -------------------------------------------------------------------------------- /result/real45/31_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/31_pretr.png -------------------------------------------------------------------------------- /result/real45/31_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/31_t.png -------------------------------------------------------------------------------- /result/real45/32_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/32_b.png -------------------------------------------------------------------------------- /result/real45/32_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/32_pretr.png -------------------------------------------------------------------------------- /result/real45/32_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/32_t.png -------------------------------------------------------------------------------- /result/real45/33_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/33_b.png -------------------------------------------------------------------------------- /result/real45/33_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/33_pretr.png -------------------------------------------------------------------------------- /result/real45/33_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/33_t.png -------------------------------------------------------------------------------- /result/real45/34_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/34_b.png -------------------------------------------------------------------------------- /result/real45/34_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/34_pretr.png -------------------------------------------------------------------------------- /result/real45/34_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/34_t.png -------------------------------------------------------------------------------- /result/real45/35_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/35_b.png -------------------------------------------------------------------------------- /result/real45/35_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/35_pretr.png -------------------------------------------------------------------------------- /result/real45/35_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/35_t.png -------------------------------------------------------------------------------- /result/real45/36_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/36_b.png -------------------------------------------------------------------------------- /result/real45/36_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/36_pretr.png -------------------------------------------------------------------------------- /result/real45/36_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/36_t.png -------------------------------------------------------------------------------- /result/real45/37_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/37_b.png -------------------------------------------------------------------------------- /result/real45/37_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/37_pretr.png -------------------------------------------------------------------------------- /result/real45/37_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/37_t.png -------------------------------------------------------------------------------- /result/real45/38_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/38_b.png -------------------------------------------------------------------------------- /result/real45/38_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/38_pretr.png -------------------------------------------------------------------------------- /result/real45/38_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/38_t.png -------------------------------------------------------------------------------- /result/real45/39_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/39_b.png -------------------------------------------------------------------------------- /result/real45/39_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/39_pretr.png -------------------------------------------------------------------------------- /result/real45/39_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/39_t.png -------------------------------------------------------------------------------- /result/real45/3_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/3_b.png -------------------------------------------------------------------------------- /result/real45/3_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/3_pretr.png -------------------------------------------------------------------------------- /result/real45/3_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/3_t.png -------------------------------------------------------------------------------- /result/real45/40_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/40_b.png -------------------------------------------------------------------------------- /result/real45/40_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/40_pretr.png -------------------------------------------------------------------------------- /result/real45/40_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/40_t.png -------------------------------------------------------------------------------- /result/real45/41_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/41_b.png -------------------------------------------------------------------------------- /result/real45/41_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/41_pretr.png -------------------------------------------------------------------------------- /result/real45/41_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/41_t.png -------------------------------------------------------------------------------- /result/real45/42_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/42_b.png -------------------------------------------------------------------------------- /result/real45/42_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/42_pretr.png -------------------------------------------------------------------------------- /result/real45/42_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/42_t.png -------------------------------------------------------------------------------- /result/real45/43_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/43_b.png -------------------------------------------------------------------------------- /result/real45/43_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/43_pretr.png -------------------------------------------------------------------------------- /result/real45/43_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/43_t.png -------------------------------------------------------------------------------- /result/real45/44_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/44_b.png -------------------------------------------------------------------------------- /result/real45/44_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/44_pretr.png -------------------------------------------------------------------------------- /result/real45/44_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/44_t.png -------------------------------------------------------------------------------- /result/real45/4_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/4_b.png -------------------------------------------------------------------------------- /result/real45/4_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/4_pretr.png -------------------------------------------------------------------------------- /result/real45/4_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/4_t.png -------------------------------------------------------------------------------- /result/real45/5_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/5_b.png -------------------------------------------------------------------------------- /result/real45/5_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/5_pretr.png -------------------------------------------------------------------------------- /result/real45/5_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/5_t.png -------------------------------------------------------------------------------- /result/real45/6_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/6_b.png -------------------------------------------------------------------------------- /result/real45/6_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/6_pretr.png -------------------------------------------------------------------------------- /result/real45/6_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/6_t.png -------------------------------------------------------------------------------- /result/real45/7_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/7_b.png -------------------------------------------------------------------------------- /result/real45/7_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/7_pretr.png -------------------------------------------------------------------------------- /result/real45/7_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/7_t.png -------------------------------------------------------------------------------- /result/real45/8_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/8_b.png -------------------------------------------------------------------------------- /result/real45/8_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/8_pretr.png -------------------------------------------------------------------------------- /result/real45/8_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/8_t.png -------------------------------------------------------------------------------- /result/real45/9_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/9_b.png -------------------------------------------------------------------------------- /result/real45/9_pretr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/9_pretr.png -------------------------------------------------------------------------------- /result/real45/9_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/result/real45/9_t.png -------------------------------------------------------------------------------- /solver.py: -------------------------------------------------------------------------------- 1 | import os 2 | import torch 3 | import torchvision.models as models 4 | import torch.nn.functional as F 5 | from models.GT import Discriminator,GT_Model 6 | from models.GR import GR_Model 7 | from models.encoder_build import encoder 8 | from data.dataset import MyDataset,FusionDataset 9 | from utils.utils import is_image_file 10 | from test import test_state 11 | import cv2 12 | 13 | EPS=1e-12 14 | class Solver: 15 | def __init__(self,args): 16 | self.args = args 17 | self.start_epoch=0 18 | self.global_step = 0 19 | self.is_blur=0 20 | 21 | self.encoder_I = encoder() 22 | self.encoder_I.cuda() 23 | self.encoder_R = encoder() 24 | self.encoder_R.cuda() 25 | 26 | self.vgg_feature = models.vgg19() 27 | vgg_feature_state_dict = torch.load(self.args.vgg_feature_pretrained_ckpt) 28 | self.vgg_feature.load_state_dict(vgg_feature_state_dict) 29 | del(vgg_feature_state_dict) 30 | self.vgg_feature.cuda() 31 | 32 | self.encoder = encoder() 33 | self.encoder.cuda() 34 | 35 | def prepare_data(self,train_path,is_ref_syn): 36 | blended=[] 37 | transmission=[] 38 | reflection=[] 39 | if is_ref_syn: 40 | print('loading synthetic data...') 41 | else: 42 | print('loading real data...') 43 | 44 | for dirname in train_path: 45 | train_t_gt= dirname+"/transmission_layer/" 46 | train_r_gt=dirname+"/reflection_layer/" 47 | train_b=dirname+"/blended/" 48 | if is_ref_syn: 49 | r_list=os.listdir(train_r_gt) 50 | for _,_,fnames in sorted(os.walk(train_t_gt)): 51 | for fname in fnames: 52 | if is_ref_syn: 53 | if not fname in r_list: 54 | continue 55 | if is_image_file(fname): 56 | path_transmission=os.path.join(train_t_gt,fname) 57 | transmission_img = cv2.imread(path_transmission) 58 | path_blended=os.path.join(train_b,fname) 59 | blended_img = cv2.imread(path_blended) 60 | path_reflection=os.path.join(train_r_gt,fname) 61 | reflection_img = cv2.imread(path_reflection) 62 | 63 | blended.append(blended_img) 64 | transmission.append(transmission_img) 65 | reflection.append(reflection_img) 66 | 67 | return blended,transmission,reflection 68 | 69 | def feat_loss(self,output_t,gt_t): 70 | feat_loss = 0 71 | conv_list = [2, 7, 12, 21, 30] 72 | sigma_list = [1/2.6, 1/4.8, 1/3.7, 1/5.6, 10/1.5] 73 | i = 0 74 | for index in range(31): 75 | torch.cuda.empty_cache() 76 | output_t = self.vgg_feature.features[index](output_t) 77 | gt_t = self.vgg_feature.features[index](gt_t) 78 | if index in conv_list: 79 | feat_loss+=self.l1_loss(output_t,gt_t)*sigma_list[i] 80 | i += 1 81 | return feat_loss 82 | 83 | def exclusion_loss(self,img_T,img_R,level=3): 84 | grad_x_loss = [] 85 | grad_y_loss = [] 86 | for l in range(level): 87 | grad_x_T,grad_y_T = self.compute_grad(img_T) 88 | grad_x_R,grad_y_R = self.compute_grad(img_R) 89 | 90 | alphax = 2.0 * torch.mean(torch.abs(grad_x_T)) / torch.mean(torch.abs(grad_x_R)) 91 | alphay = 2.0 * torch.mean(torch.abs(grad_y_T)) / torch.mean(torch.abs(grad_y_R)) 92 | 93 | gradx1_s = (torch.sigmoid(grad_x_T) * 2) - 1 # mul 2 minus 1 is to change sigmoid into tanh 94 | grady1_s = (torch.sigmoid(grad_y_T) * 2) - 1 95 | gradx2_s = (torch.sigmoid(grad_x_R * alphax) * 2) - 1 96 | grady2_s = (torch.sigmoid(grad_y_R * alphay) * 2) - 1 97 | 98 | grad_x_loss.append(torch.mean(torch.mul(gradx1_s.pow(2), gradx2_s.pow(2))) ** 0.25) 99 | grad_y_loss.append(torch.mean(torch.mul(grady1_s.pow(2), grady2_s.pow(2))) ** 0.25) 100 | 101 | img_T=F.interpolate(img_T,scale_factor=0.5,mode='bilinear') 102 | img_R=F.interpolate(img_R,scale_factor=0.5,mode='bilinear') 103 | loss_gradxy = torch.sum(sum(grad_x_loss)/3) + torch.sum(sum(grad_y_loss)/3) 104 | 105 | return loss_gradxy/2 106 | 107 | def l1_loss(self,input,output): 108 | return torch.mean(torch.abs(input - output)) 109 | 110 | def convert_L(self, img): 111 | img_L = (0.114*img[0,0,:,:]+0.587*img[0,1,:,:]+\ 112 | 0.299*img[0,2,:,:]).unsqueeze(0).unsqueeze(0) 113 | return img_L 114 | 115 | def compute_grad(self,img): 116 | gradx = img[:,:,1:,:]-img[:,:,:-1,:] 117 | grady = img[:,:,:,1:]-img[:,:,:,:-1] 118 | return gradx,grady 119 | 120 | def thr_loss(self, list_map, list_R, list_mask, list_mask_encoder, list_map_encoder): 121 | mask_loss = 0 122 | mask_encoder_loss = 0 123 | for i in range(4): 124 | mask_loss = mask_loss + self.l1_loss(list_map[i]*list_mask[i], list_map[i]*1) 125 | mask_encoder_loss = mask_encoder_loss + \ 126 | self.l1_loss(list_map_encoder[i]*list_mask_encoder[i], list_map_encoder[i]*0) 127 | return mask_loss + mask_encoder_loss 128 | 129 | 130 | def train_model(self): 131 | self.gr_model = GR_Model(self.encoder) 132 | self.gr_model.cuda() 133 | 134 | self.gt_model = GT_Model(self.encoder_I,self.encoder_R) 135 | self.gt_model.cuda() 136 | 137 | self.discriminator = Discriminator() 138 | self.discriminator.cuda() 139 | 140 | param = list(self.gt_model.parameters()) + list(self.gr_model.parameters()) 141 | self.G_opt = torch.optim.Adam(param,lr=self.args.lr,) 142 | self.D_opt = torch.optim.Adam(self.discriminator.parameters(),lr=self.args.lr,) 143 | 144 | #resume from a checkpoit 145 | if self.args.resume_file: 146 | if os.path.isfile(self.args.resume_file): 147 | print("loading checkpoint'{}'".format(self.args.resume_file)) 148 | checkpoint = torch.load(self.args.resume_file) 149 | self.start_epoch = checkpoint['epoch'] 150 | self.global_step = checkpoint['global_step'] 151 | self.gt_model.load_state_dict(checkpoint['GT_state']) 152 | self.gr_model.load_state_dict(checkpoint['GR_state']) 153 | del(checkpoint) 154 | print("'{}' loaded".format(self.args.resume_file,self.args.start_epoch)) 155 | else: 156 | print("no checkpoint found at '{}'".format(self.args.resume_file)) 157 | return 1 158 | 159 | torch.backends.cudnn.benchmark = True 160 | 161 | input_real_b,output_real_t,output_real_r=self.prepare_data([self.args.ref_real_dir],is_ref_syn=False) 162 | input_syn_b,output_syn_t,output_syn_r=self.prepare_data([self.args.ref_syn_dir],is_ref_syn=True) 163 | 164 | train_refreal_dataset = MyDataset(input_real_b,output_real_t,output_real_r,is_ref_syn=False) 165 | train_refsyn_dataset = MyDataset(input_syn_b,output_syn_t,output_syn_r,is_ref_syn=True) 166 | 167 | train_fusion_dataset=FusionDataset([train_refsyn_dataset,train_refreal_dataset],[0.7,0.3]) 168 | 169 | train_dataloader_fusion = torch.utils.data.DataLoader(train_fusion_dataset, 170 | batch_size=self.args.batch_size,shuffle=False,num_workers=self.args.load_workers) 171 | 172 | # train the model 173 | best_psnr = best_ssim = 0 174 | for epoch in range(self.start_epoch, self.args.num_epochs): 175 | G_loss_avg,D_loss_avg = self.train_epoch(train_dataloader_fusion,epoch) 176 | 177 | if epoch % self.args.save_model_freq == 0 and epoch !=0 : 178 | state = { 179 | 'epoch': epoch + 1, 180 | 'global_step': self.global_step, 181 | 'GT_state': self.gt_model.state_dict(), 182 | 'GR_state': self.gr_model.state_dict(), 183 | } 184 | 185 | psnr,ssim = test_state(state['GT_state'],state['GR_state']) 186 | if psnr > best_psnr or ssim > best_ssim: 187 | print('Saving checkpoint, G_loss: {} D_loss: {}'.format(G_loss_avg, D_loss_avg)) 188 | if psnr > best_psnr: 189 | best_psnr = psnr 190 | torch.save(state, './checkpoint/epoch_{:0>3}_G_{:.3f}_P_{:.3f}.pth'.format(epoch,G_loss_avg,psnr)) 191 | else: 192 | best_ssim = ssim 193 | torch.save(state, './checkpoint/epoch_{:0>3}_G_{:.3f}_P_{:.3f}.pth'.format(epoch,G_loss_avg,psnr)) 194 | 195 | def train_epoch(self,train_dataloader_fusion,epoch): 196 | self.gt_model.train() 197 | self.discriminator.train() 198 | self.gr_model.train() 199 | 200 | G_loss_sum=0 201 | D_loss_sum=0 202 | 203 | self.steps_per_epoch = len(train_dataloader_fusion) 204 | 205 | for index, (input_b,gt_t,gt_r, is_ref_syn) in enumerate(train_dataloader_fusion): 206 | input_b = input_b.cuda(non_blocking=True) 207 | gt_t = gt_t.cuda(non_blocking=True) 208 | gt_r = gt_r.cuda(non_blocking=True) 209 | 210 | gray_r = self.convert_L(gt_r) 211 | map_thr = torch.zeros(gray_r.shape) 212 | map_thr[0,0,gray_r[0,0,:,:]<0.01] = 1 213 | map_thr = map_thr.cuda() 214 | 215 | map_encoder = torch.zeros(gray_r.shape) 216 | map_encoder[0,0,gray_r[0,0,:,:]>0.3] = 1 217 | map_encoder = map_encoder.cuda() 218 | 219 | if index%2==0: 220 | self.D_opt.zero_grad() 221 | with torch.no_grad(): 222 | pretrained_R = self.gr_model(input_b) 223 | output_t, list_map, list_R, list_mask, list_mask_encoder, \ 224 | list_map_encoder = self.gt_model(input_b, pretrained_R, map_thr, map_encoder) 225 | 226 | score_fake = self.discriminator(input_b, output_t) 227 | score_real = self.discriminator(input_b, gt_t) 228 | D_loss = (torch.mean(-(torch.log(score_real + EPS) + torch.log(1-score_fake+EPS))))*0.5 229 | D_loss_sum += D_loss.item() 230 | D_loss.cuda() 231 | D_loss.backward() 232 | self.D_opt.step() 233 | if index % self.args.print_freq == 0: 234 | print('D_loss: {0}\tstep: {1}'.format(D_loss,index)) 235 | 236 | pretrained_R = self.gr_model(input_b) 237 | output_t, list_map, list_R, list_mask, list_mask_encoder, \ 238 | list_map_encoder = self.gt_model(input_b, pretrained_R, map_thr, map_encoder) 239 | 240 | score_fake = self.discriminator(input_b, output_t) 241 | self.G_opt.zero_grad() 242 | 243 | F_loss = self.feat_loss(output_t, gt_t) 244 | A_loss = torch.mean(-torch.log(score_fake + EPS)) 245 | E_loss= self.exclusion_loss(output_t, pretrained_R, level=3) 246 | 247 | if is_ref_syn: 248 | Thr_loss = self.thr_loss(list_map, list_R, list_mask, list_mask_encoder, list_map_encoder) 249 | F_loss = F_loss + self.feat_loss(pretrained_R,gt_r) 250 | R_loss = self.l1_loss(pretrained_R, gt_r) 251 | 252 | G_loss = 0.2 * F_loss + E_loss + R_loss + 0.01*A_loss +Thr_loss 253 | if index % self.args.print_freq == 0: 254 | print('A_loss: {0}\tF_loss: {1}\tE_loss: {2}\tthr_loss: {3}\tepoch: {4}'.format(0.01*A_loss, 255 | 0.2*F_loss, E_loss,Thr_loss,epoch)) 256 | 257 | else: 258 | G_loss = 0.2 * F_loss + 0.01*A_loss + E_loss 259 | if index % self.args.print_freq == 0: 260 | print('A_loss: {0}\tF_loss: {1}\tE_loss: {2}\tepoch: {3}'.format(0.01*A_loss, 261 | 0.2*F_loss,E_loss,epoch)) 262 | 263 | G_loss_sum += G_loss.item() 264 | G_loss = G_loss.cuda() 265 | torch.cuda.empty_cache() 266 | G_loss.backward() 267 | self.G_opt.step() 268 | torch.cuda.empty_cache() 269 | 270 | self.global_step+=1 271 | return G_loss_sum/self.steps_per_epoch, D_loss_sum/(self.steps_per_epoch/2) 272 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | import os 4 | import cv2 5 | from models.GT import GT_Model 6 | from models.GR import GR_Model 7 | from models.encoder_build import encoder 8 | from torch.utils.data.dataset import Dataset 9 | import torchvision.transforms as transforms 10 | from utils import index 11 | import argparse 12 | from collections import OrderedDict as odict 13 | 14 | 15 | os.environ['CUDA_VISIBLE_DEVICES'] = '1' 16 | 17 | def str2bool(v): 18 | return v.lower() in ('y', 'yes', 't', 'true', '1') 19 | 20 | parser = argparse.ArgumentParser('test') 21 | parser.add_argument('--save_result_path',type=str2bool,default=True,help="if save result") 22 | parser.add_argument('--real20',type=str2bool,default=True,help="if real20 test") 23 | parser.add_argument('--sir_wild',type=str2bool,default=False,help="if sir_wild test") 24 | parser.add_argument('--sir_solid',type=str2bool,default=False,help="if sir_solid test") 25 | parser.add_argument('--sir_postcard',type=str2bool,default=False,help="if sir_postcard test") 26 | parser.add_argument('--real45',type=str2bool,default=True,help="if real45 test") 27 | parser.add_argument('--num_workers',type=int,default=4,help="num_workers") 28 | args = parser.parse_args() 29 | 30 | #dataset without GT 31 | path_real45 = './testsets/real45/' 32 | 33 | #datasets with GT 34 | path_real20 = './testsets/real20/' 35 | # The following datasets are not provided due to their policy 36 | # You can apply for the SIR^2 dataset from https://sir2data.github.io/ 37 | path_sir_wild = './testsets/WildSceneDataset/withgt/' 38 | path_sir_postcard = './testsets/PostcardDataset/' 39 | path_sir_solid = './testsets/SolidObjectDataset/' 40 | 41 | 42 | encoder_I = encoder() 43 | encoder_R = encoder() 44 | encoder_I.cuda() 45 | encoder_R.cuda() 46 | gt_model = GT_Model(encoder_I,encoder_R) 47 | gt_model.cuda() 48 | gt_model.eval() 49 | 50 | encoder = encoder() 51 | encoder.cuda() 52 | gr_model = GR_Model(encoder) 53 | gr_model.cuda() 54 | gr_model.eval() 55 | 56 | def creat_list(path,if_gt=True): 57 | gt_list = [] 58 | image_list = [] 59 | 60 | if if_gt: 61 | blended_path = path + 'blended/' 62 | trans_path = path + 'transmission_layer/' 63 | for _,_,fnames in sorted(os.walk(blended_path)): 64 | for fname in fnames: 65 | image_list.append(blended_path+fname) 66 | gt_list.append(trans_path+fname) 67 | 68 | else: 69 | for _,_,fnames in sorted(os.walk(path)): 70 | for fname in fnames: 71 | image_list.append(path+fname) 72 | 73 | return image_list,gt_list 74 | 75 | class TestDataset(Dataset): 76 | def __init__(self,blended_list,trans_list,transform=False,if_GT=True): 77 | self.to_tensor = transforms.ToTensor() 78 | self.blended_list = blended_list 79 | self.trans_list = trans_list 80 | self.transform = transform 81 | self.if_GT = if_GT 82 | 83 | def __getitem__(self, index): 84 | blended = cv2.imread(self.blended_list[index]) 85 | trans = blended 86 | if self.if_GT: 87 | trans= cv2.imread(self.trans_list[index]) 88 | if self.transform == True: 89 | if trans.shape[0] > trans.shape[1]: 90 | neww = 300 91 | newh = round((neww / trans.shape[1]) * trans.shape[0]) 92 | if trans.shape[0] < trans.shape[1]: 93 | newh = 300 94 | neww = round((newh / trans.shape[0]) * trans.shape[1]) 95 | blended = cv2.resize(np.float32(blended), (neww, newh), cv2.INTER_CUBIC)/255.0 96 | trans = cv2.resize(np.float32(trans), (neww, newh), cv2.INTER_CUBIC)/255.0 97 | 98 | blended = self.to_tensor(blended) 99 | trans = self.to_tensor(trans) 100 | return blended,trans 101 | 102 | def __len__(self): 103 | return len(self.blended_list) 104 | 105 | def test_diffdataset(test_loader,save_path=None,if_GT=True): 106 | ssim_sum = 0 107 | psnr_sum = 0 108 | 109 | for j, (image, gt) in enumerate(test_loader): 110 | image = image.cuda() 111 | gt = gt.cuda() 112 | with torch.no_grad(): 113 | image.requires_grad_(False) 114 | 115 | pretrained_R = gr_model(image) 116 | output_t, *_ = gt_model(image, pretrained_R) 117 | 118 | output_t = index.tensor2im(output_t) 119 | gt = index.tensor2im(gt) 120 | pretrained_R = index.tensor2im(pretrained_R) 121 | 122 | if if_GT: 123 | res, psnr,ssim = index.quality_assess(output_t, gt) 124 | print(res) 125 | ssim_sum += ssim 126 | psnr_sum += psnr 127 | 128 | if save_path: 129 | if not os.path.exists(save_path): 130 | os.mkdir(save_path) 131 | image = index.tensor2im(image) 132 | cv2.imwrite("%s/%s_pretr.png"%(save_path,j),pretrained_R,[int(cv2.IMWRITE_JPEG_QUALITY),100]) 133 | cv2.imwrite("%s/%s_b.png"%(save_path,j),image,[int(cv2.IMWRITE_JPEG_QUALITY),100]) 134 | cv2.imwrite("%s/%s_t.png"%(save_path,j),output_t,[int(cv2.IMWRITE_JPEG_QUALITY),100]) 135 | if if_GT: 136 | cv2.imwrite("%s/%s_gt.png"%(save_path,j),gt,[int(cv2.IMWRITE_JPEG_QUALITY),100]) 137 | 138 | print(len(test_loader),'SSIM:',ssim_sum/len(test_loader),'PSNR:',psnr_sum/len(test_loader)) 139 | return len(test_loader),ssim_sum,psnr_sum 140 | 141 | 142 | def test_state(state_T,state_R): 143 | 144 | gt_model.load_state_dict(state_T) 145 | gr_model.load_state_dict(state_R) 146 | del(state_T) 147 | del(state_R) 148 | 149 | datasets = odict([('real20', True), ('real45', False), ('sir_wild', True), ('sir_solid', True), ('sir_postcard', True)]) 150 | 151 | psnr_all, ssim_all, num_all = 0, 0, 0 152 | for dataset, with_GT in datasets.items(): 153 | if getattr(args, dataset): 154 | if args.save_result_path: 155 | save_path = './result/' + dataset 156 | else: 157 | save_path = None 158 | print('testing dataset:',dataset) 159 | num, ssim_sum, psnr_sum = test_diffdataset(eval('test_loader_'+dataset.replace('_','')), save_path, with_GT) 160 | 161 | if with_GT: 162 | psnr_all += psnr_sum 163 | ssim_all += ssim_sum 164 | num_all += num 165 | ssim_av = ssim_all/num_all 166 | psnr_av = psnr_all/num_all 167 | return psnr_av,ssim_av 168 | 169 | 170 | image_list_real20, gt_list_real20 = creat_list(path_real20) 171 | test_dataset_real20 = TestDataset(image_list_real20, gt_list_real20,transform=True) 172 | test_loader_real20 = torch.utils.data.DataLoader(dataset=test_dataset_real20,\ 173 | batch_size=1,shuffle=False,num_workers=args.num_workers) 174 | 175 | image_list_sirwild, gt_list_sirwild = creat_list(path_sir_wild) 176 | test_dataset_sirwild = TestDataset(image_list_sirwild,gt_list_sirwild) 177 | test_loader_sirwild = torch.utils.data.DataLoader(dataset=test_dataset_sirwild,\ 178 | batch_size=1,shuffle=False,num_workers=args.num_workers) 179 | 180 | image_list_sirpostcard, gt_list_sirpostcard = creat_list(path_sir_postcard) 181 | test_dataset_sirpostcard = TestDataset(image_list_sirpostcard,gt_list_sirpostcard) 182 | test_loader_sirpostcard = torch.utils.data.DataLoader(dataset=test_dataset_sirpostcard,\ 183 | batch_size=1,shuffle=False,num_workers=args.num_workers) 184 | 185 | image_list_sirsolid, gt_list_sirsolid = creat_list(path_sir_solid) 186 | test_dataset_sirsolid = TestDataset(image_list_sirsolid,gt_list_sirsolid) 187 | test_loader_sirsolid = torch.utils.data.DataLoader(dataset=test_dataset_sirsolid,\ 188 | batch_size=1,shuffle=False,num_workers=args.num_workers) 189 | 190 | image_list_real45, gt_list_real45 = creat_list(path_real45,if_gt=False) 191 | test_dataset_real45 = TestDataset(image_list_real45,gt_list_real45,if_GT=False) 192 | test_loader_real45 = torch.utils.data.DataLoader(dataset=test_dataset_real45,\ 193 | batch_size=1,shuffle=False,num_workers=args.num_workers) 194 | 195 | if __name__ == '__main__': 196 | 197 | ckpt_path = './checkpoint/pretrain.pth' 198 | ckpt_pre = torch.load(ckpt_path) 199 | print("loading checkpoint'{}'".format(ckpt_path)) 200 | 201 | psnr_av,ssim_av = test_state(ckpt_pre['GT_state'],ckpt_pre['GR_state']) 202 | print('The average PSNR/SSIM of all chosen testsets:',psnr_av,ssim_av) 203 | 204 | 205 | -------------------------------------------------------------------------------- /testsets/real20/blended/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/103.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/107.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/110.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/12.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/15.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/22.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/23.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/25.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/29.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/3.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/39.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/4.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/46.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/47.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/58.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/86.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/87.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/89.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/9.jpg -------------------------------------------------------------------------------- /testsets/real20/blended/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/blended/93.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/103.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/107.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/110.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/12.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/15.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/22.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/23.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/25.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/29.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/3.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/39.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/4.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/46.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/47.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/58.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/86.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/87.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/89.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/9.jpg -------------------------------------------------------------------------------- /testsets/real20/transmission_layer/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real20/transmission_layer/93.jpg -------------------------------------------------------------------------------- /testsets/real45/19-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/19-input.png -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-1-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-1-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-11-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-11-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-13-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-13-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-14-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-14-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-15-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-15-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-18-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-18-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-2-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-2-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-20-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-20-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-21-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-21-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-22-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-22-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-24-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-24-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-26-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-26-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-27-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-27-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-29-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-29-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-3-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-3-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-31-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-31-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-36-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-36-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-37-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-37-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-38-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-38-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-39-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-39-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-4-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-4-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-40-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-40-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-45-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-45-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-46-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-46-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-47-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-47-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-49-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-49-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-5-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-5-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-52-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-52-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-53-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-53-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-54-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-54-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-55-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-55-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-59-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-59-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-6-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-6-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-61-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-61-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-63-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-63-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-64-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-64-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-69-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-69-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-74-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-74-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-75-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-75-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-8-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-8-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-80-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-80-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-82-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-82-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-86-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-86-input.jpg -------------------------------------------------------------------------------- /testsets/real45/qingnan-new2-9-input.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyucs/RAGNet/75467a50dcbf1558dbb6b7b70cdcbefc78a4d242/testsets/real45/qingnan-new2-9-input.jpg -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import os 2 | import argparse 3 | from solver import Solver 4 | 5 | os.environ['CUDA_VISIBLE_DEVICES'] = '1' 6 | 7 | parser = argparse.ArgumentParser('Perceptual Reflection Removel') 8 | 9 | parser.add_argument('--ref_syn_dir',default="./synthetic",help="path to synthetic data") 10 | parser.add_argument('--ref_real_dir',default="./real",help="path to real data") 11 | parser.add_argument('--vgg_feature_pretrained_ckpt',default='./checkpoint/vgg19-dcbb9e9d.pth',help='path to vgg_19 ckpt') 12 | parser.add_argument('--save_model_freq',default=5,type=int,help="frequency to save model") 13 | parser.add_argument('--print_freq',type=int,default=10,help='print frequency') 14 | parser.add_argument('--resume_file',default='',help="resume file path") 15 | parser.add_argument('--lr',default=1e-4,type=float,help="learning rate") 16 | parser.add_argument('--load_workers',default=4,type=int,help="number of workers to load data") 17 | parser.add_argument('--batch_size',default=1,type=int,help="batch size") 18 | parser.add_argument('--start_epoch',type=int,default=0,help="start epoch of training") 19 | parser.add_argument('--num_epochs',type=int,default=150,help="total epoch of training") 20 | 21 | def main(): 22 | args = parser.parse_args() 23 | solver=Solver(args) 24 | solver.train_model() 25 | 26 | if __name__=='__main__': 27 | main() 28 | -------------------------------------------------------------------------------- /utils/index.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from skimage.measure import compare_ssim, compare_psnr 3 | from functools import partial 4 | 5 | class Bandwise(object): 6 | def __init__(self, index_fn): 7 | self.index_fn = index_fn 8 | 9 | def __call__(self, X, Y): 10 | C = X.shape[-1] 11 | bwindex = [] 12 | for ch in range(C): 13 | x = X[..., ch] 14 | y = Y[..., ch] 15 | index = self.index_fn(x, y) 16 | bwindex.append(index) 17 | return bwindex 18 | 19 | cal_bwpsnr = Bandwise(partial(compare_psnr, data_range=255)) 20 | cal_bwssim = Bandwise(partial(compare_ssim, data_range=255)) 21 | 22 | 23 | def tensor2im(image_tensor, imtype=np.uint8): 24 | image_tensor = image_tensor.detach() 25 | image_numpy = image_tensor[0].cpu().float().numpy() 26 | image_numpy = np.clip(image_numpy, 0, 1) 27 | if image_numpy.shape[0] == 1: 28 | image_numpy = np.tile(image_numpy, (3, 1, 1)) 29 | image_numpy = (np.transpose(image_numpy, (1, 2, 0))) * 255.0 30 | image_numpy = image_numpy.astype(imtype) 31 | return image_numpy 32 | 33 | def ssim_access(X, Y): 34 | ssim = np.mean(cal_bwssim(Y, X)) 35 | return ssim 36 | 37 | def quality_assess(X, Y): 38 | # Y: correct; X: estimate 39 | psnr = np.mean(cal_bwpsnr(Y, X)) 40 | ssim = np.mean(cal_bwssim(Y, X)) 41 | res = {'PSNR':psnr, 'SSIM': ssim} 42 | return res, psnr,ssim 43 | -------------------------------------------------------------------------------- /utils/padding.py: -------------------------------------------------------------------------------- 1 | import torch.utils.data 2 | from torch.nn import functional as F 3 | 4 | import math 5 | import torch 6 | from torch.nn.parameter import Parameter 7 | from torch.nn.functional import pad 8 | from torch.nn.modules import Module 9 | from torch.nn.modules.utils import _single, _pair, _triple 10 | 11 | def conv2d_same_padding(input, weight, bias=None, stride=1, padding=1, dilation=1, groups=1): 12 | input_rows = input.size(2) 13 | filter_rows = weight.size(2) 14 | effective_filter_size_rows = (filter_rows - 1) * dilation[0] + 1 15 | out_rows = (input_rows + stride[0] - 1) // stride[0] 16 | padding_rows = max(0, (out_rows - 1) * stride[0] + 17 | (filter_rows - 1) * dilation[0] + 1 - input_rows) 18 | rows_odd = (padding_rows % 2 != 0) 19 | padding_cols = max(0, (out_rows - 1) * stride[0] + 20 | (filter_rows - 1) * dilation[0] + 1 - input_rows) 21 | cols_odd = (padding_rows % 2 != 0) 22 | 23 | if rows_odd or cols_odd: 24 | input = pad(input, [0, int(cols_odd), 0, int(rows_odd)]) 25 | 26 | return F.conv2d(input, weight, bias, stride, 27 | padding=(padding_rows // 2, padding_cols // 2), 28 | dilation=dilation, groups=groups) 29 | 30 | class _ConvNd(Module): 31 | 32 | def __init__(self, in_channels, out_channels, kernel_size, stride, 33 | padding, dilation, transposed, output_padding, groups, bias): 34 | super(_ConvNd, self).__init__() 35 | if in_channels % groups != 0: 36 | raise ValueError('in_channels must be divisible by groups') 37 | if out_channels % groups != 0: 38 | raise ValueError('out_channels must be divisible by groups') 39 | self.in_channels = in_channels 40 | self.out_channels = out_channels 41 | self.kernel_size = kernel_size 42 | self.stride = stride 43 | self.padding = padding 44 | self.dilation = dilation 45 | self.transposed = transposed 46 | self.output_padding = output_padding 47 | self.groups = groups 48 | if transposed: 49 | self.weight = Parameter(torch.Tensor( 50 | in_channels, out_channels // groups, *kernel_size)) 51 | else: 52 | self.weight = Parameter(torch.Tensor( 53 | out_channels, in_channels // groups, *kernel_size)) 54 | if bias: 55 | self.bias = Parameter(torch.Tensor(out_channels)) 56 | else: 57 | self.register_parameter('bias', None) 58 | self.reset_parameters() 59 | 60 | def reset_parameters(self): 61 | n = self.in_channels 62 | for k in self.kernel_size: 63 | n *= k 64 | stdv = 1. / math.sqrt(n) 65 | self.weight.data.uniform_(-stdv, stdv) 66 | if self.bias is not None: 67 | self.bias.data.uniform_(-stdv, stdv) 68 | 69 | def __repr__(self): 70 | s = ('{name}({in_channels}, {out_channels}, kernel_size={kernel_size}' 71 | ', stride={stride}') 72 | if self.padding != (0,) * len(self.padding): 73 | s += ', padding={padding}' 74 | if self.dilation != (1,) * len(self.dilation): 75 | s += ', dilation={dilation}' 76 | if self.output_padding != (0,) * len(self.output_padding): 77 | s += ', output_padding={output_padding}' 78 | if self.groups != 1: 79 | s += ', groups={groups}' 80 | if self.bias is None: 81 | s += ', bias=False' 82 | s += ')' 83 | return s.format(name=self.__class__.__name__, **self.__dict__) 84 | 85 | class Conv2d(_ConvNd): 86 | 87 | def __init__(self, in_channels, out_channels, kernel_size, stride=1, 88 | padding=0, dilation=1, groups=1, bias=True): 89 | kernel_size = _pair(kernel_size) 90 | stride = _pair(stride) 91 | padding = _pair(padding) 92 | dilation = _pair(dilation) 93 | super(Conv2d, self).__init__( 94 | in_channels, out_channels, kernel_size, stride, padding, dilation, 95 | False, _pair(0), groups, bias) 96 | 97 | def forward(self, input): 98 | return conv2d_same_padding(input, self.weight, self.bias, self.stride, 99 | self.padding, self.dilation, self.groups) -------------------------------------------------------------------------------- /utils/utils.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | import random 4 | from scipy.signal import convolve2d 5 | 6 | 7 | IMG_EXTENSIONS = [ 8 | '.jpg', '.JPG', '.jpeg', '.JPEG', 9 | '.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP', 10 | ] 11 | 12 | def is_image_file(filename): 13 | return any(filename.endswith(extension) for extension in IMG_EXTENSIONS) 14 | 15 | def syn(input1,input2): 16 | input1 = np.float32(input1) / 255. 17 | input2 = np.float32(input2) / 255. 18 | 19 | sigma = random.uniform(2,5) 20 | R_blur = input2 21 | kernel = cv2.getGaussianKernel(11,sigma) 22 | kernel2d = np.dot(kernel,kernel.T) 23 | for i in range(3): 24 | R_blur[...,i] = convolve2d(R_blur[...,i],kernel2d,mode='same') 25 | M_ = input1 + R_blur 26 | if np.max(M_)>1: 27 | m = M_[M_>1] 28 | m = (np.mean(m)-1)*1.3 29 | R_blur = np.clip(R_blur-m,0,1) 30 | M_ = np.clip(R_blur+input1,0,1) 31 | 32 | return np.float32(input1),np.float32(R_blur),np.float32(M_) 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | --------------------------------------------------------------------------------