sunshangquan commited on
Commit
111d9b6
·
1 Parent(s): f0c4119

commit from ssq

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +4 -0
  2. Allweather/Options/Allweather_Histoformer.yml +155 -0
  3. Allweather/compute_psnr.py +136 -0
  4. Allweather/pretrained_models/README.md +1 -0
  5. Allweather/test_histoformer.py +89 -0
  6. Allweather/util.py +86 -0
  7. INSTALL.md +53 -0
  8. README.md +47 -0
  9. basicsr/__pycache__/version.cpython-38.pyc +0 -0
  10. basicsr/data/__init__.py +126 -0
  11. basicsr/data/__pycache__/__init__.cpython-38.pyc +0 -0
  12. basicsr/data/__pycache__/data_sampler.cpython-38.pyc +0 -0
  13. basicsr/data/__pycache__/data_util.cpython-38.pyc +0 -0
  14. basicsr/data/__pycache__/ffhq_dataset.cpython-38.pyc +0 -0
  15. basicsr/data/__pycache__/paired_image_dataset.cpython-38.pyc +0 -0
  16. basicsr/data/__pycache__/prefetch_dataloader.cpython-38.pyc +0 -0
  17. basicsr/data/__pycache__/reds_dataset.cpython-38.pyc +0 -0
  18. basicsr/data/__pycache__/single_image_dataset.cpython-38.pyc +0 -0
  19. basicsr/data/__pycache__/transforms.cpython-38.pyc +0 -0
  20. basicsr/data/__pycache__/video_test_dataset.cpython-38.pyc +0 -0
  21. basicsr/data/__pycache__/vimeo90k_dataset.cpython-38.pyc +0 -0
  22. basicsr/data/data_sampler.py +49 -0
  23. basicsr/data/data_util.py +390 -0
  24. basicsr/data/meta_info/meta_info_DIV2K800sub_GT.txt +0 -0
  25. basicsr/data/meta_info/meta_info_REDS4_test_GT.txt +4 -0
  26. basicsr/data/meta_info/meta_info_REDS_GT.txt +270 -0
  27. basicsr/data/meta_info/meta_info_REDSofficial4_test_GT.txt +4 -0
  28. basicsr/data/meta_info/meta_info_REDSval_official_test_GT.txt +30 -0
  29. basicsr/data/meta_info/meta_info_Vimeo90K_test_GT.txt +0 -0
  30. basicsr/data/meta_info/meta_info_Vimeo90K_test_fast_GT.txt +1225 -0
  31. basicsr/data/meta_info/meta_info_Vimeo90K_test_medium_GT.txt +0 -0
  32. basicsr/data/meta_info/meta_info_Vimeo90K_test_slow_GT.txt +1613 -0
  33. basicsr/data/meta_info/meta_info_Vimeo90K_train_GT.txt +0 -0
  34. basicsr/data/paired_image_dataset.py +374 -0
  35. basicsr/data/prefetch_dataloader.py +126 -0
  36. basicsr/data/single_image_dataset.py +67 -0
  37. basicsr/data/transforms.py +275 -0
  38. basicsr/data/video_test_dataset.py +325 -0
  39. basicsr/metrics/__init__.py +4 -0
  40. basicsr/metrics/__pycache__/__init__.cpython-38.pyc +0 -0
  41. basicsr/metrics/__pycache__/metric_util.cpython-38.pyc +0 -0
  42. basicsr/metrics/__pycache__/niqe.cpython-38.pyc +0 -0
  43. basicsr/metrics/__pycache__/psnr_ssim.cpython-38.pyc +0 -0
  44. basicsr/metrics/fid.py +102 -0
  45. basicsr/metrics/metric_util.py +47 -0
  46. basicsr/metrics/niqe.py +205 -0
  47. basicsr/metrics/niqe_pris_params.npz +0 -0
  48. basicsr/metrics/psnr_ssim.py +303 -0
  49. basicsr/models/__init__.py +42 -0
  50. basicsr/models/__pycache__/__init__.cpython-38.pyc +0 -0
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ # script
2
+ git.sh
3
+ Allweather/pretrained_models/net_g_best.pth
4
+ Allweather/pretrained_models/net_g_real.pth
Allweather/Options/Allweather_Histoformer.yml ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # general settings
2
+ name: Allweather_Histotormer
3
+ model_type: ImageCleanModel
4
+ scale: 1
5
+ num_gpu: 4 # set num_gpu: 0 for cpu mode
6
+ manual_seed: 100
7
+
8
+ # dataset and data loader settings
9
+ datasets:
10
+ train:
11
+ name: TrainSet
12
+ type: Dataset_PairedImage
13
+ dataroot_gt: /home1/ssq/data/allweather/gt/
14
+ dataroot_lq: /home1/ssq/data/allweather/input/
15
+ geometric_augs: true
16
+
17
+ filename_tmpl: '{}'
18
+ io_backend:
19
+ type: disk
20
+
21
+ # data loader
22
+ use_shuffle: true
23
+ num_worker_per_gpu: 8
24
+ batch_size_per_gpu: 8
25
+
26
+ ### -------------Progressive training--------------------------
27
+ mini_batch_sizes: [8,5,2,1,1] # Batch size per gpu
28
+ iters: [92000,84000,56000,36000,32000]
29
+ gt_size: 362 # Max patch size for progressive training
30
+ gt_sizes: [128,160,256,320,362] # Patch sizes for progressive training.
31
+ ### ------------------------------------------------------------
32
+
33
+ ### ------- Training on single fixed-patch size 128x128---------
34
+ # mini_batch_sizes: [8]
35
+ # iters: [300000]
36
+ # gt_size: 128
37
+ # gt_sizes: [128]
38
+ ### ------------------------------------------------------------
39
+
40
+ dataset_enlarge_ratio: 1
41
+ prefetch_mode: ~
42
+
43
+ val_snow_s:
44
+ name: ValSet_Snow100K-S
45
+ type: Dataset_PairedImage
46
+ dataroot_gt: /home1/ssq/data/allweather/test/Snow100K-S/gt/
47
+ dataroot_lq: /home1/ssq/data/allweather/test/Snow100K-S/synthetic/
48
+ io_backend:
49
+ type: disk
50
+ val_snow_l:
51
+ name: ValSet_Snow100K-L
52
+ type: Dataset_PairedImage
53
+ dataroot_gt: /home1/ssq/data/allweather/test/Snow100K-L/gt/
54
+ dataroot_lq: /home1/ssq/data/allweather/test/Snow100K-L/synthetic/
55
+ io_backend:
56
+ type: disk
57
+ val_test1:
58
+ name: ValSet_Test1
59
+ type: Dataset_PairedImage
60
+ dataroot_gt: /home1/ssq/data/allweather/test/Test1/gt/
61
+ dataroot_lq: /home1/ssq/data/allweather/test/Test1/input/
62
+ io_backend:
63
+ type: disk
64
+ val_raindrop:
65
+ name: ValSet_RainDrop
66
+ type: Dataset_PairedImage
67
+ dataroot_gt: /home1/ssq/data/allweather/test/RainDrop/gt/
68
+ dataroot_lq: /home1/ssq/data/allweather/test/RainDrop/input/
69
+ io_backend:
70
+ type: disk
71
+
72
+
73
+ # network structures
74
+ network_g:
75
+ type: Histoformer
76
+ inp_channels: 3
77
+ out_channels: 3
78
+ dim: 36
79
+ num_blocks: [4,4,6,8]
80
+ num_refinement_blocks: 4
81
+ heads: [1,2,4,8]
82
+ ffn_expansion_factor: 2.667
83
+ bias: False
84
+ LayerNorm_type: WithBias
85
+ dual_pixel_task: False
86
+
87
+
88
+ # path
89
+ path:
90
+ pretrain_network_g: ~
91
+ strict_load_g: true
92
+ resume_state: ~
93
+
94
+ # training settings
95
+ train:
96
+ total_iter: 300000
97
+ warmup_iter: -1 # no warm up
98
+ use_grad_clip: true
99
+
100
+ # Split 300k iterations into two cycles.
101
+ # 1st cycle: fixed 3e-4 LR for 92k iters.
102
+ # 2nd cycle: cosine annealing (3e-4 to 1e-6) for 208k iters.
103
+ scheduler:
104
+ type: CosineAnnealingRestartCyclicLR # ReduceLROnPlateau
105
+ periods: [92000, 208000]
106
+ restart_weights: [1,1]
107
+ eta_mins: [0.0003,0.000001]
108
+
109
+ mixing_augs:
110
+ mixup: false
111
+ mixup_beta: 1.2
112
+ use_identity: true
113
+
114
+ optim_g:
115
+ type: AdamW
116
+ lr: !!float 3e-4
117
+ weight_decay: !!float 1e-4
118
+ betas: [0.9, 0.999]
119
+
120
+ # losses
121
+ pixel_opt:
122
+ type: L1Loss
123
+ loss_weight: 1
124
+ reduction: mean
125
+ seq_opt:
126
+ type: Pearson
127
+
128
+ # validation settings
129
+ val:
130
+ window_size: 8
131
+ val_freq: !!float 1e3
132
+ save_img: true
133
+ rgb2bgr: true
134
+ use_image: true
135
+ max_minibatch: 8
136
+
137
+ metrics:
138
+ psnr: # metric name, can be arbitrary
139
+ type: calculate_psnr
140
+ crop_border: 0
141
+ test_y_channel: true
142
+
143
+ # logging settings
144
+ logger:
145
+ print_freq: 10
146
+ save_checkpoint_freq: !!float 1e3
147
+ use_tb_logger: true
148
+ wandb:
149
+ project: ~
150
+ resume_id: ~
151
+
152
+ # dist training settings
153
+ dist_params:
154
+ backend: nccl
155
+ port: 29500
Allweather/compute_psnr.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import cv2
3
+ import os
4
+ import numpy as np
5
+ from skimage.metrics import mean_squared_error
6
+ from skimage.measure import compare_ssim
7
+ from skimage.metrics import structural_similarity
8
+ from skimage.metrics import peak_signal_noise_ratio
9
+ #import lpips
10
+ import torch
11
+ from tqdm import tqdm
12
+
13
+ #from niqe.niqe import compute_niqe
14
+
15
+ #criterion = lpips.LPIPS(net='vgg', lpips=True, pnet_rand=False, pretrained=True).cuda()
16
+ def rgb2ycbcr(im, only_y=True):
17
+ '''
18
+ same as matlab rgb2ycbcr
19
+ :parame img: uint8 or float ndarray
20
+ '''
21
+ in_im_type = im.dtype
22
+ im = im.astype(np.float64)
23
+ if in_im_type != np.uint8:
24
+ im *= 255.
25
+ # convert
26
+ if only_y:
27
+ rlt = np.dot(im, np.array([65.481, 128.553, 24.966])/ 255.0) + 16.0
28
+ else:
29
+ rlt = np.matmul(im, np.array([[65.481, -37.797, 112.0 ],
30
+ [128.553, -74.203, -93.786],
31
+ [24.966, 112.0, -18.214]])/255.0) + [16, 128, 128]
32
+ if in_im_type == np.uint8:
33
+ rlt = rlt.round()
34
+ else:
35
+ rlt /= 255.
36
+
37
+ return rlt.astype(in_im_type)
38
+
39
+ def rgb2ycbcrTorch(im, only_y=True):
40
+ '''
41
+ same as matlab rgb2ycbcr
42
+ Input:
43
+ im: float [0,1], N x 3 x H x W
44
+ only_y: only return Y channel
45
+ '''
46
+ im_temp = im.permute([0,2,3,1]) * 255.0 # N x H x W x C --> N x H x W x C, [0,255]
47
+ # convert
48
+ if only_y:
49
+ rlt = torch.matmul(im_temp, torch.tensor([65.481, 128.553, 24.966],
50
+ device=im.device, dtype=im.dtype).view([3,1])/ 255.0) + 16.0
51
+ else:
52
+ rlt = torch.matmul(im_temp, torch.tensor([[65.481, -37.797, 112.0 ],
53
+ [128.553, -74.203, -93.786],
54
+ [24.966, 112.0, -18.214]],
55
+ device=im.device, dtype=im.dtype)/255.0) + \
56
+ torch.tensor([16, 128, 128]).view([-1, 1, 1, 3])
57
+ rlt /= 255.0
58
+ rlt.clamp_(0.0, 1.0)
59
+ return rlt.permute([0, 3, 1, 2])
60
+
61
+ def readim(file):
62
+ # print(file)
63
+ img = cv2.imread(file)
64
+ img = img.astype(np.float32)
65
+ return img / 255.
66
+
67
+ def loadfiles(folder):
68
+ files = os.listdir(folder)
69
+ return natsorted(files)
70
+
71
+ def resize(im, size, crop=True):
72
+ if crop:
73
+ return im[:size[0], :size[1]]
74
+ else:
75
+ return cv2.resize(im, size)
76
+
77
+ from natsort import natsorted
78
+
79
+ def np2torch(img):
80
+ im = img.astype(np.float32) / 255
81
+ im = torch.tensor(im).permute((2,0,1)).unsqueeze(0)
82
+ return im.cuda()
83
+
84
+ def compute_metrics(path1, path2, ycbcr=True):
85
+ print(path1)
86
+ files1 = loadfiles(path1)
87
+ files2 = loadfiles(path2)
88
+ print(len(files1), len(files2))
89
+ psnr = []
90
+ ssim = []
91
+ mse = []
92
+ lpips = []
93
+ niqe = []
94
+ crop = False
95
+ for file1, file2 in tqdm(zip(files1, files2)):
96
+ img1 = readim(os.path.join(path1, file1))
97
+ img2 = readim(os.path.join(path2, file2))
98
+ if img1.shape != img2.shape:
99
+ if not crop:
100
+ img1 = resize(img1, img2.shape[:2][::-1], False)
101
+ else:
102
+ img1 = resize(img1, img2.shape, True)
103
+ # print(img1.shape, img2.shape, img1.max())
104
+ MSE = mean_squared_error(img1, img2)
105
+ if ycbcr:
106
+ img1 = rgb2ycbcr(img1, True)
107
+ img2 = rgb2ycbcr(img2, True)
108
+ diff = (img2 - img1)
109
+ # print(diff.mean(), diff.max(), diff.min(), diff.shape)
110
+ PSNR = peak_signal_noise_ratio(img1, img2, data_range=1)
111
+ SSIM = structural_similarity(img1, img2, win_size=11, multichannel=False if ycbcr else True, data_range=1)
112
+
113
+ mse.append(MSE)
114
+ psnr.append(PSNR)
115
+ ssim.append(SSIM)
116
+
117
+
118
+ mean_mse, mean_psnr, mean_ssim = np.mean(mse), np.mean(psnr), np.mean(ssim)
119
+ print(mean_mse, mean_psnr, mean_ssim)
120
+ return mean_mse, mean_psnr, mean_ssim
121
+
122
+ if __name__ == "__main__":
123
+ parser = argparse.ArgumentParser()
124
+ # path setting
125
+ parser.add_argument('--path1', type=str,default= "") # modify the experiments name-->modify all save path
126
+ parser.add_argument('--path2', type=str,default= "")
127
+ args = parser.parse_args()
128
+
129
+ path1 = ''
130
+ path2 = ''
131
+ if len(args.path1) != 0:
132
+ path1 = args.path1
133
+ if len(args.path2) != 0:
134
+ path2 = args.path2
135
+
136
+ compute_metrics(path1, path2, True)
Allweather/pretrained_models/README.md ADDED
@@ -0,0 +1 @@
 
 
1
+ pre-trained models are available [here](https://drive.google.com/drive/folders/1dmPhr8Z5iPRx9lh7TwdUFPSfwGIxp5l0?usp=drive_link)
Allweather/test_histoformer.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import os
3
+ import argparse
4
+ from tqdm import tqdm
5
+
6
+ import torch.nn as nn
7
+ import torch
8
+ import torch.nn.functional as F
9
+ import util
10
+
11
+ from natsort import natsorted
12
+ from glob import glob
13
+ import sys
14
+ sys.path.append(os.path.join(os.getcwd(), ".."))
15
+ from basicsr.models.archs.histoformer_arch import Histoformer
16
+ from skimage import img_as_ubyte
17
+ from pdb import set_trace as stx
18
+ import time
19
+ parser = argparse.ArgumentParser(description='Image Deraining using Restormer')
20
+
21
+ parser.add_argument('--input_dir', default='./Datasets/', type=str, help='Directory of validation images')
22
+ parser.add_argument('--result_dir', default='./results/', type=str, help='Directory for results')
23
+ parser.add_argument('--weights', default='./pretrained_models/deraining.pth', type=str, help='Path to weights')
24
+ parser.add_argument('--yaml_file', default='Options/Allweather_Histoformer.yml', type=str, help='Path to weights')
25
+
26
+ args = parser.parse_args()
27
+
28
+ ####### Load yaml #######
29
+ yaml_file = args.yaml_file
30
+ import yaml
31
+
32
+ try:
33
+ from yaml import CLoader as Loader
34
+ except ImportError:
35
+ from yaml import Loader
36
+
37
+ x = yaml.load(open(yaml_file, mode='r'), Loader=Loader)
38
+
39
+ s = x['network_g'].pop('type')
40
+ ##########################
41
+
42
+ model_restoration = Histoformer(**x['network_g'])
43
+
44
+ checkpoint = torch.load(args.weights)
45
+ '''
46
+ from thop import profile
47
+ flops, params = profile(model_restoration, inputs=(torch.randn(1, 3, 256,256), ))
48
+ print('FLOPs = ' + str(flops/1000**3) + 'G')
49
+ print('Params = ' + str(params/1000**2) + 'M')
50
+ '''
51
+ model_restoration.load_state_dict(checkpoint['params'])
52
+ print("===>Testing using weights: ",args.weights)
53
+ model_restoration.cuda()
54
+ model_restoration = nn.DataParallel(model_restoration)
55
+ model_restoration.eval()
56
+
57
+ factor = 8
58
+
59
+ result_dir = os.path.join(args.result_dir)
60
+ os.makedirs(result_dir, exist_ok=True)
61
+ inp_dir = os.path.join(args.input_dir)
62
+ files = natsorted(glob(os.path.join(inp_dir, '*.png')) + glob(os.path.join(inp_dir, '*.jpg')))
63
+ with torch.no_grad():
64
+ for file_ in tqdm(files):
65
+ torch.cuda.ipc_collect()
66
+ torch.cuda.empty_cache()
67
+
68
+ img = np.float32(util.load_img(file_))/255.
69
+ img = torch.from_numpy(img).permute(2,0,1)
70
+ input_ = img.unsqueeze(0).cuda()
71
+
72
+ # Padding in case images are not multiples of 8
73
+ h,w = input_.shape[2], input_.shape[3]
74
+ H,W = ((h+factor)//factor)*factor, ((w+factor)//factor)*factor
75
+ padh = H-h if h%factor!=0 else 0
76
+ padw = W-w if w%factor!=0 else 0
77
+ input_ = F.pad(input_, (0,padw,0,padh), 'reflect')
78
+
79
+ time1 = time.time()
80
+ restored = model_restoration(input_)
81
+ time2 = time.time()
82
+ #print(time2-time1)
83
+
84
+ # Unpad images to original dimensions
85
+ restored = restored[:,:,:h,:w]
86
+
87
+ restored = torch.clamp(restored,0,1).cpu().detach().permute(0, 2, 3, 1).squeeze(0).numpy()
88
+
89
+ util.save_img((os.path.join(result_dir, os.path.splitext(os.path.split(file_)[-1])[0]+'.png')), img_as_ubyte(restored))
Allweather/util.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import os
3
+ import cv2
4
+ import math
5
+
6
+ def calculate_psnr(img1, img2, border=0):
7
+ # img1 and img2 have range [0, 255]
8
+ #img1 = img1.squeeze()
9
+ #img2 = img2.squeeze()
10
+ if not img1.shape == img2.shape:
11
+ raise ValueError('Input images must have the same dimensions.')
12
+ h, w = img1.shape[:2]
13
+ img1 = img1[border:h-border, border:w-border]
14
+ img2 = img2[border:h-border, border:w-border]
15
+
16
+ img1 = img1.astype(np.float64)
17
+ img2 = img2.astype(np.float64)
18
+ mse = np.mean((img1 - img2)**2)
19
+ if mse == 0:
20
+ return float('inf')
21
+ return 20 * math.log10(255.0 / math.sqrt(mse))
22
+
23
+
24
+ # --------------------------------------------
25
+ # SSIM
26
+ # --------------------------------------------
27
+ def calculate_ssim(img1, img2, border=0):
28
+ '''calculate SSIM
29
+ the same outputs as MATLAB's
30
+ img1, img2: [0, 255]
31
+ '''
32
+ #img1 = img1.squeeze()
33
+ #img2 = img2.squeeze()
34
+ if not img1.shape == img2.shape:
35
+ raise ValueError('Input images must have the same dimensions.')
36
+ h, w = img1.shape[:2]
37
+ img1 = img1[border:h-border, border:w-border]
38
+ img2 = img2[border:h-border, border:w-border]
39
+
40
+ if img1.ndim == 2:
41
+ return ssim(img1, img2)
42
+ elif img1.ndim == 3:
43
+ if img1.shape[2] == 3:
44
+ ssims = []
45
+ for i in range(3):
46
+ ssims.append(ssim(img1[:,:,i], img2[:,:,i]))
47
+ return np.array(ssims).mean()
48
+ elif img1.shape[2] == 1:
49
+ return ssim(np.squeeze(img1), np.squeeze(img2))
50
+ else:
51
+ raise ValueError('Wrong input image dimensions.')
52
+
53
+
54
+ def ssim(img1, img2):
55
+ C1 = (0.01 * 255)**2
56
+ C2 = (0.03 * 255)**2
57
+
58
+ img1 = img1.astype(np.float64)
59
+ img2 = img2.astype(np.float64)
60
+ kernel = cv2.getGaussianKernel(11, 1.5)
61
+ window = np.outer(kernel, kernel.transpose())
62
+
63
+ mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid
64
+ mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]
65
+ mu1_sq = mu1**2
66
+ mu2_sq = mu2**2
67
+ mu1_mu2 = mu1 * mu2
68
+ sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq
69
+ sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq
70
+ sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2
71
+
72
+ ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *
73
+ (sigma1_sq + sigma2_sq + C2))
74
+ return ssim_map.mean()
75
+
76
+ def load_img(filepath):
77
+ return cv2.cvtColor(cv2.imread(filepath), cv2.COLOR_BGR2RGB)
78
+
79
+ def save_img(filepath, img):
80
+ cv2.imwrite(filepath,cv2.cvtColor(img, cv2.COLOR_RGB2BGR))
81
+
82
+ def load_gray_img(filepath):
83
+ return np.expand_dims(cv2.imread(filepath, cv2.IMREAD_GRAYSCALE), axis=2)
84
+
85
+ def save_gray_img(filepath, img):
86
+ cv2.imwrite(filepath, img)
INSTALL.md ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Installation
2
+
3
+ This repository is built in PyTorch 1.8.1 and tested on Ubuntu 16.04 environment (Python3.7, CUDA10.2, cuDNN7.6).
4
+ Follow these intructions
5
+
6
+ 1. Clone our repository
7
+ ```
8
+ git clone https://github.com/sunshangquan/Histoformer.git
9
+ cd Histoformer
10
+ ```
11
+
12
+ 2. Make conda environment
13
+ ```
14
+ conda create -n pytorch181 python=3.7
15
+ conda activate pytorch181
16
+ ```
17
+
18
+ 3. Install dependencies
19
+ ```
20
+ conda install pytorch=1.8 torchvision cudatoolkit=10.2 -c pytorch
21
+ pip install matplotlib scikit-learn scikit-image opencv-python yacs joblib natsort h5py tqdm
22
+ pip install einops gdown addict future lmdb numpy pyyaml requests scipy tb-nightly yapf lpips
23
+ ```
24
+
25
+ 4. Install basicsr
26
+ ```
27
+ python setup.py develop --no_cuda_ext
28
+ ```
29
+
30
+ ### Download datasets from Google Drive
31
+
32
+ To be able to download datasets automatically you would need `go` and `gdrive` installed.
33
+
34
+ 1. You can install `go` with the following
35
+ ```
36
+ curl -O https://storage.googleapis.com/golang/go1.11.1.linux-amd64.tar.gz
37
+ mkdir -p ~/installed
38
+ tar -C ~/installed -xzf go1.11.1.linux-amd64.tar.gz
39
+ mkdir -p ~/go
40
+ ```
41
+
42
+ 2. Add the lines in `~/.bashrc`
43
+ ```
44
+ export GOPATH=$HOME/go
45
+ export PATH=$PATH:$HOME/go/bin:$HOME/installed/go/bin
46
+ ```
47
+
48
+ 3. Install `gdrive` using
49
+ ```
50
+ go get github.com/prasmussen/gdrive
51
+ ```
52
+
53
+ 4. Close current terminal and open a new terminal.
README.md CHANGED
@@ -7,12 +7,59 @@ pipeline_tag: image-to-image
7
 
8
  # Restoring Images in Adverse Weather Conditions via Histogram Transformer
9
 
 
 
 
 
10
  ## Abstract
11
 
12
  Transformer-based image restoration methods in adverse weather have achieved significant progress. Most of them use self-attention along the channel dimension or within spatially fixed-range blocks to reduce computational load. However, such a compromise results in limitations in capturing long-range spatial features. Inspired by the observation that the weather-induced degradation factors mainly cause similar occlusion and brightness, in this work, we propose an efficient Histogram Transformer (Histoformer) for restoring images affected by adverse weather. It is powered by a mechanism dubbed histogram self-attention, which sorts and segments spatial features into intensity-based bins. Self-attention is then applied across bins or within each bin to selectively focus on spatial features of dynamic range and process similar degraded pixels of the long range together. To boost histogram self-attention, we present a dynamic-range convolution enabling conventional convolution to conduct operation over similar pixels rather than neighbor pixels. We also observe that the common pixel-wise losses neglect linear association and correlation between output and ground-truth. Thus, we propose to leverage the Pearson correlation coefficient as a loss function to enforce the recovered pixels following the identical order as ground-truth. Extensive experiments demonstrate the efficacy and superiority of our proposed method.
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  ## Demo
15
 
 
 
 
 
 
 
 
 
 
 
 
16
  ## Citation
17
 
18
  If you find our work useful, please cite the following paper:
 
7
 
8
  # Restoring Images in Adverse Weather Conditions via Histogram Transformer
9
 
10
+ <img src="https://github.com/sunshangquan/Histoformer/raw/main/assets/eccv2024_cover.jpg" width="385"> | <img src="https://github.com/sunshangquan/Histoformer/raw/main/assets/histoformer.png" width="385"> |
11
+ :-------------------------:|:-------------------------:
12
+ Cover figure | Network structure
13
+
14
  ## Abstract
15
 
16
  Transformer-based image restoration methods in adverse weather have achieved significant progress. Most of them use self-attention along the channel dimension or within spatially fixed-range blocks to reduce computational load. However, such a compromise results in limitations in capturing long-range spatial features. Inspired by the observation that the weather-induced degradation factors mainly cause similar occlusion and brightness, in this work, we propose an efficient Histogram Transformer (Histoformer) for restoring images affected by adverse weather. It is powered by a mechanism dubbed histogram self-attention, which sorts and segments spatial features into intensity-based bins. Self-attention is then applied across bins or within each bin to selectively focus on spatial features of dynamic range and process similar degraded pixels of the long range together. To boost histogram self-attention, we present a dynamic-range convolution enabling conventional convolution to conduct operation over similar pixels rather than neighbor pixels. We also observe that the common pixel-wise losses neglect linear association and correlation between output and ground-truth. Thus, we propose to leverage the Pearson correlation coefficient as a loss function to enforce the recovered pixels following the identical order as ground-truth. Extensive experiments demonstrate the efficacy and superiority of our proposed method.
17
 
18
+ ## Visual Examples
19
+
20
+ ![example-RainDrop.png](https://github.com/sunshangquan/Histoformer/raw/main/assets/example-RainDrop.png) | ![example-Outdoor-Rain.png](https://github.com/sunshangquan/Histoformer/raw/main/assets/example-Outdoor-Rain.png) | ![example-Snow100K-L.png](https://github.com/sunshangquan/Histoformer/raw/main/assets/example-Snow100K-L.png) | ![example-RealSnow.png](https://github.com/sunshangquan/Histoformer/raw/main/assets/example-RealSnow.png)
21
+ :-------------------------:|:-------------------------:|:-------------------------:|:-------------------------:
22
+ RainDrop | Outdoor-Rain | Snow100K-L | RealSnow
23
+
24
+ ## Installation
25
+
26
+ See [INSTALL.md](INSTALL.md) for the installation of dependencies required to run Histoformer.
27
+
28
+ ## Evaluation
29
+
30
+ 0. ```cd Allweather```
31
+
32
+ 1. Download the pre-trained [models](https://drive.google.com/drive/folders/1dmPhr8Z5iPRx9lh7TwdUFPSfwGIxp5l0?usp=drive_link) and place it in `./pretrained_models/`
33
+
34
+ 2. Download test datasets from each of them, i.e., [Snow100K](https://sites.google.com/view/yunfuliu/desnownet), [Outdoor-Rain](https://github.com/liruoteng/HeavyRainRemoval), and [RainDrop](https://github.com/rui1996/DeRaindrop).
35
+
36
+ 3. Test with the replaced argument ```--input_dir [INPUT_FOLDER]```
37
+ ```
38
+ python test_histoformer.py --input_dir [INPUT_FOLDER] --result_dir result/ --weights pretrained_models/net_g_best.pth --yaml_file Options/Allweather_Histoformer.yml
39
+
40
+ # for realsnow
41
+ python test_histoformer.py --input_dir [INPUT_FOLDER] --result_dir result/ --weights pretrained_models/net_g_real.pth --yaml_file Options/Allweather_Histoformer.yml
42
+ ```
43
+
44
+ 4. Compute PSNR and SSIM by
45
+ ```
46
+ python compute_psnr.py --path1 [GT-PATH] --path2 [Restored-PATH]
47
+ ```
48
+ Values may be slightly different because a) the images I upload are in JPG file format for saving space, but the values reported are computed on the PNG-format images; b) some values are reported by previous works like WeatherDiff and may be slightly different from this reproduction.
49
+
50
  ## Demo
51
 
52
+ 0. ```cd Allweather```
53
+
54
+ 1. Download the pre-trained [models](https://drive.google.com/drive/folders/1dmPhr8Z5iPRx9lh7TwdUFPSfwGIxp5l0?usp=drive_link) and place it in `./pretrained_models/`
55
+
56
+ 2. Test with the replaced argument ```--input_dir [INPUT_FOLDER]```
57
+ ```
58
+ # for realsnow
59
+ python test_histoformer.py --input_dir [INPUT_FOLDER] --result_dir result/ --weights pretrained_models/net_g_real.pth --yaml_file Options/Allweather_Histoformer.yml
60
+ ```
61
+
62
+
63
  ## Citation
64
 
65
  If you find our work useful, please cite the following paper:
basicsr/__pycache__/version.cpython-38.pyc ADDED
Binary file (246 Bytes). View file
 
basicsr/data/__init__.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib
2
+ import numpy as np
3
+ import random
4
+ import torch
5
+ import torch.utils.data
6
+ from functools import partial
7
+ from os import path as osp
8
+
9
+ from data.prefetch_dataloader import PrefetchDataLoader
10
+ from utils import get_root_logger, scandir
11
+ from utils.dist_util import get_dist_info
12
+
13
+ __all__ = ['create_dataset', 'create_dataloader']
14
+
15
+ # automatically scan and import dataset modules
16
+ # scan all the files under the data folder with '_dataset' in file names
17
+ data_folder = osp.dirname(osp.abspath(__file__))
18
+ dataset_filenames = [
19
+ osp.splitext(osp.basename(v))[0] for v in scandir(data_folder)
20
+ if v.endswith('_dataset.py')
21
+ ]
22
+ # import all the dataset modules
23
+ _dataset_modules = [
24
+ importlib.import_module(f'data.{file_name}')
25
+ for file_name in dataset_filenames
26
+ ]
27
+
28
+
29
+ def create_dataset(dataset_opt):
30
+ """Create dataset.
31
+
32
+ Args:
33
+ dataset_opt (dict): Configuration for dataset. It constains:
34
+ name (str): Dataset name.
35
+ type (str): Dataset type.
36
+ """
37
+ dataset_type = dataset_opt['type']
38
+
39
+ # dynamic instantiation
40
+ for module in _dataset_modules:
41
+ dataset_cls = getattr(module, dataset_type, None)
42
+ if dataset_cls is not None:
43
+ break
44
+ if dataset_cls is None:
45
+ raise ValueError(f'Dataset {dataset_type} is not found.')
46
+
47
+ dataset = dataset_cls(dataset_opt)
48
+
49
+ logger = get_root_logger()
50
+ logger.info(
51
+ f'Dataset {dataset.__class__.__name__} - {dataset_opt["name"]} '
52
+ 'is created.')
53
+ return dataset
54
+
55
+
56
+ def create_dataloader(dataset,
57
+ dataset_opt,
58
+ num_gpu=1,
59
+ dist=False,
60
+ sampler=None,
61
+ seed=None):
62
+ """Create dataloader.
63
+
64
+ Args:
65
+ dataset (torch.utils.data.Dataset): Dataset.
66
+ dataset_opt (dict): Dataset options. It contains the following keys:
67
+ phase (str): 'train' or 'val'.
68
+ num_worker_per_gpu (int): Number of workers for each GPU.
69
+ batch_size_per_gpu (int): Training batch size for each GPU.
70
+ num_gpu (int): Number of GPUs. Used only in the train phase.
71
+ Default: 1.
72
+ dist (bool): Whether in distributed training. Used only in the train
73
+ phase. Default: False.
74
+ sampler (torch.utils.data.sampler): Data sampler. Default: None.
75
+ seed (int | None): Seed. Default: None
76
+ """
77
+ phase = dataset_opt['phase']
78
+ rank, _ = get_dist_info()
79
+ if phase == 'train':
80
+ if dist: # distributed training
81
+ batch_size = dataset_opt['batch_size_per_gpu']
82
+ num_workers = dataset_opt['num_worker_per_gpu']
83
+ else: # non-distributed training
84
+ multiplier = 1 if num_gpu == 0 else num_gpu
85
+ batch_size = dataset_opt['batch_size_per_gpu'] * multiplier
86
+ num_workers = dataset_opt['num_worker_per_gpu'] * multiplier
87
+ dataloader_args = dict(
88
+ dataset=dataset,
89
+ batch_size=batch_size,
90
+ shuffle=False,
91
+ num_workers=num_workers,
92
+ sampler=sampler,
93
+ drop_last=True)
94
+ if sampler is None:
95
+ dataloader_args['shuffle'] = True
96
+ dataloader_args['worker_init_fn'] = partial(
97
+ worker_init_fn, num_workers=num_workers, rank=rank,
98
+ seed=seed) if seed is not None else None
99
+ elif phase in ['val', 'test']: # validation
100
+ dataloader_args = dict(
101
+ dataset=dataset, batch_size=1, shuffle=False, num_workers=0)
102
+ else:
103
+ raise ValueError(f'Wrong dataset phase: {phase}. '
104
+ "Supported ones are 'train', 'val' and 'test'.")
105
+
106
+ dataloader_args['pin_memory'] = dataset_opt.get('pin_memory', False)
107
+
108
+ prefetch_mode = dataset_opt.get('prefetch_mode')
109
+ if prefetch_mode == 'cpu': # CPUPrefetcher
110
+ num_prefetch_queue = dataset_opt.get('num_prefetch_queue', 1)
111
+ logger = get_root_logger()
112
+ logger.info(f'Use {prefetch_mode} prefetch dataloader: '
113
+ f'num_prefetch_queue = {num_prefetch_queue}')
114
+ return PrefetchDataLoader(
115
+ num_prefetch_queue=num_prefetch_queue, **dataloader_args)
116
+ else:
117
+ # prefetch_mode=None: Normal dataloader
118
+ # prefetch_mode='cuda': dataloader for CUDAPrefetcher
119
+ return torch.utils.data.DataLoader(**dataloader_args)
120
+
121
+
122
+ def worker_init_fn(worker_id, num_workers, rank, seed):
123
+ # Set the worker seed to num_workers * rank + worker_id + seed
124
+ worker_seed = num_workers * rank + worker_id + seed
125
+ np.random.seed(worker_seed)
126
+ random.seed(worker_seed)
basicsr/data/__pycache__/__init__.cpython-38.pyc ADDED
Binary file (3.56 kB). View file
 
basicsr/data/__pycache__/data_sampler.cpython-38.pyc ADDED
Binary file (2.17 kB). View file
 
basicsr/data/__pycache__/data_util.cpython-38.pyc ADDED
Binary file (12.1 kB). View file
 
basicsr/data/__pycache__/ffhq_dataset.cpython-38.pyc ADDED
Binary file (2.58 kB). View file
 
basicsr/data/__pycache__/paired_image_dataset.cpython-38.pyc ADDED
Binary file (9.92 kB). View file
 
basicsr/data/__pycache__/prefetch_dataloader.cpython-38.pyc ADDED
Binary file (4.36 kB). View file
 
basicsr/data/__pycache__/reds_dataset.cpython-38.pyc ADDED
Binary file (6.53 kB). View file
 
basicsr/data/__pycache__/single_image_dataset.cpython-38.pyc ADDED
Binary file (2.63 kB). View file
 
basicsr/data/__pycache__/transforms.cpython-38.pyc ADDED
Binary file (7.87 kB). View file
 
basicsr/data/__pycache__/video_test_dataset.cpython-38.pyc ADDED
Binary file (10.4 kB). View file
 
basicsr/data/__pycache__/vimeo90k_dataset.cpython-38.pyc ADDED
Binary file (4.19 kB). View file
 
basicsr/data/data_sampler.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import torch
3
+ from torch.utils.data.sampler import Sampler
4
+
5
+
6
+ class EnlargedSampler(Sampler):
7
+ """Sampler that restricts data loading to a subset of the dataset.
8
+
9
+ Modified from torch.utils.data.distributed.DistributedSampler
10
+ Support enlarging the dataset for iteration-based training, for saving
11
+ time when restart the dataloader after each epoch
12
+
13
+ Args:
14
+ dataset (torch.utils.data.Dataset): Dataset used for sampling.
15
+ num_replicas (int | None): Number of processes participating in
16
+ the training. It is usually the world_size.
17
+ rank (int | None): Rank of the current process within num_replicas.
18
+ ratio (int): Enlarging ratio. Default: 1.
19
+ """
20
+
21
+ def __init__(self, dataset, num_replicas, rank, ratio=1):
22
+ self.dataset = dataset
23
+ self.num_replicas = num_replicas
24
+ self.rank = rank
25
+ self.epoch = 0
26
+ self.num_samples = math.ceil(
27
+ len(self.dataset) * ratio / self.num_replicas)
28
+ self.total_size = self.num_samples * self.num_replicas
29
+
30
+ def __iter__(self):
31
+ # deterministically shuffle based on epoch
32
+ g = torch.Generator()
33
+ g.manual_seed(self.epoch)
34
+ indices = torch.randperm(self.total_size, generator=g).tolist()
35
+
36
+ dataset_size = len(self.dataset)
37
+ indices = [v % dataset_size for v in indices]
38
+
39
+ # subsample
40
+ indices = indices[self.rank:self.total_size:self.num_replicas]
41
+ assert len(indices) == self.num_samples
42
+
43
+ return iter(indices)
44
+
45
+ def __len__(self):
46
+ return self.num_samples
47
+
48
+ def set_epoch(self, epoch):
49
+ self.epoch = epoch
basicsr/data/data_util.py ADDED
@@ -0,0 +1,390 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ cv2.setNumThreads(1)
3
+ import numpy as np
4
+ import torch
5
+ from os import path as osp
6
+ from torch.nn import functional as F
7
+
8
+ from basicsr.data.transforms import mod_crop
9
+ from basicsr.utils import img2tensor, scandir
10
+
11
+
12
+ def read_img_seq(path, require_mod_crop=False, scale=1):
13
+ """Read a sequence of images from a given folder path.
14
+
15
+ Args:
16
+ path (list[str] | str): List of image paths or image folder path.
17
+ require_mod_crop (bool): Require mod crop for each image.
18
+ Default: False.
19
+ scale (int): Scale factor for mod_crop. Default: 1.
20
+
21
+ Returns:
22
+ Tensor: size (t, c, h, w), RGB, [0, 1].
23
+ """
24
+ if isinstance(path, list):
25
+ img_paths = path
26
+ else:
27
+ img_paths = sorted(list(scandir(path, full_path=True)))
28
+ imgs = [cv2.imread(v).astype(np.float32) / 255. for v in img_paths]
29
+ if require_mod_crop:
30
+ imgs = [mod_crop(img, scale) for img in imgs]
31
+ imgs = img2tensor(imgs, bgr2rgb=True, float32=True)
32
+ imgs = torch.stack(imgs, dim=0)
33
+ return imgs
34
+
35
+
36
+ def generate_frame_indices(crt_idx,
37
+ max_frame_num,
38
+ num_frames,
39
+ padding='reflection'):
40
+ """Generate an index list for reading `num_frames` frames from a sequence
41
+ of images.
42
+
43
+ Args:
44
+ crt_idx (int): Current center index.
45
+ max_frame_num (int): Max number of the sequence of images (from 1).
46
+ num_frames (int): Reading num_frames frames.
47
+ padding (str): Padding mode, one of
48
+ 'replicate' | 'reflection' | 'reflection_circle' | 'circle'
49
+ Examples: current_idx = 0, num_frames = 5
50
+ The generated frame indices under different padding mode:
51
+ replicate: [0, 0, 0, 1, 2]
52
+ reflection: [2, 1, 0, 1, 2]
53
+ reflection_circle: [4, 3, 0, 1, 2]
54
+ circle: [3, 4, 0, 1, 2]
55
+
56
+ Returns:
57
+ list[int]: A list of indices.
58
+ """
59
+ assert num_frames % 2 == 1, 'num_frames should be an odd number.'
60
+ assert padding in ('replicate', 'reflection', 'reflection_circle',
61
+ 'circle'), f'Wrong padding mode: {padding}.'
62
+
63
+ max_frame_num = max_frame_num - 1 # start from 0
64
+ num_pad = num_frames // 2
65
+
66
+ indices = []
67
+ for i in range(crt_idx - num_pad, crt_idx + num_pad + 1):
68
+ if i < 0:
69
+ if padding == 'replicate':
70
+ pad_idx = 0
71
+ elif padding == 'reflection':
72
+ pad_idx = -i
73
+ elif padding == 'reflection_circle':
74
+ pad_idx = crt_idx + num_pad - i
75
+ else:
76
+ pad_idx = num_frames + i
77
+ elif i > max_frame_num:
78
+ if padding == 'replicate':
79
+ pad_idx = max_frame_num
80
+ elif padding == 'reflection':
81
+ pad_idx = max_frame_num * 2 - i
82
+ elif padding == 'reflection_circle':
83
+ pad_idx = (crt_idx - num_pad) - (i - max_frame_num)
84
+ else:
85
+ pad_idx = i - num_frames
86
+ else:
87
+ pad_idx = i
88
+ indices.append(pad_idx)
89
+ return indices
90
+
91
+
92
+ def paired_paths_from_lmdb(folders, keys):
93
+ """Generate paired paths from lmdb files.
94
+
95
+ Contents of lmdb. Taking the `lq.lmdb` for example, the file structure is:
96
+
97
+ lq.lmdb
98
+ ├── data.mdb
99
+ ├── lock.mdb
100
+ ├── meta_info.txt
101
+
102
+ The data.mdb and lock.mdb are standard lmdb files and you can refer to
103
+ https://lmdb.readthedocs.io/en/release/ for more details.
104
+
105
+ The meta_info.txt is a specified txt file to record the meta information
106
+ of our datasets. It will be automatically created when preparing
107
+ datasets by our provided dataset tools.
108
+ Each line in the txt file records
109
+ 1)image name (with extension),
110
+ 2)image shape,
111
+ 3)compression level, separated by a white space.
112
+ Example: `baboon.png (120,125,3) 1`
113
+
114
+ We use the image name without extension as the lmdb key.
115
+ Note that we use the same key for the corresponding lq and gt images.
116
+
117
+ Args:
118
+ folders (list[str]): A list of folder path. The order of list should
119
+ be [input_folder, gt_folder].
120
+ keys (list[str]): A list of keys identifying folders. The order should
121
+ be in consistent with folders, e.g., ['lq', 'gt'].
122
+ Note that this key is different from lmdb keys.
123
+
124
+ Returns:
125
+ list[str]: Returned path list.
126
+ """
127
+ assert len(folders) == 2, (
128
+ 'The len of folders should be 2 with [input_folder, gt_folder]. '
129
+ f'But got {len(folders)}')
130
+ assert len(keys) == 2, (
131
+ 'The len of keys should be 2 with [input_key, gt_key]. '
132
+ f'But got {len(keys)}')
133
+ input_folder, gt_folder = folders
134
+ input_key, gt_key = keys
135
+
136
+ if not (input_folder.endswith('.lmdb') and gt_folder.endswith('.lmdb')):
137
+ raise ValueError(
138
+ f'{input_key} folder and {gt_key} folder should both in lmdb '
139
+ f'formats. But received {input_key}: {input_folder}; '
140
+ f'{gt_key}: {gt_folder}')
141
+ # ensure that the two meta_info files are the same
142
+ with open(osp.join(input_folder, 'meta_info.txt')) as fin:
143
+ input_lmdb_keys = [line.split('.')[0] for line in fin]
144
+ with open(osp.join(gt_folder, 'meta_info.txt')) as fin:
145
+ gt_lmdb_keys = [line.split('.')[0] for line in fin]
146
+ if set(input_lmdb_keys) != set(gt_lmdb_keys):
147
+ raise ValueError(
148
+ f'Keys in {input_key}_folder and {gt_key}_folder are different.')
149
+ else:
150
+ paths = []
151
+ for lmdb_key in sorted(input_lmdb_keys):
152
+ paths.append(
153
+ dict([(f'{input_key}_path', lmdb_key),
154
+ (f'{gt_key}_path', lmdb_key)]))
155
+ return paths
156
+
157
+
158
+ def paired_paths_from_meta_info_file(folders, keys, meta_info_file,
159
+ filename_tmpl):
160
+ """Generate paired paths from an meta information file.
161
+
162
+ Each line in the meta information file contains the image names and
163
+ image shape (usually for gt), separated by a white space.
164
+
165
+ Example of an meta information file:
166
+ ```
167
+ 0001_s001.png (480,480,3)
168
+ 0001_s002.png (480,480,3)
169
+ ```
170
+
171
+ Args:
172
+ folders (list[str]): A list of folder path. The order of list should
173
+ be [input_folder, gt_folder].
174
+ keys (list[str]): A list of keys identifying folders. The order should
175
+ be in consistent with folders, e.g., ['lq', 'gt'].
176
+ meta_info_file (str): Path to the meta information file.
177
+ filename_tmpl (str): Template for each filename. Note that the
178
+ template excludes the file extension. Usually the filename_tmpl is
179
+ for files in the input folder.
180
+
181
+ Returns:
182
+ list[str]: Returned path list.
183
+ """
184
+ assert len(folders) == 2, (
185
+ 'The len of folders should be 2 with [input_folder, gt_folder]. '
186
+ f'But got {len(folders)}')
187
+ assert len(keys) == 2, (
188
+ 'The len of keys should be 2 with [input_key, gt_key]. '
189
+ f'But got {len(keys)}')
190
+ input_folder, gt_folder = folders
191
+ input_key, gt_key = keys
192
+
193
+ with open(meta_info_file, 'r') as fin:
194
+ gt_names = [line.split(' ')[0] for line in fin]
195
+
196
+ paths = []
197
+ for gt_name in gt_names:
198
+ basename, ext = osp.splitext(osp.basename(gt_name))
199
+ input_name = f'{filename_tmpl.format(basename)}{ext}'
200
+ input_path = osp.join(input_folder, input_name)
201
+ gt_path = osp.join(gt_folder, gt_name)
202
+ paths.append(
203
+ dict([(f'{input_key}_path', input_path),
204
+ (f'{gt_key}_path', gt_path)]))
205
+ return paths
206
+
207
+
208
+ def paired_paths_from_folder(folders, keys, filename_tmpl):
209
+ """Generate paired paths from folders.
210
+
211
+ Args:
212
+ folders (list[str]): A list of folder path. The order of list should
213
+ be [input_folder, gt_folder].
214
+ keys (list[str]): A list of keys identifying folders. The order should
215
+ be in consistent with folders, e.g., ['lq', 'gt'].
216
+ filename_tmpl (str): Template for each filename. Note that the
217
+ template excludes the file extension. Usually the filename_tmpl is
218
+ for files in the input folder.
219
+
220
+ Returns:
221
+ list[str]: Returned path list.
222
+ """
223
+ assert len(folders) == 2, (
224
+ 'The len of folders should be 2 with [input_folder, gt_folder]. '
225
+ f'But got {len(folders)}')
226
+ assert len(keys) == 2, (
227
+ 'The len of keys should be 2 with [input_key, gt_key]. '
228
+ f'But got {len(keys)}')
229
+ input_folder, gt_folder = folders
230
+ input_key, gt_key = keys
231
+
232
+ input_paths = list(scandir(input_folder))
233
+ gt_paths = list(scandir(gt_folder))
234
+ assert len(input_paths) == len(gt_paths), (
235
+ f'{input_key} and {gt_key} datasets have different number of images: '
236
+ f'{len(input_paths)}, {len(gt_paths)}.')
237
+ paths = []
238
+ for idx in range(len(gt_paths)):
239
+ gt_path = gt_paths[idx]
240
+ # if "lns" in gt_path:
241
+ # continue
242
+ basename, ext = osp.splitext(osp.basename(gt_path))
243
+ input_path = input_paths[idx]
244
+ basename_input, ext_input = osp.splitext(osp.basename(input_path))
245
+ input_name = f'{filename_tmpl.format(basename)}{ext_input}'
246
+ input_path = osp.join(input_folder, input_name)
247
+ assert input_name in input_paths, (f'{input_name} is not in '
248
+ f'{input_key}_paths.')
249
+ gt_path = osp.join(gt_folder, gt_path)
250
+ paths.append(
251
+ dict([(f'{input_key}_path', input_path),
252
+ (f'{gt_key}_path', gt_path)]))
253
+ return paths
254
+
255
+ def paired_DP_paths_from_folder(folders, keys, filename_tmpl):
256
+ """Generate paired paths from folders.
257
+
258
+ Args:
259
+ folders (list[str]): A list of folder path. The order of list should
260
+ be [input_folder, gt_folder].
261
+ keys (list[str]): A list of keys identifying folders. The order should
262
+ be in consistent with folders, e.g., ['lq', 'gt'].
263
+ filename_tmpl (str): Template for each filename. Note that the
264
+ template excludes the file extension. Usually the filename_tmpl is
265
+ for files in the input folder.
266
+
267
+ Returns:
268
+ list[str]: Returned path list.
269
+ """
270
+ assert len(folders) == 3, (
271
+ 'The len of folders should be 3 with [inputL_folder, inputR_folder, gt_folder]. '
272
+ f'But got {len(folders)}')
273
+ assert len(keys) == 3, (
274
+ 'The len of keys should be 2 with [inputL_key, inputR_key, gt_key]. '
275
+ f'But got {len(keys)}')
276
+ inputL_folder, inputR_folder, gt_folder = folders
277
+ inputL_key, inputR_key, gt_key = keys
278
+
279
+ inputL_paths = list(scandir(inputL_folder))
280
+ inputR_paths = list(scandir(inputR_folder))
281
+ gt_paths = list(scandir(gt_folder))
282
+ assert len(inputL_paths) == len(inputR_paths) == len(gt_paths), (
283
+ f'{inputL_key} and {inputR_key} and {gt_key} datasets have different number of images: '
284
+ f'{len(inputL_paths)}, {len(inputR_paths)}, {len(gt_paths)}.')
285
+ paths = []
286
+ for idx in range(len(gt_paths)):
287
+ gt_path = gt_paths[idx]
288
+ basename, ext = osp.splitext(osp.basename(gt_path))
289
+ inputL_path = inputL_paths[idx]
290
+ basename_input, ext_input = osp.splitext(osp.basename(inputL_path))
291
+ inputL_name = f'{filename_tmpl.format(basename)}{ext_input}'
292
+ inputL_path = osp.join(inputL_folder, inputL_name)
293
+ assert inputL_name in inputL_paths, (f'{inputL_name} is not in '
294
+ f'{inputL_key}_paths.')
295
+ inputR_path = inputR_paths[idx]
296
+ basename_input, ext_input = osp.splitext(osp.basename(inputR_path))
297
+ inputR_name = f'{filename_tmpl.format(basename)}{ext_input}'
298
+ inputR_path = osp.join(inputR_folder, inputR_name)
299
+ assert inputR_name in inputR_paths, (f'{inputR_name} is not in '
300
+ f'{inputR_key}_paths.')
301
+ gt_path = osp.join(gt_folder, gt_path)
302
+ paths.append(
303
+ dict([(f'{inputL_key}_path', inputL_path),
304
+ (f'{inputR_key}_path', inputR_path),
305
+ (f'{gt_key}_path', gt_path)]))
306
+ return paths
307
+
308
+
309
+ def paths_from_folder(folder):
310
+ """Generate paths from folder.
311
+
312
+ Args:
313
+ folder (str): Folder path.
314
+
315
+ Returns:
316
+ list[str]: Returned path list.
317
+ """
318
+
319
+ paths = list(scandir(folder))
320
+ paths = [osp.join(folder, path) for path in paths]
321
+ return paths
322
+
323
+
324
+ def paths_from_lmdb(folder):
325
+ """Generate paths from lmdb.
326
+
327
+ Args:
328
+ folder (str): Folder path.
329
+
330
+ Returns:
331
+ list[str]: Returned path list.
332
+ """
333
+ if not folder.endswith('.lmdb'):
334
+ raise ValueError(f'Folder {folder}folder should in lmdb format.')
335
+ with open(osp.join(folder, 'meta_info.txt')) as fin:
336
+ paths = [line.split('.')[0] for line in fin]
337
+ return paths
338
+
339
+
340
+ def generate_gaussian_kernel(kernel_size=13, sigma=1.6):
341
+ """Generate Gaussian kernel used in `duf_downsample`.
342
+
343
+ Args:
344
+ kernel_size (int): Kernel size. Default: 13.
345
+ sigma (float): Sigma of the Gaussian kernel. Default: 1.6.
346
+
347
+ Returns:
348
+ np.array: The Gaussian kernel.
349
+ """
350
+ from scipy.ndimage import filters as filters
351
+ kernel = np.zeros((kernel_size, kernel_size))
352
+ # set element at the middle to one, a dirac delta
353
+ kernel[kernel_size // 2, kernel_size // 2] = 1
354
+ # gaussian-smooth the dirac, resulting in a gaussian filter
355
+ return filters.gaussian_filter(kernel, sigma)
356
+
357
+
358
+ def duf_downsample(x, kernel_size=13, scale=4):
359
+ """Downsamping with Gaussian kernel used in the DUF official code.
360
+
361
+ Args:
362
+ x (Tensor): Frames to be downsampled, with shape (b, t, c, h, w).
363
+ kernel_size (int): Kernel size. Default: 13.
364
+ scale (int): Downsampling factor. Supported scale: (2, 3, 4).
365
+ Default: 4.
366
+
367
+ Returns:
368
+ Tensor: DUF downsampled frames.
369
+ """
370
+ assert scale in (2, 3,
371
+ 4), f'Only support scale (2, 3, 4), but got {scale}.'
372
+
373
+ squeeze_flag = False
374
+ if x.ndim == 4:
375
+ squeeze_flag = True
376
+ x = x.unsqueeze(0)
377
+ b, t, c, h, w = x.size()
378
+ x = x.view(-1, 1, h, w)
379
+ pad_w, pad_h = kernel_size // 2 + scale * 2, kernel_size // 2 + scale * 2
380
+ x = F.pad(x, (pad_w, pad_w, pad_h, pad_h), 'reflect')
381
+
382
+ gaussian_filter = generate_gaussian_kernel(kernel_size, 0.4 * scale)
383
+ gaussian_filter = torch.from_numpy(gaussian_filter).type_as(x).unsqueeze(
384
+ 0).unsqueeze(0)
385
+ x = F.conv2d(x, gaussian_filter, stride=scale)
386
+ x = x[:, :, 2:-2, 2:-2]
387
+ x = x.view(b, t, c, x.size(2), x.size(3))
388
+ if squeeze_flag:
389
+ x = x.squeeze(0)
390
+ return x
basicsr/data/meta_info/meta_info_DIV2K800sub_GT.txt ADDED
The diff for this file is too large to render. See raw diff
 
basicsr/data/meta_info/meta_info_REDS4_test_GT.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ 000 100 (720,1280,3)
2
+ 011 100 (720,1280,3)
3
+ 015 100 (720,1280,3)
4
+ 020 100 (720,1280,3)
basicsr/data/meta_info/meta_info_REDS_GT.txt ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 000 100 (720,1280,3)
2
+ 001 100 (720,1280,3)
3
+ 002 100 (720,1280,3)
4
+ 003 100 (720,1280,3)
5
+ 004 100 (720,1280,3)
6
+ 005 100 (720,1280,3)
7
+ 006 100 (720,1280,3)
8
+ 007 100 (720,1280,3)
9
+ 008 100 (720,1280,3)
10
+ 009 100 (720,1280,3)
11
+ 010 100 (720,1280,3)
12
+ 011 100 (720,1280,3)
13
+ 012 100 (720,1280,3)
14
+ 013 100 (720,1280,3)
15
+ 014 100 (720,1280,3)
16
+ 015 100 (720,1280,3)
17
+ 016 100 (720,1280,3)
18
+ 017 100 (720,1280,3)
19
+ 018 100 (720,1280,3)
20
+ 019 100 (720,1280,3)
21
+ 020 100 (720,1280,3)
22
+ 021 100 (720,1280,3)
23
+ 022 100 (720,1280,3)
24
+ 023 100 (720,1280,3)
25
+ 024 100 (720,1280,3)
26
+ 025 100 (720,1280,3)
27
+ 026 100 (720,1280,3)
28
+ 027 100 (720,1280,3)
29
+ 028 100 (720,1280,3)
30
+ 029 100 (720,1280,3)
31
+ 030 100 (720,1280,3)
32
+ 031 100 (720,1280,3)
33
+ 032 100 (720,1280,3)
34
+ 033 100 (720,1280,3)
35
+ 034 100 (720,1280,3)
36
+ 035 100 (720,1280,3)
37
+ 036 100 (720,1280,3)
38
+ 037 100 (720,1280,3)
39
+ 038 100 (720,1280,3)
40
+ 039 100 (720,1280,3)
41
+ 040 100 (720,1280,3)
42
+ 041 100 (720,1280,3)
43
+ 042 100 (720,1280,3)
44
+ 043 100 (720,1280,3)
45
+ 044 100 (720,1280,3)
46
+ 045 100 (720,1280,3)
47
+ 046 100 (720,1280,3)
48
+ 047 100 (720,1280,3)
49
+ 048 100 (720,1280,3)
50
+ 049 100 (720,1280,3)
51
+ 050 100 (720,1280,3)
52
+ 051 100 (720,1280,3)
53
+ 052 100 (720,1280,3)
54
+ 053 100 (720,1280,3)
55
+ 054 100 (720,1280,3)
56
+ 055 100 (720,1280,3)
57
+ 056 100 (720,1280,3)
58
+ 057 100 (720,1280,3)
59
+ 058 100 (720,1280,3)
60
+ 059 100 (720,1280,3)
61
+ 060 100 (720,1280,3)
62
+ 061 100 (720,1280,3)
63
+ 062 100 (720,1280,3)
64
+ 063 100 (720,1280,3)
65
+ 064 100 (720,1280,3)
66
+ 065 100 (720,1280,3)
67
+ 066 100 (720,1280,3)
68
+ 067 100 (720,1280,3)
69
+ 068 100 (720,1280,3)
70
+ 069 100 (720,1280,3)
71
+ 070 100 (720,1280,3)
72
+ 071 100 (720,1280,3)
73
+ 072 100 (720,1280,3)
74
+ 073 100 (720,1280,3)
75
+ 074 100 (720,1280,3)
76
+ 075 100 (720,1280,3)
77
+ 076 100 (720,1280,3)
78
+ 077 100 (720,1280,3)
79
+ 078 100 (720,1280,3)
80
+ 079 100 (720,1280,3)
81
+ 080 100 (720,1280,3)
82
+ 081 100 (720,1280,3)
83
+ 082 100 (720,1280,3)
84
+ 083 100 (720,1280,3)
85
+ 084 100 (720,1280,3)
86
+ 085 100 (720,1280,3)
87
+ 086 100 (720,1280,3)
88
+ 087 100 (720,1280,3)
89
+ 088 100 (720,1280,3)
90
+ 089 100 (720,1280,3)
91
+ 090 100 (720,1280,3)
92
+ 091 100 (720,1280,3)
93
+ 092 100 (720,1280,3)
94
+ 093 100 (720,1280,3)
95
+ 094 100 (720,1280,3)
96
+ 095 100 (720,1280,3)
97
+ 096 100 (720,1280,3)
98
+ 097 100 (720,1280,3)
99
+ 098 100 (720,1280,3)
100
+ 099 100 (720,1280,3)
101
+ 100 100 (720,1280,3)
102
+ 101 100 (720,1280,3)
103
+ 102 100 (720,1280,3)
104
+ 103 100 (720,1280,3)
105
+ 104 100 (720,1280,3)
106
+ 105 100 (720,1280,3)
107
+ 106 100 (720,1280,3)
108
+ 107 100 (720,1280,3)
109
+ 108 100 (720,1280,3)
110
+ 109 100 (720,1280,3)
111
+ 110 100 (720,1280,3)
112
+ 111 100 (720,1280,3)
113
+ 112 100 (720,1280,3)
114
+ 113 100 (720,1280,3)
115
+ 114 100 (720,1280,3)
116
+ 115 100 (720,1280,3)
117
+ 116 100 (720,1280,3)
118
+ 117 100 (720,1280,3)
119
+ 118 100 (720,1280,3)
120
+ 119 100 (720,1280,3)
121
+ 120 100 (720,1280,3)
122
+ 121 100 (720,1280,3)
123
+ 122 100 (720,1280,3)
124
+ 123 100 (720,1280,3)
125
+ 124 100 (720,1280,3)
126
+ 125 100 (720,1280,3)
127
+ 126 100 (720,1280,3)
128
+ 127 100 (720,1280,3)
129
+ 128 100 (720,1280,3)
130
+ 129 100 (720,1280,3)
131
+ 130 100 (720,1280,3)
132
+ 131 100 (720,1280,3)
133
+ 132 100 (720,1280,3)
134
+ 133 100 (720,1280,3)
135
+ 134 100 (720,1280,3)
136
+ 135 100 (720,1280,3)
137
+ 136 100 (720,1280,3)
138
+ 137 100 (720,1280,3)
139
+ 138 100 (720,1280,3)
140
+ 139 100 (720,1280,3)
141
+ 140 100 (720,1280,3)
142
+ 141 100 (720,1280,3)
143
+ 142 100 (720,1280,3)
144
+ 143 100 (720,1280,3)
145
+ 144 100 (720,1280,3)
146
+ 145 100 (720,1280,3)
147
+ 146 100 (720,1280,3)
148
+ 147 100 (720,1280,3)
149
+ 148 100 (720,1280,3)
150
+ 149 100 (720,1280,3)
151
+ 150 100 (720,1280,3)
152
+ 151 100 (720,1280,3)
153
+ 152 100 (720,1280,3)
154
+ 153 100 (720,1280,3)
155
+ 154 100 (720,1280,3)
156
+ 155 100 (720,1280,3)
157
+ 156 100 (720,1280,3)
158
+ 157 100 (720,1280,3)
159
+ 158 100 (720,1280,3)
160
+ 159 100 (720,1280,3)
161
+ 160 100 (720,1280,3)
162
+ 161 100 (720,1280,3)
163
+ 162 100 (720,1280,3)
164
+ 163 100 (720,1280,3)
165
+ 164 100 (720,1280,3)
166
+ 165 100 (720,1280,3)
167
+ 166 100 (720,1280,3)
168
+ 167 100 (720,1280,3)
169
+ 168 100 (720,1280,3)
170
+ 169 100 (720,1280,3)
171
+ 170 100 (720,1280,3)
172
+ 171 100 (720,1280,3)
173
+ 172 100 (720,1280,3)
174
+ 173 100 (720,1280,3)
175
+ 174 100 (720,1280,3)
176
+ 175 100 (720,1280,3)
177
+ 176 100 (720,1280,3)
178
+ 177 100 (720,1280,3)
179
+ 178 100 (720,1280,3)
180
+ 179 100 (720,1280,3)
181
+ 180 100 (720,1280,3)
182
+ 181 100 (720,1280,3)
183
+ 182 100 (720,1280,3)
184
+ 183 100 (720,1280,3)
185
+ 184 100 (720,1280,3)
186
+ 185 100 (720,1280,3)
187
+ 186 100 (720,1280,3)
188
+ 187 100 (720,1280,3)
189
+ 188 100 (720,1280,3)
190
+ 189 100 (720,1280,3)
191
+ 190 100 (720,1280,3)
192
+ 191 100 (720,1280,3)
193
+ 192 100 (720,1280,3)
194
+ 193 100 (720,1280,3)
195
+ 194 100 (720,1280,3)
196
+ 195 100 (720,1280,3)
197
+ 196 100 (720,1280,3)
198
+ 197 100 (720,1280,3)
199
+ 198 100 (720,1280,3)
200
+ 199 100 (720,1280,3)
201
+ 200 100 (720,1280,3)
202
+ 201 100 (720,1280,3)
203
+ 202 100 (720,1280,3)
204
+ 203 100 (720,1280,3)
205
+ 204 100 (720,1280,3)
206
+ 205 100 (720,1280,3)
207
+ 206 100 (720,1280,3)
208
+ 207 100 (720,1280,3)
209
+ 208 100 (720,1280,3)
210
+ 209 100 (720,1280,3)
211
+ 210 100 (720,1280,3)
212
+ 211 100 (720,1280,3)
213
+ 212 100 (720,1280,3)
214
+ 213 100 (720,1280,3)
215
+ 214 100 (720,1280,3)
216
+ 215 100 (720,1280,3)
217
+ 216 100 (720,1280,3)
218
+ 217 100 (720,1280,3)
219
+ 218 100 (720,1280,3)
220
+ 219 100 (720,1280,3)
221
+ 220 100 (720,1280,3)
222
+ 221 100 (720,1280,3)
223
+ 222 100 (720,1280,3)
224
+ 223 100 (720,1280,3)
225
+ 224 100 (720,1280,3)
226
+ 225 100 (720,1280,3)
227
+ 226 100 (720,1280,3)
228
+ 227 100 (720,1280,3)
229
+ 228 100 (720,1280,3)
230
+ 229 100 (720,1280,3)
231
+ 230 100 (720,1280,3)
232
+ 231 100 (720,1280,3)
233
+ 232 100 (720,1280,3)
234
+ 233 100 (720,1280,3)
235
+ 234 100 (720,1280,3)
236
+ 235 100 (720,1280,3)
237
+ 236 100 (720,1280,3)
238
+ 237 100 (720,1280,3)
239
+ 238 100 (720,1280,3)
240
+ 239 100 (720,1280,3)
241
+ 240 100 (720,1280,3)
242
+ 241 100 (720,1280,3)
243
+ 242 100 (720,1280,3)
244
+ 243 100 (720,1280,3)
245
+ 244 100 (720,1280,3)
246
+ 245 100 (720,1280,3)
247
+ 246 100 (720,1280,3)
248
+ 247 100 (720,1280,3)
249
+ 248 100 (720,1280,3)
250
+ 249 100 (720,1280,3)
251
+ 250 100 (720,1280,3)
252
+ 251 100 (720,1280,3)
253
+ 252 100 (720,1280,3)
254
+ 253 100 (720,1280,3)
255
+ 254 100 (720,1280,3)
256
+ 255 100 (720,1280,3)
257
+ 256 100 (720,1280,3)
258
+ 257 100 (720,1280,3)
259
+ 258 100 (720,1280,3)
260
+ 259 100 (720,1280,3)
261
+ 260 100 (720,1280,3)
262
+ 261 100 (720,1280,3)
263
+ 262 100 (720,1280,3)
264
+ 263 100 (720,1280,3)
265
+ 264 100 (720,1280,3)
266
+ 265 100 (720,1280,3)
267
+ 266 100 (720,1280,3)
268
+ 267 100 (720,1280,3)
269
+ 268 100 (720,1280,3)
270
+ 269 100 (720,1280,3)
basicsr/data/meta_info/meta_info_REDSofficial4_test_GT.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ 240 100 (720,1280,3)
2
+ 241 100 (720,1280,3)
3
+ 246 100 (720,1280,3)
4
+ 257 100 (720,1280,3)
basicsr/data/meta_info/meta_info_REDSval_official_test_GT.txt ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 240 100 (720,1280,3)
2
+ 241 100 (720,1280,3)
3
+ 242 100 (720,1280,3)
4
+ 243 100 (720,1280,3)
5
+ 244 100 (720,1280,3)
6
+ 245 100 (720,1280,3)
7
+ 246 100 (720,1280,3)
8
+ 247 100 (720,1280,3)
9
+ 248 100 (720,1280,3)
10
+ 249 100 (720,1280,3)
11
+ 250 100 (720,1280,3)
12
+ 251 100 (720,1280,3)
13
+ 252 100 (720,1280,3)
14
+ 253 100 (720,1280,3)
15
+ 254 100 (720,1280,3)
16
+ 255 100 (720,1280,3)
17
+ 256 100 (720,1280,3)
18
+ 257 100 (720,1280,3)
19
+ 258 100 (720,1280,3)
20
+ 259 100 (720,1280,3)
21
+ 260 100 (720,1280,3)
22
+ 261 100 (720,1280,3)
23
+ 262 100 (720,1280,3)
24
+ 263 100 (720,1280,3)
25
+ 264 100 (720,1280,3)
26
+ 265 100 (720,1280,3)
27
+ 266 100 (720,1280,3)
28
+ 267 100 (720,1280,3)
29
+ 268 100 (720,1280,3)
30
+ 269 100 (720,1280,3)
basicsr/data/meta_info/meta_info_Vimeo90K_test_GT.txt ADDED
The diff for this file is too large to render. See raw diff
 
basicsr/data/meta_info/meta_info_Vimeo90K_test_fast_GT.txt ADDED
@@ -0,0 +1,1225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 00001/0625 7 (256,448,3)
2
+ 00001/0632 7 (256,448,3)
3
+ 00001/0807 7 (256,448,3)
4
+ 00001/0832 7 (256,448,3)
5
+ 00001/0834 7 (256,448,3)
6
+ 00001/0836 7 (256,448,3)
7
+ 00002/0004 7 (256,448,3)
8
+ 00002/0112 7 (256,448,3)
9
+ 00002/0116 7 (256,448,3)
10
+ 00002/0123 7 (256,448,3)
11
+ 00002/0455 7 (256,448,3)
12
+ 00002/0602 7 (256,448,3)
13
+ 00002/0976 7 (256,448,3)
14
+ 00002/0980 7 (256,448,3)
15
+ 00002/0983 7 (256,448,3)
16
+ 00002/1000 7 (256,448,3)
17
+ 00003/0022 7 (256,448,3)
18
+ 00003/0031 7 (256,448,3)
19
+ 00003/0035 7 (256,448,3)
20
+ 00003/0041 7 (256,448,3)
21
+ 00003/0073 7 (256,448,3)
22
+ 00003/0107 7 (256,448,3)
23
+ 00003/0111 7 (256,448,3)
24
+ 00003/0114 7 (256,448,3)
25
+ 00003/0117 7 (256,448,3)
26
+ 00003/0121 7 (256,448,3)
27
+ 00003/0499 7 (256,448,3)
28
+ 00003/0501 7 (256,448,3)
29
+ 00003/0507 7 (256,448,3)
30
+ 00003/0510 7 (256,448,3)
31
+ 00003/0517 7 (256,448,3)
32
+ 00003/0522 7 (256,448,3)
33
+ 00003/0531 7 (256,448,3)
34
+ 00003/0533 7 (256,448,3)
35
+ 00003/0534 7 (256,448,3)
36
+ 00003/0682 7 (256,448,3)
37
+ 00003/0687 7 (256,448,3)
38
+ 00003/0715 7 (256,448,3)
39
+ 00003/0742 7 (256,448,3)
40
+ 00003/0751 7 (256,448,3)
41
+ 00003/0984 7 (256,448,3)
42
+ 00004/0042 7 (256,448,3)
43
+ 00004/0165 7 (256,448,3)
44
+ 00004/0321 7 (256,448,3)
45
+ 00004/0569 7 (256,448,3)
46
+ 00004/0572 7 (256,448,3)
47
+ 00004/0619 7 (256,448,3)
48
+ 00004/0776 7 (256,448,3)
49
+ 00004/0780 7 (256,448,3)
50
+ 00004/0825 7 (256,448,3)
51
+ 00004/0832 7 (256,448,3)
52
+ 00004/0853 7 (256,448,3)
53
+ 00004/0876 7 (256,448,3)
54
+ 00004/0888 7 (256,448,3)
55
+ 00005/0015 7 (256,448,3)
56
+ 00005/0021 7 (256,448,3)
57
+ 00005/0022 7 (256,448,3)
58
+ 00005/0024 7 (256,448,3)
59
+ 00005/0026 7 (256,448,3)
60
+ 00005/0394 7 (256,448,3)
61
+ 00005/0403 7 (256,448,3)
62
+ 00005/0531 7 (256,448,3)
63
+ 00005/0546 7 (256,448,3)
64
+ 00005/0554 7 (256,448,3)
65
+ 00005/0694 7 (256,448,3)
66
+ 00005/0700 7 (256,448,3)
67
+ 00005/0740 7 (256,448,3)
68
+ 00005/0826 7 (256,448,3)
69
+ 00005/0832 7 (256,448,3)
70
+ 00005/0834 7 (256,448,3)
71
+ 00005/0943 7 (256,448,3)
72
+ 00006/0184 7 (256,448,3)
73
+ 00006/0205 7 (256,448,3)
74
+ 00006/0206 7 (256,448,3)
75
+ 00006/0211 7 (256,448,3)
76
+ 00006/0271 7 (256,448,3)
77
+ 00006/0273 7 (256,448,3)
78
+ 00006/0277 7 (256,448,3)
79
+ 00006/0283 7 (256,448,3)
80
+ 00006/0287 7 (256,448,3)
81
+ 00006/0298 7 (256,448,3)
82
+ 00006/0310 7 (256,448,3)
83
+ 00006/0356 7 (256,448,3)
84
+ 00006/0357 7 (256,448,3)
85
+ 00006/0544 7 (256,448,3)
86
+ 00006/0565 7 (256,448,3)
87
+ 00006/0569 7 (256,448,3)
88
+ 00006/0573 7 (256,448,3)
89
+ 00006/0592 7 (256,448,3)
90
+ 00006/0613 7 (256,448,3)
91
+ 00006/0633 7 (256,448,3)
92
+ 00006/0637 7 (256,448,3)
93
+ 00006/0646 7 (256,448,3)
94
+ 00006/0649 7 (256,448,3)
95
+ 00006/0655 7 (256,448,3)
96
+ 00006/0658 7 (256,448,3)
97
+ 00006/0662 7 (256,448,3)
98
+ 00006/0666 7 (256,448,3)
99
+ 00006/0673 7 (256,448,3)
100
+ 00007/0248 7 (256,448,3)
101
+ 00007/0253 7 (256,448,3)
102
+ 00007/0430 7 (256,448,3)
103
+ 00007/0434 7 (256,448,3)
104
+ 00007/0436 7 (256,448,3)
105
+ 00007/0452 7 (256,448,3)
106
+ 00007/0464 7 (256,448,3)
107
+ 00007/0470 7 (256,448,3)
108
+ 00007/0472 7 (256,448,3)
109
+ 00007/0483 7 (256,448,3)
110
+ 00007/0484 7 (256,448,3)
111
+ 00007/0493 7 (256,448,3)
112
+ 00007/0508 7 (256,448,3)
113
+ 00007/0514 7 (256,448,3)
114
+ 00007/0697 7 (256,448,3)
115
+ 00007/0698 7 (256,448,3)
116
+ 00007/0744 7 (256,448,3)
117
+ 00007/0775 7 (256,448,3)
118
+ 00007/0786 7 (256,448,3)
119
+ 00007/0790 7 (256,448,3)
120
+ 00007/0800 7 (256,448,3)
121
+ 00007/0833 7 (256,448,3)
122
+ 00007/0867 7 (256,448,3)
123
+ 00007/0879 7 (256,448,3)
124
+ 00007/0899 7 (256,448,3)
125
+ 00008/0251 7 (256,448,3)
126
+ 00008/0322 7 (256,448,3)
127
+ 00008/0971 7 (256,448,3)
128
+ 00008/0976 7 (256,448,3)
129
+ 00009/0016 7 (256,448,3)
130
+ 00009/0036 7 (256,448,3)
131
+ 00009/0037 7 (256,448,3)
132
+ 00009/0609 7 (256,448,3)
133
+ 00009/0812 7 (256,448,3)
134
+ 00009/0821 7 (256,448,3)
135
+ 00009/0947 7 (256,448,3)
136
+ 00009/0952 7 (256,448,3)
137
+ 00009/0955 7 (256,448,3)
138
+ 00009/0970 7 (256,448,3)
139
+ 00010/0072 7 (256,448,3)
140
+ 00010/0074 7 (256,448,3)
141
+ 00010/0079 7 (256,448,3)
142
+ 00010/0085 7 (256,448,3)
143
+ 00010/0139 7 (256,448,3)
144
+ 00010/0140 7 (256,448,3)
145
+ 00010/0183 7 (256,448,3)
146
+ 00010/0200 7 (256,448,3)
147
+ 00010/0223 7 (256,448,3)
148
+ 00010/0305 7 (256,448,3)
149
+ 00010/0323 7 (256,448,3)
150
+ 00010/0338 7 (256,448,3)
151
+ 00010/0342 7 (256,448,3)
152
+ 00010/0350 7 (256,448,3)
153
+ 00010/0356 7 (256,448,3)
154
+ 00010/0362 7 (256,448,3)
155
+ 00010/0366 7 (256,448,3)
156
+ 00010/0375 7 (256,448,3)
157
+ 00010/0404 7 (256,448,3)
158
+ 00010/0407 7 (256,448,3)
159
+ 00010/0414 7 (256,448,3)
160
+ 00010/0418 7 (256,448,3)
161
+ 00010/0429 7 (256,448,3)
162
+ 00010/0557 7 (256,448,3)
163
+ 00010/0564 7 (256,448,3)
164
+ 00010/0733 7 (256,448,3)
165
+ 00010/0935 7 (256,448,3)
166
+ 00010/0939 7 (256,448,3)
167
+ 00010/0943 7 (256,448,3)
168
+ 00011/0242 7 (256,448,3)
169
+ 00011/0259 7 (256,448,3)
170
+ 00011/0263 7 (256,448,3)
171
+ 00011/0266 7 (256,448,3)
172
+ 00011/0278 7 (256,448,3)
173
+ 00011/0890 7 (256,448,3)
174
+ 00011/0894 7 (256,448,3)
175
+ 00011/0903 7 (256,448,3)
176
+ 00011/0906 7 (256,448,3)
177
+ 00011/0913 7 (256,448,3)
178
+ 00012/0011 7 (256,448,3)
179
+ 00012/0014 7 (256,448,3)
180
+ 00012/0126 7 (256,448,3)
181
+ 00012/0127 7 (256,448,3)
182
+ 00012/0526 7 (256,448,3)
183
+ 00012/0551 7 (256,448,3)
184
+ 00012/0896 7 (256,448,3)
185
+ 00012/0910 7 (256,448,3)
186
+ 00012/0915 7 (256,448,3)
187
+ 00013/0167 7 (256,448,3)
188
+ 00013/0794 7 (256,448,3)
189
+ 00013/0807 7 (256,448,3)
190
+ 00013/0846 7 (256,448,3)
191
+ 00013/0882 7 (256,448,3)
192
+ 00013/0889 7 (256,448,3)
193
+ 00013/0910 7 (256,448,3)
194
+ 00013/0913 7 (256,448,3)
195
+ 00013/0924 7 (256,448,3)
196
+ 00013/0931 7 (256,448,3)
197
+ 00013/0944 7 (256,448,3)
198
+ 00013/0955 7 (256,448,3)
199
+ 00013/0962 7 (256,448,3)
200
+ 00013/0969 7 (256,448,3)
201
+ 00014/0012 7 (256,448,3)
202
+ 00014/0025 7 (256,448,3)
203
+ 00014/0473 7 (256,448,3)
204
+ 00014/0499 7 (256,448,3)
205
+ 00014/0524 7 (256,448,3)
206
+ 00014/0739 7 (256,448,3)
207
+ 00014/0753 7 (256,448,3)
208
+ 00014/0771 7 (256,448,3)
209
+ 00014/0832 7 (256,448,3)
210
+ 00014/0836 7 (256,448,3)
211
+ 00014/0838 7 (256,448,3)
212
+ 00014/0839 7 (256,448,3)
213
+ 00014/0843 7 (256,448,3)
214
+ 00014/0846 7 (256,448,3)
215
+ 00014/0849 7 (256,448,3)
216
+ 00014/0859 7 (256,448,3)
217
+ 00014/0880 7 (256,448,3)
218
+ 00014/0906 7 (256,448,3)
219
+ 00015/0030 7 (256,448,3)
220
+ 00015/0067 7 (256,448,3)
221
+ 00015/0084 7 (256,448,3)
222
+ 00015/0190 7 (256,448,3)
223
+ 00015/0575 7 (256,448,3)
224
+ 00015/0784 7 (256,448,3)
225
+ 00015/0855 7 (256,448,3)
226
+ 00015/0904 7 (256,448,3)
227
+ 00015/0914 7 (256,448,3)
228
+ 00015/0936 7 (256,448,3)
229
+ 00015/0939 7 (256,448,3)
230
+ 00015/0943 7 (256,448,3)
231
+ 00015/0957 7 (256,448,3)
232
+ 00016/0131 7 (256,448,3)
233
+ 00016/0173 7 (256,448,3)
234
+ 00016/0320 7 (256,448,3)
235
+ 00016/0328 7 (256,448,3)
236
+ 00016/0334 7 (256,448,3)
237
+ 00016/0338 7 (256,448,3)
238
+ 00016/0339 7 (256,448,3)
239
+ 00016/0345 7 (256,448,3)
240
+ 00016/0365 7 (256,448,3)
241
+ 00016/0584 7 (256,448,3)
242
+ 00016/0634 7 (256,448,3)
243
+ 00017/0342 7 (256,448,3)
244
+ 00017/0346 7 (256,448,3)
245
+ 00017/0350 7 (256,448,3)
246
+ 00017/0766 7 (256,448,3)
247
+ 00017/0786 7 (256,448,3)
248
+ 00017/0911 7 (256,448,3)
249
+ 00017/0914 7 (256,448,3)
250
+ 00018/0217 7 (256,448,3)
251
+ 00018/0258 7 (256,448,3)
252
+ 00018/0307 7 (256,448,3)
253
+ 00018/0480 7 (256,448,3)
254
+ 00018/0491 7 (256,448,3)
255
+ 00018/0994 7 (256,448,3)
256
+ 00018/0995 7 (256,448,3)
257
+ 00018/0997 7 (256,448,3)
258
+ 00018/1000 7 (256,448,3)
259
+ 00019/0007 7 (256,448,3)
260
+ 00019/0016 7 (256,448,3)
261
+ 00019/0026 7 (256,448,3)
262
+ 00019/0030 7 (256,448,3)
263
+ 00019/0086 7 (256,448,3)
264
+ 00019/0089 7 (256,448,3)
265
+ 00019/0111 7 (256,448,3)
266
+ 00019/0285 7 (256,448,3)
267
+ 00019/0415 7 (256,448,3)
268
+ 00019/0434 7 (256,448,3)
269
+ 00019/0437 7 (256,448,3)
270
+ 00019/0568 7 (256,448,3)
271
+ 00019/0570 7 (256,448,3)
272
+ 00019/0591 7 (256,448,3)
273
+ 00019/0596 7 (256,448,3)
274
+ 00019/0603 7 (256,448,3)
275
+ 00019/0607 7 (256,448,3)
276
+ 00019/0637 7 (256,448,3)
277
+ 00019/0644 7 (256,448,3)
278
+ 00019/0647 7 (256,448,3)
279
+ 00019/0787 7 (256,448,3)
280
+ 00019/0993 7 (256,448,3)
281
+ 00019/0998 7 (256,448,3)
282
+ 00021/0232 7 (256,448,3)
283
+ 00021/0255 7 (256,448,3)
284
+ 00021/0646 7 (256,448,3)
285
+ 00021/0653 7 (256,448,3)
286
+ 00021/0657 7 (256,448,3)
287
+ 00021/0668 7 (256,448,3)
288
+ 00021/0672 7 (256,448,3)
289
+ 00021/0725 7 (256,448,3)
290
+ 00021/0750 7 (256,448,3)
291
+ 00021/0764 7 (256,448,3)
292
+ 00021/0821 7 (256,448,3)
293
+ 00022/0192 7 (256,448,3)
294
+ 00022/0391 7 (256,448,3)
295
+ 00022/0514 7 (256,448,3)
296
+ 00022/0567 7 (256,448,3)
297
+ 00022/0674 7 (256,448,3)
298
+ 00022/0686 7 (256,448,3)
299
+ 00022/0700 7 (256,448,3)
300
+ 00023/0020 7 (256,448,3)
301
+ 00023/0024 7 (256,448,3)
302
+ 00023/0025 7 (256,448,3)
303
+ 00023/0042 7 (256,448,3)
304
+ 00023/0050 7 (256,448,3)
305
+ 00023/0094 7 (256,448,3)
306
+ 00023/0107 7 (256,448,3)
307
+ 00023/0635 7 (256,448,3)
308
+ 00023/0698 7 (256,448,3)
309
+ 00023/0774 7 (256,448,3)
310
+ 00023/0795 7 (256,448,3)
311
+ 00023/0821 7 (256,448,3)
312
+ 00023/0839 7 (256,448,3)
313
+ 00023/0846 7 (256,448,3)
314
+ 00023/0869 7 (256,448,3)
315
+ 00023/0879 7 (256,448,3)
316
+ 00023/0887 7 (256,448,3)
317
+ 00023/0899 7 (256,448,3)
318
+ 00023/0910 7 (256,448,3)
319
+ 00023/0920 7 (256,448,3)
320
+ 00023/0929 7 (256,448,3)
321
+ 00023/0941 7 (256,448,3)
322
+ 00023/0942 7 (256,448,3)
323
+ 00023/0952 7 (256,448,3)
324
+ 00024/0066 7 (256,448,3)
325
+ 00024/0072 7 (256,448,3)
326
+ 00024/0080 7 (256,448,3)
327
+ 00024/0093 7 (256,448,3)
328
+ 00024/0107 7 (256,448,3)
329
+ 00024/0262 7 (256,448,3)
330
+ 00024/0283 7 (256,448,3)
331
+ 00024/0294 7 (256,448,3)
332
+ 00024/0296 7 (256,448,3)
333
+ 00024/0304 7 (256,448,3)
334
+ 00024/0315 7 (256,448,3)
335
+ 00024/0322 7 (256,448,3)
336
+ 00024/0648 7 (256,448,3)
337
+ 00024/0738 7 (256,448,3)
338
+ 00024/0743 7 (256,448,3)
339
+ 00025/0542 7 (256,448,3)
340
+ 00025/0769 7 (256,448,3)
341
+ 00025/0984 7 (256,448,3)
342
+ 00025/0985 7 (256,448,3)
343
+ 00025/0989 7 (256,448,3)
344
+ 00025/0991 7 (256,448,3)
345
+ 00026/0009 7 (256,448,3)
346
+ 00026/0013 7 (256,448,3)
347
+ 00026/0020 7 (256,448,3)
348
+ 00026/0021 7 (256,448,3)
349
+ 00026/0025 7 (256,448,3)
350
+ 00026/0135 7 (256,448,3)
351
+ 00026/0200 7 (256,448,3)
352
+ 00026/0297 7 (256,448,3)
353
+ 00026/0306 7 (256,448,3)
354
+ 00026/0444 7 (256,448,3)
355
+ 00026/0450 7 (256,448,3)
356
+ 00026/0453 7 (256,448,3)
357
+ 00026/0464 7 (256,448,3)
358
+ 00026/0486 7 (256,448,3)
359
+ 00026/0773 7 (256,448,3)
360
+ 00026/0785 7 (256,448,3)
361
+ 00026/0836 7 (256,448,3)
362
+ 00026/0838 7 (256,448,3)
363
+ 00026/0848 7 (256,448,3)
364
+ 00026/0885 7 (256,448,3)
365
+ 00026/0893 7 (256,448,3)
366
+ 00026/0939 7 (256,448,3)
367
+ 00026/0942 7 (256,448,3)
368
+ 00027/0092 7 (256,448,3)
369
+ 00027/0112 7 (256,448,3)
370
+ 00027/0115 7 (256,448,3)
371
+ 00027/0143 7 (256,448,3)
372
+ 00027/0175 7 (256,448,3)
373
+ 00027/0179 7 (256,448,3)
374
+ 00027/0183 7 (256,448,3)
375
+ 00027/0197 7 (256,448,3)
376
+ 00027/0199 7 (256,448,3)
377
+ 00027/0300 7 (256,448,3)
378
+ 00028/0015 7 (256,448,3)
379
+ 00028/0032 7 (256,448,3)
380
+ 00028/0048 7 (256,448,3)
381
+ 00028/0068 7 (256,448,3)
382
+ 00028/0219 7 (256,448,3)
383
+ 00028/0606 7 (256,448,3)
384
+ 00028/0626 7 (256,448,3)
385
+ 00028/0748 7 (256,448,3)
386
+ 00028/0764 7 (256,448,3)
387
+ 00028/0772 7 (256,448,3)
388
+ 00028/0780 7 (256,448,3)
389
+ 00028/0926 7 (256,448,3)
390
+ 00028/0947 7 (256,448,3)
391
+ 00028/0962 7 (256,448,3)
392
+ 00029/0085 7 (256,448,3)
393
+ 00029/0281 7 (256,448,3)
394
+ 00029/0284 7 (256,448,3)
395
+ 00029/0288 7 (256,448,3)
396
+ 00029/0294 7 (256,448,3)
397
+ 00029/0364 7 (256,448,3)
398
+ 00029/0369 7 (256,448,3)
399
+ 00029/0421 7 (256,448,3)
400
+ 00029/0425 7 (256,448,3)
401
+ 00029/0550 7 (256,448,3)
402
+ 00030/0014 7 (256,448,3)
403
+ 00030/0101 7 (256,448,3)
404
+ 00030/0143 7 (256,448,3)
405
+ 00030/0351 7 (256,448,3)
406
+ 00030/0356 7 (256,448,3)
407
+ 00030/0371 7 (256,448,3)
408
+ 00030/0484 7 (256,448,3)
409
+ 00030/0492 7 (256,448,3)
410
+ 00030/0503 7 (256,448,3)
411
+ 00030/0682 7 (256,448,3)
412
+ 00030/0696 7 (256,448,3)
413
+ 00030/0735 7 (256,448,3)
414
+ 00030/0737 7 (256,448,3)
415
+ 00030/0868 7 (256,448,3)
416
+ 00031/0161 7 (256,448,3)
417
+ 00031/0180 7 (256,448,3)
418
+ 00031/0194 7 (256,448,3)
419
+ 00031/0253 7 (256,448,3)
420
+ 00031/0293 7 (256,448,3)
421
+ 00031/0466 7 (256,448,3)
422
+ 00031/0477 7 (256,448,3)
423
+ 00031/0549 7 (256,448,3)
424
+ 00031/0600 7 (256,448,3)
425
+ 00031/0617 7 (256,448,3)
426
+ 00031/0649 7 (256,448,3)
427
+ 00032/0015 7 (256,448,3)
428
+ 00032/0020 7 (256,448,3)
429
+ 00032/0023 7 (256,448,3)
430
+ 00032/0048 7 (256,448,3)
431
+ 00032/0056 7 (256,448,3)
432
+ 00032/0872 7 (256,448,3)
433
+ 00033/0069 7 (256,448,3)
434
+ 00033/0073 7 (256,448,3)
435
+ 00033/0078 7 (256,448,3)
436
+ 00033/0079 7 (256,448,3)
437
+ 00033/0086 7 (256,448,3)
438
+ 00033/0088 7 (256,448,3)
439
+ 00033/0091 7 (256,448,3)
440
+ 00033/0096 7 (256,448,3)
441
+ 00033/0607 7 (256,448,3)
442
+ 00033/0613 7 (256,448,3)
443
+ 00033/0616 7 (256,448,3)
444
+ 00033/0619 7 (256,448,3)
445
+ 00033/0626 7 (256,448,3)
446
+ 00033/0628 7 (256,448,3)
447
+ 00033/0637 7 (256,448,3)
448
+ 00033/0686 7 (256,448,3)
449
+ 00033/0842 7 (256,448,3)
450
+ 00034/0261 7 (256,448,3)
451
+ 00034/0265 7 (256,448,3)
452
+ 00034/0269 7 (256,448,3)
453
+ 00034/0275 7 (256,448,3)
454
+ 00034/0286 7 (256,448,3)
455
+ 00034/0294 7 (256,448,3)
456
+ 00034/0431 7 (256,448,3)
457
+ 00034/0577 7 (256,448,3)
458
+ 00034/0685 7 (256,448,3)
459
+ 00034/0687 7 (256,448,3)
460
+ 00034/0703 7 (256,448,3)
461
+ 00034/0715 7 (256,448,3)
462
+ 00034/0935 7 (256,448,3)
463
+ 00034/0943 7 (256,448,3)
464
+ 00034/0963 7 (256,448,3)
465
+ 00034/0979 7 (256,448,3)
466
+ 00034/0990 7 (256,448,3)
467
+ 00035/0129 7 (256,448,3)
468
+ 00035/0153 7 (256,448,3)
469
+ 00035/0156 7 (256,448,3)
470
+ 00035/0474 7 (256,448,3)
471
+ 00035/0507 7 (256,448,3)
472
+ 00035/0532 7 (256,448,3)
473
+ 00035/0560 7 (256,448,3)
474
+ 00035/0572 7 (256,448,3)
475
+ 00035/0587 7 (256,448,3)
476
+ 00035/0588 7 (256,448,3)
477
+ 00035/0640 7 (256,448,3)
478
+ 00035/0654 7 (256,448,3)
479
+ 00035/0655 7 (256,448,3)
480
+ 00035/0737 7 (256,448,3)
481
+ 00035/0843 7 (256,448,3)
482
+ 00035/0932 7 (256,448,3)
483
+ 00035/0957 7 (256,448,3)
484
+ 00036/0029 7 (256,448,3)
485
+ 00036/0266 7 (256,448,3)
486
+ 00036/0276 7 (256,448,3)
487
+ 00036/0310 7 (256,448,3)
488
+ 00036/0314 7 (256,448,3)
489
+ 00036/0320 7 (256,448,3)
490
+ 00036/0333 7 (256,448,3)
491
+ 00036/0348 7 (256,448,3)
492
+ 00036/0357 7 (256,448,3)
493
+ 00036/0360 7 (256,448,3)
494
+ 00036/0368 7 (256,448,3)
495
+ 00036/0371 7 (256,448,3)
496
+ 00036/0378 7 (256,448,3)
497
+ 00036/0391 7 (256,448,3)
498
+ 00036/0440 7 (256,448,3)
499
+ 00036/0731 7 (256,448,3)
500
+ 00036/0733 7 (256,448,3)
501
+ 00036/0741 7 (256,448,3)
502
+ 00036/0743 7 (256,448,3)
503
+ 00036/0927 7 (256,448,3)
504
+ 00036/0931 7 (256,448,3)
505
+ 00036/0933 7 (256,448,3)
506
+ 00036/0938 7 (256,448,3)
507
+ 00036/0944 7 (256,448,3)
508
+ 00036/0946 7 (256,448,3)
509
+ 00036/0951 7 (256,448,3)
510
+ 00036/0953 7 (256,448,3)
511
+ 00036/0963 7 (256,448,3)
512
+ 00036/0964 7 (256,448,3)
513
+ 00036/0981 7 (256,448,3)
514
+ 00036/0991 7 (256,448,3)
515
+ 00037/0072 7 (256,448,3)
516
+ 00037/0079 7 (256,448,3)
517
+ 00037/0132 7 (256,448,3)
518
+ 00037/0135 7 (256,448,3)
519
+ 00037/0137 7 (256,448,3)
520
+ 00037/0141 7 (256,448,3)
521
+ 00037/0229 7 (256,448,3)
522
+ 00037/0234 7 (256,448,3)
523
+ 00037/0239 7 (256,448,3)
524
+ 00037/0242 7 (256,448,3)
525
+ 00037/0254 7 (256,448,3)
526
+ 00037/0269 7 (256,448,3)
527
+ 00037/0276 7 (256,448,3)
528
+ 00037/0279 7 (256,448,3)
529
+ 00037/0286 7 (256,448,3)
530
+ 00037/0345 7 (256,448,3)
531
+ 00037/0449 7 (256,448,3)
532
+ 00037/0450 7 (256,448,3)
533
+ 00037/0820 7 (256,448,3)
534
+ 00037/0824 7 (256,448,3)
535
+ 00037/0859 7 (256,448,3)
536
+ 00037/0899 7 (256,448,3)
537
+ 00037/0906 7 (256,448,3)
538
+ 00038/0535 7 (256,448,3)
539
+ 00038/0572 7 (256,448,3)
540
+ 00038/0675 7 (256,448,3)
541
+ 00038/0731 7 (256,448,3)
542
+ 00038/0732 7 (256,448,3)
543
+ 00038/0744 7 (256,448,3)
544
+ 00038/0755 7 (256,448,3)
545
+ 00039/0002 7 (256,448,3)
546
+ 00039/0013 7 (256,448,3)
547
+ 00039/0247 7 (256,448,3)
548
+ 00039/0489 7 (256,448,3)
549
+ 00039/0504 7 (256,448,3)
550
+ 00039/0558 7 (256,448,3)
551
+ 00039/0686 7 (256,448,3)
552
+ 00039/0727 7 (256,448,3)
553
+ 00039/0769 7 (256,448,3)
554
+ 00040/0081 7 (256,448,3)
555
+ 00040/0082 7 (256,448,3)
556
+ 00040/0402 7 (256,448,3)
557
+ 00040/0407 7 (256,448,3)
558
+ 00040/0408 7 (256,448,3)
559
+ 00040/0410 7 (256,448,3)
560
+ 00040/0411 7 (256,448,3)
561
+ 00040/0412 7 (256,448,3)
562
+ 00040/0413 7 (256,448,3)
563
+ 00040/0415 7 (256,448,3)
564
+ 00040/0421 7 (256,448,3)
565
+ 00040/0422 7 (256,448,3)
566
+ 00040/0426 7 (256,448,3)
567
+ 00040/0438 7 (256,448,3)
568
+ 00040/0439 7 (256,448,3)
569
+ 00040/0440 7 (256,448,3)
570
+ 00040/0443 7 (256,448,3)
571
+ 00040/0457 7 (256,448,3)
572
+ 00040/0459 7 (256,448,3)
573
+ 00040/0725 7 (256,448,3)
574
+ 00040/0727 7 (256,448,3)
575
+ 00040/0936 7 (256,448,3)
576
+ 00040/0959 7 (256,448,3)
577
+ 00040/0964 7 (256,448,3)
578
+ 00040/0968 7 (256,448,3)
579
+ 00040/0974 7 (256,448,3)
580
+ 00040/0978 7 (256,448,3)
581
+ 00040/0979 7 (256,448,3)
582
+ 00040/0989 7 (256,448,3)
583
+ 00040/0993 7 (256,448,3)
584
+ 00040/0994 7 (256,448,3)
585
+ 00040/0997 7 (256,448,3)
586
+ 00041/0001 7 (256,448,3)
587
+ 00041/0007 7 (256,448,3)
588
+ 00041/0019 7 (256,448,3)
589
+ 00041/0040 7 (256,448,3)
590
+ 00041/0350 7 (256,448,3)
591
+ 00041/0357 7 (256,448,3)
592
+ 00041/0393 7 (256,448,3)
593
+ 00041/0890 7 (256,448,3)
594
+ 00041/0909 7 (256,448,3)
595
+ 00041/0915 7 (256,448,3)
596
+ 00041/0933 7 (256,448,3)
597
+ 00042/0017 7 (256,448,3)
598
+ 00042/0332 7 (256,448,3)
599
+ 00042/0346 7 (256,448,3)
600
+ 00042/0350 7 (256,448,3)
601
+ 00042/0356 7 (256,448,3)
602
+ 00042/0382 7 (256,448,3)
603
+ 00042/0389 7 (256,448,3)
604
+ 00042/0539 7 (256,448,3)
605
+ 00042/0546 7 (256,448,3)
606
+ 00042/0550 7 (256,448,3)
607
+ 00042/0553 7 (256,448,3)
608
+ 00042/0555 7 (256,448,3)
609
+ 00042/0560 7 (256,448,3)
610
+ 00042/0570 7 (256,448,3)
611
+ 00043/0119 7 (256,448,3)
612
+ 00043/0122 7 (256,448,3)
613
+ 00043/0168 7 (256,448,3)
614
+ 00043/0274 7 (256,448,3)
615
+ 00043/0304 7 (256,448,3)
616
+ 00043/0731 7 (256,448,3)
617
+ 00043/0735 7 (256,448,3)
618
+ 00043/0739 7 (256,448,3)
619
+ 00043/0740 7 (256,448,3)
620
+ 00044/0212 7 (256,448,3)
621
+ 00044/0432 7 (256,448,3)
622
+ 00044/0934 7 (256,448,3)
623
+ 00044/0940 7 (256,448,3)
624
+ 00044/0987 7 (256,448,3)
625
+ 00045/0004 7 (256,448,3)
626
+ 00045/0009 7 (256,448,3)
627
+ 00045/0011 7 (256,448,3)
628
+ 00045/0019 7 (256,448,3)
629
+ 00045/0023 7 (256,448,3)
630
+ 00045/0289 7 (256,448,3)
631
+ 00045/0760 7 (256,448,3)
632
+ 00045/0779 7 (256,448,3)
633
+ 00045/0816 7 (256,448,3)
634
+ 00045/0820 7 (256,448,3)
635
+ 00046/0132 7 (256,448,3)
636
+ 00046/0350 7 (256,448,3)
637
+ 00046/0356 7 (256,448,3)
638
+ 00046/0357 7 (256,448,3)
639
+ 00046/0379 7 (256,448,3)
640
+ 00046/0410 7 (256,448,3)
641
+ 00046/0412 7 (256,448,3)
642
+ 00046/0481 7 (256,448,3)
643
+ 00046/0497 7 (256,448,3)
644
+ 00046/0510 7 (256,448,3)
645
+ 00046/0515 7 (256,448,3)
646
+ 00046/0529 7 (256,448,3)
647
+ 00046/0544 7 (256,448,3)
648
+ 00046/0545 7 (256,448,3)
649
+ 00046/0552 7 (256,448,3)
650
+ 00046/0559 7 (256,448,3)
651
+ 00046/0589 7 (256,448,3)
652
+ 00046/0642 7 (256,448,3)
653
+ 00046/0724 7 (256,448,3)
654
+ 00046/0758 7 (256,448,3)
655
+ 00046/0930 7 (256,448,3)
656
+ 00046/0953 7 (256,448,3)
657
+ 00047/0013 7 (256,448,3)
658
+ 00047/0014 7 (256,448,3)
659
+ 00047/0017 7 (256,448,3)
660
+ 00047/0076 7 (256,448,3)
661
+ 00047/0151 7 (256,448,3)
662
+ 00047/0797 7 (256,448,3)
663
+ 00048/0014 7 (256,448,3)
664
+ 00048/0021 7 (256,448,3)
665
+ 00048/0026 7 (256,448,3)
666
+ 00048/0030 7 (256,448,3)
667
+ 00048/0039 7 (256,448,3)
668
+ 00048/0045 7 (256,448,3)
669
+ 00048/0049 7 (256,448,3)
670
+ 00048/0145 7 (256,448,3)
671
+ 00048/0188 7 (256,448,3)
672
+ 00048/0302 7 (256,448,3)
673
+ 00048/0361 7 (256,448,3)
674
+ 00048/0664 7 (256,448,3)
675
+ 00048/0672 7 (256,448,3)
676
+ 00048/0681 7 (256,448,3)
677
+ 00048/0689 7 (256,448,3)
678
+ 00048/0690 7 (256,448,3)
679
+ 00048/0691 7 (256,448,3)
680
+ 00048/0711 7 (256,448,3)
681
+ 00049/0085 7 (256,448,3)
682
+ 00049/0810 7 (256,448,3)
683
+ 00049/0858 7 (256,448,3)
684
+ 00049/0865 7 (256,448,3)
685
+ 00049/0871 7 (256,448,3)
686
+ 00049/0903 7 (256,448,3)
687
+ 00049/0928 7 (256,448,3)
688
+ 00050/0092 7 (256,448,3)
689
+ 00050/0101 7 (256,448,3)
690
+ 00050/0108 7 (256,448,3)
691
+ 00050/0112 7 (256,448,3)
692
+ 00050/0120 7 (256,448,3)
693
+ 00050/0128 7 (256,448,3)
694
+ 00050/0383 7 (256,448,3)
695
+ 00050/0395 7 (256,448,3)
696
+ 00050/0405 7 (256,448,3)
697
+ 00050/0632 7 (256,448,3)
698
+ 00050/0648 7 (256,448,3)
699
+ 00050/0649 7 (256,448,3)
700
+ 00050/0659 7 (256,448,3)
701
+ 00050/0699 7 (256,448,3)
702
+ 00050/0708 7 (256,448,3)
703
+ 00050/0716 7 (256,448,3)
704
+ 00050/0758 7 (256,448,3)
705
+ 00050/0761 7 (256,448,3)
706
+ 00051/0572 7 (256,448,3)
707
+ 00052/0163 7 (256,448,3)
708
+ 00052/0242 7 (256,448,3)
709
+ 00052/0260 7 (256,448,3)
710
+ 00052/0322 7 (256,448,3)
711
+ 00052/0333 7 (256,448,3)
712
+ 00052/0806 7 (256,448,3)
713
+ 00052/0813 7 (256,448,3)
714
+ 00052/0821 7 (256,448,3)
715
+ 00052/0830 7 (256,448,3)
716
+ 00052/0914 7 (256,448,3)
717
+ 00052/0923 7 (256,448,3)
718
+ 00052/0959 7 (256,448,3)
719
+ 00053/0288 7 (256,448,3)
720
+ 00053/0290 7 (256,448,3)
721
+ 00053/0323 7 (256,448,3)
722
+ 00053/0337 7 (256,448,3)
723
+ 00053/0340 7 (256,448,3)
724
+ 00053/0437 7 (256,448,3)
725
+ 00053/0595 7 (256,448,3)
726
+ 00053/0739 7 (256,448,3)
727
+ 00053/0761 7 (256,448,3)
728
+ 00054/0014 7 (256,448,3)
729
+ 00054/0017 7 (256,448,3)
730
+ 00054/0178 7 (256,448,3)
731
+ 00054/0183 7 (256,448,3)
732
+ 00054/0196 7 (256,448,3)
733
+ 00054/0205 7 (256,448,3)
734
+ 00054/0214 7 (256,448,3)
735
+ 00054/0289 7 (256,448,3)
736
+ 00054/0453 7 (256,448,3)
737
+ 00054/0498 7 (256,448,3)
738
+ 00054/0502 7 (256,448,3)
739
+ 00054/0514 7 (256,448,3)
740
+ 00054/0773 7 (256,448,3)
741
+ 00055/0001 7 (256,448,3)
742
+ 00055/0115 7 (256,448,3)
743
+ 00055/0118 7 (256,448,3)
744
+ 00055/0171 7 (256,448,3)
745
+ 00055/0214 7 (256,448,3)
746
+ 00055/0354 7 (256,448,3)
747
+ 00055/0449 7 (256,448,3)
748
+ 00055/0473 7 (256,448,3)
749
+ 00055/0649 7 (256,448,3)
750
+ 00055/0800 7 (256,448,3)
751
+ 00055/0803 7 (256,448,3)
752
+ 00055/0990 7 (256,448,3)
753
+ 00056/0041 7 (256,448,3)
754
+ 00056/0120 7 (256,448,3)
755
+ 00056/0293 7 (256,448,3)
756
+ 00056/0357 7 (256,448,3)
757
+ 00056/0506 7 (256,448,3)
758
+ 00056/0561 7 (256,448,3)
759
+ 00056/0567 7 (256,448,3)
760
+ 00056/0575 7 (256,448,3)
761
+ 00057/0175 7 (256,448,3)
762
+ 00057/0495 7 (256,448,3)
763
+ 00057/0498 7 (256,448,3)
764
+ 00057/0506 7 (256,448,3)
765
+ 00057/0612 7 (256,448,3)
766
+ 00057/0620 7 (256,448,3)
767
+ 00057/0623 7 (256,448,3)
768
+ 00057/0635 7 (256,448,3)
769
+ 00057/0773 7 (256,448,3)
770
+ 00057/0778 7 (256,448,3)
771
+ 00057/0867 7 (256,448,3)
772
+ 00057/0976 7 (256,448,3)
773
+ 00057/0980 7 (256,448,3)
774
+ 00057/0985 7 (256,448,3)
775
+ 00057/0992 7 (256,448,3)
776
+ 00058/0009 7 (256,448,3)
777
+ 00058/0076 7 (256,448,3)
778
+ 00058/0078 7 (256,448,3)
779
+ 00058/0279 7 (256,448,3)
780
+ 00058/0283 7 (256,448,3)
781
+ 00058/0286 7 (256,448,3)
782
+ 00058/0350 7 (256,448,3)
783
+ 00058/0380 7 (256,448,3)
784
+ 00061/0132 7 (256,448,3)
785
+ 00061/0141 7 (256,448,3)
786
+ 00061/0156 7 (256,448,3)
787
+ 00061/0159 7 (256,448,3)
788
+ 00061/0168 7 (256,448,3)
789
+ 00061/0170 7 (256,448,3)
790
+ 00061/0186 7 (256,448,3)
791
+ 00061/0219 7 (256,448,3)
792
+ 00061/0227 7 (256,448,3)
793
+ 00061/0238 7 (256,448,3)
794
+ 00061/0256 7 (256,448,3)
795
+ 00061/0303 7 (256,448,3)
796
+ 00061/0312 7 (256,448,3)
797
+ 00061/0313 7 (256,448,3)
798
+ 00061/0325 7 (256,448,3)
799
+ 00061/0367 7 (256,448,3)
800
+ 00061/0369 7 (256,448,3)
801
+ 00061/0387 7 (256,448,3)
802
+ 00061/0396 7 (256,448,3)
803
+ 00061/0486 7 (256,448,3)
804
+ 00061/0895 7 (256,448,3)
805
+ 00061/0897 7 (256,448,3)
806
+ 00062/0846 7 (256,448,3)
807
+ 00063/0156 7 (256,448,3)
808
+ 00063/0184 7 (256,448,3)
809
+ 00063/0191 7 (256,448,3)
810
+ 00063/0334 7 (256,448,3)
811
+ 00063/0350 7 (256,448,3)
812
+ 00063/0499 7 (256,448,3)
813
+ 00063/0878 7 (256,448,3)
814
+ 00064/0004 7 (256,448,3)
815
+ 00064/0264 7 (256,448,3)
816
+ 00064/0735 7 (256,448,3)
817
+ 00064/0738 7 (256,448,3)
818
+ 00065/0105 7 (256,448,3)
819
+ 00065/0169 7 (256,448,3)
820
+ 00065/0305 7 (256,448,3)
821
+ 00065/0324 7 (256,448,3)
822
+ 00065/0353 7 (256,448,3)
823
+ 00065/0520 7 (256,448,3)
824
+ 00065/0533 7 (256,448,3)
825
+ 00065/0545 7 (256,448,3)
826
+ 00065/0551 7 (256,448,3)
827
+ 00065/0568 7 (256,448,3)
828
+ 00065/0603 7 (256,448,3)
829
+ 00065/0884 7 (256,448,3)
830
+ 00065/0988 7 (256,448,3)
831
+ 00066/0002 7 (256,448,3)
832
+ 00066/0011 7 (256,448,3)
833
+ 00066/0031 7 (256,448,3)
834
+ 00066/0037 7 (256,448,3)
835
+ 00066/0136 7 (256,448,3)
836
+ 00066/0137 7 (256,448,3)
837
+ 00066/0150 7 (256,448,3)
838
+ 00066/0166 7 (256,448,3)
839
+ 00066/0178 7 (256,448,3)
840
+ 00066/0357 7 (256,448,3)
841
+ 00066/0428 7 (256,448,3)
842
+ 00066/0483 7 (256,448,3)
843
+ 00066/0600 7 (256,448,3)
844
+ 00066/0863 7 (256,448,3)
845
+ 00066/0873 7 (256,448,3)
846
+ 00066/0875 7 (256,448,3)
847
+ 00066/0899 7 (256,448,3)
848
+ 00067/0020 7 (256,448,3)
849
+ 00067/0025 7 (256,448,3)
850
+ 00067/0132 7 (256,448,3)
851
+ 00067/0492 7 (256,448,3)
852
+ 00067/0726 7 (256,448,3)
853
+ 00067/0734 7 (256,448,3)
854
+ 00067/0744 7 (256,448,3)
855
+ 00067/0754 7 (256,448,3)
856
+ 00067/0779 7 (256,448,3)
857
+ 00068/0078 7 (256,448,3)
858
+ 00068/0083 7 (256,448,3)
859
+ 00068/0113 7 (256,448,3)
860
+ 00068/0117 7 (256,448,3)
861
+ 00068/0121 7 (256,448,3)
862
+ 00068/0206 7 (256,448,3)
863
+ 00068/0261 7 (256,448,3)
864
+ 00068/0321 7 (256,448,3)
865
+ 00068/0354 7 (256,448,3)
866
+ 00068/0380 7 (256,448,3)
867
+ 00068/0419 7 (256,448,3)
868
+ 00068/0547 7 (256,448,3)
869
+ 00068/0561 7 (256,448,3)
870
+ 00068/0565 7 (256,448,3)
871
+ 00068/0583 7 (256,448,3)
872
+ 00068/0599 7 (256,448,3)
873
+ 00068/0739 7 (256,448,3)
874
+ 00068/0743 7 (256,448,3)
875
+ 00068/0754 7 (256,448,3)
876
+ 00068/0812 7 (256,448,3)
877
+ 00069/0178 7 (256,448,3)
878
+ 00070/0025 7 (256,448,3)
879
+ 00070/0030 7 (256,448,3)
880
+ 00070/0036 7 (256,448,3)
881
+ 00070/0042 7 (256,448,3)
882
+ 00070/0078 7 (256,448,3)
883
+ 00070/0079 7 (256,448,3)
884
+ 00070/0362 7 (256,448,3)
885
+ 00071/0195 7 (256,448,3)
886
+ 00071/0210 7 (256,448,3)
887
+ 00071/0211 7 (256,448,3)
888
+ 00071/0221 7 (256,448,3)
889
+ 00071/0352 7 (256,448,3)
890
+ 00071/0354 7 (256,448,3)
891
+ 00071/0366 7 (256,448,3)
892
+ 00071/0454 7 (256,448,3)
893
+ 00071/0464 7 (256,448,3)
894
+ 00071/0487 7 (256,448,3)
895
+ 00071/0502 7 (256,448,3)
896
+ 00071/0561 7 (256,448,3)
897
+ 00071/0676 7 (256,448,3)
898
+ 00071/0808 7 (256,448,3)
899
+ 00071/0813 7 (256,448,3)
900
+ 00071/0836 7 (256,448,3)
901
+ 00072/0286 7 (256,448,3)
902
+ 00072/0290 7 (256,448,3)
903
+ 00072/0298 7 (256,448,3)
904
+ 00072/0302 7 (256,448,3)
905
+ 00072/0333 7 (256,448,3)
906
+ 00072/0590 7 (256,448,3)
907
+ 00072/0793 7 (256,448,3)
908
+ 00072/0803 7 (256,448,3)
909
+ 00072/0833 7 (256,448,3)
910
+ 00073/0049 7 (256,448,3)
911
+ 00073/0050 7 (256,448,3)
912
+ 00073/0388 7 (256,448,3)
913
+ 00073/0480 7 (256,448,3)
914
+ 00073/0485 7 (256,448,3)
915
+ 00073/0611 7 (256,448,3)
916
+ 00073/0616 7 (256,448,3)
917
+ 00073/0714 7 (256,448,3)
918
+ 00073/0724 7 (256,448,3)
919
+ 00073/0730 7 (256,448,3)
920
+ 00074/0034 7 (256,448,3)
921
+ 00074/0228 7 (256,448,3)
922
+ 00074/0239 7 (256,448,3)
923
+ 00074/0275 7 (256,448,3)
924
+ 00074/0527 7 (256,448,3)
925
+ 00074/0620 7 (256,448,3)
926
+ 00074/0764 7 (256,448,3)
927
+ 00074/0849 7 (256,448,3)
928
+ 00074/0893 7 (256,448,3)
929
+ 00075/0333 7 (256,448,3)
930
+ 00075/0339 7 (256,448,3)
931
+ 00075/0347 7 (256,448,3)
932
+ 00075/0399 7 (256,448,3)
933
+ 00075/0478 7 (256,448,3)
934
+ 00075/0494 7 (256,448,3)
935
+ 00075/0678 7 (256,448,3)
936
+ 00075/0688 7 (256,448,3)
937
+ 00075/0706 7 (256,448,3)
938
+ 00075/0709 7 (256,448,3)
939
+ 00075/0748 7 (256,448,3)
940
+ 00075/0769 7 (256,448,3)
941
+ 00075/0777 7 (256,448,3)
942
+ 00075/0781 7 (256,448,3)
943
+ 00076/0151 7 (256,448,3)
944
+ 00076/0159 7 (256,448,3)
945
+ 00076/0164 7 (256,448,3)
946
+ 00076/0265 7 (256,448,3)
947
+ 00076/0269 7 (256,448,3)
948
+ 00076/0433 7 (256,448,3)
949
+ 00076/0813 7 (256,448,3)
950
+ 00076/0817 7 (256,448,3)
951
+ 00076/0818 7 (256,448,3)
952
+ 00076/0827 7 (256,448,3)
953
+ 00076/0874 7 (256,448,3)
954
+ 00076/0880 7 (256,448,3)
955
+ 00076/0891 7 (256,448,3)
956
+ 00076/0894 7 (256,448,3)
957
+ 00076/0909 7 (256,448,3)
958
+ 00076/0913 7 (256,448,3)
959
+ 00076/0926 7 (256,448,3)
960
+ 00076/0962 7 (256,448,3)
961
+ 00076/0973 7 (256,448,3)
962
+ 00076/0986 7 (256,448,3)
963
+ 00077/0617 7 (256,448,3)
964
+ 00077/0623 7 (256,448,3)
965
+ 00077/0628 7 (256,448,3)
966
+ 00077/0629 7 (256,448,3)
967
+ 00077/0631 7 (256,448,3)
968
+ 00077/0639 7 (256,448,3)
969
+ 00077/0982 7 (256,448,3)
970
+ 00077/0984 7 (256,448,3)
971
+ 00077/0995 7 (256,448,3)
972
+ 00077/0998 7 (256,448,3)
973
+ 00078/0001 7 (256,448,3)
974
+ 00078/0015 7 (256,448,3)
975
+ 00078/0157 7 (256,448,3)
976
+ 00078/0161 7 (256,448,3)
977
+ 00078/0175 7 (256,448,3)
978
+ 00078/0178 7 (256,448,3)
979
+ 00078/0189 7 (256,448,3)
980
+ 00078/0192 7 (256,448,3)
981
+ 00078/0229 7 (256,448,3)
982
+ 00078/0237 7 (256,448,3)
983
+ 00078/0241 7 (256,448,3)
984
+ 00078/0249 7 (256,448,3)
985
+ 00078/0251 7 (256,448,3)
986
+ 00078/0254 7 (256,448,3)
987
+ 00078/0258 7 (256,448,3)
988
+ 00078/0311 7 (256,448,3)
989
+ 00078/0603 7 (256,448,3)
990
+ 00078/0607 7 (256,448,3)
991
+ 00078/0824 7 (256,448,3)
992
+ 00079/0045 7 (256,448,3)
993
+ 00079/0048 7 (256,448,3)
994
+ 00079/0054 7 (256,448,3)
995
+ 00080/0050 7 (256,448,3)
996
+ 00080/0488 7 (256,448,3)
997
+ 00080/0494 7 (256,448,3)
998
+ 00080/0496 7 (256,448,3)
999
+ 00080/0499 7 (256,448,3)
1000
+ 00080/0502 7 (256,448,3)
1001
+ 00080/0510 7 (256,448,3)
1002
+ 00080/0534 7 (256,448,3)
1003
+ 00080/0558 7 (256,448,3)
1004
+ 00080/0571 7 (256,448,3)
1005
+ 00080/0709 7 (256,448,3)
1006
+ 00080/0882 7 (256,448,3)
1007
+ 00081/0322 7 (256,448,3)
1008
+ 00081/0428 7 (256,448,3)
1009
+ 00081/0700 7 (256,448,3)
1010
+ 00081/0706 7 (256,448,3)
1011
+ 00081/0707 7 (256,448,3)
1012
+ 00081/0937 7 (256,448,3)
1013
+ 00082/0021 7 (256,448,3)
1014
+ 00082/0424 7 (256,448,3)
1015
+ 00082/0794 7 (256,448,3)
1016
+ 00082/0807 7 (256,448,3)
1017
+ 00082/0810 7 (256,448,3)
1018
+ 00082/0824 7 (256,448,3)
1019
+ 00083/0129 7 (256,448,3)
1020
+ 00083/0131 7 (256,448,3)
1021
+ 00083/0249 7 (256,448,3)
1022
+ 00083/0250 7 (256,448,3)
1023
+ 00083/0656 7 (256,448,3)
1024
+ 00083/0812 7 (256,448,3)
1025
+ 00083/0819 7 (256,448,3)
1026
+ 00083/0824 7 (256,448,3)
1027
+ 00083/0827 7 (256,448,3)
1028
+ 00083/0841 7 (256,448,3)
1029
+ 00083/0963 7 (256,448,3)
1030
+ 00084/0047 7 (256,448,3)
1031
+ 00084/0319 7 (256,448,3)
1032
+ 00084/0334 7 (256,448,3)
1033
+ 00084/0363 7 (256,448,3)
1034
+ 00084/0493 7 (256,448,3)
1035
+ 00084/0655 7 (256,448,3)
1036
+ 00084/0752 7 (256,448,3)
1037
+ 00084/0813 7 (256,448,3)
1038
+ 00084/0886 7 (256,448,3)
1039
+ 00084/0948 7 (256,448,3)
1040
+ 00084/0976 7 (256,448,3)
1041
+ 00085/0512 7 (256,448,3)
1042
+ 00085/0641 7 (256,448,3)
1043
+ 00085/0653 7 (256,448,3)
1044
+ 00085/0655 7 (256,448,3)
1045
+ 00085/0697 7 (256,448,3)
1046
+ 00085/0698 7 (256,448,3)
1047
+ 00085/0700 7 (256,448,3)
1048
+ 00085/0703 7 (256,448,3)
1049
+ 00085/0705 7 (256,448,3)
1050
+ 00085/0709 7 (256,448,3)
1051
+ 00085/0713 7 (256,448,3)
1052
+ 00085/0739 7 (256,448,3)
1053
+ 00085/0750 7 (256,448,3)
1054
+ 00085/0763 7 (256,448,3)
1055
+ 00085/0765 7 (256,448,3)
1056
+ 00085/0769 7 (256,448,3)
1057
+ 00085/0863 7 (256,448,3)
1058
+ 00085/0868 7 (256,448,3)
1059
+ 00085/0927 7 (256,448,3)
1060
+ 00085/0936 7 (256,448,3)
1061
+ 00085/0965 7 (256,448,3)
1062
+ 00085/0969 7 (256,448,3)
1063
+ 00085/0974 7 (256,448,3)
1064
+ 00085/0981 7 (256,448,3)
1065
+ 00085/0982 7 (256,448,3)
1066
+ 00085/1000 7 (256,448,3)
1067
+ 00086/0003 7 (256,448,3)
1068
+ 00086/0009 7 (256,448,3)
1069
+ 00086/0011 7 (256,448,3)
1070
+ 00086/0028 7 (256,448,3)
1071
+ 00086/0032 7 (256,448,3)
1072
+ 00086/0034 7 (256,448,3)
1073
+ 00086/0035 7 (256,448,3)
1074
+ 00086/0042 7 (256,448,3)
1075
+ 00086/0064 7 (256,448,3)
1076
+ 00086/0066 7 (256,448,3)
1077
+ 00086/0095 7 (256,448,3)
1078
+ 00086/0099 7 (256,448,3)
1079
+ 00086/0101 7 (256,448,3)
1080
+ 00086/0104 7 (256,448,3)
1081
+ 00086/0115 7 (256,448,3)
1082
+ 00086/0116 7 (256,448,3)
1083
+ 00086/0284 7 (256,448,3)
1084
+ 00086/0291 7 (256,448,3)
1085
+ 00086/0295 7 (256,448,3)
1086
+ 00086/0302 7 (256,448,3)
1087
+ 00086/0318 7 (256,448,3)
1088
+ 00086/0666 7 (256,448,3)
1089
+ 00086/0797 7 (256,448,3)
1090
+ 00086/0851 7 (256,448,3)
1091
+ 00086/0855 7 (256,448,3)
1092
+ 00086/0874 7 (256,448,3)
1093
+ 00086/0878 7 (256,448,3)
1094
+ 00086/0881 7 (256,448,3)
1095
+ 00086/0883 7 (256,448,3)
1096
+ 00086/0896 7 (256,448,3)
1097
+ 00086/0899 7 (256,448,3)
1098
+ 00086/0903 7 (256,448,3)
1099
+ 00086/0989 7 (256,448,3)
1100
+ 00087/0008 7 (256,448,3)
1101
+ 00087/0429 7 (256,448,3)
1102
+ 00087/0511 7 (256,448,3)
1103
+ 00088/0241 7 (256,448,3)
1104
+ 00088/0319 7 (256,448,3)
1105
+ 00088/0323 7 (256,448,3)
1106
+ 00088/0411 7 (256,448,3)
1107
+ 00088/0427 7 (256,448,3)
1108
+ 00088/0452 7 (256,448,3)
1109
+ 00088/0463 7 (256,448,3)
1110
+ 00088/0476 7 (256,448,3)
1111
+ 00088/0496 7 (256,448,3)
1112
+ 00088/0559 7 (256,448,3)
1113
+ 00089/0058 7 (256,448,3)
1114
+ 00089/0061 7 (256,448,3)
1115
+ 00089/0069 7 (256,448,3)
1116
+ 00089/0077 7 (256,448,3)
1117
+ 00089/0096 7 (256,448,3)
1118
+ 00089/0099 7 (256,448,3)
1119
+ 00089/0100 7 (256,448,3)
1120
+ 00089/0211 7 (256,448,3)
1121
+ 00089/0380 7 (256,448,3)
1122
+ 00089/0381 7 (256,448,3)
1123
+ 00089/0384 7 (256,448,3)
1124
+ 00089/0390 7 (256,448,3)
1125
+ 00089/0393 7 (256,448,3)
1126
+ 00089/0394 7 (256,448,3)
1127
+ 00089/0395 7 (256,448,3)
1128
+ 00089/0406 7 (256,448,3)
1129
+ 00089/0410 7 (256,448,3)
1130
+ 00089/0412 7 (256,448,3)
1131
+ 00089/0703 7 (256,448,3)
1132
+ 00089/0729 7 (256,448,3)
1133
+ 00089/0930 7 (256,448,3)
1134
+ 00089/0952 7 (256,448,3)
1135
+ 00090/0062 7 (256,448,3)
1136
+ 00090/0101 7 (256,448,3)
1137
+ 00090/0213 7 (256,448,3)
1138
+ 00090/0216 7 (256,448,3)
1139
+ 00090/0268 7 (256,448,3)
1140
+ 00090/0406 7 (256,448,3)
1141
+ 00090/0411 7 (256,448,3)
1142
+ 00090/0442 7 (256,448,3)
1143
+ 00090/0535 7 (256,448,3)
1144
+ 00090/0542 7 (256,448,3)
1145
+ 00090/0571 7 (256,448,3)
1146
+ 00090/0934 7 (256,448,3)
1147
+ 00090/0938 7 (256,448,3)
1148
+ 00090/0947 7 (256,448,3)
1149
+ 00091/0066 7 (256,448,3)
1150
+ 00091/0448 7 (256,448,3)
1151
+ 00091/0451 7 (256,448,3)
1152
+ 00091/0454 7 (256,448,3)
1153
+ 00091/0457 7 (256,448,3)
1154
+ 00091/0467 7 (256,448,3)
1155
+ 00091/0470 7 (256,448,3)
1156
+ 00091/0477 7 (256,448,3)
1157
+ 00091/0583 7 (256,448,3)
1158
+ 00091/0981 7 (256,448,3)
1159
+ 00091/0994 7 (256,448,3)
1160
+ 00092/0112 7 (256,448,3)
1161
+ 00092/0119 7 (256,448,3)
1162
+ 00092/0129 7 (256,448,3)
1163
+ 00092/0146 7 (256,448,3)
1164
+ 00092/0149 7 (256,448,3)
1165
+ 00092/0608 7 (256,448,3)
1166
+ 00092/0643 7 (256,448,3)
1167
+ 00092/0646 7 (256,448,3)
1168
+ 00092/0766 7 (256,448,3)
1169
+ 00092/0768 7 (256,448,3)
1170
+ 00092/0779 7 (256,448,3)
1171
+ 00093/0081 7 (256,448,3)
1172
+ 00093/0085 7 (256,448,3)
1173
+ 00093/0135 7 (256,448,3)
1174
+ 00093/0241 7 (256,448,3)
1175
+ 00093/0277 7 (256,448,3)
1176
+ 00093/0283 7 (256,448,3)
1177
+ 00093/0320 7 (256,448,3)
1178
+ 00093/0598 7 (256,448,3)
1179
+ 00094/0159 7 (256,448,3)
1180
+ 00094/0253 7 (256,448,3)
1181
+ 00094/0265 7 (256,448,3)
1182
+ 00094/0267 7 (256,448,3)
1183
+ 00094/0269 7 (256,448,3)
1184
+ 00094/0281 7 (256,448,3)
1185
+ 00094/0293 7 (256,448,3)
1186
+ 00094/0404 7 (256,448,3)
1187
+ 00094/0593 7 (256,448,3)
1188
+ 00094/0612 7 (256,448,3)
1189
+ 00094/0638 7 (256,448,3)
1190
+ 00094/0656 7 (256,448,3)
1191
+ 00094/0668 7 (256,448,3)
1192
+ 00094/0786 7 (256,448,3)
1193
+ 00094/0870 7 (256,448,3)
1194
+ 00094/0897 7 (256,448,3)
1195
+ 00094/0900 7 (256,448,3)
1196
+ 00094/0944 7 (256,448,3)
1197
+ 00094/0946 7 (256,448,3)
1198
+ 00094/0952 7 (256,448,3)
1199
+ 00094/0969 7 (256,448,3)
1200
+ 00094/0973 7 (256,448,3)
1201
+ 00094/0981 7 (256,448,3)
1202
+ 00095/0088 7 (256,448,3)
1203
+ 00095/0125 7 (256,448,3)
1204
+ 00095/0130 7 (256,448,3)
1205
+ 00095/0142 7 (256,448,3)
1206
+ 00095/0151 7 (256,448,3)
1207
+ 00095/0180 7 (256,448,3)
1208
+ 00095/0192 7 (256,448,3)
1209
+ 00095/0194 7 (256,448,3)
1210
+ 00095/0195 7 (256,448,3)
1211
+ 00095/0204 7 (256,448,3)
1212
+ 00095/0245 7 (256,448,3)
1213
+ 00095/0315 7 (256,448,3)
1214
+ 00095/0321 7 (256,448,3)
1215
+ 00095/0324 7 (256,448,3)
1216
+ 00095/0327 7 (256,448,3)
1217
+ 00095/0730 7 (256,448,3)
1218
+ 00095/0731 7 (256,448,3)
1219
+ 00095/0741 7 (256,448,3)
1220
+ 00095/0948 7 (256,448,3)
1221
+ 00096/0407 7 (256,448,3)
1222
+ 00096/0420 7 (256,448,3)
1223
+ 00096/0435 7 (256,448,3)
1224
+ 00096/0682 7 (256,448,3)
1225
+ 00096/0865 7 (256,448,3)
basicsr/data/meta_info/meta_info_Vimeo90K_test_medium_GT.txt ADDED
The diff for this file is too large to render. See raw diff
 
basicsr/data/meta_info/meta_info_Vimeo90K_test_slow_GT.txt ADDED
@@ -0,0 +1,1613 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 00001/0266 7 (256,448,3)
2
+ 00001/0268 7 (256,448,3)
3
+ 00001/0275 7 (256,448,3)
4
+ 00001/0278 7 (256,448,3)
5
+ 00001/0287 7 (256,448,3)
6
+ 00001/0291 7 (256,448,3)
7
+ 00001/0627 7 (256,448,3)
8
+ 00001/0636 7 (256,448,3)
9
+ 00001/0804 7 (256,448,3)
10
+ 00001/0837 7 (256,448,3)
11
+ 00001/0849 7 (256,448,3)
12
+ 00001/0851 7 (256,448,3)
13
+ 00001/0852 7 (256,448,3)
14
+ 00001/0986 7 (256,448,3)
15
+ 00001/0991 7 (256,448,3)
16
+ 00002/0007 7 (256,448,3)
17
+ 00002/0008 7 (256,448,3)
18
+ 00002/0016 7 (256,448,3)
19
+ 00002/0036 7 (256,448,3)
20
+ 00002/0091 7 (256,448,3)
21
+ 00002/0093 7 (256,448,3)
22
+ 00002/0209 7 (256,448,3)
23
+ 00002/0235 7 (256,448,3)
24
+ 00002/0236 7 (256,448,3)
25
+ 00002/0241 7 (256,448,3)
26
+ 00002/0466 7 (256,448,3)
27
+ 00002/0504 7 (256,448,3)
28
+ 00002/0960 7 (256,448,3)
29
+ 00002/0961 7 (256,448,3)
30
+ 00002/0964 7 (256,448,3)
31
+ 00003/0007 7 (256,448,3)
32
+ 00003/0069 7 (256,448,3)
33
+ 00003/0345 7 (256,448,3)
34
+ 00003/0347 7 (256,448,3)
35
+ 00003/0372 7 (256,448,3)
36
+ 00003/0525 7 (256,448,3)
37
+ 00003/0652 7 (256,448,3)
38
+ 00003/0667 7 (256,448,3)
39
+ 00003/0669 7 (256,448,3)
40
+ 00003/0706 7 (256,448,3)
41
+ 00003/0713 7 (256,448,3)
42
+ 00003/0721 7 (256,448,3)
43
+ 00003/0747 7 (256,448,3)
44
+ 00003/0829 7 (256,448,3)
45
+ 00003/0916 7 (256,448,3)
46
+ 00003/0918 7 (256,448,3)
47
+ 00003/0924 7 (256,448,3)
48
+ 00003/0926 7 (256,448,3)
49
+ 00003/0927 7 (256,448,3)
50
+ 00004/0288 7 (256,448,3)
51
+ 00004/0303 7 (256,448,3)
52
+ 00004/0307 7 (256,448,3)
53
+ 00004/0628 7 (256,448,3)
54
+ 00004/0713 7 (256,448,3)
55
+ 00004/0715 7 (256,448,3)
56
+ 00004/0719 7 (256,448,3)
57
+ 00004/0727 7 (256,448,3)
58
+ 00004/0821 7 (256,448,3)
59
+ 00005/0006 7 (256,448,3)
60
+ 00005/0007 7 (256,448,3)
61
+ 00005/0012 7 (256,448,3)
62
+ 00005/0013 7 (256,448,3)
63
+ 00005/0040 7 (256,448,3)
64
+ 00005/0055 7 (256,448,3)
65
+ 00005/0119 7 (256,448,3)
66
+ 00005/0130 7 (256,448,3)
67
+ 00005/0185 7 (256,448,3)
68
+ 00005/0198 7 (256,448,3)
69
+ 00005/0270 7 (256,448,3)
70
+ 00005/0541 7 (256,448,3)
71
+ 00005/0560 7 (256,448,3)
72
+ 00005/0660 7 (256,448,3)
73
+ 00005/0682 7 (256,448,3)
74
+ 00005/0683 7 (256,448,3)
75
+ 00005/0688 7 (256,448,3)
76
+ 00005/0706 7 (256,448,3)
77
+ 00005/0728 7 (256,448,3)
78
+ 00005/0732 7 (256,448,3)
79
+ 00005/0739 7 (256,448,3)
80
+ 00005/0804 7 (256,448,3)
81
+ 00005/0805 7 (256,448,3)
82
+ 00005/0827 7 (256,448,3)
83
+ 00005/0828 7 (256,448,3)
84
+ 00005/0857 7 (256,448,3)
85
+ 00005/0861 7 (256,448,3)
86
+ 00005/0862 7 (256,448,3)
87
+ 00005/0868 7 (256,448,3)
88
+ 00005/0872 7 (256,448,3)
89
+ 00005/0933 7 (256,448,3)
90
+ 00005/0958 7 (256,448,3)
91
+ 00005/0960 7 (256,448,3)
92
+ 00006/0087 7 (256,448,3)
93
+ 00006/0090 7 (256,448,3)
94
+ 00006/0351 7 (256,448,3)
95
+ 00006/0353 7 (256,448,3)
96
+ 00006/0558 7 (256,448,3)
97
+ 00006/0588 7 (256,448,3)
98
+ 00006/0619 7 (256,448,3)
99
+ 00006/0621 7 (256,448,3)
100
+ 00006/0748 7 (256,448,3)
101
+ 00006/0796 7 (256,448,3)
102
+ 00006/0805 7 (256,448,3)
103
+ 00006/0807 7 (256,448,3)
104
+ 00007/0236 7 (256,448,3)
105
+ 00007/0240 7 (256,448,3)
106
+ 00007/0243 7 (256,448,3)
107
+ 00007/0246 7 (256,448,3)
108
+ 00007/0247 7 (256,448,3)
109
+ 00007/0252 7 (256,448,3)
110
+ 00007/0322 7 (256,448,3)
111
+ 00007/0458 7 (256,448,3)
112
+ 00007/0492 7 (256,448,3)
113
+ 00007/0658 7 (256,448,3)
114
+ 00007/0717 7 (256,448,3)
115
+ 00007/0722 7 (256,448,3)
116
+ 00007/0725 7 (256,448,3)
117
+ 00007/0740 7 (256,448,3)
118
+ 00007/0748 7 (256,448,3)
119
+ 00007/0749 7 (256,448,3)
120
+ 00007/0759 7 (256,448,3)
121
+ 00007/0772 7 (256,448,3)
122
+ 00007/0783 7 (256,448,3)
123
+ 00007/0787 7 (256,448,3)
124
+ 00007/0883 7 (256,448,3)
125
+ 00008/0033 7 (256,448,3)
126
+ 00008/0035 7 (256,448,3)
127
+ 00008/0091 7 (256,448,3)
128
+ 00008/0154 7 (256,448,3)
129
+ 00008/0966 7 (256,448,3)
130
+ 00008/0987 7 (256,448,3)
131
+ 00009/0108 7 (256,448,3)
132
+ 00009/0607 7 (256,448,3)
133
+ 00009/0668 7 (256,448,3)
134
+ 00009/0683 7 (256,448,3)
135
+ 00009/0941 7 (256,448,3)
136
+ 00009/0949 7 (256,448,3)
137
+ 00009/0962 7 (256,448,3)
138
+ 00009/0972 7 (256,448,3)
139
+ 00009/0974 7 (256,448,3)
140
+ 00010/0014 7 (256,448,3)
141
+ 00010/0018 7 (256,448,3)
142
+ 00010/0043 7 (256,448,3)
143
+ 00010/0099 7 (256,448,3)
144
+ 00010/0252 7 (256,448,3)
145
+ 00010/0296 7 (256,448,3)
146
+ 00010/0413 7 (256,448,3)
147
+ 00010/0422 7 (256,448,3)
148
+ 00010/0516 7 (256,448,3)
149
+ 00010/0525 7 (256,448,3)
150
+ 00010/0556 7 (256,448,3)
151
+ 00010/0701 7 (256,448,3)
152
+ 00010/0740 7 (256,448,3)
153
+ 00010/0772 7 (256,448,3)
154
+ 00010/0831 7 (256,448,3)
155
+ 00010/0925 7 (256,448,3)
156
+ 00011/0013 7 (256,448,3)
157
+ 00011/0016 7 (256,448,3)
158
+ 00011/0017 7 (256,448,3)
159
+ 00011/0249 7 (256,448,3)
160
+ 00011/0826 7 (256,448,3)
161
+ 00011/0827 7 (256,448,3)
162
+ 00011/0831 7 (256,448,3)
163
+ 00011/0833 7 (256,448,3)
164
+ 00011/0835 7 (256,448,3)
165
+ 00011/0998 7 (256,448,3)
166
+ 00012/0023 7 (256,448,3)
167
+ 00012/0024 7 (256,448,3)
168
+ 00012/0027 7 (256,448,3)
169
+ 00012/0037 7 (256,448,3)
170
+ 00012/0444 7 (256,448,3)
171
+ 00012/0445 7 (256,448,3)
172
+ 00012/0451 7 (256,448,3)
173
+ 00012/0461 7 (256,448,3)
174
+ 00012/0521 7 (256,448,3)
175
+ 00012/0758 7 (256,448,3)
176
+ 00012/0760 7 (256,448,3)
177
+ 00012/0771 7 (256,448,3)
178
+ 00012/0903 7 (256,448,3)
179
+ 00012/0909 7 (256,448,3)
180
+ 00013/0581 7 (256,448,3)
181
+ 00013/0786 7 (256,448,3)
182
+ 00013/0789 7 (256,448,3)
183
+ 00013/0791 7 (256,448,3)
184
+ 00013/0798 7 (256,448,3)
185
+ 00013/0802 7 (256,448,3)
186
+ 00013/0820 7 (256,448,3)
187
+ 00013/0850 7 (256,448,3)
188
+ 00013/0854 7 (256,448,3)
189
+ 00013/0894 7 (256,448,3)
190
+ 00013/0919 7 (256,448,3)
191
+ 00013/0999 7 (256,448,3)
192
+ 00014/0001 7 (256,448,3)
193
+ 00014/0014 7 (256,448,3)
194
+ 00014/0018 7 (256,448,3)
195
+ 00014/0244 7 (256,448,3)
196
+ 00014/0475 7 (256,448,3)
197
+ 00014/0483 7 (256,448,3)
198
+ 00014/0680 7 (256,448,3)
199
+ 00014/0700 7 (256,448,3)
200
+ 00014/0701 7 (256,448,3)
201
+ 00014/0706 7 (256,448,3)
202
+ 00014/0712 7 (256,448,3)
203
+ 00014/0713 7 (256,448,3)
204
+ 00014/0717 7 (256,448,3)
205
+ 00014/0719 7 (256,448,3)
206
+ 00014/0728 7 (256,448,3)
207
+ 00014/0734 7 (256,448,3)
208
+ 00014/0736 7 (256,448,3)
209
+ 00014/0738 7 (256,448,3)
210
+ 00014/0742 7 (256,448,3)
211
+ 00014/0745 7 (256,448,3)
212
+ 00014/0746 7 (256,448,3)
213
+ 00014/0750 7 (256,448,3)
214
+ 00014/0769 7 (256,448,3)
215
+ 00014/0774 7 (256,448,3)
216
+ 00014/0781 7 (256,448,3)
217
+ 00014/0782 7 (256,448,3)
218
+ 00014/0852 7 (256,448,3)
219
+ 00014/0853 7 (256,448,3)
220
+ 00014/0855 7 (256,448,3)
221
+ 00014/0867 7 (256,448,3)
222
+ 00014/0876 7 (256,448,3)
223
+ 00014/0881 7 (256,448,3)
224
+ 00014/0890 7 (256,448,3)
225
+ 00014/0914 7 (256,448,3)
226
+ 00015/0033 7 (256,448,3)
227
+ 00015/0113 7 (256,448,3)
228
+ 00015/0125 7 (256,448,3)
229
+ 00015/0185 7 (256,448,3)
230
+ 00015/0194 7 (256,448,3)
231
+ 00015/0202 7 (256,448,3)
232
+ 00015/0312 7 (256,448,3)
233
+ 00015/0688 7 (256,448,3)
234
+ 00015/0698 7 (256,448,3)
235
+ 00015/0788 7 (256,448,3)
236
+ 00015/0854 7 (256,448,3)
237
+ 00015/0863 7 (256,448,3)
238
+ 00015/0864 7 (256,448,3)
239
+ 00015/0918 7 (256,448,3)
240
+ 00015/0931 7 (256,448,3)
241
+ 00016/0276 7 (256,448,3)
242
+ 00016/0301 7 (256,448,3)
243
+ 00016/0306 7 (256,448,3)
244
+ 00016/0324 7 (256,448,3)
245
+ 00016/0362 7 (256,448,3)
246
+ 00016/0364 7 (256,448,3)
247
+ 00016/0370 7 (256,448,3)
248
+ 00016/0378 7 (256,448,3)
249
+ 00016/0379 7 (256,448,3)
250
+ 00016/0402 7 (256,448,3)
251
+ 00016/0405 7 (256,448,3)
252
+ 00016/0418 7 (256,448,3)
253
+ 00016/0419 7 (256,448,3)
254
+ 00016/0435 7 (256,448,3)
255
+ 00016/0501 7 (256,448,3)
256
+ 00016/0561 7 (256,448,3)
257
+ 00016/0562 7 (256,448,3)
258
+ 00016/0569 7 (256,448,3)
259
+ 00016/0591 7 (256,448,3)
260
+ 00016/0599 7 (256,448,3)
261
+ 00016/0711 7 (256,448,3)
262
+ 00016/0713 7 (256,448,3)
263
+ 00016/0813 7 (256,448,3)
264
+ 00016/0953 7 (256,448,3)
265
+ 00016/0960 7 (256,448,3)
266
+ 00016/0961 7 (256,448,3)
267
+ 00017/0519 7 (256,448,3)
268
+ 00017/0523 7 (256,448,3)
269
+ 00017/0588 7 (256,448,3)
270
+ 00017/0608 7 (256,448,3)
271
+ 00017/0609 7 (256,448,3)
272
+ 00017/0719 7 (256,448,3)
273
+ 00017/0721 7 (256,448,3)
274
+ 00017/0727 7 (256,448,3)
275
+ 00017/0728 7 (256,448,3)
276
+ 00017/0769 7 (256,448,3)
277
+ 00017/0775 7 (256,448,3)
278
+ 00017/0787 7 (256,448,3)
279
+ 00017/0797 7 (256,448,3)
280
+ 00018/0043 7 (256,448,3)
281
+ 00018/0206 7 (256,448,3)
282
+ 00018/0209 7 (256,448,3)
283
+ 00018/0211 7 (256,448,3)
284
+ 00018/0216 7 (256,448,3)
285
+ 00018/0220 7 (256,448,3)
286
+ 00018/0221 7 (256,448,3)
287
+ 00018/0252 7 (256,448,3)
288
+ 00018/0260 7 (256,448,3)
289
+ 00018/0331 7 (256,448,3)
290
+ 00018/0333 7 (256,448,3)
291
+ 00018/0447 7 (256,448,3)
292
+ 00018/0523 7 (256,448,3)
293
+ 00019/0014 7 (256,448,3)
294
+ 00019/0015 7 (256,448,3)
295
+ 00019/0019 7 (256,448,3)
296
+ 00019/0049 7 (256,448,3)
297
+ 00019/0109 7 (256,448,3)
298
+ 00019/0114 7 (256,448,3)
299
+ 00019/0125 7 (256,448,3)
300
+ 00019/0137 7 (256,448,3)
301
+ 00019/0140 7 (256,448,3)
302
+ 00019/0148 7 (256,448,3)
303
+ 00019/0153 7 (256,448,3)
304
+ 00019/0155 7 (256,448,3)
305
+ 00019/0158 7 (256,448,3)
306
+ 00019/0159 7 (256,448,3)
307
+ 00019/0160 7 (256,448,3)
308
+ 00019/0162 7 (256,448,3)
309
+ 00019/0279 7 (256,448,3)
310
+ 00019/0282 7 (256,448,3)
311
+ 00019/0409 7 (256,448,3)
312
+ 00019/0427 7 (256,448,3)
313
+ 00019/0430 7 (256,448,3)
314
+ 00019/0545 7 (256,448,3)
315
+ 00019/0555 7 (256,448,3)
316
+ 00019/0558 7 (256,448,3)
317
+ 00019/0650 7 (256,448,3)
318
+ 00019/0681 7 (256,448,3)
319
+ 00019/0747 7 (256,448,3)
320
+ 00019/0748 7 (256,448,3)
321
+ 00019/0749 7 (256,448,3)
322
+ 00019/0752 7 (256,448,3)
323
+ 00019/0768 7 (256,448,3)
324
+ 00019/0772 7 (256,448,3)
325
+ 00019/0773 7 (256,448,3)
326
+ 00019/0777 7 (256,448,3)
327
+ 00019/0795 7 (256,448,3)
328
+ 00019/0806 7 (256,448,3)
329
+ 00019/0815 7 (256,448,3)
330
+ 00019/0840 7 (256,448,3)
331
+ 00019/0844 7 (256,448,3)
332
+ 00019/0848 7 (256,448,3)
333
+ 00019/0853 7 (256,448,3)
334
+ 00019/0863 7 (256,448,3)
335
+ 00019/0888 7 (256,448,3)
336
+ 00019/0894 7 (256,448,3)
337
+ 00019/0901 7 (256,448,3)
338
+ 00019/0995 7 (256,448,3)
339
+ 00021/0030 7 (256,448,3)
340
+ 00021/0035 7 (256,448,3)
341
+ 00021/0039 7 (256,448,3)
342
+ 00021/0041 7 (256,448,3)
343
+ 00021/0044 7 (256,448,3)
344
+ 00021/0045 7 (256,448,3)
345
+ 00021/0264 7 (256,448,3)
346
+ 00021/0330 7 (256,448,3)
347
+ 00021/0332 7 (256,448,3)
348
+ 00021/0333 7 (256,448,3)
349
+ 00021/0336 7 (256,448,3)
350
+ 00021/0337 7 (256,448,3)
351
+ 00021/0338 7 (256,448,3)
352
+ 00021/0343 7 (256,448,3)
353
+ 00021/0472 7 (256,448,3)
354
+ 00021/0667 7 (256,448,3)
355
+ 00021/0731 7 (256,448,3)
356
+ 00021/0779 7 (256,448,3)
357
+ 00021/0805 7 (256,448,3)
358
+ 00021/0814 7 (256,448,3)
359
+ 00021/0818 7 (256,448,3)
360
+ 00021/0874 7 (256,448,3)
361
+ 00022/0008 7 (256,448,3)
362
+ 00022/0010 7 (256,448,3)
363
+ 00022/0231 7 (256,448,3)
364
+ 00022/0323 7 (256,448,3)
365
+ 00022/0337 7 (256,448,3)
366
+ 00022/0359 7 (256,448,3)
367
+ 00022/0377 7 (256,448,3)
368
+ 00022/0378 7 (256,448,3)
369
+ 00022/0385 7 (256,448,3)
370
+ 00022/0393 7 (256,448,3)
371
+ 00022/0424 7 (256,448,3)
372
+ 00022/0582 7 (256,448,3)
373
+ 00022/0583 7 (256,448,3)
374
+ 00022/0605 7 (256,448,3)
375
+ 00022/0632 7 (256,448,3)
376
+ 00022/0633 7 (256,448,3)
377
+ 00022/0666 7 (256,448,3)
378
+ 00022/0671 7 (256,448,3)
379
+ 00022/0673 7 (256,448,3)
380
+ 00022/0702 7 (256,448,3)
381
+ 00022/0852 7 (256,448,3)
382
+ 00022/0853 7 (256,448,3)
383
+ 00022/0971 7 (256,448,3)
384
+ 00023/0037 7 (256,448,3)
385
+ 00023/0224 7 (256,448,3)
386
+ 00023/0308 7 (256,448,3)
387
+ 00023/0393 7 (256,448,3)
388
+ 00023/0633 7 (256,448,3)
389
+ 00023/0637 7 (256,448,3)
390
+ 00023/0638 7 (256,448,3)
391
+ 00023/0770 7 (256,448,3)
392
+ 00023/0786 7 (256,448,3)
393
+ 00023/0898 7 (256,448,3)
394
+ 00024/0247 7 (256,448,3)
395
+ 00024/0251 7 (256,448,3)
396
+ 00024/0267 7 (256,448,3)
397
+ 00024/0288 7 (256,448,3)
398
+ 00024/0530 7 (256,448,3)
399
+ 00024/0569 7 (256,448,3)
400
+ 00024/0587 7 (256,448,3)
401
+ 00024/0730 7 (256,448,3)
402
+ 00024/0736 7 (256,448,3)
403
+ 00024/0742 7 (256,448,3)
404
+ 00024/0832 7 (256,448,3)
405
+ 00024/0936 7 (256,448,3)
406
+ 00025/0044 7 (256,448,3)
407
+ 00025/0047 7 (256,448,3)
408
+ 00025/0540 7 (256,448,3)
409
+ 00025/0552 7 (256,448,3)
410
+ 00025/0554 7 (256,448,3)
411
+ 00025/0559 7 (256,448,3)
412
+ 00025/0572 7 (256,448,3)
413
+ 00025/0576 7 (256,448,3)
414
+ 00025/0699 7 (256,448,3)
415
+ 00025/0709 7 (256,448,3)
416
+ 00025/0743 7 (256,448,3)
417
+ 00025/0767 7 (256,448,3)
418
+ 00025/0780 7 (256,448,3)
419
+ 00025/0782 7 (256,448,3)
420
+ 00025/0784 7 (256,448,3)
421
+ 00025/0791 7 (256,448,3)
422
+ 00025/0889 7 (256,448,3)
423
+ 00025/0890 7 (256,448,3)
424
+ 00025/0894 7 (256,448,3)
425
+ 00025/0896 7 (256,448,3)
426
+ 00025/0898 7 (256,448,3)
427
+ 00025/0905 7 (256,448,3)
428
+ 00025/0999 7 (256,448,3)
429
+ 00026/0003 7 (256,448,3)
430
+ 00026/0005 7 (256,448,3)
431
+ 00026/0011 7 (256,448,3)
432
+ 00026/0017 7 (256,448,3)
433
+ 00026/0036 7 (256,448,3)
434
+ 00026/0129 7 (256,448,3)
435
+ 00026/0131 7 (256,448,3)
436
+ 00026/0161 7 (256,448,3)
437
+ 00026/0177 7 (256,448,3)
438
+ 00026/0178 7 (256,448,3)
439
+ 00026/0180 7 (256,448,3)
440
+ 00026/0298 7 (256,448,3)
441
+ 00026/0307 7 (256,448,3)
442
+ 00026/0308 7 (256,448,3)
443
+ 00026/0312 7 (256,448,3)
444
+ 00026/0352 7 (256,448,3)
445
+ 00026/0440 7 (256,448,3)
446
+ 00026/0706 7 (256,448,3)
447
+ 00026/0708 7 (256,448,3)
448
+ 00026/0715 7 (256,448,3)
449
+ 00026/0769 7 (256,448,3)
450
+ 00026/0777 7 (256,448,3)
451
+ 00026/0779 7 (256,448,3)
452
+ 00026/0789 7 (256,448,3)
453
+ 00026/0924 7 (256,448,3)
454
+ 00026/0928 7 (256,448,3)
455
+ 00026/0932 7 (256,448,3)
456
+ 00026/0935 7 (256,448,3)
457
+ 00027/0118 7 (256,448,3)
458
+ 00027/0121 7 (256,448,3)
459
+ 00027/0155 7 (256,448,3)
460
+ 00027/0168 7 (256,448,3)
461
+ 00027/0196 7 (256,448,3)
462
+ 00027/0289 7 (256,448,3)
463
+ 00027/0294 7 (256,448,3)
464
+ 00027/0803 7 (256,448,3)
465
+ 00028/0016 7 (256,448,3)
466
+ 00028/0045 7 (256,448,3)
467
+ 00028/0063 7 (256,448,3)
468
+ 00028/0601 7 (256,448,3)
469
+ 00028/0638 7 (256,448,3)
470
+ 00028/0733 7 (256,448,3)
471
+ 00028/0736 7 (256,448,3)
472
+ 00028/0741 7 (256,448,3)
473
+ 00028/0753 7 (256,448,3)
474
+ 00028/0770 7 (256,448,3)
475
+ 00028/0771 7 (256,448,3)
476
+ 00028/0777 7 (256,448,3)
477
+ 00028/0950 7 (256,448,3)
478
+ 00028/0951 7 (256,448,3)
479
+ 00029/0048 7 (256,448,3)
480
+ 00029/0060 7 (256,448,3)
481
+ 00029/0362 7 (256,448,3)
482
+ 00029/0399 7 (256,448,3)
483
+ 00029/0404 7 (256,448,3)
484
+ 00029/0412 7 (256,448,3)
485
+ 00029/0416 7 (256,448,3)
486
+ 00029/0418 7 (256,448,3)
487
+ 00029/0428 7 (256,448,3)
488
+ 00030/0131 7 (256,448,3)
489
+ 00030/0135 7 (256,448,3)
490
+ 00030/0150 7 (256,448,3)
491
+ 00030/0245 7 (256,448,3)
492
+ 00030/0339 7 (256,448,3)
493
+ 00030/0472 7 (256,448,3)
494
+ 00030/0482 7 (256,448,3)
495
+ 00030/0500 7 (256,448,3)
496
+ 00030/0501 7 (256,448,3)
497
+ 00030/0697 7 (256,448,3)
498
+ 00030/0707 7 (256,448,3)
499
+ 00030/0733 7 (256,448,3)
500
+ 00030/0743 7 (256,448,3)
501
+ 00030/0747 7 (256,448,3)
502
+ 00030/0754 7 (256,448,3)
503
+ 00030/0755 7 (256,448,3)
504
+ 00030/0759 7 (256,448,3)
505
+ 00030/0762 7 (256,448,3)
506
+ 00030/0764 7 (256,448,3)
507
+ 00030/0767 7 (256,448,3)
508
+ 00030/0794 7 (256,448,3)
509
+ 00030/0796 7 (256,448,3)
510
+ 00030/0799 7 (256,448,3)
511
+ 00030/0814 7 (256,448,3)
512
+ 00030/0823 7 (256,448,3)
513
+ 00030/0829 7 (256,448,3)
514
+ 00030/0833 7 (256,448,3)
515
+ 00030/0848 7 (256,448,3)
516
+ 00030/0853 7 (256,448,3)
517
+ 00030/0861 7 (256,448,3)
518
+ 00031/0182 7 (256,448,3)
519
+ 00031/0275 7 (256,448,3)
520
+ 00031/0279 7 (256,448,3)
521
+ 00031/0555 7 (256,448,3)
522
+ 00031/0648 7 (256,448,3)
523
+ 00031/0663 7 (256,448,3)
524
+ 00031/0680 7 (256,448,3)
525
+ 00031/0880 7 (256,448,3)
526
+ 00031/0922 7 (256,448,3)
527
+ 00031/0925 7 (256,448,3)
528
+ 00031/0928 7 (256,448,3)
529
+ 00032/0025 7 (256,448,3)
530
+ 00032/0377 7 (256,448,3)
531
+ 00032/0378 7 (256,448,3)
532
+ 00032/0382 7 (256,448,3)
533
+ 00032/0384 7 (256,448,3)
534
+ 00032/0386 7 (256,448,3)
535
+ 00032/0389 7 (256,448,3)
536
+ 00032/0391 7 (256,448,3)
537
+ 00032/0393 7 (256,448,3)
538
+ 00032/0492 7 (256,448,3)
539
+ 00032/0497 7 (256,448,3)
540
+ 00032/0505 7 (256,448,3)
541
+ 00032/0523 7 (256,448,3)
542
+ 00032/0542 7 (256,448,3)
543
+ 00032/0544 7 (256,448,3)
544
+ 00032/0712 7 (256,448,3)
545
+ 00032/0847 7 (256,448,3)
546
+ 00032/0850 7 (256,448,3)
547
+ 00032/0875 7 (256,448,3)
548
+ 00033/0062 7 (256,448,3)
549
+ 00033/0063 7 (256,448,3)
550
+ 00033/0098 7 (256,448,3)
551
+ 00033/0101 7 (256,448,3)
552
+ 00033/0105 7 (256,448,3)
553
+ 00033/0114 7 (256,448,3)
554
+ 00033/0432 7 (256,448,3)
555
+ 00033/0441 7 (256,448,3)
556
+ 00033/0606 7 (256,448,3)
557
+ 00033/0611 7 (256,448,3)
558
+ 00033/0634 7 (256,448,3)
559
+ 00033/0787 7 (256,448,3)
560
+ 00033/0792 7 (256,448,3)
561
+ 00033/0802 7 (256,448,3)
562
+ 00033/0825 7 (256,448,3)
563
+ 00033/0835 7 (256,448,3)
564
+ 00034/0249 7 (256,448,3)
565
+ 00034/0253 7 (256,448,3)
566
+ 00034/0254 7 (256,448,3)
567
+ 00034/0282 7 (256,448,3)
568
+ 00034/0318 7 (256,448,3)
569
+ 00034/0319 7 (256,448,3)
570
+ 00034/0323 7 (256,448,3)
571
+ 00034/0336 7 (256,448,3)
572
+ 00034/0348 7 (256,448,3)
573
+ 00034/0356 7 (256,448,3)
574
+ 00034/0379 7 (256,448,3)
575
+ 00034/0387 7 (256,448,3)
576
+ 00034/0575 7 (256,448,3)
577
+ 00034/0608 7 (256,448,3)
578
+ 00034/0663 7 (256,448,3)
579
+ 00034/0811 7 (256,448,3)
580
+ 00034/0812 7 (256,448,3)
581
+ 00034/0946 7 (256,448,3)
582
+ 00034/0948 7 (256,448,3)
583
+ 00034/0950 7 (256,448,3)
584
+ 00035/0204 7 (256,448,3)
585
+ 00035/0243 7 (256,448,3)
586
+ 00035/0308 7 (256,448,3)
587
+ 00035/0465 7 (256,448,3)
588
+ 00035/0478 7 (256,448,3)
589
+ 00035/0523 7 (256,448,3)
590
+ 00035/0540 7 (256,448,3)
591
+ 00035/0544 7 (256,448,3)
592
+ 00035/0556 7 (256,448,3)
593
+ 00035/0568 7 (256,448,3)
594
+ 00035/0570 7 (256,448,3)
595
+ 00035/0609 7 (256,448,3)
596
+ 00035/0643 7 (256,448,3)
597
+ 00035/0644 7 (256,448,3)
598
+ 00035/0645 7 (256,448,3)
599
+ 00035/0646 7 (256,448,3)
600
+ 00035/0650 7 (256,448,3)
601
+ 00035/0661 7 (256,448,3)
602
+ 00035/0724 7 (256,448,3)
603
+ 00035/0725 7 (256,448,3)
604
+ 00035/0850 7 (256,448,3)
605
+ 00035/0863 7 (256,448,3)
606
+ 00035/0870 7 (256,448,3)
607
+ 00035/0951 7 (256,448,3)
608
+ 00036/0038 7 (256,448,3)
609
+ 00036/0062 7 (256,448,3)
610
+ 00036/0423 7 (256,448,3)
611
+ 00036/0737 7 (256,448,3)
612
+ 00036/0750 7 (256,448,3)
613
+ 00036/0751 7 (256,448,3)
614
+ 00036/0754 7 (256,448,3)
615
+ 00036/0929 7 (256,448,3)
616
+ 00037/0085 7 (256,448,3)
617
+ 00037/0113 7 (256,448,3)
618
+ 00037/0130 7 (256,448,3)
619
+ 00037/0153 7 (256,448,3)
620
+ 00037/0169 7 (256,448,3)
621
+ 00037/0263 7 (256,448,3)
622
+ 00037/0272 7 (256,448,3)
623
+ 00037/0273 7 (256,448,3)
624
+ 00037/0275 7 (256,448,3)
625
+ 00037/0280 7 (256,448,3)
626
+ 00037/0399 7 (256,448,3)
627
+ 00037/0456 7 (256,448,3)
628
+ 00037/0853 7 (256,448,3)
629
+ 00037/0855 7 (256,448,3)
630
+ 00037/0856 7 (256,448,3)
631
+ 00037/0857 7 (256,448,3)
632
+ 00037/0925 7 (256,448,3)
633
+ 00037/0947 7 (256,448,3)
634
+ 00038/0148 7 (256,448,3)
635
+ 00038/0533 7 (256,448,3)
636
+ 00038/0534 7 (256,448,3)
637
+ 00038/0560 7 (256,448,3)
638
+ 00038/0562 7 (256,448,3)
639
+ 00038/0566 7 (256,448,3)
640
+ 00038/0578 7 (256,448,3)
641
+ 00038/0652 7 (256,448,3)
642
+ 00038/0674 7 (256,448,3)
643
+ 00038/0685 7 (256,448,3)
644
+ 00038/0686 7 (256,448,3)
645
+ 00038/0692 7 (256,448,3)
646
+ 00038/0736 7 (256,448,3)
647
+ 00039/0035 7 (256,448,3)
648
+ 00039/0105 7 (256,448,3)
649
+ 00039/0109 7 (256,448,3)
650
+ 00039/0121 7 (256,448,3)
651
+ 00039/0128 7 (256,448,3)
652
+ 00039/0129 7 (256,448,3)
653
+ 00039/0132 7 (256,448,3)
654
+ 00039/0137 7 (256,448,3)
655
+ 00039/0157 7 (256,448,3)
656
+ 00039/0496 7 (256,448,3)
657
+ 00039/0502 7 (256,448,3)
658
+ 00039/0526 7 (256,448,3)
659
+ 00039/0529 7 (256,448,3)
660
+ 00039/0682 7 (256,448,3)
661
+ 00039/0690 7 (256,448,3)
662
+ 00039/0693 7 (256,448,3)
663
+ 00039/0703 7 (256,448,3)
664
+ 00039/0725 7 (256,448,3)
665
+ 00039/0734 7 (256,448,3)
666
+ 00040/0518 7 (256,448,3)
667
+ 00040/0728 7 (256,448,3)
668
+ 00040/0774 7 (256,448,3)
669
+ 00040/0812 7 (256,448,3)
670
+ 00040/0818 7 (256,448,3)
671
+ 00040/0827 7 (256,448,3)
672
+ 00040/0914 7 (256,448,3)
673
+ 00040/0917 7 (256,448,3)
674
+ 00040/0918 7 (256,448,3)
675
+ 00040/0924 7 (256,448,3)
676
+ 00040/0925 7 (256,448,3)
677
+ 00041/0004 7 (256,448,3)
678
+ 00041/0006 7 (256,448,3)
679
+ 00041/0013 7 (256,448,3)
680
+ 00041/0059 7 (256,448,3)
681
+ 00041/0110 7 (256,448,3)
682
+ 00041/0291 7 (256,448,3)
683
+ 00041/0366 7 (256,448,3)
684
+ 00041/0388 7 (256,448,3)
685
+ 00041/0434 7 (256,448,3)
686
+ 00041/0436 7 (256,448,3)
687
+ 00041/0450 7 (256,448,3)
688
+ 00041/0457 7 (256,448,3)
689
+ 00041/0460 7 (256,448,3)
690
+ 00041/0468 7 (256,448,3)
691
+ 00041/0471 7 (256,448,3)
692
+ 00041/0474 7 (256,448,3)
693
+ 00041/0809 7 (256,448,3)
694
+ 00041/0844 7 (256,448,3)
695
+ 00041/0858 7 (256,448,3)
696
+ 00041/0874 7 (256,448,3)
697
+ 00041/0876 7 (256,448,3)
698
+ 00042/0020 7 (256,448,3)
699
+ 00042/0205 7 (256,448,3)
700
+ 00042/0206 7 (256,448,3)
701
+ 00042/0432 7 (256,448,3)
702
+ 00042/0563 7 (256,448,3)
703
+ 00042/0569 7 (256,448,3)
704
+ 00042/0575 7 (256,448,3)
705
+ 00042/0576 7 (256,448,3)
706
+ 00042/0888 7 (256,448,3)
707
+ 00042/0892 7 (256,448,3)
708
+ 00042/0943 7 (256,448,3)
709
+ 00042/0944 7 (256,448,3)
710
+ 00043/0126 7 (256,448,3)
711
+ 00043/0130 7 (256,448,3)
712
+ 00043/0136 7 (256,448,3)
713
+ 00043/0233 7 (256,448,3)
714
+ 00043/0235 7 (256,448,3)
715
+ 00043/0237 7 (256,448,3)
716
+ 00043/0277 7 (256,448,3)
717
+ 00043/0301 7 (256,448,3)
718
+ 00043/0302 7 (256,448,3)
719
+ 00043/0303 7 (256,448,3)
720
+ 00043/0308 7 (256,448,3)
721
+ 00043/0309 7 (256,448,3)
722
+ 00043/0314 7 (256,448,3)
723
+ 00043/0713 7 (256,448,3)
724
+ 00043/0715 7 (256,448,3)
725
+ 00043/0923 7 (256,448,3)
726
+ 00044/0095 7 (256,448,3)
727
+ 00044/0255 7 (256,448,3)
728
+ 00044/0864 7 (256,448,3)
729
+ 00044/0892 7 (256,448,3)
730
+ 00044/0898 7 (256,448,3)
731
+ 00044/0993 7 (256,448,3)
732
+ 00044/0995 7 (256,448,3)
733
+ 00044/0997 7 (256,448,3)
734
+ 00045/0001 7 (256,448,3)
735
+ 00045/0006 7 (256,448,3)
736
+ 00045/0269 7 (256,448,3)
737
+ 00045/0276 7 (256,448,3)
738
+ 00045/0280 7 (256,448,3)
739
+ 00045/0281 7 (256,448,3)
740
+ 00045/0282 7 (256,448,3)
741
+ 00045/0284 7 (256,448,3)
742
+ 00045/0550 7 (256,448,3)
743
+ 00045/0571 7 (256,448,3)
744
+ 00045/0629 7 (256,448,3)
745
+ 00045/0631 7 (256,448,3)
746
+ 00045/0659 7 (256,448,3)
747
+ 00045/0693 7 (256,448,3)
748
+ 00045/0807 7 (256,448,3)
749
+ 00045/0810 7 (256,448,3)
750
+ 00045/0826 7 (256,448,3)
751
+ 00045/0849 7 (256,448,3)
752
+ 00045/0946 7 (256,448,3)
753
+ 00045/0987 7 (256,448,3)
754
+ 00045/0990 7 (256,448,3)
755
+ 00046/0104 7 (256,448,3)
756
+ 00046/0477 7 (256,448,3)
757
+ 00046/0490 7 (256,448,3)
758
+ 00046/0491 7 (256,448,3)
759
+ 00046/0509 7 (256,448,3)
760
+ 00046/0513 7 (256,448,3)
761
+ 00046/0603 7 (256,448,3)
762
+ 00046/0723 7 (256,448,3)
763
+ 00046/0744 7 (256,448,3)
764
+ 00046/0746 7 (256,448,3)
765
+ 00046/0750 7 (256,448,3)
766
+ 00046/0852 7 (256,448,3)
767
+ 00046/0927 7 (256,448,3)
768
+ 00046/0928 7 (256,448,3)
769
+ 00046/0929 7 (256,448,3)
770
+ 00046/0931 7 (256,448,3)
771
+ 00046/0936 7 (256,448,3)
772
+ 00046/0939 7 (256,448,3)
773
+ 00046/0947 7 (256,448,3)
774
+ 00046/0948 7 (256,448,3)
775
+ 00046/0950 7 (256,448,3)
776
+ 00046/0955 7 (256,448,3)
777
+ 00046/0961 7 (256,448,3)
778
+ 00047/0023 7 (256,448,3)
779
+ 00047/0029 7 (256,448,3)
780
+ 00047/0035 7 (256,448,3)
781
+ 00047/0058 7 (256,448,3)
782
+ 00047/0061 7 (256,448,3)
783
+ 00047/0065 7 (256,448,3)
784
+ 00047/0068 7 (256,448,3)
785
+ 00047/0072 7 (256,448,3)
786
+ 00047/0074 7 (256,448,3)
787
+ 00047/0148 7 (256,448,3)
788
+ 00047/0594 7 (256,448,3)
789
+ 00047/0782 7 (256,448,3)
790
+ 00047/0787 7 (256,448,3)
791
+ 00047/0860 7 (256,448,3)
792
+ 00047/0889 7 (256,448,3)
793
+ 00047/0893 7 (256,448,3)
794
+ 00047/0894 7 (256,448,3)
795
+ 00047/0902 7 (256,448,3)
796
+ 00047/0975 7 (256,448,3)
797
+ 00047/0995 7 (256,448,3)
798
+ 00048/0033 7 (256,448,3)
799
+ 00048/0113 7 (256,448,3)
800
+ 00048/0115 7 (256,448,3)
801
+ 00048/0120 7 (256,448,3)
802
+ 00048/0129 7 (256,448,3)
803
+ 00048/0136 7 (256,448,3)
804
+ 00048/0327 7 (256,448,3)
805
+ 00048/0329 7 (256,448,3)
806
+ 00048/0341 7 (256,448,3)
807
+ 00048/0343 7 (256,448,3)
808
+ 00048/0345 7 (256,448,3)
809
+ 00048/0346 7 (256,448,3)
810
+ 00048/0355 7 (256,448,3)
811
+ 00048/0359 7 (256,448,3)
812
+ 00048/0363 7 (256,448,3)
813
+ 00048/0378 7 (256,448,3)
814
+ 00048/0386 7 (256,448,3)
815
+ 00048/0387 7 (256,448,3)
816
+ 00048/0388 7 (256,448,3)
817
+ 00048/0428 7 (256,448,3)
818
+ 00048/0439 7 (256,448,3)
819
+ 00048/0507 7 (256,448,3)
820
+ 00048/0510 7 (256,448,3)
821
+ 00048/0512 7 (256,448,3)
822
+ 00048/0514 7 (256,448,3)
823
+ 00048/0539 7 (256,448,3)
824
+ 00048/0542 7 (256,448,3)
825
+ 00048/0544 7 (256,448,3)
826
+ 00048/0631 7 (256,448,3)
827
+ 00048/0632 7 (256,448,3)
828
+ 00048/0636 7 (256,448,3)
829
+ 00048/0640 7 (256,448,3)
830
+ 00048/0644 7 (256,448,3)
831
+ 00048/0653 7 (256,448,3)
832
+ 00048/0655 7 (256,448,3)
833
+ 00048/0658 7 (256,448,3)
834
+ 00048/0667 7 (256,448,3)
835
+ 00048/0688 7 (256,448,3)
836
+ 00048/0708 7 (256,448,3)
837
+ 00049/0005 7 (256,448,3)
838
+ 00049/0074 7 (256,448,3)
839
+ 00049/0077 7 (256,448,3)
840
+ 00049/0084 7 (256,448,3)
841
+ 00049/0516 7 (256,448,3)
842
+ 00049/0800 7 (256,448,3)
843
+ 00049/0900 7 (256,448,3)
844
+ 00050/0607 7 (256,448,3)
845
+ 00050/0661 7 (256,448,3)
846
+ 00050/0665 7 (256,448,3)
847
+ 00050/0685 7 (256,448,3)
848
+ 00050/0711 7 (256,448,3)
849
+ 00051/0068 7 (256,448,3)
850
+ 00051/0069 7 (256,448,3)
851
+ 00051/0076 7 (256,448,3)
852
+ 00051/0569 7 (256,448,3)
853
+ 00051/0801 7 (256,448,3)
854
+ 00051/0927 7 (256,448,3)
855
+ 00051/0945 7 (256,448,3)
856
+ 00051/0952 7 (256,448,3)
857
+ 00051/0976 7 (256,448,3)
858
+ 00051/0985 7 (256,448,3)
859
+ 00052/0012 7 (256,448,3)
860
+ 00052/0015 7 (256,448,3)
861
+ 00052/0052 7 (256,448,3)
862
+ 00052/0056 7 (256,448,3)
863
+ 00052/0060 7 (256,448,3)
864
+ 00052/0157 7 (256,448,3)
865
+ 00052/0265 7 (256,448,3)
866
+ 00052/0788 7 (256,448,3)
867
+ 00052/0790 7 (256,448,3)
868
+ 00052/0793 7 (256,448,3)
869
+ 00052/0816 7 (256,448,3)
870
+ 00052/0824 7 (256,448,3)
871
+ 00052/0918 7 (256,448,3)
872
+ 00052/0933 7 (256,448,3)
873
+ 00052/0947 7 (256,448,3)
874
+ 00053/0232 7 (256,448,3)
875
+ 00053/0277 7 (256,448,3)
876
+ 00053/0362 7 (256,448,3)
877
+ 00053/0577 7 (256,448,3)
878
+ 00053/0609 7 (256,448,3)
879
+ 00053/0612 7 (256,448,3)
880
+ 00053/0628 7 (256,448,3)
881
+ 00053/0629 7 (256,448,3)
882
+ 00053/0633 7 (256,448,3)
883
+ 00053/0659 7 (256,448,3)
884
+ 00053/0667 7 (256,448,3)
885
+ 00053/0671 7 (256,448,3)
886
+ 00053/0797 7 (256,448,3)
887
+ 00053/0804 7 (256,448,3)
888
+ 00053/0807 7 (256,448,3)
889
+ 00053/0952 7 (256,448,3)
890
+ 00053/0970 7 (256,448,3)
891
+ 00053/0981 7 (256,448,3)
892
+ 00053/0999 7 (256,448,3)
893
+ 00054/0003 7 (256,448,3)
894
+ 00054/0013 7 (256,448,3)
895
+ 00054/0020 7 (256,448,3)
896
+ 00054/0022 7 (256,448,3)
897
+ 00054/0023 7 (256,448,3)
898
+ 00054/0044 7 (256,448,3)
899
+ 00054/0051 7 (256,448,3)
900
+ 00054/0063 7 (256,448,3)
901
+ 00054/0065 7 (256,448,3)
902
+ 00054/0145 7 (256,448,3)
903
+ 00054/0153 7 (256,448,3)
904
+ 00054/0203 7 (256,448,3)
905
+ 00054/0325 7 (256,448,3)
906
+ 00054/0445 7 (256,448,3)
907
+ 00054/0448 7 (256,448,3)
908
+ 00054/0456 7 (256,448,3)
909
+ 00054/0457 7 (256,448,3)
910
+ 00054/0519 7 (256,448,3)
911
+ 00054/0524 7 (256,448,3)
912
+ 00054/0530 7 (256,448,3)
913
+ 00054/0532 7 (256,448,3)
914
+ 00054/0535 7 (256,448,3)
915
+ 00054/0574 7 (256,448,3)
916
+ 00054/0760 7 (256,448,3)
917
+ 00054/0767 7 (256,448,3)
918
+ 00054/0837 7 (256,448,3)
919
+ 00055/0011 7 (256,448,3)
920
+ 00055/0109 7 (256,448,3)
921
+ 00055/0111 7 (256,448,3)
922
+ 00055/0117 7 (256,448,3)
923
+ 00055/0119 7 (256,448,3)
924
+ 00055/0182 7 (256,448,3)
925
+ 00055/0192 7 (256,448,3)
926
+ 00055/0193 7 (256,448,3)
927
+ 00055/0200 7 (256,448,3)
928
+ 00055/0204 7 (256,448,3)
929
+ 00055/0207 7 (256,448,3)
930
+ 00055/0212 7 (256,448,3)
931
+ 00055/0213 7 (256,448,3)
932
+ 00055/0348 7 (256,448,3)
933
+ 00055/0423 7 (256,448,3)
934
+ 00055/0427 7 (256,448,3)
935
+ 00055/0456 7 (256,448,3)
936
+ 00055/0489 7 (256,448,3)
937
+ 00055/0689 7 (256,448,3)
938
+ 00055/0753 7 (256,448,3)
939
+ 00055/0802 7 (256,448,3)
940
+ 00055/0844 7 (256,448,3)
941
+ 00055/0850 7 (256,448,3)
942
+ 00055/0982 7 (256,448,3)
943
+ 00055/0993 7 (256,448,3)
944
+ 00056/0113 7 (256,448,3)
945
+ 00056/0148 7 (256,448,3)
946
+ 00056/0151 7 (256,448,3)
947
+ 00056/0316 7 (256,448,3)
948
+ 00056/0379 7 (256,448,3)
949
+ 00056/0380 7 (256,448,3)
950
+ 00056/0385 7 (256,448,3)
951
+ 00056/0505 7 (256,448,3)
952
+ 00056/0579 7 (256,448,3)
953
+ 00057/0254 7 (256,448,3)
954
+ 00057/0264 7 (256,448,3)
955
+ 00057/0272 7 (256,448,3)
956
+ 00057/0403 7 (256,448,3)
957
+ 00057/0501 7 (256,448,3)
958
+ 00057/0503 7 (256,448,3)
959
+ 00057/0884 7 (256,448,3)
960
+ 00058/0026 7 (256,448,3)
961
+ 00058/0029 7 (256,448,3)
962
+ 00058/0104 7 (256,448,3)
963
+ 00058/0124 7 (256,448,3)
964
+ 00058/0162 7 (256,448,3)
965
+ 00058/0288 7 (256,448,3)
966
+ 00058/0289 7 (256,448,3)
967
+ 00058/0323 7 (256,448,3)
968
+ 00058/0328 7 (256,448,3)
969
+ 00058/0329 7 (256,448,3)
970
+ 00058/0337 7 (256,448,3)
971
+ 00058/0367 7 (256,448,3)
972
+ 00058/0383 7 (256,448,3)
973
+ 00058/0395 7 (256,448,3)
974
+ 00060/0178 7 (256,448,3)
975
+ 00060/0182 7 (256,448,3)
976
+ 00061/0001 7 (256,448,3)
977
+ 00061/0003 7 (256,448,3)
978
+ 00061/0006 7 (256,448,3)
979
+ 00061/0443 7 (256,448,3)
980
+ 00061/0586 7 (256,448,3)
981
+ 00061/0587 7 (256,448,3)
982
+ 00061/0774 7 (256,448,3)
983
+ 00061/0789 7 (256,448,3)
984
+ 00061/0815 7 (256,448,3)
985
+ 00061/0817 7 (256,448,3)
986
+ 00061/0826 7 (256,448,3)
987
+ 00061/0829 7 (256,448,3)
988
+ 00061/0830 7 (256,448,3)
989
+ 00061/0832 7 (256,448,3)
990
+ 00061/0833 7 (256,448,3)
991
+ 00061/0836 7 (256,448,3)
992
+ 00061/0837 7 (256,448,3)
993
+ 00061/0839 7 (256,448,3)
994
+ 00061/0843 7 (256,448,3)
995
+ 00061/0849 7 (256,448,3)
996
+ 00061/0859 7 (256,448,3)
997
+ 00061/0861 7 (256,448,3)
998
+ 00061/0868 7 (256,448,3)
999
+ 00061/0877 7 (256,448,3)
1000
+ 00061/0889 7 (256,448,3)
1001
+ 00061/0905 7 (256,448,3)
1002
+ 00062/0115 7 (256,448,3)
1003
+ 00062/0118 7 (256,448,3)
1004
+ 00062/0125 7 (256,448,3)
1005
+ 00062/0134 7 (256,448,3)
1006
+ 00062/0142 7 (256,448,3)
1007
+ 00062/0400 7 (256,448,3)
1008
+ 00062/0457 7 (256,448,3)
1009
+ 00062/0459 7 (256,448,3)
1010
+ 00062/0560 7 (256,448,3)
1011
+ 00062/0650 7 (256,448,3)
1012
+ 00062/0655 7 (256,448,3)
1013
+ 00062/0715 7 (256,448,3)
1014
+ 00062/0847 7 (256,448,3)
1015
+ 00062/0905 7 (256,448,3)
1016
+ 00062/0981 7 (256,448,3)
1017
+ 00063/0177 7 (256,448,3)
1018
+ 00063/0230 7 (256,448,3)
1019
+ 00063/0253 7 (256,448,3)
1020
+ 00063/0257 7 (256,448,3)
1021
+ 00063/0326 7 (256,448,3)
1022
+ 00063/0530 7 (256,448,3)
1023
+ 00063/0677 7 (256,448,3)
1024
+ 00063/0759 7 (256,448,3)
1025
+ 00063/0761 7 (256,448,3)
1026
+ 00063/0777 7 (256,448,3)
1027
+ 00063/0842 7 (256,448,3)
1028
+ 00063/0900 7 (256,448,3)
1029
+ 00064/0014 7 (256,448,3)
1030
+ 00064/0028 7 (256,448,3)
1031
+ 00064/0029 7 (256,448,3)
1032
+ 00064/0030 7 (256,448,3)
1033
+ 00064/0037 7 (256,448,3)
1034
+ 00064/0044 7 (256,448,3)
1035
+ 00064/0280 7 (256,448,3)
1036
+ 00064/0285 7 (256,448,3)
1037
+ 00064/0286 7 (256,448,3)
1038
+ 00064/0291 7 (256,448,3)
1039
+ 00064/0300 7 (256,448,3)
1040
+ 00064/0303 7 (256,448,3)
1041
+ 00064/0308 7 (256,448,3)
1042
+ 00064/0314 7 (256,448,3)
1043
+ 00064/0316 7 (256,448,3)
1044
+ 00064/0317 7 (256,448,3)
1045
+ 00064/0323 7 (256,448,3)
1046
+ 00064/0435 7 (256,448,3)
1047
+ 00064/0733 7 (256,448,3)
1048
+ 00064/0848 7 (256,448,3)
1049
+ 00064/0868 7 (256,448,3)
1050
+ 00064/0888 7 (256,448,3)
1051
+ 00064/0898 7 (256,448,3)
1052
+ 00065/0116 7 (256,448,3)
1053
+ 00065/0121 7 (256,448,3)
1054
+ 00065/0122 7 (256,448,3)
1055
+ 00065/0124 7 (256,448,3)
1056
+ 00065/0125 7 (256,448,3)
1057
+ 00065/0126 7 (256,448,3)
1058
+ 00065/0136 7 (256,448,3)
1059
+ 00065/0146 7 (256,448,3)
1060
+ 00065/0147 7 (256,448,3)
1061
+ 00065/0163 7 (256,448,3)
1062
+ 00065/0170 7 (256,448,3)
1063
+ 00065/0175 7 (256,448,3)
1064
+ 00065/0176 7 (256,448,3)
1065
+ 00065/0180 7 (256,448,3)
1066
+ 00065/0184 7 (256,448,3)
1067
+ 00065/0186 7 (256,448,3)
1068
+ 00065/0332 7 (256,448,3)
1069
+ 00065/0343 7 (256,448,3)
1070
+ 00065/0365 7 (256,448,3)
1071
+ 00065/0393 7 (256,448,3)
1072
+ 00065/0394 7 (256,448,3)
1073
+ 00065/0442 7 (256,448,3)
1074
+ 00065/0459 7 (256,448,3)
1075
+ 00065/0462 7 (256,448,3)
1076
+ 00065/0476 7 (256,448,3)
1077
+ 00065/0483 7 (256,448,3)
1078
+ 00065/0590 7 (256,448,3)
1079
+ 00065/0593 7 (256,448,3)
1080
+ 00065/0595 7 (256,448,3)
1081
+ 00065/0774 7 (256,448,3)
1082
+ 00065/0947 7 (256,448,3)
1083
+ 00065/0985 7 (256,448,3)
1084
+ 00065/0986 7 (256,448,3)
1085
+ 00066/0015 7 (256,448,3)
1086
+ 00066/0043 7 (256,448,3)
1087
+ 00066/0131 7 (256,448,3)
1088
+ 00066/0157 7 (256,448,3)
1089
+ 00066/0169 7 (256,448,3)
1090
+ 00066/0374 7 (256,448,3)
1091
+ 00066/0382 7 (256,448,3)
1092
+ 00066/0481 7 (256,448,3)
1093
+ 00066/0482 7 (256,448,3)
1094
+ 00066/0491 7 (256,448,3)
1095
+ 00066/0493 7 (256,448,3)
1096
+ 00066/0494 7 (256,448,3)
1097
+ 00066/0496 7 (256,448,3)
1098
+ 00066/0680 7 (256,448,3)
1099
+ 00066/0700 7 (256,448,3)
1100
+ 00066/0887 7 (256,448,3)
1101
+ 00066/0910 7 (256,448,3)
1102
+ 00066/0918 7 (256,448,3)
1103
+ 00067/0024 7 (256,448,3)
1104
+ 00067/0059 7 (256,448,3)
1105
+ 00067/0408 7 (256,448,3)
1106
+ 00067/0414 7 (256,448,3)
1107
+ 00067/0417 7 (256,448,3)
1108
+ 00067/0419 7 (256,448,3)
1109
+ 00067/0423 7 (256,448,3)
1110
+ 00067/0441 7 (256,448,3)
1111
+ 00067/0467 7 (256,448,3)
1112
+ 00067/0471 7 (256,448,3)
1113
+ 00067/0487 7 (256,448,3)
1114
+ 00067/0494 7 (256,448,3)
1115
+ 00067/0497 7 (256,448,3)
1116
+ 00067/0513 7 (256,448,3)
1117
+ 00067/0521 7 (256,448,3)
1118
+ 00068/0111 7 (256,448,3)
1119
+ 00068/0123 7 (256,448,3)
1120
+ 00068/0126 7 (256,448,3)
1121
+ 00068/0129 7 (256,448,3)
1122
+ 00068/0270 7 (256,448,3)
1123
+ 00068/0330 7 (256,448,3)
1124
+ 00068/0407 7 (256,448,3)
1125
+ 00068/0428 7 (256,448,3)
1126
+ 00068/0544 7 (256,448,3)
1127
+ 00068/0635 7 (256,448,3)
1128
+ 00068/0637 7 (256,448,3)
1129
+ 00068/0736 7 (256,448,3)
1130
+ 00068/0738 7 (256,448,3)
1131
+ 00068/0747 7 (256,448,3)
1132
+ 00068/0748 7 (256,448,3)
1133
+ 00068/0749 7 (256,448,3)
1134
+ 00068/0762 7 (256,448,3)
1135
+ 00068/0815 7 (256,448,3)
1136
+ 00068/0981 7 (256,448,3)
1137
+ 00068/0982 7 (256,448,3)
1138
+ 00069/0187 7 (256,448,3)
1139
+ 00069/0191 7 (256,448,3)
1140
+ 00070/0001 7 (256,448,3)
1141
+ 00070/0003 7 (256,448,3)
1142
+ 00070/0340 7 (256,448,3)
1143
+ 00070/0341 7 (256,448,3)
1144
+ 00070/0342 7 (256,448,3)
1145
+ 00070/0347 7 (256,448,3)
1146
+ 00070/0372 7 (256,448,3)
1147
+ 00070/0383 7 (256,448,3)
1148
+ 00070/0389 7 (256,448,3)
1149
+ 00070/0728 7 (256,448,3)
1150
+ 00070/0813 7 (256,448,3)
1151
+ 00070/0814 7 (256,448,3)
1152
+ 00070/0823 7 (256,448,3)
1153
+ 00070/0840 7 (256,448,3)
1154
+ 00070/0843 7 (256,448,3)
1155
+ 00070/0861 7 (256,448,3)
1156
+ 00071/0111 7 (256,448,3)
1157
+ 00071/0138 7 (256,448,3)
1158
+ 00071/0143 7 (256,448,3)
1159
+ 00071/0150 7 (256,448,3)
1160
+ 00071/0508 7 (256,448,3)
1161
+ 00071/0514 7 (256,448,3)
1162
+ 00071/0550 7 (256,448,3)
1163
+ 00071/0556 7 (256,448,3)
1164
+ 00071/0600 7 (256,448,3)
1165
+ 00071/0665 7 (256,448,3)
1166
+ 00071/0670 7 (256,448,3)
1167
+ 00071/0672 7 (256,448,3)
1168
+ 00071/0673 7 (256,448,3)
1169
+ 00071/0705 7 (256,448,3)
1170
+ 00071/0706 7 (256,448,3)
1171
+ 00071/0707 7 (256,448,3)
1172
+ 00071/0774 7 (256,448,3)
1173
+ 00071/0799 7 (256,448,3)
1174
+ 00071/0814 7 (256,448,3)
1175
+ 00071/0816 7 (256,448,3)
1176
+ 00071/0819 7 (256,448,3)
1177
+ 00071/0823 7 (256,448,3)
1178
+ 00071/0828 7 (256,448,3)
1179
+ 00071/0830 7 (256,448,3)
1180
+ 00071/0839 7 (256,448,3)
1181
+ 00071/0841 7 (256,448,3)
1182
+ 00072/0192 7 (256,448,3)
1183
+ 00072/0194 7 (256,448,3)
1184
+ 00072/0197 7 (256,448,3)
1185
+ 00072/0199 7 (256,448,3)
1186
+ 00072/0285 7 (256,448,3)
1187
+ 00072/0586 7 (256,448,3)
1188
+ 00072/0795 7 (256,448,3)
1189
+ 00072/0811 7 (256,448,3)
1190
+ 00072/0812 7 (256,448,3)
1191
+ 00072/0824 7 (256,448,3)
1192
+ 00072/0831 7 (256,448,3)
1193
+ 00072/0835 7 (256,448,3)
1194
+ 00072/0837 7 (256,448,3)
1195
+ 00072/0841 7 (256,448,3)
1196
+ 00072/0962 7 (256,448,3)
1197
+ 00073/0296 7 (256,448,3)
1198
+ 00073/0299 7 (256,448,3)
1199
+ 00073/0300 7 (256,448,3)
1200
+ 00073/0301 7 (256,448,3)
1201
+ 00073/0427 7 (256,448,3)
1202
+ 00073/0428 7 (256,448,3)
1203
+ 00073/0494 7 (256,448,3)
1204
+ 00073/0615 7 (256,448,3)
1205
+ 00073/0620 7 (256,448,3)
1206
+ 00073/0624 7 (256,448,3)
1207
+ 00073/0979 7 (256,448,3)
1208
+ 00074/0226 7 (256,448,3)
1209
+ 00074/0250 7 (256,448,3)
1210
+ 00074/0284 7 (256,448,3)
1211
+ 00074/0503 7 (256,448,3)
1212
+ 00074/0614 7 (256,448,3)
1213
+ 00074/0629 7 (256,448,3)
1214
+ 00074/0762 7 (256,448,3)
1215
+ 00074/0765 7 (256,448,3)
1216
+ 00074/0900 7 (256,448,3)
1217
+ 00074/0908 7 (256,448,3)
1218
+ 00075/0352 7 (256,448,3)
1219
+ 00075/0360 7 (256,448,3)
1220
+ 00075/0361 7 (256,448,3)
1221
+ 00075/0365 7 (256,448,3)
1222
+ 00075/0383 7 (256,448,3)
1223
+ 00075/0384 7 (256,448,3)
1224
+ 00075/0386 7 (256,448,3)
1225
+ 00075/0407 7 (256,448,3)
1226
+ 00075/0410 7 (256,448,3)
1227
+ 00075/0412 7 (256,448,3)
1228
+ 00075/0413 7 (256,448,3)
1229
+ 00075/0459 7 (256,448,3)
1230
+ 00075/0504 7 (256,448,3)
1231
+ 00075/0515 7 (256,448,3)
1232
+ 00075/0518 7 (256,448,3)
1233
+ 00075/0567 7 (256,448,3)
1234
+ 00075/0681 7 (256,448,3)
1235
+ 00075/0693 7 (256,448,3)
1236
+ 00075/0728 7 (256,448,3)
1237
+ 00075/0731 7 (256,448,3)
1238
+ 00075/0804 7 (256,448,3)
1239
+ 00075/0974 7 (256,448,3)
1240
+ 00075/0975 7 (256,448,3)
1241
+ 00075/0983 7 (256,448,3)
1242
+ 00075/0997 7 (256,448,3)
1243
+ 00076/0006 7 (256,448,3)
1244
+ 00076/0007 7 (256,448,3)
1245
+ 00076/0011 7 (256,448,3)
1246
+ 00076/0013 7 (256,448,3)
1247
+ 00076/0014 7 (256,448,3)
1248
+ 00076/0027 7 (256,448,3)
1249
+ 00076/0029 7 (256,448,3)
1250
+ 00076/0037 7 (256,448,3)
1251
+ 00076/0041 7 (256,448,3)
1252
+ 00076/0055 7 (256,448,3)
1253
+ 00076/0071 7 (256,448,3)
1254
+ 00076/0172 7 (256,448,3)
1255
+ 00076/0275 7 (256,448,3)
1256
+ 00076/0286 7 (256,448,3)
1257
+ 00076/0467 7 (256,448,3)
1258
+ 00076/0481 7 (256,448,3)
1259
+ 00076/0527 7 (256,448,3)
1260
+ 00076/0895 7 (256,448,3)
1261
+ 00076/0896 7 (256,448,3)
1262
+ 00076/0906 7 (256,448,3)
1263
+ 00076/0924 7 (256,448,3)
1264
+ 00076/0964 7 (256,448,3)
1265
+ 00076/0984 7 (256,448,3)
1266
+ 00077/0317 7 (256,448,3)
1267
+ 00077/0322 7 (256,448,3)
1268
+ 00077/0333 7 (256,448,3)
1269
+ 00077/0334 7 (256,448,3)
1270
+ 00077/0480 7 (256,448,3)
1271
+ 00077/0488 7 (256,448,3)
1272
+ 00077/0490 7 (256,448,3)
1273
+ 00077/0582 7 (256,448,3)
1274
+ 00077/0586 7 (256,448,3)
1275
+ 00077/0969 7 (256,448,3)
1276
+ 00078/0007 7 (256,448,3)
1277
+ 00078/0011 7 (256,448,3)
1278
+ 00078/0153 7 (256,448,3)
1279
+ 00078/0289 7 (256,448,3)
1280
+ 00078/0312 7 (256,448,3)
1281
+ 00078/0492 7 (256,448,3)
1282
+ 00078/0580 7 (256,448,3)
1283
+ 00078/0595 7 (256,448,3)
1284
+ 00078/0814 7 (256,448,3)
1285
+ 00078/0950 7 (256,448,3)
1286
+ 00078/0955 7 (256,448,3)
1287
+ 00079/0060 7 (256,448,3)
1288
+ 00079/0067 7 (256,448,3)
1289
+ 00080/0216 7 (256,448,3)
1290
+ 00080/0308 7 (256,448,3)
1291
+ 00080/0504 7 (256,448,3)
1292
+ 00080/0552 7 (256,448,3)
1293
+ 00080/0576 7 (256,448,3)
1294
+ 00080/0583 7 (256,448,3)
1295
+ 00080/0837 7 (256,448,3)
1296
+ 00080/0839 7 (256,448,3)
1297
+ 00080/0871 7 (256,448,3)
1298
+ 00080/0877 7 (256,448,3)
1299
+ 00080/0880 7 (256,448,3)
1300
+ 00080/0969 7 (256,448,3)
1301
+ 00080/0973 7 (256,448,3)
1302
+ 00080/0980 7 (256,448,3)
1303
+ 00081/0202 7 (256,448,3)
1304
+ 00081/0203 7 (256,448,3)
1305
+ 00081/0210 7 (256,448,3)
1306
+ 00081/0268 7 (256,448,3)
1307
+ 00081/0281 7 (256,448,3)
1308
+ 00081/0283 7 (256,448,3)
1309
+ 00081/0317 7 (256,448,3)
1310
+ 00081/0327 7 (256,448,3)
1311
+ 00082/0018 7 (256,448,3)
1312
+ 00082/0025 7 (256,448,3)
1313
+ 00082/0089 7 (256,448,3)
1314
+ 00082/0140 7 (256,448,3)
1315
+ 00082/0442 7 (256,448,3)
1316
+ 00082/0465 7 (256,448,3)
1317
+ 00082/0473 7 (256,448,3)
1318
+ 00082/0481 7 (256,448,3)
1319
+ 00082/0492 7 (256,448,3)
1320
+ 00082/0495 7 (256,448,3)
1321
+ 00082/0497 7 (256,448,3)
1322
+ 00082/0502 7 (256,448,3)
1323
+ 00082/0504 7 (256,448,3)
1324
+ 00082/0506 7 (256,448,3)
1325
+ 00082/0507 7 (256,448,3)
1326
+ 00082/0510 7 (256,448,3)
1327
+ 00082/0519 7 (256,448,3)
1328
+ 00082/0523 7 (256,448,3)
1329
+ 00082/0588 7 (256,448,3)
1330
+ 00082/0597 7 (256,448,3)
1331
+ 00082/0632 7 (256,448,3)
1332
+ 00082/0751 7 (256,448,3)
1333
+ 00082/0767 7 (256,448,3)
1334
+ 00082/0771 7 (256,448,3)
1335
+ 00082/0790 7 (256,448,3)
1336
+ 00082/0804 7 (256,448,3)
1337
+ 00082/0823 7 (256,448,3)
1338
+ 00083/0052 7 (256,448,3)
1339
+ 00083/0056 7 (256,448,3)
1340
+ 00083/0113 7 (256,448,3)
1341
+ 00083/0114 7 (256,448,3)
1342
+ 00083/0122 7 (256,448,3)
1343
+ 00083/0137 7 (256,448,3)
1344
+ 00083/0270 7 (256,448,3)
1345
+ 00083/0295 7 (256,448,3)
1346
+ 00083/0303 7 (256,448,3)
1347
+ 00083/0308 7 (256,448,3)
1348
+ 00083/0586 7 (256,448,3)
1349
+ 00083/0592 7 (256,448,3)
1350
+ 00083/0640 7 (256,448,3)
1351
+ 00083/0648 7 (256,448,3)
1352
+ 00083/0654 7 (256,448,3)
1353
+ 00083/0662 7 (256,448,3)
1354
+ 00083/0666 7 (256,448,3)
1355
+ 00083/0668 7 (256,448,3)
1356
+ 00083/0669 7 (256,448,3)
1357
+ 00083/0675 7 (256,448,3)
1358
+ 00083/0679 7 (256,448,3)
1359
+ 00083/0681 7 (256,448,3)
1360
+ 00083/0682 7 (256,448,3)
1361
+ 00083/0694 7 (256,448,3)
1362
+ 00083/0695 7 (256,448,3)
1363
+ 00083/0697 7 (256,448,3)
1364
+ 00083/0704 7 (256,448,3)
1365
+ 00083/0713 7 (256,448,3)
1366
+ 00083/0721 7 (256,448,3)
1367
+ 00083/0855 7 (256,448,3)
1368
+ 00084/0109 7 (256,448,3)
1369
+ 00084/0113 7 (256,448,3)
1370
+ 00084/0306 7 (256,448,3)
1371
+ 00084/0442 7 (256,448,3)
1372
+ 00084/0669 7 (256,448,3)
1373
+ 00084/0679 7 (256,448,3)
1374
+ 00084/0685 7 (256,448,3)
1375
+ 00084/0691 7 (256,448,3)
1376
+ 00084/0768 7 (256,448,3)
1377
+ 00084/0817 7 (256,448,3)
1378
+ 00085/0027 7 (256,448,3)
1379
+ 00085/0035 7 (256,448,3)
1380
+ 00085/0038 7 (256,448,3)
1381
+ 00085/0223 7 (256,448,3)
1382
+ 00085/0233 7 (256,448,3)
1383
+ 00085/0281 7 (256,448,3)
1384
+ 00085/0287 7 (256,448,3)
1385
+ 00085/0313 7 (256,448,3)
1386
+ 00085/0521 7 (256,448,3)
1387
+ 00085/0848 7 (256,448,3)
1388
+ 00085/0855 7 (256,448,3)
1389
+ 00085/0865 7 (256,448,3)
1390
+ 00085/0952 7 (256,448,3)
1391
+ 00085/0964 7 (256,448,3)
1392
+ 00085/0973 7 (256,448,3)
1393
+ 00085/0986 7 (256,448,3)
1394
+ 00085/0993 7 (256,448,3)
1395
+ 00086/0070 7 (256,448,3)
1396
+ 00086/0075 7 (256,448,3)
1397
+ 00086/0094 7 (256,448,3)
1398
+ 00086/0103 7 (256,448,3)
1399
+ 00086/0112 7 (256,448,3)
1400
+ 00086/0288 7 (256,448,3)
1401
+ 00086/0576 7 (256,448,3)
1402
+ 00086/0580 7 (256,448,3)
1403
+ 00086/0584 7 (256,448,3)
1404
+ 00086/0599 7 (256,448,3)
1405
+ 00086/0600 7 (256,448,3)
1406
+ 00086/0602 7 (256,448,3)
1407
+ 00086/0612 7 (256,448,3)
1408
+ 00086/0629 7 (256,448,3)
1409
+ 00086/0655 7 (256,448,3)
1410
+ 00086/0679 7 (256,448,3)
1411
+ 00086/0694 7 (256,448,3)
1412
+ 00086/0695 7 (256,448,3)
1413
+ 00086/0701 7 (256,448,3)
1414
+ 00086/0760 7 (256,448,3)
1415
+ 00086/0786 7 (256,448,3)
1416
+ 00086/0845 7 (256,448,3)
1417
+ 00086/0868 7 (256,448,3)
1418
+ 00086/0889 7 (256,448,3)
1419
+ 00086/0891 7 (256,448,3)
1420
+ 00086/0927 7 (256,448,3)
1421
+ 00086/0938 7 (256,448,3)
1422
+ 00086/0946 7 (256,448,3)
1423
+ 00086/0963 7 (256,448,3)
1424
+ 00086/0969 7 (256,448,3)
1425
+ 00087/0023 7 (256,448,3)
1426
+ 00087/0029 7 (256,448,3)
1427
+ 00087/0144 7 (256,448,3)
1428
+ 00087/0148 7 (256,448,3)
1429
+ 00087/0159 7 (256,448,3)
1430
+ 00087/0174 7 (256,448,3)
1431
+ 00087/0283 7 (256,448,3)
1432
+ 00087/0284 7 (256,448,3)
1433
+ 00087/0294 7 (256,448,3)
1434
+ 00087/0296 7 (256,448,3)
1435
+ 00087/0498 7 (256,448,3)
1436
+ 00087/0502 7 (256,448,3)
1437
+ 00087/0532 7 (256,448,3)
1438
+ 00087/0557 7 (256,448,3)
1439
+ 00087/0559 7 (256,448,3)
1440
+ 00087/0574 7 (256,448,3)
1441
+ 00087/0577 7 (256,448,3)
1442
+ 00088/0006 7 (256,448,3)
1443
+ 00088/0268 7 (256,448,3)
1444
+ 00088/0320 7 (256,448,3)
1445
+ 00088/0412 7 (256,448,3)
1446
+ 00088/0431 7 (256,448,3)
1447
+ 00088/0432 7 (256,448,3)
1448
+ 00088/0465 7 (256,448,3)
1449
+ 00088/0507 7 (256,448,3)
1450
+ 00088/0565 7 (256,448,3)
1451
+ 00088/0629 7 (256,448,3)
1452
+ 00088/0831 7 (256,448,3)
1453
+ 00088/0836 7 (256,448,3)
1454
+ 00088/0972 7 (256,448,3)
1455
+ 00088/0974 7 (256,448,3)
1456
+ 00088/0980 7 (256,448,3)
1457
+ 00089/0067 7 (256,448,3)
1458
+ 00089/0244 7 (256,448,3)
1459
+ 00089/0404 7 (256,448,3)
1460
+ 00089/0416 7 (256,448,3)
1461
+ 00089/0419 7 (256,448,3)
1462
+ 00089/0428 7 (256,448,3)
1463
+ 00089/0712 7 (256,448,3)
1464
+ 00089/0713 7 (256,448,3)
1465
+ 00089/0723 7 (256,448,3)
1466
+ 00089/0727 7 (256,448,3)
1467
+ 00089/0770 7 (256,448,3)
1468
+ 00089/0809 7 (256,448,3)
1469
+ 00089/0811 7 (256,448,3)
1470
+ 00089/0888 7 (256,448,3)
1471
+ 00089/0898 7 (256,448,3)
1472
+ 00089/0903 7 (256,448,3)
1473
+ 00089/0907 7 (256,448,3)
1474
+ 00089/0911 7 (256,448,3)
1475
+ 00089/0915 7 (256,448,3)
1476
+ 00089/0926 7 (256,448,3)
1477
+ 00089/0955 7 (256,448,3)
1478
+ 00090/0027 7 (256,448,3)
1479
+ 00090/0028 7 (256,448,3)
1480
+ 00090/0032 7 (256,448,3)
1481
+ 00090/0038 7 (256,448,3)
1482
+ 00090/0076 7 (256,448,3)
1483
+ 00090/0081 7 (256,448,3)
1484
+ 00090/0086 7 (256,448,3)
1485
+ 00090/0119 7 (256,448,3)
1486
+ 00090/0258 7 (256,448,3)
1487
+ 00090/0261 7 (256,448,3)
1488
+ 00090/0447 7 (256,448,3)
1489
+ 00090/0498 7 (256,448,3)
1490
+ 00090/0514 7 (256,448,3)
1491
+ 00090/0523 7 (256,448,3)
1492
+ 00090/0530 7 (256,448,3)
1493
+ 00090/0540 7 (256,448,3)
1494
+ 00090/0548 7 (256,448,3)
1495
+ 00090/0565 7 (256,448,3)
1496
+ 00090/0578 7 (256,448,3)
1497
+ 00090/0580 7 (256,448,3)
1498
+ 00090/0581 7 (256,448,3)
1499
+ 00090/0780 7 (256,448,3)
1500
+ 00090/0940 7 (256,448,3)
1501
+ 00090/0984 7 (256,448,3)
1502
+ 00091/0023 7 (256,448,3)
1503
+ 00091/0051 7 (256,448,3)
1504
+ 00091/0317 7 (256,448,3)
1505
+ 00091/0320 7 (256,448,3)
1506
+ 00091/0582 7 (256,448,3)
1507
+ 00091/0585 7 (256,448,3)
1508
+ 00091/0588 7 (256,448,3)
1509
+ 00091/0601 7 (256,448,3)
1510
+ 00091/0602 7 (256,448,3)
1511
+ 00091/0603 7 (256,448,3)
1512
+ 00091/0634 7 (256,448,3)
1513
+ 00091/0693 7 (256,448,3)
1514
+ 00091/0741 7 (256,448,3)
1515
+ 00091/0966 7 (256,448,3)
1516
+ 00091/0973 7 (256,448,3)
1517
+ 00091/0985 7 (256,448,3)
1518
+ 00092/0007 7 (256,448,3)
1519
+ 00092/0132 7 (256,448,3)
1520
+ 00092/0270 7 (256,448,3)
1521
+ 00092/0296 7 (256,448,3)
1522
+ 00092/0611 7 (256,448,3)
1523
+ 00092/0625 7 (256,448,3)
1524
+ 00092/0627 7 (256,448,3)
1525
+ 00092/0651 7 (256,448,3)
1526
+ 00092/0652 7 (256,448,3)
1527
+ 00092/0910 7 (256,448,3)
1528
+ 00093/0075 7 (256,448,3)
1529
+ 00093/0078 7 (256,448,3)
1530
+ 00093/0100 7 (256,448,3)
1531
+ 00093/0132 7 (256,448,3)
1532
+ 00093/0133 7 (256,448,3)
1533
+ 00093/0176 7 (256,448,3)
1534
+ 00093/0177 7 (256,448,3)
1535
+ 00093/0178 7 (256,448,3)
1536
+ 00093/0181 7 (256,448,3)
1537
+ 00093/0183 7 (256,448,3)
1538
+ 00093/0184 7 (256,448,3)
1539
+ 00093/0286 7 (256,448,3)
1540
+ 00093/0304 7 (256,448,3)
1541
+ 00093/0305 7 (256,448,3)
1542
+ 00093/0319 7 (256,448,3)
1543
+ 00093/0324 7 (256,448,3)
1544
+ 00093/0325 7 (256,448,3)
1545
+ 00093/0327 7 (256,448,3)
1546
+ 00093/0331 7 (256,448,3)
1547
+ 00093/0444 7 (256,448,3)
1548
+ 00093/0450 7 (256,448,3)
1549
+ 00093/0593 7 (256,448,3)
1550
+ 00094/0032 7 (256,448,3)
1551
+ 00094/0057 7 (256,448,3)
1552
+ 00094/0139 7 (256,448,3)
1553
+ 00094/0206 7 (256,448,3)
1554
+ 00094/0211 7 (256,448,3)
1555
+ 00094/0215 7 (256,448,3)
1556
+ 00094/0218 7 (256,448,3)
1557
+ 00094/0257 7 (256,448,3)
1558
+ 00094/0329 7 (256,448,3)
1559
+ 00094/0331 7 (256,448,3)
1560
+ 00094/0332 7 (256,448,3)
1561
+ 00094/0369 7 (256,448,3)
1562
+ 00094/0370 7 (256,448,3)
1563
+ 00094/0383 7 (256,448,3)
1564
+ 00094/0385 7 (256,448,3)
1565
+ 00094/0387 7 (256,448,3)
1566
+ 00094/0399 7 (256,448,3)
1567
+ 00094/0605 7 (256,448,3)
1568
+ 00094/0648 7 (256,448,3)
1569
+ 00094/0649 7 (256,448,3)
1570
+ 00094/0759 7 (256,448,3)
1571
+ 00094/0800 7 (256,448,3)
1572
+ 00094/0894 7 (256,448,3)
1573
+ 00094/0896 7 (256,448,3)
1574
+ 00095/0089 7 (256,448,3)
1575
+ 00095/0108 7 (256,448,3)
1576
+ 00095/0109 7 (256,448,3)
1577
+ 00095/0114 7 (256,448,3)
1578
+ 00095/0128 7 (256,448,3)
1579
+ 00095/0133 7 (256,448,3)
1580
+ 00095/0150 7 (256,448,3)
1581
+ 00095/0153 7 (256,448,3)
1582
+ 00095/0154 7 (256,448,3)
1583
+ 00095/0196 7 (256,448,3)
1584
+ 00095/0209 7 (256,448,3)
1585
+ 00095/0228 7 (256,448,3)
1586
+ 00095/0230 7 (256,448,3)
1587
+ 00095/0231 7 (256,448,3)
1588
+ 00095/0242 7 (256,448,3)
1589
+ 00095/0243 7 (256,448,3)
1590
+ 00095/0253 7 (256,448,3)
1591
+ 00095/0280 7 (256,448,3)
1592
+ 00095/0281 7 (256,448,3)
1593
+ 00095/0283 7 (256,448,3)
1594
+ 00095/0314 7 (256,448,3)
1595
+ 00095/0868 7 (256,448,3)
1596
+ 00095/0894 7 (256,448,3)
1597
+ 00096/0062 7 (256,448,3)
1598
+ 00096/0347 7 (256,448,3)
1599
+ 00096/0348 7 (256,448,3)
1600
+ 00096/0359 7 (256,448,3)
1601
+ 00096/0363 7 (256,448,3)
1602
+ 00096/0373 7 (256,448,3)
1603
+ 00096/0378 7 (256,448,3)
1604
+ 00096/0387 7 (256,448,3)
1605
+ 00096/0395 7 (256,448,3)
1606
+ 00096/0396 7 (256,448,3)
1607
+ 00096/0404 7 (256,448,3)
1608
+ 00096/0653 7 (256,448,3)
1609
+ 00096/0668 7 (256,448,3)
1610
+ 00096/0679 7 (256,448,3)
1611
+ 00096/0729 7 (256,448,3)
1612
+ 00096/0736 7 (256,448,3)
1613
+ 00096/0823 7 (256,448,3)
basicsr/data/meta_info/meta_info_Vimeo90K_train_GT.txt ADDED
The diff for this file is too large to render. See raw diff
 
basicsr/data/paired_image_dataset.py ADDED
@@ -0,0 +1,374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from torch.utils import data as data
2
+ from torchvision.transforms.functional import normalize
3
+
4
+ from basicsr.data.data_util import (paired_paths_from_folder,
5
+ paired_DP_paths_from_folder,
6
+ paired_paths_from_lmdb,
7
+ paired_paths_from_meta_info_file)
8
+ from basicsr.data.transforms import augment, paired_random_crop, paired_random_crop_DP, random_augmentation
9
+ from basicsr.utils import FileClient, imfrombytes, img2tensor, padding, padding_DP, imfrombytesDP
10
+
11
+ import random
12
+ import numpy as np
13
+ import torch
14
+ import cv2
15
+
16
+ class Dataset_PairedImage(data.Dataset):
17
+ """Paired image dataset for image restoration.
18
+
19
+ Read LQ (Low Quality, e.g. LR (Low Resolution), blurry, noisy, etc) and
20
+ GT image pairs.
21
+
22
+ There are three modes:
23
+ 1. 'lmdb': Use lmdb files.
24
+ If opt['io_backend'] == lmdb.
25
+ 2. 'meta_info_file': Use meta information file to generate paths.
26
+ If opt['io_backend'] != lmdb and opt['meta_info_file'] is not None.
27
+ 3. 'folder': Scan folders to generate paths.
28
+ The rest.
29
+
30
+ Args:
31
+ opt (dict): Config for train datasets. It contains the following keys:
32
+ dataroot_gt (str): Data root path for gt.
33
+ dataroot_lq (str): Data root path for lq.
34
+ meta_info_file (str): Path for meta information file.
35
+ io_backend (dict): IO backend type and other kwarg.
36
+ filename_tmpl (str): Template for each filename. Note that the
37
+ template excludes the file extension. Default: '{}'.
38
+ gt_size (int): Cropped patched size for gt patches.
39
+ geometric_augs (bool): Use geometric augmentations.
40
+
41
+ scale (bool): Scale, which will be added automatically.
42
+ phase (str): 'train' or 'val'.
43
+ """
44
+
45
+ def __init__(self, opt):
46
+ super(Dataset_PairedImage, self).__init__()
47
+ self.opt = opt
48
+ # file client (io backend)
49
+ self.file_client = None
50
+ self.io_backend_opt = opt['io_backend']
51
+ self.mean = opt['mean'] if 'mean' in opt else None
52
+ self.std = opt['std'] if 'std' in opt else None
53
+
54
+ self.gt_folder, self.lq_folder = opt['dataroot_gt'], opt['dataroot_lq']
55
+ if 'filename_tmpl' in opt:
56
+ self.filename_tmpl = opt['filename_tmpl']
57
+ else:
58
+ self.filename_tmpl = '{}'
59
+
60
+ if self.io_backend_opt['type'] == 'lmdb':
61
+ self.io_backend_opt['db_paths'] = [self.lq_folder, self.gt_folder]
62
+ self.io_backend_opt['client_keys'] = ['lq', 'gt']
63
+ self.paths = paired_paths_from_lmdb(
64
+ [self.lq_folder, self.gt_folder], ['lq', 'gt'])
65
+ elif 'meta_info_file' in self.opt and self.opt[
66
+ 'meta_info_file'] is not None:
67
+ self.paths = paired_paths_from_meta_info_file(
68
+ [self.lq_folder, self.gt_folder], ['lq', 'gt'],
69
+ self.opt['meta_info_file'], self.filename_tmpl)
70
+ else:
71
+ self.paths = paired_paths_from_folder(
72
+ [self.lq_folder, self.gt_folder], ['lq', 'gt'],
73
+ self.filename_tmpl)
74
+
75
+ if self.opt['phase'] == 'train':
76
+ self.geometric_augs = opt['geometric_augs']
77
+
78
+ def __getitem__(self, index):
79
+ if self.file_client is None:
80
+ self.file_client = FileClient(
81
+ self.io_backend_opt.pop('type'), **self.io_backend_opt)
82
+
83
+ scale = self.opt['scale']
84
+ index = index % len(self.paths)
85
+ # Load gt and lq images. Dimension order: HWC; channel order: BGR;
86
+ # image range: [0, 1], float32.
87
+ gt_path = self.paths[index]['gt_path']
88
+ img_bytes = self.file_client.get(gt_path, 'gt')
89
+ try:
90
+ img_gt = imfrombytes(img_bytes, float32=True)
91
+ except:
92
+ raise Exception("gt path {} not working".format(gt_path))
93
+
94
+ lq_path = self.paths[index]['lq_path']
95
+ img_bytes = self.file_client.get(lq_path, 'lq')
96
+ try:
97
+ img_lq = imfrombytes(img_bytes, float32=True)
98
+ except:
99
+ raise Exception("lq path {} not working".format(lq_path))
100
+
101
+ # augmentation for training
102
+ if self.opt['phase'] == 'train':
103
+ gt_size = self.opt['gt_size']
104
+ # padding
105
+ img_gt, img_lq = padding(img_gt, img_lq, gt_size)
106
+
107
+ # random crop
108
+ img_gt, img_lq = paired_random_crop(img_gt, img_lq, gt_size, scale,
109
+ gt_path)
110
+
111
+ # flip, rotation augmentations
112
+ if self.geometric_augs:
113
+ img_gt, img_lq = random_augmentation(img_gt, img_lq)
114
+
115
+ # BGR to RGB, HWC to CHW, numpy to tensor
116
+ img_gt, img_lq = img2tensor([img_gt, img_lq],
117
+ bgr2rgb=True,
118
+ float32=True)
119
+ # normalize
120
+ if self.mean is not None or self.std is not None:
121
+ normalize(img_lq, self.mean, self.std, inplace=True)
122
+ normalize(img_gt, self.mean, self.std, inplace=True)
123
+ label = self.get_label(lq_path,)
124
+ return {
125
+ 'lq': img_lq,
126
+ 'gt': img_gt,
127
+ 'lq_path': lq_path,
128
+ 'gt_path': gt_path,
129
+ 'label': label
130
+ }
131
+ def get_label(self, lq_path):
132
+ img_name = lq_path.split("/")[-1]
133
+ if "im_" in img_name:
134
+ return 0
135
+ elif '.jpg' in img_name:
136
+ return 1
137
+ elif 'rain' in img_name:
138
+ return 2
139
+ else:
140
+ return 4
141
+
142
+ def __len__(self):
143
+ return len(self.paths)
144
+
145
+ class Dataset_GaussianDenoising(data.Dataset):
146
+ """Paired image dataset for image restoration.
147
+
148
+ Read LQ (Low Quality, e.g. LR (Low Resolution), blurry, noisy, etc) and
149
+ GT image pairs.
150
+
151
+ There are three modes:
152
+ 1. 'lmdb': Use lmdb files.
153
+ If opt['io_backend'] == lmdb.
154
+ 2. 'meta_info_file': Use meta information file to generate paths.
155
+ If opt['io_backend'] != lmdb and opt['meta_info_file'] is not None.
156
+ 3. 'folder': Scan folders to generate paths.
157
+ The rest.
158
+
159
+ Args:
160
+ opt (dict): Config for train datasets. It contains the following keys:
161
+ dataroot_gt (str): Data root path for gt.
162
+ meta_info_file (str): Path for meta information file.
163
+ io_backend (dict): IO backend type and other kwarg.
164
+ gt_size (int): Cropped patched size for gt patches.
165
+ use_flip (bool): Use horizontal flips.
166
+ use_rot (bool): Use rotation (use vertical flip and transposing h
167
+ and w for implementation).
168
+
169
+ scale (bool): Scale, which will be added automatically.
170
+ phase (str): 'train' or 'val'.
171
+ """
172
+
173
+ def __init__(self, opt):
174
+ super(Dataset_GaussianDenoising, self).__init__()
175
+ self.opt = opt
176
+
177
+ if self.opt['phase'] == 'train':
178
+ self.sigma_type = opt['sigma_type']
179
+ self.sigma_range = opt['sigma_range']
180
+ assert self.sigma_type in ['constant', 'random', 'choice']
181
+ else:
182
+ self.sigma_test = opt['sigma_test']
183
+ self.in_ch = opt['in_ch']
184
+
185
+ # file client (io backend)
186
+ self.file_client = None
187
+ self.io_backend_opt = opt['io_backend']
188
+ self.mean = opt['mean'] if 'mean' in opt else None
189
+ self.std = opt['std'] if 'std' in opt else None
190
+
191
+ self.gt_folder = opt['dataroot_gt']
192
+
193
+ if self.io_backend_opt['type'] == 'lmdb':
194
+ self.io_backend_opt['db_paths'] = [self.gt_folder]
195
+ self.io_backend_opt['client_keys'] = ['gt']
196
+ self.paths = paths_from_lmdb(self.gt_folder)
197
+ elif 'meta_info_file' in self.opt:
198
+ with open(self.opt['meta_info_file'], 'r') as fin:
199
+ self.paths = [
200
+ osp.join(self.gt_folder,
201
+ line.split(' ')[0]) for line in fin
202
+ ]
203
+ else:
204
+ self.paths = sorted(list(scandir(self.gt_folder, full_path=True)))
205
+
206
+ if self.opt['phase'] == 'train':
207
+ self.geometric_augs = self.opt['geometric_augs']
208
+
209
+ def __getitem__(self, index):
210
+ if self.file_client is None:
211
+ self.file_client = FileClient(
212
+ self.io_backend_opt.pop('type'), **self.io_backend_opt)
213
+
214
+ scale = self.opt['scale']
215
+ index = index % len(self.paths)
216
+ # Load gt and lq images. Dimension order: HWC; channel order: BGR;
217
+ # image range: [0, 1], float32.
218
+ gt_path = self.paths[index]['gt_path']
219
+ img_bytes = self.file_client.get(gt_path, 'gt')
220
+
221
+ if self.in_ch == 3:
222
+ try:
223
+ img_gt = imfrombytes(img_bytes, float32=True)
224
+ except:
225
+ raise Exception("gt path {} not working".format(gt_path))
226
+
227
+ img_gt = cv2.cvtColor(img_gt, cv2.COLOR_BGR2RGB)
228
+ else:
229
+ try:
230
+ img_gt = imfrombytes(img_bytes, flag='grayscale', float32=True)
231
+ except:
232
+ raise Exception("gt path {} not working".format(gt_path))
233
+
234
+ img_gt = np.expand_dims(img_gt, axis=2)
235
+ img_lq = img_gt.copy()
236
+
237
+
238
+ # augmentation for training
239
+ if self.opt['phase'] == 'train':
240
+ gt_size = self.opt['gt_size']
241
+ # padding
242
+ img_gt, img_lq = padding(img_gt, img_lq, gt_size)
243
+
244
+ # random crop
245
+ img_gt, img_lq = paired_random_crop(img_gt, img_lq, gt_size, scale,
246
+ gt_path)
247
+ # flip, rotation
248
+ if self.geometric_augs:
249
+ img_gt, img_lq = random_augmentation(img_gt, img_lq)
250
+
251
+ img_gt, img_lq = img2tensor([img_gt, img_lq],
252
+ bgr2rgb=False,
253
+ float32=True)
254
+
255
+
256
+ if self.sigma_type == 'constant':
257
+ sigma_value = self.sigma_range
258
+ elif self.sigma_type == 'random':
259
+ sigma_value = random.uniform(self.sigma_range[0], self.sigma_range[1])
260
+ elif self.sigma_type == 'choice':
261
+ sigma_value = random.choice(self.sigma_range)
262
+
263
+ noise_level = torch.FloatTensor([sigma_value])/255.0
264
+ # noise_level_map = torch.ones((1, img_lq.size(1), img_lq.size(2))).mul_(noise_level).float()
265
+ noise = torch.randn(img_lq.size()).mul_(noise_level).float()
266
+ img_lq.add_(noise)
267
+
268
+ else:
269
+ np.random.seed(seed=0)
270
+ img_lq += np.random.normal(0, self.sigma_test/255.0, img_lq.shape)
271
+ # noise_level_map = torch.ones((1, img_lq.shape[0], img_lq.shape[1])).mul_(self.sigma_test/255.0).float()
272
+
273
+ img_gt, img_lq = img2tensor([img_gt, img_lq],
274
+ bgr2rgb=False,
275
+ float32=True)
276
+
277
+ return {
278
+ 'lq': img_lq,
279
+ 'gt': img_gt,
280
+ 'lq_path': gt_path,
281
+ 'gt_path': gt_path
282
+ }
283
+
284
+ def __len__(self):
285
+ return len(self.paths)
286
+
287
+ class Dataset_DefocusDeblur_DualPixel_16bit(data.Dataset):
288
+ def __init__(self, opt):
289
+ super(Dataset_DefocusDeblur_DualPixel_16bit, self).__init__()
290
+ self.opt = opt
291
+ # file client (io backend)
292
+ self.file_client = None
293
+ self.io_backend_opt = opt['io_backend']
294
+ self.mean = opt['mean'] if 'mean' in opt else None
295
+ self.std = opt['std'] if 'std' in opt else None
296
+
297
+ self.gt_folder, self.lqL_folder, self.lqR_folder = opt['dataroot_gt'], opt['dataroot_lqL'], opt['dataroot_lqR']
298
+ if 'filename_tmpl' in opt:
299
+ self.filename_tmpl = opt['filename_tmpl']
300
+ else:
301
+ self.filename_tmpl = '{}'
302
+
303
+ self.paths = paired_DP_paths_from_folder(
304
+ [self.lqL_folder, self.lqR_folder, self.gt_folder], ['lqL', 'lqR', 'gt'],
305
+ self.filename_tmpl)
306
+
307
+ if self.opt['phase'] == 'train':
308
+ self.geometric_augs = self.opt['geometric_augs']
309
+
310
+ def __getitem__(self, index):
311
+ if self.file_client is None:
312
+ self.file_client = FileClient(
313
+ self.io_backend_opt.pop('type'), **self.io_backend_opt)
314
+
315
+ scale = self.opt['scale']
316
+ index = index % len(self.paths)
317
+ # Load gt and lq images. Dimension order: HWC; channel order: BGR;
318
+ # image range: [0, 1], float32.
319
+ gt_path = self.paths[index]['gt_path']
320
+ img_bytes = self.file_client.get(gt_path, 'gt')
321
+ try:
322
+ img_gt = imfrombytesDP(img_bytes, float32=True)
323
+ except:
324
+ raise Exception("gt path {} not working".format(gt_path))
325
+
326
+ lqL_path = self.paths[index]['lqL_path']
327
+ img_bytes = self.file_client.get(lqL_path, 'lqL')
328
+ try:
329
+ img_lqL = imfrombytesDP(img_bytes, float32=True)
330
+ except:
331
+ raise Exception("lqL path {} not working".format(lqL_path))
332
+
333
+ lqR_path = self.paths[index]['lqR_path']
334
+ img_bytes = self.file_client.get(lqR_path, 'lqR')
335
+ try:
336
+ img_lqR = imfrombytesDP(img_bytes, float32=True)
337
+ except:
338
+ raise Exception("lqR path {} not working".format(lqR_path))
339
+
340
+
341
+ # augmentation for training
342
+ if self.opt['phase'] == 'train':
343
+ gt_size = self.opt['gt_size']
344
+ # padding
345
+ img_lqL, img_lqR, img_gt = padding_DP(img_lqL, img_lqR, img_gt, gt_size)
346
+
347
+ # random crop
348
+ img_lqL, img_lqR, img_gt = paired_random_crop_DP(img_lqL, img_lqR, img_gt, gt_size, scale, gt_path)
349
+
350
+ # flip, rotation
351
+ if self.geometric_augs:
352
+ img_lqL, img_lqR, img_gt = random_augmentation(img_lqL, img_lqR, img_gt)
353
+ # TODO: color space transform
354
+ # BGR to RGB, HWC to CHW, numpy to tensor
355
+ img_lqL, img_lqR, img_gt = img2tensor([img_lqL, img_lqR, img_gt],
356
+ bgr2rgb=True,
357
+ float32=True)
358
+ # normalize
359
+ if self.mean is not None or self.std is not None:
360
+ normalize(img_lqL, self.mean, self.std, inplace=True)
361
+ normalize(img_lqR, self.mean, self.std, inplace=True)
362
+ normalize(img_gt, self.mean, self.std, inplace=True)
363
+
364
+ img_lq = torch.cat([img_lqL, img_lqR], 0)
365
+
366
+ return {
367
+ 'lq': img_lq,
368
+ 'gt': img_gt,
369
+ 'lq_path': lqL_path,
370
+ 'gt_path': gt_path
371
+ }
372
+
373
+ def __len__(self):
374
+ return len(self.paths)
basicsr/data/prefetch_dataloader.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import queue as Queue
2
+ import threading
3
+ import torch
4
+ from torch.utils.data import DataLoader
5
+
6
+
7
+ class PrefetchGenerator(threading.Thread):
8
+ """A general prefetch generator.
9
+
10
+ Ref:
11
+ https://stackoverflow.com/questions/7323664/python-generator-pre-fetch
12
+
13
+ Args:
14
+ generator: Python generator.
15
+ num_prefetch_queue (int): Number of prefetch queue.
16
+ """
17
+
18
+ def __init__(self, generator, num_prefetch_queue):
19
+ threading.Thread.__init__(self)
20
+ self.queue = Queue.Queue(num_prefetch_queue)
21
+ self.generator = generator
22
+ self.daemon = True
23
+ self.start()
24
+
25
+ def run(self):
26
+ for item in self.generator:
27
+ self.queue.put(item)
28
+ self.queue.put(None)
29
+
30
+ def __next__(self):
31
+ next_item = self.queue.get()
32
+ if next_item is None:
33
+ raise StopIteration
34
+ return next_item
35
+
36
+ def __iter__(self):
37
+ return self
38
+
39
+
40
+ class PrefetchDataLoader(DataLoader):
41
+ """Prefetch version of dataloader.
42
+
43
+ Ref:
44
+ https://github.com/IgorSusmelj/pytorch-styleguide/issues/5#
45
+
46
+ TODO:
47
+ Need to test on single gpu and ddp (multi-gpu). There is a known issue in
48
+ ddp.
49
+
50
+ Args:
51
+ num_prefetch_queue (int): Number of prefetch queue.
52
+ kwargs (dict): Other arguments for dataloader.
53
+ """
54
+
55
+ def __init__(self, num_prefetch_queue, **kwargs):
56
+ self.num_prefetch_queue = num_prefetch_queue
57
+ super(PrefetchDataLoader, self).__init__(**kwargs)
58
+
59
+ def __iter__(self):
60
+ return PrefetchGenerator(super().__iter__(), self.num_prefetch_queue)
61
+
62
+
63
+ class CPUPrefetcher():
64
+ """CPU prefetcher.
65
+
66
+ Args:
67
+ loader: Dataloader.
68
+ """
69
+
70
+ def __init__(self, loader):
71
+ self.ori_loader = loader
72
+ self.loader = iter(loader)
73
+
74
+ def next(self):
75
+ try:
76
+ return next(self.loader)
77
+ except StopIteration:
78
+ return None
79
+
80
+ def reset(self):
81
+ self.loader = iter(self.ori_loader)
82
+
83
+
84
+ class CUDAPrefetcher():
85
+ """CUDA prefetcher.
86
+
87
+ Ref:
88
+ https://github.com/NVIDIA/apex/issues/304#
89
+
90
+ It may consums more GPU memory.
91
+
92
+ Args:
93
+ loader: Dataloader.
94
+ opt (dict): Options.
95
+ """
96
+
97
+ def __init__(self, loader, opt):
98
+ self.ori_loader = loader
99
+ self.loader = iter(loader)
100
+ self.opt = opt
101
+ self.stream = torch.cuda.Stream()
102
+ self.device = torch.device('cuda' if opt['num_gpu'] != 0 else 'cpu')
103
+ self.preload()
104
+
105
+ def preload(self):
106
+ try:
107
+ self.batch = next(self.loader) # self.batch is a dict
108
+ except StopIteration:
109
+ self.batch = None
110
+ return None
111
+ # put tensors to gpu
112
+ with torch.cuda.stream(self.stream):
113
+ for k, v in self.batch.items():
114
+ if torch.is_tensor(v):
115
+ self.batch[k] = self.batch[k].to(
116
+ device=self.device, non_blocking=True)
117
+
118
+ def next(self):
119
+ torch.cuda.current_stream().wait_stream(self.stream)
120
+ batch = self.batch
121
+ self.preload()
122
+ return batch
123
+
124
+ def reset(self):
125
+ self.loader = iter(self.ori_loader)
126
+ self.preload()
basicsr/data/single_image_dataset.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from os import path as osp
2
+ from torch.utils import data as data
3
+ from torchvision.transforms.functional import normalize
4
+
5
+ from basicsr.data.data_util import paths_from_lmdb
6
+ from basicsr.utils import FileClient, imfrombytes, img2tensor, scandir
7
+
8
+
9
+ class SingleImageDataset(data.Dataset):
10
+ """Read only lq images in the test phase.
11
+
12
+ Read LQ (Low Quality, e.g. LR (Low Resolution), blurry, noisy, etc).
13
+
14
+ There are two modes:
15
+ 1. 'meta_info_file': Use meta information file to generate paths.
16
+ 2. 'folder': Scan folders to generate paths.
17
+
18
+ Args:
19
+ opt (dict): Config for train datasets. It contains the following keys:
20
+ dataroot_lq (str): Data root path for lq.
21
+ meta_info_file (str): Path for meta information file.
22
+ io_backend (dict): IO backend type and other kwarg.
23
+ """
24
+
25
+ def __init__(self, opt):
26
+ super(SingleImageDataset, self).__init__()
27
+ self.opt = opt
28
+ # file client (io backend)
29
+ self.file_client = None
30
+ self.io_backend_opt = opt['io_backend']
31
+ self.mean = opt['mean'] if 'mean' in opt else None
32
+ self.std = opt['std'] if 'std' in opt else None
33
+ self.lq_folder = opt['dataroot_lq']
34
+
35
+ if self.io_backend_opt['type'] == 'lmdb':
36
+ self.io_backend_opt['db_paths'] = [self.lq_folder]
37
+ self.io_backend_opt['client_keys'] = ['lq']
38
+ self.paths = paths_from_lmdb(self.lq_folder)
39
+ elif 'meta_info_file' in self.opt:
40
+ with open(self.opt['meta_info_file'], 'r') as fin:
41
+ self.paths = [
42
+ osp.join(self.lq_folder,
43
+ line.split(' ')[0]) for line in fin
44
+ ]
45
+ else:
46
+ self.paths = sorted(list(scandir(self.lq_folder, full_path=True)))
47
+
48
+ def __getitem__(self, index):
49
+ if self.file_client is None:
50
+ self.file_client = FileClient(
51
+ self.io_backend_opt.pop('type'), **self.io_backend_opt)
52
+
53
+ # load lq image
54
+ lq_path = self.paths[index]
55
+ img_bytes = self.file_client.get(lq_path, 'lq')
56
+ img_lq = imfrombytes(img_bytes, float32=True)
57
+
58
+ # TODO: color space transform
59
+ # BGR to RGB, HWC to CHW, numpy to tensor
60
+ img_lq = img2tensor(img_lq, bgr2rgb=True, float32=True)
61
+ # normalize
62
+ if self.mean is not None or self.std is not None:
63
+ normalize(img_lq, self.mean, self.std, inplace=True)
64
+ return {'lq': img_lq, 'lq_path': lq_path}
65
+
66
+ def __len__(self):
67
+ return len(self.paths)
basicsr/data/transforms.py ADDED
@@ -0,0 +1,275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import random
3
+ import numpy as np
4
+
5
+ def mod_crop(img, scale):
6
+ """Mod crop images, used during testing.
7
+
8
+ Args:
9
+ img (ndarray): Input image.
10
+ scale (int): Scale factor.
11
+
12
+ Returns:
13
+ ndarray: Result image.
14
+ """
15
+ img = img.copy()
16
+ if img.ndim in (2, 3):
17
+ h, w = img.shape[0], img.shape[1]
18
+ h_remainder, w_remainder = h % scale, w % scale
19
+ img = img[:h - h_remainder, :w - w_remainder, ...]
20
+ else:
21
+ raise ValueError(f'Wrong img ndim: {img.ndim}.')
22
+ return img
23
+
24
+ def paired_random_crop(img_gts, img_lqs, lq_patch_size, scale, gt_path):
25
+ """Paired random crop.
26
+
27
+ It crops lists of lq and gt images with corresponding locations.
28
+
29
+ Args:
30
+ img_gts (list[ndarray] | ndarray): GT images. Note that all images
31
+ should have the same shape. If the input is an ndarray, it will
32
+ be transformed to a list containing itself.
33
+ img_lqs (list[ndarray] | ndarray): LQ images. Note that all images
34
+ should have the same shape. If the input is an ndarray, it will
35
+ be transformed to a list containing itself.
36
+ lq_patch_size (int): LQ patch size.
37
+ scale (int): Scale factor.
38
+ gt_path (str): Path to ground-truth.
39
+
40
+ Returns:
41
+ list[ndarray] | ndarray: GT images and LQ images. If returned results
42
+ only have one element, just return ndarray.
43
+ """
44
+
45
+ if not isinstance(img_gts, list):
46
+ img_gts = [img_gts]
47
+ if not isinstance(img_lqs, list):
48
+ img_lqs = [img_lqs]
49
+
50
+ h_lq, w_lq, _ = img_lqs[0].shape
51
+ h_gt, w_gt, _ = img_gts[0].shape
52
+ gt_patch_size = int(lq_patch_size * scale)
53
+
54
+ if h_gt != h_lq * scale or w_gt != w_lq * scale:
55
+ raise ValueError(
56
+ f'Scale mismatches. GT ({h_gt}, {w_gt}) is not {scale}x ',
57
+ f'multiplication of LQ ({h_lq}, {w_lq}).')
58
+ if h_lq < lq_patch_size or w_lq < lq_patch_size:
59
+ raise ValueError(f'LQ ({h_lq}, {w_lq}) is smaller than patch size '
60
+ f'({lq_patch_size}, {lq_patch_size}). '
61
+ f'Please remove {gt_path}.')
62
+
63
+ # randomly choose top and left coordinates for lq patch
64
+ top = random.randint(0, h_lq - lq_patch_size)
65
+ left = random.randint(0, w_lq - lq_patch_size)
66
+
67
+ # crop lq patch
68
+ img_lqs = [
69
+ v[top:top + lq_patch_size, left:left + lq_patch_size, ...]
70
+ for v in img_lqs
71
+ ]
72
+
73
+ # crop corresponding gt patch
74
+ top_gt, left_gt = int(top * scale), int(left * scale)
75
+ img_gts = [
76
+ v[top_gt:top_gt + gt_patch_size, left_gt:left_gt + gt_patch_size, ...]
77
+ for v in img_gts
78
+ ]
79
+ if len(img_gts) == 1:
80
+ img_gts = img_gts[0]
81
+ if len(img_lqs) == 1:
82
+ img_lqs = img_lqs[0]
83
+ return img_gts, img_lqs
84
+
85
+ def paired_random_crop_DP(img_lqLs, img_lqRs, img_gts, gt_patch_size, scale, gt_path):
86
+ if not isinstance(img_gts, list):
87
+ img_gts = [img_gts]
88
+ if not isinstance(img_lqLs, list):
89
+ img_lqLs = [img_lqLs]
90
+ if not isinstance(img_lqRs, list):
91
+ img_lqRs = [img_lqRs]
92
+
93
+ h_lq, w_lq, _ = img_lqLs[0].shape
94
+ h_gt, w_gt, _ = img_gts[0].shape
95
+ lq_patch_size = gt_patch_size // scale
96
+
97
+ if h_gt != h_lq * scale or w_gt != w_lq * scale:
98
+ raise ValueError(
99
+ f'Scale mismatches. GT ({h_gt}, {w_gt}) is not {scale}x ',
100
+ f'multiplication of LQ ({h_lq}, {w_lq}).')
101
+ if h_lq < lq_patch_size or w_lq < lq_patch_size:
102
+ raise ValueError(f'LQ ({h_lq}, {w_lq}) is smaller than patch size '
103
+ f'({lq_patch_size}, {lq_patch_size}). '
104
+ f'Please remove {gt_path}.')
105
+
106
+ # randomly choose top and left coordinates for lq patch
107
+ top = random.randint(0, h_lq - lq_patch_size)
108
+ left = random.randint(0, w_lq - lq_patch_size)
109
+
110
+ # crop lq patch
111
+ img_lqLs = [
112
+ v[top:top + lq_patch_size, left:left + lq_patch_size, ...]
113
+ for v in img_lqLs
114
+ ]
115
+
116
+ img_lqRs = [
117
+ v[top:top + lq_patch_size, left:left + lq_patch_size, ...]
118
+ for v in img_lqRs
119
+ ]
120
+
121
+ # crop corresponding gt patch
122
+ top_gt, left_gt = int(top * scale), int(left * scale)
123
+ img_gts = [
124
+ v[top_gt:top_gt + gt_patch_size, left_gt:left_gt + gt_patch_size, ...]
125
+ for v in img_gts
126
+ ]
127
+ if len(img_gts) == 1:
128
+ img_gts = img_gts[0]
129
+ if len(img_lqLs) == 1:
130
+ img_lqLs = img_lqLs[0]
131
+ if len(img_lqRs) == 1:
132
+ img_lqRs = img_lqRs[0]
133
+ return img_lqLs, img_lqRs, img_gts
134
+
135
+
136
+ def augment(imgs, hflip=True, rotation=True, flows=None, return_status=False):
137
+ """Augment: horizontal flips OR rotate (0, 90, 180, 270 degrees).
138
+
139
+ We use vertical flip and transpose for rotation implementation.
140
+ All the images in the list use the same augmentation.
141
+
142
+ Args:
143
+ imgs (list[ndarray] | ndarray): Images to be augmented. If the input
144
+ is an ndarray, it will be transformed to a list.
145
+ hflip (bool): Horizontal flip. Default: True.
146
+ rotation (bool): Ratotation. Default: True.
147
+ flows (list[ndarray]: Flows to be augmented. If the input is an
148
+ ndarray, it will be transformed to a list.
149
+ Dimension is (h, w, 2). Default: None.
150
+ return_status (bool): Return the status of flip and rotation.
151
+ Default: False.
152
+
153
+ Returns:
154
+ list[ndarray] | ndarray: Augmented images and flows. If returned
155
+ results only have one element, just return ndarray.
156
+
157
+ """
158
+ hflip = hflip and random.random() < 0.5
159
+ vflip = rotation and random.random() < 0.5
160
+ rot90 = rotation and random.random() < 0.5
161
+
162
+ def _augment(img):
163
+ if hflip: # horizontal
164
+ cv2.flip(img, 1, img)
165
+ if vflip: # vertical
166
+ cv2.flip(img, 0, img)
167
+ if rot90:
168
+ img = img.transpose(1, 0, 2)
169
+ return img
170
+
171
+ def _augment_flow(flow):
172
+ if hflip: # horizontal
173
+ cv2.flip(flow, 1, flow)
174
+ flow[:, :, 0] *= -1
175
+ if vflip: # vertical
176
+ cv2.flip(flow, 0, flow)
177
+ flow[:, :, 1] *= -1
178
+ if rot90:
179
+ flow = flow.transpose(1, 0, 2)
180
+ flow = flow[:, :, [1, 0]]
181
+ return flow
182
+
183
+ if not isinstance(imgs, list):
184
+ imgs = [imgs]
185
+ imgs = [_augment(img) for img in imgs]
186
+ if len(imgs) == 1:
187
+ imgs = imgs[0]
188
+
189
+ if flows is not None:
190
+ if not isinstance(flows, list):
191
+ flows = [flows]
192
+ flows = [_augment_flow(flow) for flow in flows]
193
+ if len(flows) == 1:
194
+ flows = flows[0]
195
+ return imgs, flows
196
+ else:
197
+ if return_status:
198
+ return imgs, (hflip, vflip, rot90)
199
+ else:
200
+ return imgs
201
+
202
+
203
+ def img_rotate(img, angle, center=None, scale=1.0):
204
+ """Rotate image.
205
+
206
+ Args:
207
+ img (ndarray): Image to be rotated.
208
+ angle (float): Rotation angle in degrees. Positive values mean
209
+ counter-clockwise rotation.
210
+ center (tuple[int]): Rotation center. If the center is None,
211
+ initialize it as the center of the image. Default: None.
212
+ scale (float): Isotropic scale factor. Default: 1.0.
213
+ """
214
+ (h, w) = img.shape[:2]
215
+
216
+ if center is None:
217
+ center = (w // 2, h // 2)
218
+
219
+ matrix = cv2.getRotationMatrix2D(center, angle, scale)
220
+ rotated_img = cv2.warpAffine(img, matrix, (w, h))
221
+ return rotated_img
222
+
223
+ def data_augmentation(image, mode):
224
+ """
225
+ Performs data augmentation of the input image
226
+ Input:
227
+ image: a cv2 (OpenCV) image
228
+ mode: int. Choice of transformation to apply to the image
229
+ 0 - no transformation
230
+ 1 - flip up and down
231
+ 2 - rotate counterwise 90 degree
232
+ 3 - rotate 90 degree and flip up and down
233
+ 4 - rotate 180 degree
234
+ 5 - rotate 180 degree and flip
235
+ 6 - rotate 270 degree
236
+ 7 - rotate 270 degree and flip
237
+ """
238
+ if mode == 0:
239
+ # original
240
+ out = image
241
+ elif mode == 1:
242
+ # flip up and down
243
+ out = np.flipud(image)
244
+ elif mode == 2:
245
+ # rotate counterwise 90 degree
246
+ out = np.rot90(image)
247
+ elif mode == 3:
248
+ # rotate 90 degree and flip up and down
249
+ out = np.rot90(image)
250
+ out = np.flipud(out)
251
+ elif mode == 4:
252
+ # rotate 180 degree
253
+ out = np.rot90(image, k=2)
254
+ elif mode == 5:
255
+ # rotate 180 degree and flip
256
+ out = np.rot90(image, k=2)
257
+ out = np.flipud(out)
258
+ elif mode == 6:
259
+ # rotate 270 degree
260
+ out = np.rot90(image, k=3)
261
+ elif mode == 7:
262
+ # rotate 270 degree and flip
263
+ out = np.rot90(image, k=3)
264
+ out = np.flipud(out)
265
+ else:
266
+ raise Exception('Invalid choice of image transformation')
267
+
268
+ return out
269
+
270
+ def random_augmentation(*args):
271
+ out = []
272
+ flag_aug = random.randint(0,7)
273
+ for data in args:
274
+ out.append(data_augmentation(data, flag_aug).copy())
275
+ return out
basicsr/data/video_test_dataset.py ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import glob
2
+ import torch
3
+ from os import path as osp
4
+ from torch.utils import data as data
5
+
6
+ from basicsr.data.data_util import (duf_downsample, generate_frame_indices,
7
+ read_img_seq)
8
+ from basicsr.utils import get_root_logger, scandir
9
+
10
+
11
+ class VideoTestDataset(data.Dataset):
12
+ """Video test dataset.
13
+
14
+ Supported datasets: Vid4, REDS4, REDSofficial.
15
+ More generally, it supports testing dataset with following structures:
16
+
17
+ dataroot
18
+ ├── subfolder1
19
+ ├── frame000
20
+ ├── frame001
21
+ ├── ...
22
+ ├── subfolder1
23
+ ├── frame000
24
+ ├── frame001
25
+ ├── ...
26
+ ├── ...
27
+
28
+ For testing datasets, there is no need to prepare LMDB files.
29
+
30
+ Args:
31
+ opt (dict): Config for train dataset. It contains the following keys:
32
+ dataroot_gt (str): Data root path for gt.
33
+ dataroot_lq (str): Data root path for lq.
34
+ io_backend (dict): IO backend type and other kwarg.
35
+ cache_data (bool): Whether to cache testing datasets.
36
+ name (str): Dataset name.
37
+ meta_info_file (str): The path to the file storing the list of test
38
+ folders. If not provided, all the folders in the dataroot will
39
+ be used.
40
+ num_frame (int): Window size for input frames.
41
+ padding (str): Padding mode.
42
+ """
43
+
44
+ def __init__(self, opt):
45
+ super(VideoTestDataset, self).__init__()
46
+ self.opt = opt
47
+ self.cache_data = opt['cache_data']
48
+ self.gt_root, self.lq_root = opt['dataroot_gt'], opt['dataroot_lq']
49
+ self.data_info = {
50
+ 'lq_path': [],
51
+ 'gt_path': [],
52
+ 'folder': [],
53
+ 'idx': [],
54
+ 'border': []
55
+ }
56
+ # file client (io backend)
57
+ self.file_client = None
58
+ self.io_backend_opt = opt['io_backend']
59
+ assert self.io_backend_opt[
60
+ 'type'] != 'lmdb', 'No need to use lmdb during validation/test.'
61
+
62
+ logger = get_root_logger()
63
+ logger.info(f'Generate data info for VideoTestDataset - {opt["name"]}')
64
+ self.imgs_lq, self.imgs_gt = {}, {}
65
+ if 'meta_info_file' in opt:
66
+ with open(opt['meta_info_file'], 'r') as fin:
67
+ subfolders = [line.split(' ')[0] for line in fin]
68
+ subfolders_lq = [
69
+ osp.join(self.lq_root, key) for key in subfolders
70
+ ]
71
+ subfolders_gt = [
72
+ osp.join(self.gt_root, key) for key in subfolders
73
+ ]
74
+ else:
75
+ subfolders_lq = sorted(glob.glob(osp.join(self.lq_root, '*')))
76
+ subfolders_gt = sorted(glob.glob(osp.join(self.gt_root, '*')))
77
+
78
+ if opt['name'].lower() in ['vid4', 'reds4', 'redsofficial']:
79
+ for subfolder_lq, subfolder_gt in zip(subfolders_lq,
80
+ subfolders_gt):
81
+ # get frame list for lq and gt
82
+ subfolder_name = osp.basename(subfolder_lq)
83
+ img_paths_lq = sorted(
84
+ list(scandir(subfolder_lq, full_path=True)))
85
+ img_paths_gt = sorted(
86
+ list(scandir(subfolder_gt, full_path=True)))
87
+
88
+ max_idx = len(img_paths_lq)
89
+ assert max_idx == len(img_paths_gt), (
90
+ f'Different number of images in lq ({max_idx})'
91
+ f' and gt folders ({len(img_paths_gt)})')
92
+
93
+ self.data_info['lq_path'].extend(img_paths_lq)
94
+ self.data_info['gt_path'].extend(img_paths_gt)
95
+ self.data_info['folder'].extend([subfolder_name] * max_idx)
96
+ for i in range(max_idx):
97
+ self.data_info['idx'].append(f'{i}/{max_idx}')
98
+ border_l = [0] * max_idx
99
+ for i in range(self.opt['num_frame'] // 2):
100
+ border_l[i] = 1
101
+ border_l[max_idx - i - 1] = 1
102
+ self.data_info['border'].extend(border_l)
103
+
104
+ # cache data or save the frame list
105
+ if self.cache_data:
106
+ logger.info(
107
+ f'Cache {subfolder_name} for VideoTestDataset...')
108
+ self.imgs_lq[subfolder_name] = read_img_seq(img_paths_lq)
109
+ self.imgs_gt[subfolder_name] = read_img_seq(img_paths_gt)
110
+ else:
111
+ self.imgs_lq[subfolder_name] = img_paths_lq
112
+ self.imgs_gt[subfolder_name] = img_paths_gt
113
+ else:
114
+ raise ValueError(
115
+ f'Non-supported video test dataset: {type(opt["name"])}')
116
+
117
+ def __getitem__(self, index):
118
+ folder = self.data_info['folder'][index]
119
+ idx, max_idx = self.data_info['idx'][index].split('/')
120
+ idx, max_idx = int(idx), int(max_idx)
121
+ border = self.data_info['border'][index]
122
+ lq_path = self.data_info['lq_path'][index]
123
+
124
+ select_idx = generate_frame_indices(
125
+ idx, max_idx, self.opt['num_frame'], padding=self.opt['padding'])
126
+
127
+ if self.cache_data:
128
+ imgs_lq = self.imgs_lq[folder].index_select(
129
+ 0, torch.LongTensor(select_idx))
130
+ img_gt = self.imgs_gt[folder][idx]
131
+ else:
132
+ img_paths_lq = [self.imgs_lq[folder][i] for i in select_idx]
133
+ imgs_lq = read_img_seq(img_paths_lq)
134
+ img_gt = read_img_seq([self.imgs_gt[folder][idx]])
135
+ img_gt.squeeze_(0)
136
+
137
+ return {
138
+ 'lq': imgs_lq, # (t, c, h, w)
139
+ 'gt': img_gt, # (c, h, w)
140
+ 'folder': folder, # folder name
141
+ 'idx': self.data_info['idx'][index], # e.g., 0/99
142
+ 'border': border, # 1 for border, 0 for non-border
143
+ 'lq_path': lq_path # center frame
144
+ }
145
+
146
+ def __len__(self):
147
+ return len(self.data_info['gt_path'])
148
+
149
+
150
+ class VideoTestVimeo90KDataset(data.Dataset):
151
+ """Video test dataset for Vimeo90k-Test dataset.
152
+
153
+ It only keeps the center frame for testing.
154
+ For testing datasets, there is no need to prepare LMDB files.
155
+
156
+ Args:
157
+ opt (dict): Config for train dataset. It contains the following keys:
158
+ dataroot_gt (str): Data root path for gt.
159
+ dataroot_lq (str): Data root path for lq.
160
+ io_backend (dict): IO backend type and other kwarg.
161
+ cache_data (bool): Whether to cache testing datasets.
162
+ name (str): Dataset name.
163
+ meta_info_file (str): The path to the file storing the list of test
164
+ folders. If not provided, all the folders in the dataroot will
165
+ be used.
166
+ num_frame (int): Window size for input frames.
167
+ padding (str): Padding mode.
168
+ """
169
+
170
+ def __init__(self, opt):
171
+ super(VideoTestVimeo90KDataset, self).__init__()
172
+ self.opt = opt
173
+ self.cache_data = opt['cache_data']
174
+ if self.cache_data:
175
+ raise NotImplementedError(
176
+ 'cache_data in Vimeo90K-Test dataset is not implemented.')
177
+ self.gt_root, self.lq_root = opt['dataroot_gt'], opt['dataroot_lq']
178
+ self.data_info = {
179
+ 'lq_path': [],
180
+ 'gt_path': [],
181
+ 'folder': [],
182
+ 'idx': [],
183
+ 'border': []
184
+ }
185
+ neighbor_list = [
186
+ i + (9 - opt['num_frame']) // 2 for i in range(opt['num_frame'])
187
+ ]
188
+
189
+ # file client (io backend)
190
+ self.file_client = None
191
+ self.io_backend_opt = opt['io_backend']
192
+ assert self.io_backend_opt[
193
+ 'type'] != 'lmdb', 'No need to use lmdb during validation/test.'
194
+
195
+ logger = get_root_logger()
196
+ logger.info(f'Generate data info for VideoTestDataset - {opt["name"]}')
197
+ with open(opt['meta_info_file'], 'r') as fin:
198
+ subfolders = [line.split(' ')[0] for line in fin]
199
+ for idx, subfolder in enumerate(subfolders):
200
+ gt_path = osp.join(self.gt_root, subfolder, 'im4.png')
201
+ self.data_info['gt_path'].append(gt_path)
202
+ lq_paths = [
203
+ osp.join(self.lq_root, subfolder, f'im{i}.png')
204
+ for i in neighbor_list
205
+ ]
206
+ self.data_info['lq_path'].append(lq_paths)
207
+ self.data_info['folder'].append('vimeo90k')
208
+ self.data_info['idx'].append(f'{idx}/{len(subfolders)}')
209
+ self.data_info['border'].append(0)
210
+
211
+ def __getitem__(self, index):
212
+ lq_path = self.data_info['lq_path'][index]
213
+ gt_path = self.data_info['gt_path'][index]
214
+ imgs_lq = read_img_seq(lq_path)
215
+ img_gt = read_img_seq([gt_path])
216
+ img_gt.squeeze_(0)
217
+
218
+ return {
219
+ 'lq': imgs_lq, # (t, c, h, w)
220
+ 'gt': img_gt, # (c, h, w)
221
+ 'folder': self.data_info['folder'][index], # folder name
222
+ 'idx': self.data_info['idx'][index], # e.g., 0/843
223
+ 'border': self.data_info['border'][index], # 0 for non-border
224
+ 'lq_path': lq_path[self.opt['num_frame'] // 2] # center frame
225
+ }
226
+
227
+ def __len__(self):
228
+ return len(self.data_info['gt_path'])
229
+
230
+
231
+ class VideoTestDUFDataset(VideoTestDataset):
232
+ """ Video test dataset for DUF dataset.
233
+
234
+ Args:
235
+ opt (dict): Config for train dataset.
236
+ Most of keys are the same as VideoTestDataset.
237
+ It has the follwing extra keys:
238
+
239
+ use_duf_downsampling (bool): Whether to use duf downsampling to
240
+ generate low-resolution frames.
241
+ scale (bool): Scale, which will be added automatically.
242
+ """
243
+
244
+ def __getitem__(self, index):
245
+ folder = self.data_info['folder'][index]
246
+ idx, max_idx = self.data_info['idx'][index].split('/')
247
+ idx, max_idx = int(idx), int(max_idx)
248
+ border = self.data_info['border'][index]
249
+ lq_path = self.data_info['lq_path'][index]
250
+
251
+ select_idx = generate_frame_indices(
252
+ idx, max_idx, self.opt['num_frame'], padding=self.opt['padding'])
253
+
254
+ if self.cache_data:
255
+ if self.opt['use_duf_downsampling']:
256
+ # read imgs_gt to generate low-resolution frames
257
+ imgs_lq = self.imgs_gt[folder].index_select(
258
+ 0, torch.LongTensor(select_idx))
259
+ imgs_lq = duf_downsample(
260
+ imgs_lq, kernel_size=13, scale=self.opt['scale'])
261
+ else:
262
+ imgs_lq = self.imgs_lq[folder].index_select(
263
+ 0, torch.LongTensor(select_idx))
264
+ img_gt = self.imgs_gt[folder][idx]
265
+ else:
266
+ if self.opt['use_duf_downsampling']:
267
+ img_paths_lq = [self.imgs_gt[folder][i] for i in select_idx]
268
+ # read imgs_gt to generate low-resolution frames
269
+ imgs_lq = read_img_seq(
270
+ img_paths_lq,
271
+ require_mod_crop=True,
272
+ scale=self.opt['scale'])
273
+ imgs_lq = duf_downsample(
274
+ imgs_lq, kernel_size=13, scale=self.opt['scale'])
275
+ else:
276
+ img_paths_lq = [self.imgs_lq[folder][i] for i in select_idx]
277
+ imgs_lq = read_img_seq(img_paths_lq)
278
+ img_gt = read_img_seq([self.imgs_gt[folder][idx]],
279
+ require_mod_crop=True,
280
+ scale=self.opt['scale'])
281
+ img_gt.squeeze_(0)
282
+
283
+ return {
284
+ 'lq': imgs_lq, # (t, c, h, w)
285
+ 'gt': img_gt, # (c, h, w)
286
+ 'folder': folder, # folder name
287
+ 'idx': self.data_info['idx'][index], # e.g., 0/99
288
+ 'border': border, # 1 for border, 0 for non-border
289
+ 'lq_path': lq_path # center frame
290
+ }
291
+
292
+
293
+ class VideoRecurrentTestDataset(VideoTestDataset):
294
+ """Video test dataset for recurrent architectures, which takes LR video
295
+ frames as input and output corresponding HR video frames.
296
+
297
+ Args:
298
+ Same as VideoTestDataset.
299
+ Unused opt:
300
+ padding (str): Padding mode.
301
+
302
+ """
303
+
304
+ def __init__(self, opt):
305
+ super(VideoRecurrentTestDataset, self).__init__(opt)
306
+ # Find unique folder strings
307
+ self.folders = sorted(list(set(self.data_info['folder'])))
308
+
309
+ def __getitem__(self, index):
310
+ folder = self.folders[index]
311
+
312
+ if self.cache_data:
313
+ imgs_lq = self.imgs_lq[folder]
314
+ imgs_gt = self.imgs_gt[folder]
315
+ else:
316
+ raise NotImplementedError('Without cache_data is not implemented.')
317
+
318
+ return {
319
+ 'lq': imgs_lq,
320
+ 'gt': imgs_gt,
321
+ 'folder': folder,
322
+ }
323
+
324
+ def __len__(self):
325
+ return len(self.folders)
basicsr/metrics/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ from .niqe import calculate_niqe
2
+ from .psnr_ssim import calculate_psnr, calculate_ssim
3
+
4
+ __all__ = ['calculate_psnr', 'calculate_ssim', 'calculate_niqe']
basicsr/metrics/__pycache__/__init__.cpython-38.pyc ADDED
Binary file (313 Bytes). View file
 
basicsr/metrics/__pycache__/metric_util.cpython-38.pyc ADDED
Binary file (1.51 kB). View file
 
basicsr/metrics/__pycache__/niqe.cpython-38.pyc ADDED
Binary file (6.49 kB). View file
 
basicsr/metrics/__pycache__/psnr_ssim.cpython-38.pyc ADDED
Binary file (7.61 kB). View file
 
basicsr/metrics/fid.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ import torch.nn as nn
4
+ from scipy import linalg
5
+ from tqdm import tqdm
6
+
7
+ from basicsr.models.archs.inception import InceptionV3
8
+
9
+
10
+ def load_patched_inception_v3(device='cuda',
11
+ resize_input=True,
12
+ normalize_input=False):
13
+ # we may not resize the input, but in [rosinality/stylegan2-pytorch] it
14
+ # does resize the input.
15
+ inception = InceptionV3([3],
16
+ resize_input=resize_input,
17
+ normalize_input=normalize_input)
18
+ inception = nn.DataParallel(inception).eval().to(device)
19
+ return inception
20
+
21
+
22
+ @torch.no_grad()
23
+ def extract_inception_features(data_generator,
24
+ inception,
25
+ len_generator=None,
26
+ device='cuda'):
27
+ """Extract inception features.
28
+
29
+ Args:
30
+ data_generator (generator): A data generator.
31
+ inception (nn.Module): Inception model.
32
+ len_generator (int): Length of the data_generator to show the
33
+ progressbar. Default: None.
34
+ device (str): Device. Default: cuda.
35
+
36
+ Returns:
37
+ Tensor: Extracted features.
38
+ """
39
+ if len_generator is not None:
40
+ pbar = tqdm(total=len_generator, unit='batch', desc='Extract')
41
+ else:
42
+ pbar = None
43
+ features = []
44
+
45
+ for data in data_generator:
46
+ if pbar:
47
+ pbar.update(1)
48
+ data = data.to(device)
49
+ feature = inception(data)[0].view(data.shape[0], -1)
50
+ features.append(feature.to('cpu'))
51
+ if pbar:
52
+ pbar.close()
53
+ features = torch.cat(features, 0)
54
+ return features
55
+
56
+
57
+ def calculate_fid(mu1, sigma1, mu2, sigma2, eps=1e-6):
58
+ """Numpy implementation of the Frechet Distance.
59
+
60
+ The Frechet distance between two multivariate Gaussians X_1 ~ N(mu_1, C_1)
61
+ and X_2 ~ N(mu_2, C_2) is
62
+ d^2 = ||mu_1 - mu_2||^2 + Tr(C_1 + C_2 - 2*sqrt(C_1*C_2)).
63
+ Stable version by Dougal J. Sutherland.
64
+
65
+ Args:
66
+ mu1 (np.array): The sample mean over activations.
67
+ sigma1 (np.array): The covariance matrix over activations for
68
+ generated samples.
69
+ mu2 (np.array): The sample mean over activations, precalculated on an
70
+ representative data set.
71
+ sigma2 (np.array): The covariance matrix over activations,
72
+ precalculated on an representative data set.
73
+
74
+ Returns:
75
+ float: The Frechet Distance.
76
+ """
77
+ assert mu1.shape == mu2.shape, 'Two mean vectors have different lengths'
78
+ assert sigma1.shape == sigma2.shape, (
79
+ 'Two covariances have different dimensions')
80
+
81
+ cov_sqrt, _ = linalg.sqrtm(sigma1 @ sigma2, disp=False)
82
+
83
+ # Product might be almost singular
84
+ if not np.isfinite(cov_sqrt).all():
85
+ print('Product of cov matrices is singular. Adding {eps} to diagonal '
86
+ 'of cov estimates')
87
+ offset = np.eye(sigma1.shape[0]) * eps
88
+ cov_sqrt = linalg.sqrtm((sigma1 + offset) @ (sigma2 + offset))
89
+
90
+ # Numerical error might give slight imaginary component
91
+ if np.iscomplexobj(cov_sqrt):
92
+ if not np.allclose(np.diagonal(cov_sqrt).imag, 0, atol=1e-3):
93
+ m = np.max(np.abs(cov_sqrt.imag))
94
+ raise ValueError(f'Imaginary component {m}')
95
+ cov_sqrt = cov_sqrt.real
96
+
97
+ mean_diff = mu1 - mu2
98
+ mean_norm = mean_diff @ mean_diff
99
+ trace = np.trace(sigma1) + np.trace(sigma2) - 2 * np.trace(cov_sqrt)
100
+ fid = mean_norm + trace
101
+
102
+ return fid
basicsr/metrics/metric_util.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ from basicsr.utils.matlab_functions import bgr2ycbcr
4
+
5
+
6
+ def reorder_image(img, input_order='HWC'):
7
+ """Reorder images to 'HWC' order.
8
+
9
+ If the input_order is (h, w), return (h, w, 1);
10
+ If the input_order is (c, h, w), return (h, w, c);
11
+ If the input_order is (h, w, c), return as it is.
12
+
13
+ Args:
14
+ img (ndarray): Input image.
15
+ input_order (str): Whether the input order is 'HWC' or 'CHW'.
16
+ If the input image shape is (h, w), input_order will not have
17
+ effects. Default: 'HWC'.
18
+
19
+ Returns:
20
+ ndarray: reordered image.
21
+ """
22
+
23
+ if input_order not in ['HWC', 'CHW']:
24
+ raise ValueError(
25
+ f'Wrong input_order {input_order}. Supported input_orders are '
26
+ "'HWC' and 'CHW'")
27
+ if len(img.shape) == 2:
28
+ img = img[..., None]
29
+ if input_order == 'CHW':
30
+ img = img.transpose(1, 2, 0)
31
+ return img
32
+
33
+
34
+ def to_y_channel(img):
35
+ """Change to Y channel of YCbCr.
36
+
37
+ Args:
38
+ img (ndarray): Images with range [0, 255].
39
+
40
+ Returns:
41
+ (ndarray): Images with range [0, 255] (float type) without round.
42
+ """
43
+ img = img.astype(np.float32) / 255.
44
+ if img.ndim == 3 and img.shape[2] == 3:
45
+ img = bgr2ycbcr(img, y_only=True)
46
+ img = img[..., None]
47
+ return img * 255.
basicsr/metrics/niqe.py ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import math
3
+ import numpy as np
4
+ from scipy.ndimage.filters import convolve
5
+ from scipy.special import gamma
6
+
7
+ from basicsr.metrics.metric_util import reorder_image, to_y_channel
8
+
9
+
10
+ def estimate_aggd_param(block):
11
+ """Estimate AGGD (Asymmetric Generalized Gaussian Distribution) paramters.
12
+
13
+ Args:
14
+ block (ndarray): 2D Image block.
15
+
16
+ Returns:
17
+ tuple: alpha (float), beta_l (float) and beta_r (float) for the AGGD
18
+ distribution (Estimating the parames in Equation 7 in the paper).
19
+ """
20
+ block = block.flatten()
21
+ gam = np.arange(0.2, 10.001, 0.001) # len = 9801
22
+ gam_reciprocal = np.reciprocal(gam)
23
+ r_gam = np.square(gamma(gam_reciprocal * 2)) / (
24
+ gamma(gam_reciprocal) * gamma(gam_reciprocal * 3))
25
+
26
+ left_std = np.sqrt(np.mean(block[block < 0]**2))
27
+ right_std = np.sqrt(np.mean(block[block > 0]**2))
28
+ gammahat = left_std / right_std
29
+ rhat = (np.mean(np.abs(block)))**2 / np.mean(block**2)
30
+ rhatnorm = (rhat * (gammahat**3 + 1) *
31
+ (gammahat + 1)) / ((gammahat**2 + 1)**2)
32
+ array_position = np.argmin((r_gam - rhatnorm)**2)
33
+
34
+ alpha = gam[array_position]
35
+ beta_l = left_std * np.sqrt(gamma(1 / alpha) / gamma(3 / alpha))
36
+ beta_r = right_std * np.sqrt(gamma(1 / alpha) / gamma(3 / alpha))
37
+ return (alpha, beta_l, beta_r)
38
+
39
+
40
+ def compute_feature(block):
41
+ """Compute features.
42
+
43
+ Args:
44
+ block (ndarray): 2D Image block.
45
+
46
+ Returns:
47
+ list: Features with length of 18.
48
+ """
49
+ feat = []
50
+ alpha, beta_l, beta_r = estimate_aggd_param(block)
51
+ feat.extend([alpha, (beta_l + beta_r) / 2])
52
+
53
+ # distortions disturb the fairly regular structure of natural images.
54
+ # This deviation can be captured by analyzing the sample distribution of
55
+ # the products of pairs of adjacent coefficients computed along
56
+ # horizontal, vertical and diagonal orientations.
57
+ shifts = [[0, 1], [1, 0], [1, 1], [1, -1]]
58
+ for i in range(len(shifts)):
59
+ shifted_block = np.roll(block, shifts[i], axis=(0, 1))
60
+ alpha, beta_l, beta_r = estimate_aggd_param(block * shifted_block)
61
+ # Eq. 8
62
+ mean = (beta_r - beta_l) * (gamma(2 / alpha) / gamma(1 / alpha))
63
+ feat.extend([alpha, mean, beta_l, beta_r])
64
+ return feat
65
+
66
+
67
+ def niqe(img,
68
+ mu_pris_param,
69
+ cov_pris_param,
70
+ gaussian_window,
71
+ block_size_h=96,
72
+ block_size_w=96):
73
+ """Calculate NIQE (Natural Image Quality Evaluator) metric.
74
+
75
+ Ref: Making a "Completely Blind" Image Quality Analyzer.
76
+ This implementation could produce almost the same results as the official
77
+ MATLAB codes: http://live.ece.utexas.edu/research/quality/niqe_release.zip
78
+
79
+ Note that we do not include block overlap height and width, since they are
80
+ always 0 in the official implementation.
81
+
82
+ For good performance, it is advisable by the official implemtation to
83
+ divide the distorted image in to the same size patched as used for the
84
+ construction of multivariate Gaussian model.
85
+
86
+ Args:
87
+ img (ndarray): Input image whose quality needs to be computed. The
88
+ image must be a gray or Y (of YCbCr) image with shape (h, w).
89
+ Range [0, 255] with float type.
90
+ mu_pris_param (ndarray): Mean of a pre-defined multivariate Gaussian
91
+ model calculated on the pristine dataset.
92
+ cov_pris_param (ndarray): Covariance of a pre-defined multivariate
93
+ Gaussian model calculated on the pristine dataset.
94
+ gaussian_window (ndarray): A 7x7 Gaussian window used for smoothing the
95
+ image.
96
+ block_size_h (int): Height of the blocks in to which image is divided.
97
+ Default: 96 (the official recommended value).
98
+ block_size_w (int): Width of the blocks in to which image is divided.
99
+ Default: 96 (the official recommended value).
100
+ """
101
+ assert img.ndim == 2, (
102
+ 'Input image must be a gray or Y (of YCbCr) image with shape (h, w).')
103
+ # crop image
104
+ h, w = img.shape
105
+ num_block_h = math.floor(h / block_size_h)
106
+ num_block_w = math.floor(w / block_size_w)
107
+ img = img[0:num_block_h * block_size_h, 0:num_block_w * block_size_w]
108
+
109
+ distparam = [] # dist param is actually the multiscale features
110
+ for scale in (1, 2): # perform on two scales (1, 2)
111
+ mu = convolve(img, gaussian_window, mode='nearest')
112
+ sigma = np.sqrt(
113
+ np.abs(
114
+ convolve(np.square(img), gaussian_window, mode='nearest') -
115
+ np.square(mu)))
116
+ # normalize, as in Eq. 1 in the paper
117
+ img_nomalized = (img - mu) / (sigma + 1)
118
+
119
+ feat = []
120
+ for idx_w in range(num_block_w):
121
+ for idx_h in range(num_block_h):
122
+ # process ecah block
123
+ block = img_nomalized[idx_h * block_size_h //
124
+ scale:(idx_h + 1) * block_size_h //
125
+ scale, idx_w * block_size_w //
126
+ scale:(idx_w + 1) * block_size_w //
127
+ scale]
128
+ feat.append(compute_feature(block))
129
+
130
+ distparam.append(np.array(feat))
131
+ # TODO: matlab bicubic downsample with anti-aliasing
132
+ # for simplicity, now we use opencv instead, which will result in
133
+ # a slight difference.
134
+ if scale == 1:
135
+ h, w = img.shape
136
+ img = cv2.resize(
137
+ img / 255., (w // 2, h // 2), interpolation=cv2.INTER_LINEAR)
138
+ img = img * 255.
139
+
140
+ distparam = np.concatenate(distparam, axis=1)
141
+
142
+ # fit a MVG (multivariate Gaussian) model to distorted patch features
143
+ mu_distparam = np.nanmean(distparam, axis=0)
144
+ # use nancov. ref: https://ww2.mathworks.cn/help/stats/nancov.html
145
+ distparam_no_nan = distparam[~np.isnan(distparam).any(axis=1)]
146
+ cov_distparam = np.cov(distparam_no_nan, rowvar=False)
147
+
148
+ # compute niqe quality, Eq. 10 in the paper
149
+ invcov_param = np.linalg.pinv((cov_pris_param + cov_distparam) / 2)
150
+ quality = np.matmul(
151
+ np.matmul((mu_pris_param - mu_distparam), invcov_param),
152
+ np.transpose((mu_pris_param - mu_distparam)))
153
+ quality = np.sqrt(quality)
154
+
155
+ return quality
156
+
157
+
158
+ def calculate_niqe(img, crop_border, input_order='HWC', convert_to='y'):
159
+ """Calculate NIQE (Natural Image Quality Evaluator) metric.
160
+
161
+ Ref: Making a "Completely Blind" Image Quality Analyzer.
162
+ This implementation could produce almost the same results as the official
163
+ MATLAB codes: http://live.ece.utexas.edu/research/quality/niqe_release.zip
164
+
165
+ We use the official params estimated from the pristine dataset.
166
+ We use the recommended block size (96, 96) without overlaps.
167
+
168
+ Args:
169
+ img (ndarray): Input image whose quality needs to be computed.
170
+ The input image must be in range [0, 255] with float/int type.
171
+ The input_order of image can be 'HW' or 'HWC' or 'CHW'. (BGR order)
172
+ If the input order is 'HWC' or 'CHW', it will be converted to gray
173
+ or Y (of YCbCr) image according to the ``convert_to`` argument.
174
+ crop_border (int): Cropped pixels in each edge of an image. These
175
+ pixels are not involved in the metric calculation.
176
+ input_order (str): Whether the input order is 'HW', 'HWC' or 'CHW'.
177
+ Default: 'HWC'.
178
+ convert_to (str): Whether coverted to 'y' (of MATLAB YCbCr) or 'gray'.
179
+ Default: 'y'.
180
+
181
+ Returns:
182
+ float: NIQE result.
183
+ """
184
+
185
+ # we use the official params estimated from the pristine dataset.
186
+ niqe_pris_params = np.load('basicsr/metrics/niqe_pris_params.npz')
187
+ mu_pris_param = niqe_pris_params['mu_pris_param']
188
+ cov_pris_param = niqe_pris_params['cov_pris_param']
189
+ gaussian_window = niqe_pris_params['gaussian_window']
190
+
191
+ img = img.astype(np.float32)
192
+ if input_order != 'HW':
193
+ img = reorder_image(img, input_order=input_order)
194
+ if convert_to == 'y':
195
+ img = to_y_channel(img)
196
+ elif convert_to == 'gray':
197
+ img = cv2.cvtColor(img / 255., cv2.COLOR_BGR2GRAY) * 255.
198
+ img = np.squeeze(img)
199
+
200
+ if crop_border != 0:
201
+ img = img[crop_border:-crop_border, crop_border:-crop_border]
202
+
203
+ niqe_result = niqe(img, mu_pris_param, cov_pris_param, gaussian_window)
204
+
205
+ return niqe_result
basicsr/metrics/niqe_pris_params.npz ADDED
Binary file (11.9 kB). View file
 
basicsr/metrics/psnr_ssim.py ADDED
@@ -0,0 +1,303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+
4
+ from basicsr.metrics.metric_util import reorder_image, to_y_channel
5
+ import skimage.metrics
6
+ import torch
7
+
8
+
9
+ def calculate_psnr(img1,
10
+ img2,
11
+ crop_border,
12
+ input_order='HWC',
13
+ test_y_channel=False):
14
+ """Calculate PSNR (Peak Signal-to-Noise Ratio).
15
+
16
+ Ref: https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio
17
+
18
+ Args:
19
+ img1 (ndarray/tensor): Images with range [0, 255]/[0, 1].
20
+ img2 (ndarray/tensor): Images with range [0, 255]/[0, 1].
21
+ crop_border (int): Cropped pixels in each edge of an image. These
22
+ pixels are not involved in the PSNR calculation.
23
+ input_order (str): Whether the input order is 'HWC' or 'CHW'.
24
+ Default: 'HWC'.
25
+ test_y_channel (bool): Test on Y channel of YCbCr. Default: False.
26
+
27
+ Returns:
28
+ float: psnr result.
29
+ """
30
+
31
+ assert img1.shape == img2.shape, (
32
+ f'Image shapes are differnet: {img1.shape}, {img2.shape}.')
33
+ if input_order not in ['HWC', 'CHW']:
34
+ raise ValueError(
35
+ f'Wrong input_order {input_order}. Supported input_orders are '
36
+ '"HWC" and "CHW"')
37
+ if type(img1) == torch.Tensor:
38
+ if len(img1.shape) == 4:
39
+ img1 = img1.squeeze(0)
40
+ img1 = img1.detach().cpu().numpy().transpose(1,2,0)
41
+ if type(img2) == torch.Tensor:
42
+ if len(img2.shape) == 4:
43
+ img2 = img2.squeeze(0)
44
+ img2 = img2.detach().cpu().numpy().transpose(1,2,0)
45
+
46
+ img1 = reorder_image(img1, input_order=input_order)
47
+ img2 = reorder_image(img2, input_order=input_order)
48
+ img1 = img1.astype(np.float64)
49
+ img2 = img2.astype(np.float64)
50
+
51
+ if crop_border != 0:
52
+ img1 = img1[crop_border:-crop_border, crop_border:-crop_border, ...]
53
+ img2 = img2[crop_border:-crop_border, crop_border:-crop_border, ...]
54
+
55
+ if test_y_channel:
56
+ img1 = to_y_channel(img1)
57
+ img2 = to_y_channel(img2)
58
+
59
+ mse = np.mean((img1 - img2)**2)
60
+ if mse == 0:
61
+ return float('inf')
62
+ max_value = 1. if img1.max() <= 1 else 255.
63
+ return 20. * np.log10(max_value / np.sqrt(mse))
64
+
65
+
66
+ def _ssim(img1, img2):
67
+ """Calculate SSIM (structural similarity) for one channel images.
68
+
69
+ It is called by func:`calculate_ssim`.
70
+
71
+ Args:
72
+ img1 (ndarray): Images with range [0, 255] with order 'HWC'.
73
+ img2 (ndarray): Images with range [0, 255] with order 'HWC'.
74
+
75
+ Returns:
76
+ float: ssim result.
77
+ """
78
+
79
+ C1 = (0.01 * 255)**2
80
+ C2 = (0.03 * 255)**2
81
+
82
+ img1 = img1.astype(np.float64)
83
+ img2 = img2.astype(np.float64)
84
+ kernel = cv2.getGaussianKernel(11, 1.5)
85
+ window = np.outer(kernel, kernel.transpose())
86
+
87
+ mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5]
88
+ mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]
89
+ mu1_sq = mu1**2
90
+ mu2_sq = mu2**2
91
+ mu1_mu2 = mu1 * mu2
92
+ sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq
93
+ sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq
94
+ sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2
95
+
96
+ ssim_map = ((2 * mu1_mu2 + C1) *
97
+ (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *
98
+ (sigma1_sq + sigma2_sq + C2))
99
+ return ssim_map.mean()
100
+
101
+ def prepare_for_ssim(img, k):
102
+ import torch
103
+ with torch.no_grad():
104
+ img = torch.from_numpy(img).unsqueeze(0).unsqueeze(0).float()
105
+ conv = torch.nn.Conv2d(1, 1, k, stride=1, padding=k//2, padding_mode='reflect')
106
+ conv.weight.requires_grad = False
107
+ conv.weight[:, :, :, :] = 1. / (k * k)
108
+
109
+ img = conv(img)
110
+
111
+ img = img.squeeze(0).squeeze(0)
112
+ img = img[0::k, 0::k]
113
+ return img.detach().cpu().numpy()
114
+
115
+ def prepare_for_ssim_rgb(img, k):
116
+ import torch
117
+ with torch.no_grad():
118
+ img = torch.from_numpy(img).float() #HxWx3
119
+
120
+ conv = torch.nn.Conv2d(1, 1, k, stride=1, padding=k // 2, padding_mode='reflect')
121
+ conv.weight.requires_grad = False
122
+ conv.weight[:, :, :, :] = 1. / (k * k)
123
+
124
+ new_img = []
125
+
126
+ for i in range(3):
127
+ new_img.append(conv(img[:, :, i].unsqueeze(0).unsqueeze(0)).squeeze(0).squeeze(0)[0::k, 0::k])
128
+
129
+ return torch.stack(new_img, dim=2).detach().cpu().numpy()
130
+
131
+ def _3d_gaussian_calculator(img, conv3d):
132
+ out = conv3d(img.unsqueeze(0).unsqueeze(0)).squeeze(0).squeeze(0)
133
+ return out
134
+
135
+ def _generate_3d_gaussian_kernel():
136
+ kernel = cv2.getGaussianKernel(11, 1.5)
137
+ window = np.outer(kernel, kernel.transpose())
138
+ kernel_3 = cv2.getGaussianKernel(11, 1.5)
139
+ kernel = torch.tensor(np.stack([window * k for k in kernel_3], axis=0))
140
+ conv3d = torch.nn.Conv3d(1, 1, (11, 11, 11), stride=1, padding=(5, 5, 5), bias=False, padding_mode='replicate')
141
+ conv3d.weight.requires_grad = False
142
+ conv3d.weight[0, 0, :, :, :] = kernel
143
+ return conv3d
144
+
145
+ def _ssim_3d(img1, img2, max_value):
146
+ assert len(img1.shape) == 3 and len(img2.shape) == 3
147
+ """Calculate SSIM (structural similarity) for one channel images.
148
+
149
+ It is called by func:`calculate_ssim`.
150
+
151
+ Args:
152
+ img1 (ndarray): Images with range [0, 255]/[0, 1] with order 'HWC'.
153
+ img2 (ndarray): Images with range [0, 255]/[0, 1] with order 'HWC'.
154
+
155
+ Returns:
156
+ float: ssim result.
157
+ """
158
+ C1 = (0.01 * max_value) ** 2
159
+ C2 = (0.03 * max_value) ** 2
160
+ img1 = img1.astype(np.float64)
161
+ img2 = img2.astype(np.float64)
162
+
163
+ kernel = _generate_3d_gaussian_kernel().cuda()
164
+
165
+ img1 = torch.tensor(img1).float().cuda()
166
+ img2 = torch.tensor(img2).float().cuda()
167
+
168
+
169
+ mu1 = _3d_gaussian_calculator(img1, kernel)
170
+ mu2 = _3d_gaussian_calculator(img2, kernel)
171
+
172
+ mu1_sq = mu1 ** 2
173
+ mu2_sq = mu2 ** 2
174
+ mu1_mu2 = mu1 * mu2
175
+ sigma1_sq = _3d_gaussian_calculator(img1 ** 2, kernel) - mu1_sq
176
+ sigma2_sq = _3d_gaussian_calculator(img2 ** 2, kernel) - mu2_sq
177
+ sigma12 = _3d_gaussian_calculator(img1*img2, kernel) - mu1_mu2
178
+
179
+ ssim_map = ((2 * mu1_mu2 + C1) *
180
+ (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *
181
+ (sigma1_sq + sigma2_sq + C2))
182
+ return float(ssim_map.mean())
183
+
184
+ def _ssim_cly(img1, img2):
185
+ assert len(img1.shape) == 2 and len(img2.shape) == 2
186
+ """Calculate SSIM (structural similarity) for one channel images.
187
+
188
+ It is called by func:`calculate_ssim`.
189
+
190
+ Args:
191
+ img1 (ndarray): Images with range [0, 255] with order 'HWC'.
192
+ img2 (ndarray): Images with range [0, 255] with order 'HWC'.
193
+
194
+ Returns:
195
+ float: ssim result.
196
+ """
197
+
198
+ C1 = (0.01 * 255)**2
199
+ C2 = (0.03 * 255)**2
200
+ img1 = img1.astype(np.float64)
201
+ img2 = img2.astype(np.float64)
202
+
203
+ kernel = cv2.getGaussianKernel(11, 1.5)
204
+ # print(kernel)
205
+ window = np.outer(kernel, kernel.transpose())
206
+
207
+ bt = cv2.BORDER_REPLICATE
208
+
209
+ mu1 = cv2.filter2D(img1, -1, window, borderType=bt)
210
+ mu2 = cv2.filter2D(img2, -1, window,borderType=bt)
211
+
212
+ mu1_sq = mu1**2
213
+ mu2_sq = mu2**2
214
+ mu1_mu2 = mu1 * mu2
215
+ sigma1_sq = cv2.filter2D(img1**2, -1, window, borderType=bt) - mu1_sq
216
+ sigma2_sq = cv2.filter2D(img2**2, -1, window, borderType=bt) - mu2_sq
217
+ sigma12 = cv2.filter2D(img1 * img2, -1, window, borderType=bt) - mu1_mu2
218
+
219
+ ssim_map = ((2 * mu1_mu2 + C1) *
220
+ (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *
221
+ (sigma1_sq + sigma2_sq + C2))
222
+ return ssim_map.mean()
223
+
224
+
225
+ def calculate_ssim(img1,
226
+ img2,
227
+ crop_border,
228
+ input_order='HWC',
229
+ test_y_channel=False):
230
+ """Calculate SSIM (structural similarity).
231
+
232
+ Ref:
233
+ Image quality assessment: From error visibility to structural similarity
234
+
235
+ The results are the same as that of the official released MATLAB code in
236
+ https://ece.uwaterloo.ca/~z70wang/research/ssim/.
237
+
238
+ For three-channel images, SSIM is calculated for each channel and then
239
+ averaged.
240
+
241
+ Args:
242
+ img1 (ndarray): Images with range [0, 255].
243
+ img2 (ndarray): Images with range [0, 255].
244
+ crop_border (int): Cropped pixels in each edge of an image. These
245
+ pixels are not involved in the SSIM calculation.
246
+ input_order (str): Whether the input order is 'HWC' or 'CHW'.
247
+ Default: 'HWC'.
248
+ test_y_channel (bool): Test on Y channel of YCbCr. Default: False.
249
+
250
+ Returns:
251
+ float: ssim result.
252
+ """
253
+
254
+ assert img1.shape == img2.shape, (
255
+ f'Image shapes are differnet: {img1.shape}, {img2.shape}.')
256
+ if input_order not in ['HWC', 'CHW']:
257
+ raise ValueError(
258
+ f'Wrong input_order {input_order}. Supported input_orders are '
259
+ '"HWC" and "CHW"')
260
+
261
+ if type(img1) == torch.Tensor:
262
+ if len(img1.shape) == 4:
263
+ img1 = img1.squeeze(0)
264
+ img1 = img1.detach().cpu().numpy().transpose(1,2,0)
265
+ if type(img2) == torch.Tensor:
266
+ if len(img2.shape) == 4:
267
+ img2 = img2.squeeze(0)
268
+ img2 = img2.detach().cpu().numpy().transpose(1,2,0)
269
+
270
+ img1 = reorder_image(img1, input_order=input_order)
271
+ img2 = reorder_image(img2, input_order=input_order)
272
+
273
+ img1 = img1.astype(np.float64)
274
+ img2 = img2.astype(np.float64)
275
+
276
+ if crop_border != 0:
277
+ img1 = img1[crop_border:-crop_border, crop_border:-crop_border, ...]
278
+ img2 = img2[crop_border:-crop_border, crop_border:-crop_border, ...]
279
+
280
+ if test_y_channel:
281
+ img1 = to_y_channel(img1)
282
+ img2 = to_y_channel(img2)
283
+ return _ssim_cly(img1[..., 0], img2[..., 0])
284
+
285
+
286
+ ssims = []
287
+ # ssims_before = []
288
+
289
+ # skimage_before = skimage.metrics.structural_similarity(img1, img2, data_range=255., multichannel=True)
290
+ # print('.._skimage',
291
+ # skimage.metrics.structural_similarity(img1, img2, data_range=255., multichannel=True))
292
+ max_value = 1 if img1.max() <= 1 else 255
293
+ with torch.no_grad():
294
+ final_ssim = _ssim_3d(img1, img2, max_value)
295
+ ssims.append(final_ssim)
296
+
297
+ # for i in range(img1.shape[2]):
298
+ # ssims_before.append(_ssim(img1, img2))
299
+
300
+ # print('..ssim mean , new {:.4f} and before {:.4f} .... skimage before {:.4f}'.format(np.array(ssims).mean(), np.array(ssims_before).mean(), skimage_before))
301
+ # ssims.append(skimage.metrics.structural_similarity(img1[..., i], img2[..., i], multichannel=False))
302
+
303
+ return np.array(ssims).mean()
basicsr/models/__init__.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib
2
+ from os import path as osp
3
+
4
+ from basicsr.utils import get_root_logger, scandir
5
+
6
+ # automatically scan and import model modules
7
+ # scan all the files under the 'models' folder and collect files ending with
8
+ # '_model.py'
9
+ model_folder = osp.dirname(osp.abspath(__file__))
10
+ model_filenames = [
11
+ osp.splitext(osp.basename(v))[0] for v in scandir(model_folder)
12
+ if v.endswith('_model.py')
13
+ ]
14
+ # import all the model modules
15
+ _model_modules = [
16
+ importlib.import_module(f'basicsr.models.{file_name}')
17
+ for file_name in model_filenames
18
+ ]
19
+
20
+
21
+ def create_model(opt):
22
+ """Create model.
23
+
24
+ Args:
25
+ opt (dict): Configuration. It constains:
26
+ model_type (str): Model type.
27
+ """
28
+ model_type = opt['model_type']
29
+
30
+ # dynamic instantiation
31
+ for module in _model_modules:
32
+ model_cls = getattr(module, model_type, None)
33
+ if model_cls is not None:
34
+ break
35
+ if model_cls is None:
36
+ raise ValueError(f'Model {model_type} is not found.')
37
+
38
+ model = model_cls(opt)
39
+
40
+ logger = get_root_logger()
41
+ logger.info(f'Model [{model.__class__.__name__}] is created.')
42
+ return model
basicsr/models/__pycache__/__init__.cpython-38.pyc ADDED
Binary file (1.25 kB). View file