sunshangquan commited on
Commit
f518bf0
1 Parent(s): 629756b

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. app.py +7 -7
  8. basicsr/__pycache__/version.cpython-38.pyc +0 -0
  9. basicsr/data/__init__.py +126 -0
  10. basicsr/data/__pycache__/__init__.cpython-38.pyc +0 -0
  11. basicsr/data/__pycache__/data_sampler.cpython-38.pyc +0 -0
  12. basicsr/data/__pycache__/data_util.cpython-38.pyc +0 -0
  13. basicsr/data/__pycache__/ffhq_dataset.cpython-38.pyc +0 -0
  14. basicsr/data/__pycache__/paired_image_dataset.cpython-38.pyc +0 -0
  15. basicsr/data/__pycache__/prefetch_dataloader.cpython-38.pyc +0 -0
  16. basicsr/data/__pycache__/reds_dataset.cpython-38.pyc +0 -0
  17. basicsr/data/__pycache__/single_image_dataset.cpython-38.pyc +0 -0
  18. basicsr/data/__pycache__/transforms.cpython-38.pyc +0 -0
  19. basicsr/data/__pycache__/video_test_dataset.cpython-38.pyc +0 -0
  20. basicsr/data/__pycache__/vimeo90k_dataset.cpython-38.pyc +0 -0
  21. basicsr/data/data_sampler.py +49 -0
  22. basicsr/data/data_util.py +390 -0
  23. basicsr/data/meta_info/meta_info_DIV2K800sub_GT.txt +0 -0
  24. basicsr/data/meta_info/meta_info_REDS4_test_GT.txt +4 -0
  25. basicsr/data/meta_info/meta_info_REDS_GT.txt +270 -0
  26. basicsr/data/meta_info/meta_info_REDSofficial4_test_GT.txt +4 -0
  27. basicsr/data/meta_info/meta_info_REDSval_official_test_GT.txt +30 -0
  28. basicsr/data/meta_info/meta_info_Vimeo90K_test_GT.txt +0 -0
  29. basicsr/data/meta_info/meta_info_Vimeo90K_test_fast_GT.txt +1225 -0
  30. basicsr/data/meta_info/meta_info_Vimeo90K_test_medium_GT.txt +0 -0
  31. basicsr/data/meta_info/meta_info_Vimeo90K_test_slow_GT.txt +1613 -0
  32. basicsr/data/meta_info/meta_info_Vimeo90K_train_GT.txt +0 -0
  33. basicsr/data/paired_image_dataset.py +374 -0
  34. basicsr/data/prefetch_dataloader.py +126 -0
  35. basicsr/data/single_image_dataset.py +67 -0
  36. basicsr/data/transforms.py +275 -0
  37. basicsr/data/video_test_dataset.py +325 -0
  38. basicsr/metrics/__init__.py +4 -0
  39. basicsr/metrics/__pycache__/__init__.cpython-38.pyc +0 -0
  40. basicsr/metrics/__pycache__/metric_util.cpython-38.pyc +0 -0
  41. basicsr/metrics/__pycache__/niqe.cpython-38.pyc +0 -0
  42. basicsr/metrics/__pycache__/psnr_ssim.cpython-38.pyc +0 -0
  43. basicsr/metrics/fid.py +102 -0
  44. basicsr/metrics/metric_util.py +47 -0
  45. basicsr/metrics/niqe.py +205 -0
  46. basicsr/metrics/niqe_pris_params.npz +0 -0
  47. basicsr/metrics/psnr_ssim.py +303 -0
  48. basicsr/models/__init__.py +42 -0
  49. basicsr/models/__pycache__/__init__.cpython-38.pyc +0 -0
  50. basicsr/models/__pycache__/base_model.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)
app.py CHANGED
@@ -2,14 +2,14 @@ import torch
2
  import gradio as gr
3
  import numpy as np
4
  import torch.nn.functional as F
 
5
 
6
  from Allweather.util import load_img, save_img
7
  from basicsr.models.archs.histoformer_arch import Histoformer
8
 
9
- model_restoration = Histoformer()
10
- model, transform = Histoformer.create_model_and_transforms()
11
- model = model.to(device)
12
- model.eval()
13
 
14
  factor = 8
15
  def predict(input_img):
@@ -25,11 +25,11 @@ def predict(input_img):
25
  input_ = F.pad(input_, (0,padw,0,padh), 'reflect')
26
  return input_
27
  prediction = model_restoration(input_)
28
- output_path = "inverse_depth_map.png"
29
- restored = restored[:,:,:h,:w]
30
  restored = torch.clamp(restored,0,1).cpu().detach().permute(0, 2, 3, 1).squeeze(0).numpy()
31
 
32
- save_img((os.path.join(result_dir, os.path.splitext(os.path.split(file_)[-1])[0]+'.png')), img_as_ubyte(restored))
33
 
34
  example_images = [
35
  "examples/example.jpeg",
 
2
  import gradio as gr
3
  import numpy as np
4
  import torch.nn.functional as F
5
+ from skimage import img_as_ubyte
6
 
7
  from Allweather.util import load_img, save_img
8
  from basicsr.models.archs.histoformer_arch import Histoformer
9
 
10
+ model_restoration = Histoformer.from_pretrained("sunsean/Histoformer-real")
11
+
12
+ model_restoration.eval()
 
13
 
14
  factor = 8
15
  def predict(input_img):
 
25
  input_ = F.pad(input_, (0,padw,0,padh), 'reflect')
26
  return input_
27
  prediction = model_restoration(input_)
28
+ output_path = "restored.png"
29
+ result_dir = restored[:,:,:h,:w]
30
  restored = torch.clamp(restored,0,1).cpu().detach().permute(0, 2, 3, 1).squeeze(0).numpy()
31
 
32
+ save_img(result_dir, img_as_ubyte(restored))
33
 
34
  example_images = [
35
  "examples/example.jpeg",
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 (348 Bytes). View file
 
basicsr/metrics/__pycache__/metric_util.cpython-38.pyc ADDED
Binary file (1.55 kB). View file
 
basicsr/metrics/__pycache__/niqe.cpython-38.pyc ADDED
Binary file (6.53 kB). View file
 
basicsr/metrics/__pycache__/psnr_ssim.cpython-38.pyc ADDED
Binary file (7.65 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.3 kB). View file
 
basicsr/models/__pycache__/base_model.cpython-38.pyc ADDED
Binary file (13.4 kB). View file