├── .gitignore
├── INSTALL.md
├── LICENSE
├── README.md
├── data_dir
├── hazy
│ └── hazy_outside.txt
├── noisy
│ └── denoise.txt
└── rainy
│ └── rainTrain.txt
├── env.yaml
├── figs
├── AdaIR.png
├── adair3d.PNG
└── adair5d.PNG
├── net
└── model.py
├── options.py
├── test.py
├── train.py
└── utils
├── __init__.py
├── dataset_utils.py
├── degradation_utils.py
├── image_io.py
├── image_utils.py
├── imresize.py
├── loss_utils.py
├── pytorch_ssim
└── __init__.py
├── schedulers.py
└── val_utils.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | *.py,cover
50 | .hypothesis/
51 | .pytest_cache/
52 | cover/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | .pybuilder/
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | # For a library or package, you might want to ignore these files since the code is
87 | # intended to run in multiple environments; otherwise, check them in:
88 | # .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # poetry
98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99 | # This is especially recommended for binary packages to ensure reproducibility, and is more
100 | # commonly ignored for libraries.
101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102 | #poetry.lock
103 |
104 | # pdm
105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106 | #pdm.lock
107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108 | # in version control.
109 | # https://pdm.fming.dev/#use-with-ide
110 | .pdm.toml
111 |
112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113 | __pypackages__/
114 |
115 | # Celery stuff
116 | celerybeat-schedule
117 | celerybeat.pid
118 |
119 | # SageMath parsed files
120 | *.sage.py
121 |
122 | # Environments
123 | .env
124 | .venv
125 | env/
126 | venv/
127 | ENV/
128 | env.bak/
129 | venv.bak/
130 |
131 | # Spyder project settings
132 | .spyderproject
133 | .spyproject
134 |
135 | # Rope project settings
136 | .ropeproject
137 |
138 | # mkdocs documentation
139 | /site
140 |
141 | # mypy
142 | .mypy_cache/
143 | .dmypy.json
144 | dmypy.json
145 |
146 | # Pyre type checker
147 | .pyre/
148 |
149 | # pytype static type analyzer
150 | .pytype/
151 |
152 | # Cython debug symbols
153 | cython_debug/
154 |
155 | # PyCharm
156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158 | # and can be added to the global gitignore or merged into this file. For a more nuclear
159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160 | #.idea/
161 |
--------------------------------------------------------------------------------
/INSTALL.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | ### Dependencies Installation
4 |
5 | This repository is built in PyTorch 1.13.1 and Python 3.8.11.
6 | Follow these intructions
7 |
8 | 1. Clone our repository
9 | ```
10 | git clone https://github.com/c-yn/AdaIR.git
11 | cd AdaIR
12 | ```
13 |
14 | 2. Create conda environment
15 | The Conda environment used can be recreated using the env.yml file
16 | ```
17 | conda env create -f env.yml
18 | ```
19 |
20 |
21 | ### Dataset Download and Preperation
22 |
23 | All the datasets for 5 tasks used in the paper can be downloaded from the following locations:
24 |
25 | Denoising: [BSD400](https://drive.google.com/file/d/1idKFDkAHJGAFDn1OyXZxsTbOSBx9GS8N/view?usp=sharing), [WED](https://drive.google.com/file/d/1e62XGdi5c6IbvkZ70LFq0KLRhFvih7US/view?usp=sharing), [Urban100](https://drive.google.com/drive/folders/1B3DJGQKB6eNdwuQIhdskA64qUuVKLZ9u), [Kodak24](https://r0k.us/graphics/kodak/), [BSD68](https://github.com/clausmichele/CBSD68-dataset/tree/master/CBSD68/original)
26 |
27 | Deraining: [Train100L&Rain100L](https://drive.google.com/drive/folders/1-_Tw-LHJF4vh8fpogKgZx1EQ9MhsJI_f?usp=sharing)
28 |
29 | Dehazing: Train[ RESIDE](https://sites.google.com/view/reside-dehaze-datasets/reside-%CE%B2), Test [SOTS-Outdoor](https://sites.google.com/view/reside-dehaze-datasets/reside-v0)
30 |
31 | Deblur: [GoPro](https://drive.google.com/file/d/1y_wQ5G5B65HS_mdIjxKYTcnRys_AGh5v/view?usp=sharing)
32 |
33 | Enhance: [LOL-V1](https://daooshee.github.io/BMVC2018website/)
34 |
35 | The training data should be placed in ``` data/Train/{task_name}``` directory where ```task_name``` can be Denoise, Derain, Dehaze, Deblur, or Enhance.
36 |
37 | The testing data should be placed in the ```test``` directory wherein each task has a seperate directory.
38 |
39 | The training and test datasets are organized as:
40 |
41 |
42 | ```
43 | |--data
44 | | |--Train
45 | | | |--Deblur
46 | | | | |--blur
47 | | | | | |--GOPR0372_07_00_000047.png
48 | | | | | |--GOPR0372_07_00_000048.png
49 | | | | | ...
50 | | | | |--sharp
51 | | | | | |--GOPR0372_07_00_000047.png
52 | | | | | |--GOPR0372_07_00_000048.png
53 | | | | | ...
54 | | | |--Dehaze
55 | | | | |--original
56 | | | | | |--0025.png
57 | | | | | |--0039.png
58 | | | | | ...
59 | | | | |--synthetic
60 | | | | | |--part1
61 | | | | | | |--0025_0.8_0.1.jpg
62 | | | | | | |--0025_0.8_0.2.jpg
63 | | | | | | ...
64 | | | | | |--part2
65 | | | | | | |--3068_0.8_0.1.jpg
66 | | | | | | |--3068_0.8_0.2.jpg
67 | | | | | | ...
68 | | | | | |--part3
69 | | | | | | |--5425_0.8_0.1.jpg
70 | | | | | | |--5425_0.8_0.2.jpg
71 | | | | | | ...
72 | | | | | |--part4
73 | | | | | | |--6823_0.8_0.1.jpg
74 | | | | | | |--6823_0.8_0.2.jpg
75 | | | | | | ...
76 | | | |--Denoise
77 | | | | |--00001.bmp
78 | | | | |--00001.bmp
79 | | | | ...
80 | | | | |--5096.jpg
81 | | | | |--6046.jpg
82 | | | | ...
83 | | | |--Derain
84 | | | | |--gt
85 | | | | | |--norain-1.png
86 | | | | | |--norain-2.png
87 | | | | | ...
88 | | | | |--rainy
89 | | | | | |--rain-1.png
90 | | | | | |--rain-2.png
91 | | | | | ...
92 | | | |--Enhance
93 | | | | |--gt
94 | | | | | |--2.png
95 | | | | | |--5.png
96 | | | | | ...
97 | | | | |--low
98 | | | | | |--2.png
99 | | | | | |--5.png
100 | | | | | ...
101 | | |--test
102 | | | |--deblur
103 | | | | |--gopro
104 | | | | | |--input
105 | | | | | | |--GOPR0384_11_00_000001.png
106 | | | | | | |--GOPR0384_11_00_000002.png
107 | | | | | | ...
108 | | | | | |--target
109 | | | | | | |--GOPR0384_11_00_000001.png
110 | | | | | | |--GOPR0384_11_00_000002.png
111 | | | | | | ...
112 | | | |--dehaze
113 | | | | |--input
114 | | | | | |--0001_0.8_0.2.jpg
115 | | | | | |--0002_0.8_0.08.jpg
116 | | | | | ...
117 | | | | |--target
118 | | | | | |--0001.png
119 | | | | | |--0002.png
120 | | | | | ...
121 | | | |--denoise
122 | | | | |--bsd68
123 | | | | | |--3096.jpg
124 | | | | | |--12084.jpg
125 | | | | | ...
126 | | | | |--urban100
127 | | | | | |--img_001.png
128 | | | | | |--img_002.png
129 | | | | | ...
130 | | | | |--kodak24
131 | | | | | |--kodim01.png
132 | | | | | |--kodim02.png
133 | | | | | ...
134 | | | |--derain
135 | | | | |--Rain100L
136 | | | | | |--input
137 | | | | | | |--1.png
138 | | | | | | |--2.png
139 | | | | | | ...
140 | | | | | |--target
141 | | | | | | |--1.png
142 | | | | | | |--2.png
143 | | | | | | ...
144 | | | |--enhance
145 | | | | |--lol
146 | | | | | |--input
147 | | | | | | |--1.png
148 | | | | | | |--22.png
149 | | | | | | ...
150 | | | | | |--target
151 | | | | | | |--1.png
152 | | | | | | |--22.png
153 | | | | | | ...
154 | ```
155 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Yuning Cui
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AdaIR: Adaptive All-in-One Image Restoration via Frequency Mining and Modulation (ICLR'25)
2 |
3 | Yuning Cui, [Syed Waqas Zamir](https://scholar.google.ae/citations?hl=en&user=POoai-QAAAAJ), [Salman Khan](https://salman-h-khan.github.io/), [Alois Knoll](https://scholar.google.com.hk/citations?user=-CA8QgwAAAAJ&hl=zh-CN&oi=ao), [Mubarak Shah](https://scholar.google.com.hk/citations?user=p8gsO3gAAAAJ&hl=zh-CN&oi=ao), and [Fahad Shahbaz Khan](https://scholar.google.es/citations?user=zvaeYnUAAAAJ&hl=en)
4 |
5 |
6 |
7 |
8 | > **Abstract:** *In the image acquisition process, various forms of degradation, including noise, blur, haze, and rain, are frequently introduced. These degradations typically arise from the inherent limitations of cameras or unfavorable ambient conditions. To recover clean images from their degraded versions, numerous specialized restoration methods have been developed, each targeting a specific type of degradation. Recently, all-in-one algorithms have garnered significant attention by addressing different types of degradations within a single model without requiring the prior information of the input degradation type. However, these methods purely operate in the spatial domain and do not delve into the distinct frequency variations inherent to different degradation types. To address this gap, we propose an adaptive all-in-one image restoration network based on frequency mining and modulation. Our approach is motivated by the observation that different degradation types impact the image content on different frequency subbands, thereby requiring different treatments for each restoration task. Specifically, we first mine low- and high-frequency information from the input features, guided by the adaptively decoupled spectra of the degraded image. The extracted features are then modulated by a bidirectional operator to facilitate interactions between different frequency components. Finally, the modulated features are merged into the original input for a progressively guided restoration. With this approach, the model achieves adaptive reconstruction by accentuating the informative frequency subbands according to different input degradations. Extensive experiments demonstrate that the proposed method, named AdaIR, achieves state-of-the-art performance on different image restoration tasks, including image denoising, dehazing, deraining, motion deblurring, and low-light image enhancement.*
9 |
10 |
11 | ## Network Architecture
12 |
13 |
14 | ## Installation and Data Preparation
15 |
16 | See [INSTALL.md](INSTALL.md) for the installation of dependencies and dataset preperation required to run this codebase.
17 |
18 | ## Training
19 |
20 | After preparing the training data in ```data/``` directory, use
21 | ```
22 | python train.py
23 | ```
24 | to start the training of the model. Use the ```de_type``` argument to choose the combination of degradation types to train on. By default it is set to all the 5 degradation tasks (denoising, deraining, dehazing, deblurring, enhancement).
25 |
26 | Example Usage: If we only want to train on deraining and dehazing:
27 | ```
28 | python train.py --de_type derain dehaze
29 | ```
30 |
31 | ## Testing
32 |
33 | After preparing the testing data in ```test/``` directory, place the mode checkpoint file in the ```ckpt``` directory. The pre-trained model can be downloaded [here](https://drive.google.com/drive/folders/1x2LN4kWkO3S65jJlH-1INUFiYt8KFzPH?usp=sharing). To perform the evaluation, use
34 | ```
35 | python test.py --mode {n}
36 | ```
37 | ```n``` is a number that can be used to set the tasks to be evaluated on, 0 for denoising, 1 for deraining, 2 for dehazing, 3 for deblurring, 4 for enhancement, 5 for three-degradation all-in-one setting and 6 for five-degradation all-in-one setting.
38 |
39 | Example Usage: To test on all the degradation types at once, run:
40 |
41 | ```
42 | python test.py --mode 6
43 | ```
44 |
59 |
60 |
61 |
62 |
63 | ## Results
64 | Performance results of the AdaIR framework trained under the all-in-one setting.
65 |
66 |
67 | Three Distinct Degradations (click to expand)
68 |
69 |
70 |
71 |
72 | Five Distinct Degradations (click to expand)
73 |
74 |
75 |
76 |
77 | The visual results can be downloaded [here](https://drive.google.com/drive/folders/1lsYFumrn3-07Vcl3TZy0dzMMA9yDTpSK?usp=sharing).
78 |
79 |
80 |
81 |
82 |
83 | ## Citation
84 | If you use our work, please consider citing:
85 | ~~~
86 | @inproceedings{cui2025adair,
87 | title={Ada{IR}: Adaptive All-in-One Image Restoration via Frequency Mining and Modulation},
88 | author={Yuning Cui and Syed Waqas Zamir and Salman Khan and Alois Knoll and Mubarak Shah and Fahad Shahbaz Khan},
89 | booktitle={The Thirteenth International Conference on Learning Representations},
90 | year={2025}
91 | }
92 | ~~~
93 |
94 |
95 |
96 | ## Contact
97 | Should you have any questions, please contact yuning.cui@in.tum.de
98 |
99 |
100 | **Acknowledgment:** This code is based on the [PromptIR](https://github.com/va1shn9v/PromptIR) repository.
101 |
102 |
--------------------------------------------------------------------------------
/data_dir/noisy/denoise.txt:
--------------------------------------------------------------------------------
1 | 03000.bmp
2 | 00012.bmp
3 | a247012.jpg
4 | 00210.bmp
5 | 01101.bmp
6 | 01020.bmp
7 | a117025.jpg
8 | a161062.jpg
9 | a306052.jpg
10 | a309040.jpg
11 | 00030.bmp
12 | 01002.bmp
13 | 00111.bmp
14 | a309004.jpg
15 | a226060.jpg
16 | 02010.bmp
17 | a206062.jpg
18 | a118015.jpg
19 | 01200.bmp
20 | a105019.jpg
21 | a134008.jpg
22 | 00021.bmp
23 | 00102.bmp
24 | a8143.jpg
25 | a374020.jpg
26 | 02001.bmp
27 | 01110.bmp
28 | 00300.bmp
29 | a6046.jpg
30 | a226033.jpg
31 | a130066.jpg
32 | a247003.jpg
33 | 00201.bmp
34 | 01011.bmp
35 | 00120.bmp
36 | a78098.jpg
37 | 00003.bmp
38 | 02100.bmp
39 | a22093.jpg
40 | 01864.bmp
41 | 02593.bmp
42 | 03646.bmp
43 | 02917.bmp
44 | 04375.bmp
45 | 03484.bmp
46 | 02755.bmp
47 | 00973.bmp
48 | 03808.bmp
49 | 04537.bmp
50 | 01945.bmp
51 | 02674.bmp
52 | 00892.bmp
53 | 03727.bmp
54 | 04456.bmp
55 | 03565.bmp
56 | 02836.bmp
57 | 04294.bmp
58 | 01783.bmp
59 | 04618.bmp
60 | 02197.bmp
61 | 00739.bmp
62 | 01468.bmp
63 | 00577.bmp
64 | 02359.bmp
65 | 03088.bmp
66 | 00496.bmp
67 | 02278.bmp
68 | 01549.bmp
69 | 00658.bmp
70 | 01387.bmp
71 | 03169.bmp
72 | 03880.bmp
73 | 04690.bmp
74 | 03961.bmp
75 | 00379.bmp
76 | 01189.bmp
77 | a35008.jpg
78 | 00298.bmp
79 | 04735.bmp
80 | 03682.bmp
81 | 02953.bmp
82 | 02791.bmp
83 | a92014.jpg
84 | 03844.bmp
85 | 04573.bmp
86 | 01981.bmp
87 | 03763.bmp
88 | 04492.bmp
89 | 02872.bmp
90 | 03925.bmp
91 | 04654.bmp
92 | 02557.bmp
93 | 03286.bmp
94 | 01828.bmp
95 | 00775.bmp
96 | 04339.bmp
97 | 02719.bmp
98 | 04177.bmp
99 | 03448.bmp
100 | 02395.bmp
101 | 00937.bmp
102 | 01666.bmp
103 | 02638.bmp
104 | 04096.bmp
105 | 03367.bmp
106 | 01909.bmp
107 | 00856.bmp
108 | 01585.bmp
109 | 00694.bmp
110 | 04258.bmp
111 | 03529.bmp
112 | 02476.bmp
113 | 01747.bmp
114 | a368078.jpg
115 | a14092.jpg
116 | 00199.bmp
117 | 01882.bmp
118 | 04717.bmp
119 | 03664.bmp
120 | 02935.bmp
121 | 04393.bmp
122 | 02773.bmp
123 | 03826.bmp
124 | 04555.bmp
125 | 00991.bmp
126 | 01963.bmp
127 | 02692.bmp
128 | 03745.bmp
129 | 04474.bmp
130 | 03583.bmp
131 | 02854.bmp
132 | 03907.bmp
133 | 04636.bmp
134 | 02539.bmp
135 | 03268.bmp
136 | 00757.bmp
137 | 01486.bmp
138 | 04159.bmp
139 | 00595.bmp
140 | 02377.bmp
141 | 00919.bmp
142 | 01648.bmp
143 | 04078.bmp
144 | 03349.bmp
145 | 02296.bmp
146 | 00838.bmp
147 | 01567.bmp
148 | 00676.bmp
149 | 02458.bmp
150 | 03187.bmp
151 | 01729.bmp
152 | a258089.jpg
153 | 00397.bmp
154 | 02179.bmp
155 | 01288.bmp
156 | 00559.bmp
157 | 00478.bmp
158 | 01369.bmp
159 | 02098.bmp
160 | 02971.bmp
161 | 04591.bmp
162 | 03862.bmp
163 | 03781.bmp
164 | 02890.bmp
165 | 04672.bmp
166 | 03943.bmp
167 | 01846.bmp
168 | 02575.bmp
169 | 03628.bmp
170 | 04357.bmp
171 | a70090.jpg
172 | 00793.bmp
173 | 03466.bmp
174 | 02737.bmp
175 | 04195.bmp
176 | 04519.bmp
177 | 00955.bmp
178 | 01684.bmp
179 | 01927.bmp
180 | 03385.bmp
181 | 02656.bmp
182 | 03709.bmp
183 | 04438.bmp
184 | 00874.bmp
185 | 03547.bmp
186 | 02818.bmp
187 | 04276.bmp
188 | 02494.bmp
189 | 01765.bmp
190 | a41029.jpg
191 | 03655.bmp
192 | 04384.bmp
193 | 02926.bmp
194 | 04708.bmp
195 | 01873.bmp
196 | 03817.bmp
197 | 04546.bmp
198 | 00982.bmp
199 | 03493.bmp
200 | 02764.bmp
201 | 03736.bmp
202 | 04465.bmp
203 | 01954.bmp
204 | 02683.bmp
205 | 04627.bmp
206 | 01792.bmp
207 | 03574.bmp
208 | 02845.bmp
209 | 00748.bmp
210 | 01477.bmp
211 | 03259.bmp
212 | a388067.jpg
213 | 02368.bmp
214 | 01639.bmp
215 | 03097.bmp
216 | 00586.bmp
217 | 00829.bmp
218 | 02287.bmp
219 | 01558.bmp
220 | 04069.bmp
221 | 02449.bmp
222 | 03178.bmp
223 | 00667.bmp
224 | 01396.bmp
225 | 03970.bmp
226 | 00388.bmp
227 | 01279.bmp
228 | 01198.bmp
229 | 00469.bmp
230 | 02089.bmp
231 | 02962.bmp
232 | 03691.bmp
233 | 04744.bmp
234 | 04582.bmp
235 | 03853.bmp
236 | 03772.bmp
237 | 01990.bmp
238 | 04663.bmp
239 | 03934.bmp
240 | 02881.bmp
241 | 03619.bmp
242 | 04348.bmp
243 | 00784.bmp
244 | 02566.bmp
245 | 01837.bmp
246 | 03295.bmp
247 | 00946.bmp
248 | 01675.bmp
249 | 04186.bmp
250 | 02728.bmp
251 | 03457.bmp
252 | 04429.bmp
253 | 00865.bmp
254 | 01594.bmp
255 | 02647.bmp
256 | 01918.bmp
257 | 03376.bmp
258 | 02485.bmp
259 | 01756.bmp
260 | 04267.bmp
261 | 02809.bmp
262 | 03538.bmp
263 | 01099.bmp
264 | 00289.bmp
265 | 03673.bmp
266 | 02944.bmp
267 | 01891.bmp
268 | 04726.bmp
269 | 03835.bmp
270 | 04564.bmp
271 | 02782.bmp
272 | 03754.bmp
273 | 04483.bmp
274 | 01972.bmp
275 | 03916.bmp
276 | 04645.bmp
277 | 03592.bmp
278 | 02863.bmp
279 | 00766.bmp
280 | 01495.bmp
281 | 02548.bmp
282 | 01819.bmp
283 | 03277.bmp
284 | 00928.bmp
285 | 02386.bmp
286 | 01657.bmp
287 | 04168.bmp
288 | 03439.bmp
289 | 00847.bmp
290 | 01576.bmp
291 | 04087.bmp
292 | 02629.bmp
293 | 03358.bmp
294 | 02467.bmp
295 | 01738.bmp
296 | 03196.bmp
297 | 04249.bmp
298 | 00685.bmp
299 | 02188.bmp
300 | 01459.bmp
301 | 03079.bmp
302 | 01297.bmp
303 | 00568.bmp
304 | 02269.bmp
305 | 00487.bmp
306 | 01378.bmp
307 | 00649.bmp
308 | 02980.bmp
309 | 03871.bmp
310 | 03790.bmp
311 | 04681.bmp
312 | 03952.bmp
313 | 03637.bmp
314 | 04366.bmp
315 | 02908.bmp
316 | 01855.bmp
317 | 02584.bmp
318 | 01693.bmp
319 | 00964.bmp
320 | 04528.bmp
321 | 03475.bmp
322 | 02746.bmp
323 | 00883.bmp
324 | 03718.bmp
325 | 04447.bmp
326 | 03394.bmp
327 | 01936.bmp
328 | 02665.bmp
329 | 01774.bmp
330 | 04609.bmp
331 | 03556.bmp
332 | 04285.bmp
333 | 02827.bmp
334 | a384089.jpg
335 | a196088.jpg
336 | 01145.bmp
337 | 00416.bmp
338 | 00092.bmp
339 | 01307.bmp
340 | 02036.bmp
341 | 00254.bmp
342 | 01226.bmp
343 | 03008.bmp
344 | 00173.bmp
345 | a288024.jpg
346 | 02117.bmp
347 | 01064.bmp
348 | 00335.bmp
349 | a176019.jpg
350 | 04610.bmp
351 | 03800.bmp
352 | a183066.jpg
353 | 04052.bmp
354 | 03323.bmp
355 | 00812.bmp
356 | 02270.bmp
357 | 01541.bmp
358 | 00650.bmp
359 | 04214.bmp
360 | 02432.bmp
361 | 01703.bmp
362 | 03161.bmp
363 | 04133.bmp
364 | 03404.bmp
365 | 02351.bmp
366 | 01622.bmp
367 | 03080.bmp
368 | 00731.bmp
369 | 01460.bmp
370 | 02513.bmp
371 | 03242.bmp
372 | a22013.jpg
373 | a285036.jpg
374 | 00452.bmp
375 | 01181.bmp
376 | 04016.bmp
377 | 02234.bmp
378 | 01505.bmp
379 | 00614.bmp
380 | 02072.bmp
381 | 01343.bmp
382 | 03125.bmp
383 | 00290.bmp
384 | 00533.bmp
385 | 01262.bmp
386 | 02315.bmp
387 | 03044.bmp
388 | 02153.bmp
389 | 01424.bmp
390 | 03206.bmp
391 | 00371.bmp
392 | a159045.jpg
393 | a175083.jpg
394 | 01901.bmp
395 | 02630.bmp
396 | 04412.bmp
397 | 03521.bmp
398 | 04250.bmp
399 | 03440.bmp
400 | 02711.bmp
401 | 03602.bmp
402 | 04331.bmp
403 | 01820.bmp
404 | 00137.bmp
405 | a368016.jpg
406 | 01028.bmp
407 | a189006.jpg
408 | 00218.bmp
409 | a277053.jpg
410 | 00056.bmp
411 | 01109.bmp
412 | 01163.bmp
413 | 00434.bmp
414 | 02216.bmp
415 | 01325.bmp
416 | 02054.bmp
417 | 00272.bmp
418 | 03107.bmp
419 | 01244.bmp
420 | 00515.bmp
421 | 00191.bmp
422 | 03026.bmp
423 | a135069.jpg
424 | 01406.bmp
425 | 02135.bmp
426 | 01082.bmp
427 | 00353.bmp
428 | 03341.bmp
429 | 04070.bmp
430 | 02612.bmp
431 | 00830.bmp
432 | 03503.bmp
433 | 04232.bmp
434 | 02450.bmp
435 | 01721.bmp
436 | 03422.bmp
437 | 04151.bmp
438 | 00911.bmp
439 | 01640.bmp
440 | 04313.bmp
441 | 02531.bmp
442 | 01802.bmp
443 | 03260.bmp
444 | 00119.bmp
445 | 00038.bmp
446 | 04034.bmp
447 | 03305.bmp
448 | 00470.bmp
449 | 02252.bmp
450 | 01523.bmp
451 | 00632.bmp
452 | 02090.bmp
453 | 01361.bmp
454 | 02414.bmp
455 | 03143.bmp
456 | 04115.bmp
457 | 00551.bmp
458 | 01280.bmp
459 | 02333.bmp
460 | 01604.bmp
461 | 03062.bmp
462 | 00713.bmp
463 | 02171.bmp
464 | 01442.bmp
465 | 03224.bmp
466 | a267036.jpg
467 | 03701.bmp
468 | 04430.bmp
469 | 02810.bmp
470 | 04511.bmp
471 | 03620.bmp
472 | 01208.bmp
473 | 00155.bmp
474 | 01046.bmp
475 | 00317.bmp
476 | 02018.bmp
477 | 00236.bmp
478 | 00074.bmp
479 | 01127.bmp
480 | 02207.bmp
481 | 01154.bmp
482 | 00425.bmp
483 | 00263.bmp
484 | a206097.jpg
485 | 01316.bmp
486 | 02045.bmp
487 | 00182.bmp
488 | 03017.bmp
489 | 01235.bmp
490 | 00506.bmp
491 | 01073.bmp
492 | 00344.bmp
493 | 02126.bmp
494 | 04700.bmp
495 | 00821.bmp
496 | 01550.bmp
497 | 02603.bmp
498 | 04061.bmp
499 | 03332.bmp
500 | 02441.bmp
501 | 03170.bmp
502 | 01712.bmp
503 | 04223.bmp
504 | 02360.bmp
505 | 00902.bmp
506 | 01631.bmp
507 | 04142.bmp
508 | 03413.bmp
509 | 02522.bmp
510 | 03251.bmp
511 | 00740.bmp
512 | 04304.bmp
513 | a365073.jpg
514 | 00029.bmp
515 | 02243.bmp
516 | 01514.bmp
517 | 00461.bmp
518 | 01190.bmp
519 | 04025.bmp
520 | 02405.bmp
521 | 03134.bmp
522 | 02081.bmp
523 | 00623.bmp
524 | 01352.bmp
525 | 02324.bmp
526 | 03053.bmp
527 | 00542.bmp
528 | a145059.jpg
529 | 01271.bmp
530 | 04106.bmp
531 | 00380.bmp
532 | 03215.bmp
533 | 02162.bmp
534 | 00704.bmp
535 | 01433.bmp
536 | a326085.jpg
537 | 04421.bmp
538 | 01910.bmp
539 | 03530.bmp
540 | 02801.bmp
541 | 04502.bmp
542 | 02720.bmp
543 | 03611.bmp
544 | 04340.bmp
545 | 00146.bmp
546 | 01037.bmp
547 | 00308.bmp
548 | a196062.jpg
549 | 00227.bmp
550 | a15011.jpg
551 | 02009.bmp
552 | 01118.bmp
553 | a187071.jpg
554 | 00065.bmp
555 | 02225.bmp
556 | 04007.bmp
557 | 01172.bmp
558 | 00443.bmp
559 | 03116.bmp
560 | 00281.bmp
561 | 01334.bmp
562 | 00605.bmp
563 | 02063.bmp
564 | 02306.bmp
565 | 03035.bmp
566 | 01253.bmp
567 | 00524.bmp
568 | 01091.bmp
569 | 00362.bmp
570 | 01415.bmp
571 | 02144.bmp
572 | 04403.bmp
573 | 03350.bmp
574 | 02621.bmp
575 | 01730.bmp
576 | 03512.bmp
577 | 04241.bmp
578 | 00920.bmp
579 | 03431.bmp
580 | 02702.bmp
581 | 04160.bmp
582 | 01811.bmp
583 | 02540.bmp
584 | 04322.bmp
585 | 00128.bmp
586 | 01019.bmp
587 | a188025.jpg
588 | 00209.bmp
589 | 00047.bmp
590 | 02261.bmp
591 | 00803.bmp
592 | 01532.bmp
593 | 04043.bmp
594 | 03314.bmp
595 | 02423.bmp
596 | 03152.bmp
597 | 04205.bmp
598 | 00641.bmp
599 | 01370.bmp
600 | 02342.bmp
601 | 03071.bmp
602 | 01613.bmp
603 | 04124.bmp
604 | 00560.bmp
605 | 02504.bmp
606 | 03233.bmp
607 | 02180.bmp
608 | 00722.bmp
609 | 01451.bmp
610 | 03710.bmp
611 | 04601.bmp
612 | 04520.bmp
613 | a335094.jpg
614 | 02900.bmp
615 | 00164.bmp
616 | 01217.bmp
617 | 01055.bmp
618 | 00326.bmp
619 | 02108.bmp
620 | 00245.bmp
621 | 02027.bmp
622 | a108069.jpg
623 | 01136.bmp
624 | 00407.bmp
625 | 00083.bmp
626 | a100007.jpg
627 | a302003.jpg
628 | 04698.bmp
629 | 03969.bmp
630 | 02997.bmp
631 | 03888.bmp
632 | 01989.bmp
633 | 02799.bmp
634 | 00999.bmp
635 | 03987.bmp
636 | a66075.jpg
637 | 02898.bmp
638 | 03789.bmp
639 | a66039.jpg
640 | 02979.bmp
641 | 04599.bmp
642 | a25098.jpg
643 | 03978.bmp
644 | 03897.bmp
645 | 02889.bmp
646 | 01998.bmp
647 | 03699.bmp
648 | a97017.jpg
649 | 01899.bmp
650 | 03996.bmp
651 | 04689.bmp
652 | 03798.bmp
653 | 02988.bmp
654 | 03879.bmp
655 | a207056.jpg
656 | 01222.bmp
657 | 03004.bmp
658 | 02113.bmp
659 | 00331.bmp
660 | 01060.bmp
661 | 02032.bmp
662 | 01303.bmp
663 | 00250.bmp
664 | 00412.bmp
665 | 01141.bmp
666 | 00016.bmp
667 | 03400.bmp
668 | 04210.bmp
669 | a176051.jpg
670 | 03040.bmp
671 | 02311.bmp
672 | 01420.bmp
673 | 03202.bmp
674 | 00610.bmp
675 | 03121.bmp
676 | 01501.bmp
677 | 02230.bmp
678 | 04012.bmp
679 | 00133.bmp
680 | 01024.bmp
681 | 00214.bmp
682 | a385022.jpg
683 | 00052.bmp
684 | 01105.bmp
685 | a147062.jpg
686 | a238025.jpg
687 | 01240.bmp
688 | 00511.bmp
689 | 03022.bmp
690 | 01402.bmp
691 | 02131.bmp
692 | 01321.bmp
693 | 02050.bmp
694 | 03103.bmp
695 | 02212.bmp
696 | 00430.bmp
697 | 00115.bmp
698 | 01006.bmp
699 | 00034.bmp
700 | 04111.bmp
701 | 01600.bmp
702 | 03220.bmp
703 | 02410.bmp
704 | 03301.bmp
705 | 04030.bmp
706 | 01204.bmp
707 | a207038.jpg
708 | 00151.bmp
709 | 00313.bmp
710 | 01042.bmp
711 | 02014.bmp
712 | 00232.bmp
713 | 00070.bmp
714 | 01123.bmp
715 | a147080.jpg
716 | a274007.jpg
717 | a346016.jpg
718 | 03013.bmp
719 | a109055.jpg
720 | 00502.bmp
721 | 01231.bmp
722 | 00340.bmp
723 | 02122.bmp
724 | 02041.bmp
725 | 01312.bmp
726 | 00421.bmp
727 | 01150.bmp
728 | 02203.bmp
729 | 00106.bmp
730 | 00025.bmp
731 | a173036.jpg
732 | 04300.bmp
733 | 02320.bmp
734 | 04102.bmp
735 | 03211.bmp
736 | 00700.bmp
737 | 03130.bmp
738 | 02401.bmp
739 | 04021.bmp
740 | 01510.bmp
741 | 00142.bmp
742 | 00304.bmp
743 | 01033.bmp
744 | a189011.jpg
745 | 00223.bmp
746 | 02005.bmp
747 | 01114.bmp
748 | 00061.bmp
749 | a181091.jpg
750 | a246053.jpg
751 | 03031.bmp
752 | 02302.bmp
753 | 00520.bmp
754 | 01411.bmp
755 | 02140.bmp
756 | 03112.bmp
757 | 01330.bmp
758 | 00601.bmp
759 | 04003.bmp
760 | 02221.bmp
761 | 00124.bmp
762 | 01015.bmp
763 | a196040.jpg
764 | 00205.bmp
765 | 00043.bmp
766 | a254054.jpg
767 | 00007.bmp
768 | 04120.bmp
769 | 02500.bmp
770 | 04201.bmp
771 | 03310.bmp
772 | 00160.bmp
773 | 01213.bmp
774 | 00322.bmp
775 | 01051.bmp
776 | 02104.bmp
777 | 00241.bmp
778 | a160067.jpg
779 | 02023.bmp
780 | 00403.bmp
781 | 01132.bmp
782 | a5096.jpg
783 | a232076.jpg
784 | 01787.bmp
785 | 04298.bmp
786 | 03569.bmp
787 | 02678.bmp
788 | 01949.bmp
789 | 00896.bmp
790 | 02597.bmp
791 | 01868.bmp
792 | 04379.bmp
793 | 02759.bmp
794 | 03488.bmp
795 | 00977.bmp
796 | 03965.bmp
797 | 04694.bmp
798 | 02993.bmp
799 | 03884.bmp
800 | 04658.bmp
801 | 03929.bmp
802 | 02876.bmp
803 | 01985.bmp
804 | 04496.bmp
805 | 03767.bmp
806 | 04739.bmp
807 | 02957.bmp
808 | 03686.bmp
809 | 02795.bmp
810 | 04577.bmp
811 | 03848.bmp
812 | a95006.jpg
813 | 00779.bmp
814 | 02399.bmp
815 | 01589.bmp
816 | 00698.bmp
817 | 02858.bmp
818 | 03587.bmp
819 | 02696.bmp
820 | 01967.bmp
821 | 04478.bmp
822 | 03749.bmp
823 | 01886.bmp
824 | 04397.bmp
825 | 02939.bmp
826 | 03668.bmp
827 | a48017.jpg
828 | 02777.bmp
829 | 00995.bmp
830 | 04559.bmp
831 | 03983.bmp
832 | 00599.bmp
833 | 03947.bmp
834 | 04676.bmp
835 | 02894.bmp
836 | 03785.bmp
837 | 02975.bmp
838 | 04595.bmp
839 | 03866.bmp
840 | 02579.bmp
841 | 00797.bmp
842 | 04199.bmp
843 | 01688.bmp
844 | 00959.bmp
845 | 03389.bmp
846 | 00878.bmp
847 | 01769.bmp
848 | 02498.bmp
849 | 02849.bmp
850 | 03578.bmp
851 | 01796.bmp
852 | 04469.bmp
853 | 02687.bmp
854 | 01958.bmp
855 | 04388.bmp
856 | 03659.bmp
857 | 01877.bmp
858 | 00986.bmp
859 | 02768.bmp
860 | 03497.bmp
861 | 03974.bmp
862 | 03893.bmp
863 | 02885.bmp
864 | 04667.bmp
865 | 03938.bmp
866 | 03776.bmp
867 | 01994.bmp
868 | 02966.bmp
869 | 03695.bmp
870 | 04586.bmp
871 | 03857.bmp
872 | a41096.jpg
873 | 00788.bmp
874 | 03299.bmp
875 | 01679.bmp
876 | 01598.bmp
877 | 00869.bmp
878 | 02489.bmp
879 | 02867.bmp
880 | 03596.bmp
881 | 04649.bmp
882 | 04487.bmp
883 | 03758.bmp
884 | 01976.bmp
885 | 02948.bmp
886 | 03677.bmp
887 | 01895.bmp
888 | 04568.bmp
889 | 03839.bmp
890 | 02786.bmp
891 | 03992.bmp
892 | 01499.bmp
893 | a202000.jpg
894 | 00689.bmp
895 | 03956.bmp
896 | 04685.bmp
897 | 03794.bmp
898 | 02984.bmp
899 | 03875.bmp
900 | 01859.bmp
901 | 02588.bmp
902 | 01697.bmp
903 | 00968.bmp
904 | 03479.bmp
905 | 00887.bmp
906 | 03398.bmp
907 | 02669.bmp
908 | 01778.bmp
909 | 04289.bmp
910 | 01860.bmp
911 | 02913.bmp
912 | 04371.bmp
913 | 03642.bmp
914 | 02751.bmp
915 | 03480.bmp
916 | 04533.bmp
917 | 03804.bmp
918 | 02670.bmp
919 | 01941.bmp
920 | 04452.bmp
921 | 03723.bmp
922 | 02832.bmp
923 | 04290.bmp
924 | 03561.bmp
925 | 04614.bmp
926 | 01149.bmp
927 | 00096.bmp
928 | 00258.bmp
929 | 00177.bmp
930 | 00339.bmp
931 | 01068.bmp
932 | 03327.bmp
933 | 04056.bmp
934 | 00492.bmp
935 | 01545.bmp
936 | 00816.bmp
937 | 02274.bmp
938 | 04218.bmp
939 | 01383.bmp
940 | 00654.bmp
941 | 03165.bmp
942 | 01707.bmp
943 | 02436.bmp
944 | 03408.bmp
945 | 04137.bmp
946 | 00573.bmp
947 | 03084.bmp
948 | 01626.bmp
949 | 02355.bmp
950 | 01464.bmp
951 | 00735.bmp
952 | 02193.bmp
953 | 03246.bmp
954 | 02517.bmp
955 | 04731.bmp
956 | 03840.bmp
957 | 03921.bmp
958 | 04650.bmp
959 | 00456.bmp
960 | 01185.bmp
961 | 02238.bmp
962 | 01509.bmp
963 | 00618.bmp
964 | 02076.bmp
965 | 01347.bmp
966 | 00294.bmp
967 | 03129.bmp
968 | 00537.bmp
969 | 01266.bmp
970 | 02319.bmp
971 | 03048.bmp
972 | 02157.bmp
973 | 01428.bmp
974 | 00375.bmp
975 | a388018.jpg
976 | a23025.jpg
977 | 02634.bmp
978 | 04092.bmp
979 | 03363.bmp
980 | 01905.bmp
981 | 04416.bmp
982 | 01581.bmp
983 | 00852.bmp
984 | 04254.bmp
985 | 03525.bmp
986 | 00690.bmp
987 | 01743.bmp
988 | 02472.bmp
989 | 02715.bmp
990 | 04173.bmp
991 | 03444.bmp
992 | 01662.bmp
993 | 00933.bmp
994 | 02391.bmp
995 | 04335.bmp
996 | 03606.bmp
997 | 00771.bmp
998 | 03282.bmp
999 | 01824.bmp
1000 | 02553.bmp
1001 | 04713.bmp
1002 | 02931.bmp
1003 | 03660.bmp
1004 | 04551.bmp
1005 | 03822.bmp
1006 | a157087.jpg
1007 | 04470.bmp
1008 | 03741.bmp
1009 | 02850.bmp
1010 | 04632.bmp
1011 | 03903.bmp
1012 | 00438.bmp
1013 | 01167.bmp
1014 | 02058.bmp
1015 | 01329.bmp
1016 | 00276.bmp
1017 | 00519.bmp
1018 | 01248.bmp
1019 | 00195.bmp
1020 | 02139.bmp
1021 | 00357.bmp
1022 | 01086.bmp
1023 | a268048.jpg
1024 | 03345.bmp
1025 | 04074.bmp
1026 | 02616.bmp
1027 | 01563.bmp
1028 | 00834.bmp
1029 | 02292.bmp
1030 | 00672.bmp
1031 | 03507.bmp
1032 | 04236.bmp
1033 | 03183.bmp
1034 | 01725.bmp
1035 | 02454.bmp
1036 | 00591.bmp
1037 | 03426.bmp
1038 | 04155.bmp
1039 | 01644.bmp
1040 | 00915.bmp
1041 | 02373.bmp
1042 | 01482.bmp
1043 | 00753.bmp
1044 | 04317.bmp
1045 | 03264.bmp
1046 | 01806.bmp
1047 | 02535.bmp
1048 | 00474.bmp
1049 | 03309.bmp
1050 | 04038.bmp
1051 | 01527.bmp
1052 | 02256.bmp
1053 | 01365.bmp
1054 | 00636.bmp
1055 | 02094.bmp
1056 | 03147.bmp
1057 | 02418.bmp
1058 | 01284.bmp
1059 | 00555.bmp
1060 | 04119.bmp
1061 | 03066.bmp
1062 | 01608.bmp
1063 | 02337.bmp
1064 | 01446.bmp
1065 | 00717.bmp
1066 | 02175.bmp
1067 | 03228.bmp
1068 | 00393.bmp
1069 | a26031.jpg
1070 | a41025.jpg
1071 | 00078.bmp
1072 | 00159.bmp
1073 | 02652.bmp
1074 | 03381.bmp
1075 | 01923.bmp
1076 | 00870.bmp
1077 | 04434.bmp
1078 | 03705.bmp
1079 | 02814.bmp
1080 | 04272.bmp
1081 | a156079.jpg
1082 | 03543.bmp
1083 | 02490.bmp
1084 | 01761.bmp
1085 | 02733.bmp
1086 | 04191.bmp
1087 | 03462.bmp
1088 | 00951.bmp
1089 | 01680.bmp
1090 | 04515.bmp
1091 | 04353.bmp
1092 | 03624.bmp
1093 | 02571.bmp
1094 | 01842.bmp
1095 | 04380.bmp
1096 | 02922.bmp
1097 | 03651.bmp
1098 | 04704.bmp
1099 | 04542.bmp
1100 | 03813.bmp
1101 | 02760.bmp
1102 | a65010.jpg
1103 | 04461.bmp
1104 | 03732.bmp
1105 | 01950.bmp
1106 | 04623.bmp
1107 | 02841.bmp
1108 | 03570.bmp
1109 | 00429.bmp
1110 | 01158.bmp
1111 | 00267.bmp
1112 | 02049.bmp
1113 | 00186.bmp
1114 | 01239.bmp
1115 | 00348.bmp
1116 | 01077.bmp
1117 | a187039.jpg
1118 | 01554.bmp
1119 | 02283.bmp
1120 | 00825.bmp
1121 | 03336.bmp
1122 | 02607.bmp
1123 | 04065.bmp
1124 | 01716.bmp
1125 | 03174.bmp
1126 | 02445.bmp
1127 | 04227.bmp
1128 | 01392.bmp
1129 | 00663.bmp
1130 | 01635.bmp
1131 | 03093.bmp
1132 | 02364.bmp
1133 | 00906.bmp
1134 | 03417.bmp
1135 | 04146.bmp
1136 | 00582.bmp
1137 | 03255.bmp
1138 | 02526.bmp
1139 | 04308.bmp
1140 | 01473.bmp
1141 | 00744.bmp
1142 | 04740.bmp
1143 | 03930.bmp
1144 | 01518.bmp
1145 | 02247.bmp
1146 | 04029.bmp
1147 | 00465.bmp
1148 | 01194.bmp
1149 | 03138.bmp
1150 | 02409.bmp
1151 | 02085.bmp
1152 | 00627.bmp
1153 | 01356.bmp
1154 | 03057.bmp
1155 | 02328.bmp
1156 | 00546.bmp
1157 | 01275.bmp
1158 | 03219.bmp
1159 | 00384.bmp
1160 | 02166.bmp
1161 | 00708.bmp
1162 | 01437.bmp
1163 | 00069.bmp
1164 | 00861.bmp
1165 | 01590.bmp
1166 | 04425.bmp
1167 | 02643.bmp
1168 | 01914.bmp
1169 | 03372.bmp
1170 | 02481.bmp
1171 | 01752.bmp
1172 | 04263.bmp
1173 | 02805.bmp
1174 | 03534.bmp
1175 | 00942.bmp
1176 | 01671.bmp
1177 | 04506.bmp
1178 | 04182.bmp
1179 | 02724.bmp
1180 | 03453.bmp
1181 | 02562.bmp
1182 | 01833.bmp
1183 | 03291.bmp
1184 | 04344.bmp
1185 | 03615.bmp
1186 | 00780.bmp
1187 | 02940.bmp
1188 | 04722.bmp
1189 | 03831.bmp
1190 | 04560.bmp
1191 | 03750.bmp
1192 | 03912.bmp
1193 | 04641.bmp
1194 | 02229.bmp
1195 | 00447.bmp
1196 | 01176.bmp
1197 | 00285.bmp
1198 | 02067.bmp
1199 | 00609.bmp
1200 | 01338.bmp
1201 | 03039.bmp
1202 | 00528.bmp
1203 | 01257.bmp
1204 | 00366.bmp
1205 | 01095.bmp
1206 | 02148.bmp
1207 | 01419.bmp
1208 | 04407.bmp
1209 | 01572.bmp
1210 | 00843.bmp
1211 | 03354.bmp
1212 | 02625.bmp
1213 | 04083.bmp
1214 | 01734.bmp
1215 | 03192.bmp
1216 | 02463.bmp
1217 | 00681.bmp
1218 | 03516.bmp
1219 | 04245.bmp
1220 | 01653.bmp
1221 | 02382.bmp
1222 | 00924.bmp
1223 | 03435.bmp
1224 | 02706.bmp
1225 | 04164.bmp
1226 | 01815.bmp
1227 | 03273.bmp
1228 | 02544.bmp
1229 | 01491.bmp
1230 | 00762.bmp
1231 | 04326.bmp
1232 | 01536.bmp
1233 | 02265.bmp
1234 | 00807.bmp
1235 | 00483.bmp
1236 | 03318.bmp
1237 | 04047.bmp
1238 | 03156.bmp
1239 | 02427.bmp
1240 | 01374.bmp
1241 | 00645.bmp
1242 | 04209.bmp
1243 | 01617.bmp
1244 | 03075.bmp
1245 | 02346.bmp
1246 | 01293.bmp
1247 | 00564.bmp
1248 | 04128.bmp
1249 | 03237.bmp
1250 | 02508.bmp
1251 | 01455.bmp
1252 | 02184.bmp
1253 | 00726.bmp
1254 | 00087.bmp
1255 | 00249.bmp
1256 | 00168.bmp
1257 | 01059.bmp
1258 | 04443.bmp
1259 | 03714.bmp
1260 | 02661.bmp
1261 | 01932.bmp
1262 | 03390.bmp
1263 | 04605.bmp
1264 | 01770.bmp
1265 | 04281.bmp
1266 | 02823.bmp
1267 | 03552.bmp
1268 | 04524.bmp
1269 | 00960.bmp
1270 | 02742.bmp
1271 | 03471.bmp
1272 | 02580.bmp
1273 | 01851.bmp
1274 | 04362.bmp
1275 | 02904.bmp
1276 | 03633.bmp
1277 | a68077.jpg
1278 | a106005.jpg
1279 | a118020.jpg
1280 | a113016.jpg
1281 | a3063.jpg
1282 | a231015.jpg
1283 | a344010.jpg
1284 | a141048.jpg
1285 | 00014.bmp
1286 | a317043.jpg
1287 | a163062.jpg
1288 | a209070.jpg
1289 | 03002.bmp
1290 | 01220.bmp
1291 | 02111.bmp
1292 | 02030.bmp
1293 | 01301.bmp
1294 | a118035.jpg
1295 | 00410.bmp
1296 | 00131.bmp
1297 | 01022.bmp
1298 | 00212.bmp
1299 | a108036.jpg
1300 | 01103.bmp
1301 | 00050.bmp
1302 | 03200.bmp
1303 | 04010.bmp
1304 | 00113.bmp
1305 | 01004.bmp
1306 | 00032.bmp
1307 | a100098.jpg
1308 | 03020.bmp
1309 | 01400.bmp
1310 | 03101.bmp
1311 | 02210.bmp
1312 | 01202.bmp
1313 | 00311.bmp
1314 | 01040.bmp
1315 | 00230.bmp
1316 | 02012.bmp
1317 | a250047.jpg
1318 | 01121.bmp
1319 | a268002.jpg
1320 | 00104.bmp
1321 | 00023.bmp
1322 | 00500.bmp
1323 | 03011.bmp
1324 | 02120.bmp
1325 | 01310.bmp
1326 | 02201.bmp
1327 | 00140.bmp
1328 | 01031.bmp
1329 | 00302.bmp
1330 | 02003.bmp
1331 | 00221.bmp
1332 | 01112.bmp
1333 | a157032.jpg
1334 | a145053.jpg
1335 | a271008.jpg
1336 | 04100.bmp
1337 | 00122.bmp
1338 | a376020.jpg
1339 | 01013.bmp
1340 | 00203.bmp
1341 | a232038.jpg
1342 | 00041.bmp
1343 | 02300.bmp
1344 | 03110.bmp
1345 | 04001.bmp
1346 | a347031.jpg
1347 | a249021.jpg
1348 | 01211.bmp
1349 | a117054.jpg
1350 | 02102.bmp
1351 | 00320.bmp
1352 | 02021.bmp
1353 | 00401.bmp
1354 | 01130.bmp
1355 | a326025.jpg
1356 | 00005.bmp
1357 | a106047.jpg
1358 | a123057.jpg
1359 | 04692.bmp
1360 | 03963.bmp
1361 | 02991.bmp
1362 | 03882.bmp
1363 | 02199.bmp
1364 | 00579.bmp
1365 | 00498.bmp
1366 | 01389.bmp
1367 | a51084.jpg
1368 | 03648.bmp
1369 | 02919.bmp
1370 | 04377.bmp
1371 | 01866.bmp
1372 | 02595.bmp
1373 | 00975.bmp
1374 | 04539.bmp
1375 | 03486.bmp
1376 | 02757.bmp
1377 | 00894.bmp
1378 | 03729.bmp
1379 | 04458.bmp
1380 | 01947.bmp
1381 | 02676.bmp
1382 | 01785.bmp
1383 | 03567.bmp
1384 | 02838.bmp
1385 | 04296.bmp
1386 | 00777.bmp
1387 | 03288.bmp
1388 | 02559.bmp
1389 | 01668.bmp
1390 | 02397.bmp
1391 | 00939.bmp
1392 | 04179.bmp
1393 | 01587.bmp
1394 | 00858.bmp
1395 | 03369.bmp
1396 | 04098.bmp
1397 | 01749.bmp
1398 | 02478.bmp
1399 | a71046.jpg
1400 | 00696.bmp
1401 | a33066.jpg
1402 | a41085.jpg
1403 | 02955.bmp
1404 | 03684.bmp
1405 | 04737.bmp
1406 | 04575.bmp
1407 | 03846.bmp
1408 | 02793.bmp
1409 | 04494.bmp
1410 | 03765.bmp
1411 | 01983.bmp
1412 | 04656.bmp
1413 | 03927.bmp
1414 | 02874.bmp
1415 | 03981.bmp
1416 | 00759.bmp
1417 | 01488.bmp
1418 | 02379.bmp
1419 | 00597.bmp
1420 | 02298.bmp
1421 | 01569.bmp
1422 | 03189.bmp
1423 | 00678.bmp
1424 | a43083.jpg
1425 | 04395.bmp
1426 | 02937.bmp
1427 | 03666.bmp
1428 | 04719.bmp
1429 | 01884.bmp
1430 | 04557.bmp
1431 | 03828.bmp
1432 | 00993.bmp
1433 | 02775.bmp
1434 | 04476.bmp
1435 | 03747.bmp
1436 | 01965.bmp
1437 | 02694.bmp
1438 | 04638.bmp
1439 | 03909.bmp
1440 | 03585.bmp
1441 | 02856.bmp
1442 | 04359.bmp
1443 | 00795.bmp
1444 | 01848.bmp
1445 | 02577.bmp
1446 | 01686.bmp
1447 | 00957.bmp
1448 | 03468.bmp
1449 | 02739.bmp
1450 | 04197.bmp
1451 | 00876.bmp
1452 | 01929.bmp
1453 | 03387.bmp
1454 | 02658.bmp
1455 | 01767.bmp
1456 | 02496.bmp
1457 | 03549.bmp
1458 | 04278.bmp
1459 | 00399.bmp
1460 | a35028.jpg
1461 | 02973.bmp
1462 | 04593.bmp
1463 | 03864.bmp
1464 | 03783.bmp
1465 | 04674.bmp
1466 | 03945.bmp
1467 | 02892.bmp
1468 | 03972.bmp
1469 | 03891.bmp
1470 | 01479.bmp
1471 | 00588.bmp
1472 | 03099.bmp
1473 | 02289.bmp
1474 | 00669.bmp
1475 | 01398.bmp
1476 | a14085.jpg
1477 | 01875.bmp
1478 | 03657.bmp
1479 | 04386.bmp
1480 | 02928.bmp
1481 | 03495.bmp
1482 | 02766.bmp
1483 | 00984.bmp
1484 | 03819.bmp
1485 | 04548.bmp
1486 | 01956.bmp
1487 | 02685.bmp
1488 | 03738.bmp
1489 | 04467.bmp
1490 | 03576.bmp
1491 | 02847.bmp
1492 | 01794.bmp
1493 | 04629.bmp
1494 | 03297.bmp
1495 | 01839.bmp
1496 | 02568.bmp
1497 | 00786.bmp
1498 | 03459.bmp
1499 | 04188.bmp
1500 | 01677.bmp
1501 | 00948.bmp
1502 | 03378.bmp
1503 | 02649.bmp
1504 | 01596.bmp
1505 | 00867.bmp
1506 | a35091.jpg
1507 | 04269.bmp
1508 | 01758.bmp
1509 | 02487.bmp
1510 | 02964.bmp
1511 | 03693.bmp
1512 | 04584.bmp
1513 | 03855.bmp
1514 | 01992.bmp
1515 | a81090.jpg
1516 | 03774.bmp
1517 | 02883.bmp
1518 | 04665.bmp
1519 | 03936.bmp
1520 | 03990.bmp
1521 | 03279.bmp
1522 | 00768.bmp
1523 | 01497.bmp
1524 | 02388.bmp
1525 | 01659.bmp
1526 | 04089.bmp
1527 | 00849.bmp
1528 | 01578.bmp
1529 | 00687.bmp
1530 | 02469.bmp
1531 | 03198.bmp
1532 | 01893.bmp
1533 | 04728.bmp
1534 | 02946.bmp
1535 | 03675.bmp
1536 | 02784.bmp
1537 | 04566.bmp
1538 | 03837.bmp
1539 | 01974.bmp
1540 | 04485.bmp
1541 | 03756.bmp
1542 | 02865.bmp
1543 | 03594.bmp
1544 | 04647.bmp
1545 | 03918.bmp
1546 | a187099.jpg
1547 | 01857.bmp
1548 | 02586.bmp
1549 | 03639.bmp
1550 | 04368.bmp
1551 | 03477.bmp
1552 | 02748.bmp
1553 | 01695.bmp
1554 | 00966.bmp
1555 | 03396.bmp
1556 | 01938.bmp
1557 | 02667.bmp
1558 | 04449.bmp
1559 | 00885.bmp
1560 | 03558.bmp
1561 | 04287.bmp
1562 | 02829.bmp
1563 | 01776.bmp
1564 | 01299.bmp
1565 | 00489.bmp
1566 | 02982.bmp
1567 | 03873.bmp
1568 | 03792.bmp
1569 | 04683.bmp
1570 | 03954.bmp
1571 | 01543.bmp
1572 | 00814.bmp
1573 | 02272.bmp
1574 | 03325.bmp
1575 | 04054.bmp
1576 | 00490.bmp
1577 | 03163.bmp
1578 | 01705.bmp
1579 | 02434.bmp
1580 | 04216.bmp
1581 | 00652.bmp
1582 | 01381.bmp
1583 | 03082.bmp
1584 | 01624.bmp
1585 | 02353.bmp
1586 | 03406.bmp
1587 | 04135.bmp
1588 | 00571.bmp
1589 | 03244.bmp
1590 | 02515.bmp
1591 | 00733.bmp
1592 | 02191.bmp
1593 | 01462.bmp
1594 | 00094.bmp
1595 | 01147.bmp
1596 | 00418.bmp
1597 | 00256.bmp
1598 | 01309.bmp
1599 | 02038.bmp
1600 | 00175.bmp
1601 | 01228.bmp
1602 | 01066.bmp
1603 | 00337.bmp
1604 | 02119.bmp
1605 | 04450.bmp
1606 | 03721.bmp
1607 | 04612.bmp
1608 | 02830.bmp
1609 | 04531.bmp
1610 | 03802.bmp
1611 | 02911.bmp
1612 | 03640.bmp
1613 | 00058.bmp
1614 | a15004.jpg
1615 | a385028.jpg
1616 | 00139.bmp
1617 | 00850.bmp
1618 | 04414.bmp
1619 | 03361.bmp
1620 | 01903.bmp
1621 | 04090.bmp
1622 | 02632.bmp
1623 | 01741.bmp
1624 | 02470.bmp
1625 | 03523.bmp
1626 | 04252.bmp
1627 | 01660.bmp
1628 | 00931.bmp
1629 | 03442.bmp
1630 | 04171.bmp
1631 | 02713.bmp
1632 | 03280.bmp
1633 | 01822.bmp
1634 | 02551.bmp
1635 | 03604.bmp
1636 | 04333.bmp
1637 | 02236.bmp
1638 | 01507.bmp
1639 | 04018.bmp
1640 | 00454.bmp
1641 | 01183.bmp
1642 | 03127.bmp
1643 | 00292.bmp
1644 | 00616.bmp
1645 | 02074.bmp
1646 | 01345.bmp
1647 | 02317.bmp
1648 | 03046.bmp
1649 | 00535.bmp
1650 | 01264.bmp
1651 | a388016.jpg
1652 | 03208.bmp
1653 | 00373.bmp
1654 | 02155.bmp
1655 | 01426.bmp
1656 | 01561.bmp
1657 | 00832.bmp
1658 | 02290.bmp
1659 | 03343.bmp
1660 | 04072.bmp
1661 | 02614.bmp
1662 | 03181.bmp
1663 | 01723.bmp
1664 | 02452.bmp
1665 | 00670.bmp
1666 | 03505.bmp
1667 | 04234.bmp
1668 | 01642.bmp
1669 | 00913.bmp
1670 | 02371.bmp
1671 | 03424.bmp
1672 | 04153.bmp
1673 | 03262.bmp
1674 | 01804.bmp
1675 | 02533.bmp
1676 | 01480.bmp
1677 | 00751.bmp
1678 | 04315.bmp
1679 | 02218.bmp
1680 | 00436.bmp
1681 | 01165.bmp
1682 | 00274.bmp
1683 | 03109.bmp
1684 | 02056.bmp
1685 | 01327.bmp
1686 | 00193.bmp
1687 | 03028.bmp
1688 | 00517.bmp
1689 | 01246.bmp
1690 | 00355.bmp
1691 | 01084.bmp
1692 | 02137.bmp
1693 | 01408.bmp
1694 | 04630.bmp
1695 | 03901.bmp
1696 | a176039.jpg
1697 | 03820.bmp
1698 | 04711.bmp
1699 | a159029.jpg
1700 | 00076.bmp
1701 | 01129.bmp
1702 | 00238.bmp
1703 | 00157.bmp
1704 | 01048.bmp
1705 | 00319.bmp
1706 | 04432.bmp
1707 | 03703.bmp
1708 | 01921.bmp
1709 | 02650.bmp
1710 | 03541.bmp
1711 | 04270.bmp
1712 | 02812.bmp
1713 | 04513.bmp
1714 | 03460.bmp
1715 | 02731.bmp
1716 | 01840.bmp
1717 | 03622.bmp
1718 | 04351.bmp
1719 | 02254.bmp
1720 | 01525.bmp
1721 | 00472.bmp
1722 | 04036.bmp
1723 | 03307.bmp
1724 | 02416.bmp
1725 | 03145.bmp
1726 | 00634.bmp
1727 | 02092.bmp
1728 | 01363.bmp
1729 | 02335.bmp
1730 | 01606.bmp
1731 | 03064.bmp
1732 | 00553.bmp
1733 | 01282.bmp
1734 | 04117.bmp
1735 | 00391.bmp
1736 | 03226.bmp
1737 | 00715.bmp
1738 | 02173.bmp
1739 | 01444.bmp
1740 | 03334.bmp
1741 | 02605.bmp
1742 | 04063.bmp
1743 | 01552.bmp
1744 | 02281.bmp
1745 | 00823.bmp
1746 | 01390.bmp
1747 | 00661.bmp
1748 | 04225.bmp
1749 | 01714.bmp
1750 | 03172.bmp
1751 | 02443.bmp
1752 | 00580.bmp
1753 | 03415.bmp
1754 | 04144.bmp
1755 | 01633.bmp
1756 | 03091.bmp
1757 | 02362.bmp
1758 | 00904.bmp
1759 | 01471.bmp
1760 | 00742.bmp
1761 | 04306.bmp
1762 | 03253.bmp
1763 | 02524.bmp
1764 | 00427.bmp
1765 | 01156.bmp
1766 | 02209.bmp
1767 | 02047.bmp
1768 | 01318.bmp
1769 | 00265.bmp
1770 | 00508.bmp
1771 | 01237.bmp
1772 | 03019.bmp
1773 | 00184.bmp
1774 | 02128.bmp
1775 | 01075.bmp
1776 | 00346.bmp
1777 | 03730.bmp
1778 | a20008.jpg
1779 | 04621.bmp
1780 | 04540.bmp
1781 | 03811.bmp
1782 | 02920.bmp
1783 | 04702.bmp
1784 | 00067.bmp
1785 | 00229.bmp
1786 | a24004.jpg
1787 | 00148.bmp
1788 | 01039.bmp
1789 | 01912.bmp
1790 | 03370.bmp
1791 | 02641.bmp
1792 | 04423.bmp
1793 | 03532.bmp
1794 | 02803.bmp
1795 | 04261.bmp
1796 | 01750.bmp
1797 | 03451.bmp
1798 | 02722.bmp
1799 | 04180.bmp
1800 | 00940.bmp
1801 | 04504.bmp
1802 | 03613.bmp
1803 | 04342.bmp
1804 | a147077.jpg
1805 | 01831.bmp
1806 | 02560.bmp
1807 | 00463.bmp
1808 | 01192.bmp
1809 | 04027.bmp
1810 | 02245.bmp
1811 | 01516.bmp
1812 | 02083.bmp
1813 | 00625.bmp
1814 | 01354.bmp
1815 | 02407.bmp
1816 | 03136.bmp
1817 | 00544.bmp
1818 | 01273.bmp
1819 | 04108.bmp
1820 | 02326.bmp
1821 | 03055.bmp
1822 | 02164.bmp
1823 | 00706.bmp
1824 | 01435.bmp
1825 | 03217.bmp
1826 | 00382.bmp
1827 | a10081.jpg
1828 | 00049.bmp
1829 | 03352.bmp
1830 | 02623.bmp
1831 | 04081.bmp
1832 | 04405.bmp
1833 | 01570.bmp
1834 | 00841.bmp
1835 | 03514.bmp
1836 | 04243.bmp
1837 | 01732.bmp
1838 | 03190.bmp
1839 | 02461.bmp
1840 | 03433.bmp
1841 | 02704.bmp
1842 | 04162.bmp
1843 | a181079.jpg
1844 | 01651.bmp
1845 | 02380.bmp
1846 | 00922.bmp
1847 | 04324.bmp
1848 | 00760.bmp
1849 | 01813.bmp
1850 | 03271.bmp
1851 | 02542.bmp
1852 | 04009.bmp
1853 | 00445.bmp
1854 | 01174.bmp
1855 | 02227.bmp
1856 | 02065.bmp
1857 | 00607.bmp
1858 | 01336.bmp
1859 | 00283.bmp
1860 | 03118.bmp
1861 | 00526.bmp
1862 | 01255.bmp
1863 | 02308.bmp
1864 | 03037.bmp
1865 | 02146.bmp
1866 | 01417.bmp
1867 | 00364.bmp
1868 | 01093.bmp
1869 | 03910.bmp
1870 | a247085.jpg
1871 | 04720.bmp
1872 | 01138.bmp
1873 | 00409.bmp
1874 | 00085.bmp
1875 | 02029.bmp
1876 | 00247.bmp
1877 | a23050.jpg
1878 | 01219.bmp
1879 | 00166.bmp
1880 | a188063.jpg
1881 | 01057.bmp
1882 | 00328.bmp
1883 | 01930.bmp
1884 | 04441.bmp
1885 | 03712.bmp
1886 | 02821.bmp
1887 | 03550.bmp
1888 | 04603.bmp
1889 | 02740.bmp
1890 | 04522.bmp
1891 | 04360.bmp
1892 | 02902.bmp
1893 | 03631.bmp
1894 | 03316.bmp
1895 | 04045.bmp
1896 | 00481.bmp
1897 | 02263.bmp
1898 | 00805.bmp
1899 | 01534.bmp
1900 | 04207.bmp
1901 | 00643.bmp
1902 | 01372.bmp
1903 | 02425.bmp
1904 | 03154.bmp
1905 | 04126.bmp
1906 | 00562.bmp
1907 | a145079.jpg
1908 | 01291.bmp
1909 | 02344.bmp
1910 | 03073.bmp
1911 | 01615.bmp
1912 | 02182.bmp
1913 | 00724.bmp
1914 | 01453.bmp
1915 | 02506.bmp
1916 | 03235.bmp
1917 | 02999.bmp
1918 | a87065.jpg
1919 | 03989.bmp
1920 | a80099.jpg
1921 | 03899.bmp
1922 | a103006.jpg
1923 | a71099.jpg
1924 | 03998.bmp
1925 | a79073.jpg
1926 | a326038.jpg
1927 | 00810.bmp
1928 | 04050.bmp
1929 | 03321.bmp
1930 | 02430.bmp
1931 | 01701.bmp
1932 | 04212.bmp
1933 | 01620.bmp
1934 | 04131.bmp
1935 | 03402.bmp
1936 | 02511.bmp
1937 | 03240.bmp
1938 | a196015.jpg
1939 | 00018.bmp
1940 | 00171.bmp
1941 | 03006.bmp
1942 | 01224.bmp
1943 | 01062.bmp
1944 | 00333.bmp
1945 | 02115.bmp
1946 | a151087.jpg
1947 | 00252.bmp
1948 | 01305.bmp
1949 | 02034.bmp
1950 | 01143.bmp
1951 | 00414.bmp
1952 | 00090.bmp
1953 | 04410.bmp
1954 | a164074.jpg
1955 | 03600.bmp
1956 | 00135.bmp
1957 | 01026.bmp
1958 | 00216.bmp
1959 | 01107.bmp
1960 | 00054.bmp
1961 | 03042.bmp
1962 | 02313.bmp
1963 | 01260.bmp
1964 | 00531.bmp
1965 | 03204.bmp
1966 | 01422.bmp
1967 | 02151.bmp
1968 | 03123.bmp
1969 | 01341.bmp
1970 | 02070.bmp
1971 | 00612.bmp
1972 | 00450.bmp
1973 | 04014.bmp
1974 | 01503.bmp
1975 | 02232.bmp
1976 | a146074.jpg
1977 | 02610.bmp
1978 | 04230.bmp
1979 | 03501.bmp
1980 | 03420.bmp
1981 | 01800.bmp
1982 | 04311.bmp
1983 | 00117.bmp
1984 | 01008.bmp
1985 | 00036.bmp
1986 | a176035.jpg
1987 | 03024.bmp
1988 | 01242.bmp
1989 | 00513.bmp
1990 | 01080.bmp
1991 | 00351.bmp
1992 | 01404.bmp
1993 | 02133.bmp
1994 | 03105.bmp
1995 | 00270.bmp
1996 | 01323.bmp
1997 | 02052.bmp
1998 | a250087.jpg
1999 | 01161.bmp
2000 | 00432.bmp
2001 | 02214.bmp
2002 | a372019.jpg
2003 | a361084.jpg
2004 | 00153.bmp
2005 | 01206.bmp
2006 | 00315.bmp
2007 | 01044.bmp
2008 | 00234.bmp
2009 | 02016.bmp
2010 | 01125.bmp
2011 | 00072.bmp
2012 | 02331.bmp
2013 | 01602.bmp
2014 | 03060.bmp
2015 | 04113.bmp
2016 | 03222.bmp
2017 | 01440.bmp
2018 | 00711.bmp
2019 | 02412.bmp
2020 | 03141.bmp
2021 | 00630.bmp
2022 | 04032.bmp
2023 | 03303.bmp
2024 | 01521.bmp
2025 | 02250.bmp
2026 | 02601.bmp
2027 | 03330.bmp
2028 | 04221.bmp
2029 | 01710.bmp
2030 | 04140.bmp
2031 | 03411.bmp
2032 | 00900.bmp
2033 | 04302.bmp
2034 | 02520.bmp
2035 | 00108.bmp
2036 | a188005.jpg
2037 | 00027.bmp
2038 | 01233.bmp
2039 | 00504.bmp
2040 | 00180.bmp
2041 | 03015.bmp
2042 | 02124.bmp
2043 | 01071.bmp
2044 | 00342.bmp
2045 | 01314.bmp
2046 | 02043.bmp
2047 | 00261.bmp
2048 | 02205.bmp
2049 | 01152.bmp
2050 | 00423.bmp
2051 | a157036.jpg
2052 | 04500.bmp
2053 | a198004.jpg
2054 | 00144.bmp
2055 | 00306.bmp
2056 | 01035.bmp
2057 | 02007.bmp
2058 | 00225.bmp
2059 | a189013.jpg
2060 | 00063.bmp
2061 | 01116.bmp
2062 | 04104.bmp
2063 | 00540.bmp
2064 | a8068.jpg
2065 | 03051.bmp
2066 | 02322.bmp
2067 | 01431.bmp
2068 | 00702.bmp
2069 | 02160.bmp
2070 | 03213.bmp
2071 | 01350.bmp
2072 | 00621.bmp
2073 | 03132.bmp
2074 | 02403.bmp
2075 | 01512.bmp
2076 | 02241.bmp
2077 | 04023.bmp
2078 | 04401.bmp
2079 | 03510.bmp
2080 | 02700.bmp
2081 | 04320.bmp
2082 | 00126.bmp
2083 | 01017.bmp
2084 | a230098.jpg
2085 | 00207.bmp
2086 | a259060.jpg
2087 | 00045.bmp
2088 | a166081.jpg
2089 | a12003.jpg
2090 | 01251.bmp
2091 | 00522.bmp
2092 | 03033.bmp
2093 | 02304.bmp
2094 | 01413.bmp
2095 | 02142.bmp
2096 | 00360.bmp
2097 | 01332.bmp
2098 | 00603.bmp
2099 | 02061.bmp
2100 | 03114.bmp
2101 | a144067.jpg
2102 | 02223.bmp
2103 | 04005.bmp
2104 | 01170.bmp
2105 | 00441.bmp
2106 | a183055.jpg
2107 | 01215.bmp
2108 | a207049.jpg
2109 | 00162.bmp
2110 | 02106.bmp
2111 | 00324.bmp
2112 | 01053.bmp
2113 | 02025.bmp
2114 | 00243.bmp
2115 | 00081.bmp
2116 | 00405.bmp
2117 | 01134.bmp
2118 | 00009.bmp
2119 | a249061.jpg
2120 | 04122.bmp
2121 | 02340.bmp
2122 | 01611.bmp
2123 | 00720.bmp
2124 | 02502.bmp
2125 | 03231.bmp
2126 | 04203.bmp
2127 | 02421.bmp
2128 | 03150.bmp
2129 | 00801.bmp
2130 | 01530.bmp
2131 | 04041.bmp
2132 | 03312.bmp
2133 | a120003.jpg
2134 | a60079.jpg
2135 | 03967.bmp
2136 | 04696.bmp
2137 | 02995.bmp
2138 | 03886.bmp
2139 | 01789.bmp
2140 | 00898.bmp
2141 | 02599.bmp
2142 | a28075.jpg
2143 | 00979.bmp
2144 | a77062.jpg
2145 | a69007.jpg
2146 | 02878.bmp
2147 | 03769.bmp
2148 | 04498.bmp
2149 | 01987.bmp
2150 | 03688.bmp
2151 | 02959.bmp
2152 | a90076.jpg
2153 | 04579.bmp
2154 | 02797.bmp
2155 | a15088.jpg
2156 | 03985.bmp
2157 | 03589.bmp
2158 | 02698.bmp
2159 | 01969.bmp
2160 | 04399.bmp
2161 | 01888.bmp
2162 | 00997.bmp
2163 | 02779.bmp
2164 | 00799.bmp
2165 | 02896.bmp
2166 | 03949.bmp
2167 | 04678.bmp
2168 | 03787.bmp
2169 | 02977.bmp
2170 | 03868.bmp
2171 | 04597.bmp
2172 | a48055.jpg
2173 | 03976.bmp
2174 | 03895.bmp
2175 | 01798.bmp
2176 | 02689.bmp
2177 | 01879.bmp
2178 | 03499.bmp
2179 | 00988.bmp
2180 | a104010.jpg
2181 | 04669.bmp
2182 | 02887.bmp
2183 | 01996.bmp
2184 | 03778.bmp
2185 | 03697.bmp
2186 | 02968.bmp
2187 | 03859.bmp
2188 | 04588.bmp
2189 | 03994.bmp
2190 | a55075.jpg
2191 | 02869.bmp
2192 | 03598.bmp
2193 | 01978.bmp
2194 | 04489.bmp
2195 | 01897.bmp
2196 | 03679.bmp
2197 | 02788.bmp
2198 | 00889.bmp
2199 | 01699.bmp
2200 | 03958.bmp
2201 | 04687.bmp
2202 | a65074.jpg
2203 | 03796.bmp
2204 | 02986.bmp
2205 | 03877.bmp
2206 | 01466.bmp
2207 | 00737.bmp
2208 | 02195.bmp
2209 | 03248.bmp
2210 | 02519.bmp
2211 | 03086.bmp
2212 | 01628.bmp
2213 | 02357.bmp
2214 | 00575.bmp
2215 | 04139.bmp
2216 | 01547.bmp
2217 | 00818.bmp
2218 | 02276.bmp
2219 | 00494.bmp
2220 | 03329.bmp
2221 | 04058.bmp
2222 | 03167.bmp
2223 | 01709.bmp
2224 | 02438.bmp
2225 | 01385.bmp
2226 | 00656.bmp
2227 | 03644.bmp
2228 | 02915.bmp
2229 | 04373.bmp
2230 | 02591.bmp
2231 | 01862.bmp
2232 | 03806.bmp
2233 | 04535.bmp
2234 | 00971.bmp
2235 | 02753.bmp
2236 | 03482.bmp
2237 | 03725.bmp
2238 | 04454.bmp
2239 | 00890.bmp
2240 | 02672.bmp
2241 | 01943.bmp
2242 | 04616.bmp
2243 | 01781.bmp
2244 | 02834.bmp
2245 | 04292.bmp
2246 | 03563.bmp
2247 | 00098.bmp
2248 | a277095.jpg
2249 | 00179.bmp
2250 | 04337.bmp
2251 | 03608.bmp
2252 | 00773.bmp
2253 | 02555.bmp
2254 | 03284.bmp
2255 | 01826.bmp
2256 | 02393.bmp
2257 | 00935.bmp
2258 | 01664.bmp
2259 | 02717.bmp
2260 | 04175.bmp
2261 | 03446.bmp
2262 | 04418.bmp
2263 | 00854.bmp
2264 | 01583.bmp
2265 | 02636.bmp
2266 | 04094.bmp
2267 | 03365.bmp
2268 | 01907.bmp
2269 | 02474.bmp
2270 | 01745.bmp
2271 | 00692.bmp
2272 | 04256.bmp
2273 | 03527.bmp
2274 | 03680.bmp
2275 | 02951.bmp
2276 | 04733.bmp
2277 | 03842.bmp
2278 | 04571.bmp
2279 | 03761.bmp
2280 | 04490.bmp
2281 | 03923.bmp
2282 | 04652.bmp
2283 | 02870.bmp
2284 | 01187.bmp
2285 | 00458.bmp
2286 | 00296.bmp
2287 | 01349.bmp
2288 | 02078.bmp
2289 | 01268.bmp
2290 | 00539.bmp
2291 | a16052.jpg
2292 | 00377.bmp
2293 | 02159.bmp
2294 | 00755.bmp
2295 | 01484.bmp
2296 | 04319.bmp
2297 | 02537.bmp
2298 | 03266.bmp
2299 | 01808.bmp
2300 | 02375.bmp
2301 | 00917.bmp
2302 | 01646.bmp
2303 | 04157.bmp
2304 | 03428.bmp
2305 | 00593.bmp
2306 | 02294.bmp
2307 | 00836.bmp
2308 | 01565.bmp
2309 | 02618.bmp
2310 | 04076.bmp
2311 | 03347.bmp
2312 | 02456.bmp
2313 | 03185.bmp
2314 | 01727.bmp
2315 | 04238.bmp
2316 | 03509.bmp
2317 | 00674.bmp
2318 | a12074.jpg
2319 | 03662.bmp
2320 | 02933.bmp
2321 | 04391.bmp
2322 | 01880.bmp
2323 | 04715.bmp
2324 | 03824.bmp
2325 | 04553.bmp
2326 | 02771.bmp
2327 | 03743.bmp
2328 | 04472.bmp
2329 | 01961.bmp
2330 | 02690.bmp
2331 | 03905.bmp
2332 | 04634.bmp
2333 | 03581.bmp
2334 | 02852.bmp
2335 | a33044.jpg
2336 | 01169.bmp
2337 | a15062.jpg
2338 | 00278.bmp
2339 | 00197.bmp
2340 | 00359.bmp
2341 | 01088.bmp
2342 | 00791.bmp
2343 | 04355.bmp
2344 | 03626.bmp
2345 | 02573.bmp
2346 | 01844.bmp
2347 | 00953.bmp
2348 | 01682.bmp
2349 | 04517.bmp
2350 | 02735.bmp
2351 | 04193.bmp
2352 | 03464.bmp
2353 | 00872.bmp
2354 | 04436.bmp
2355 | 03707.bmp
2356 | 02654.bmp
2357 | 03383.bmp
2358 | 01925.bmp
2359 | a299091.jpg
2360 | 02492.bmp
2361 | 01763.bmp
2362 | 02816.bmp
2363 | 04274.bmp
2364 | 03545.bmp
2365 | 03860.bmp
2366 | 03941.bmp
2367 | 04670.bmp
2368 | 01529.bmp
2369 | 02258.bmp
2370 | 00476.bmp
2371 | 03149.bmp
2372 | 01367.bmp
2373 | 00638.bmp
2374 | 02096.bmp
2375 | 03068.bmp
2376 | 02339.bmp
2377 | 01286.bmp
2378 | 00557.bmp
2379 | 00395.bmp
2380 | 01448.bmp
2381 | 00719.bmp
2382 | 02177.bmp
2383 | 02528.bmp
2384 | 03257.bmp
2385 | a54005.jpg
2386 | 01475.bmp
2387 | 00746.bmp
2388 | 04148.bmp
2389 | 03419.bmp
2390 | 00584.bmp
2391 | 01637.bmp
2392 | 03095.bmp
2393 | 02366.bmp
2394 | 00908.bmp
2395 | 04067.bmp
2396 | 02609.bmp
2397 | 03338.bmp
2398 | 01556.bmp
2399 | 02285.bmp
2400 | 00827.bmp
2401 | 04229.bmp
2402 | 01394.bmp
2403 | a43070.jpg
2404 | 00665.bmp
2405 | 01718.bmp
2406 | 03176.bmp
2407 | 02447.bmp
2408 | a249087.jpg
2409 | 01871.bmp
2410 | 04706.bmp
2411 | 03653.bmp
2412 | 04382.bmp
2413 | 02924.bmp
2414 | 03491.bmp
2415 | 02762.bmp
2416 | 03815.bmp
2417 | 04544.bmp
2418 | 00980.bmp
2419 | 01952.bmp
2420 | 02681.bmp
2421 | 03734.bmp
2422 | 04463.bmp
2423 | 03572.bmp
2424 | 02843.bmp
2425 | 04625.bmp
2426 | 01790.bmp
2427 | 00269.bmp
2428 | a296058.jpg
2429 | 00188.bmp
2430 | a376086.jpg
2431 | 01079.bmp
2432 | 02564.bmp
2433 | 01835.bmp
2434 | 03293.bmp
2435 | 04346.bmp
2436 | 03617.bmp
2437 | 00782.bmp
2438 | 04184.bmp
2439 | 02726.bmp
2440 | 03455.bmp
2441 | 04508.bmp
2442 | 00944.bmp
2443 | 01673.bmp
2444 | 02645.bmp
2445 | 01916.bmp
2446 | 03374.bmp
2447 | 04427.bmp
2448 | 00863.bmp
2449 | 01592.bmp
2450 | 04265.bmp
2451 | 02807.bmp
2452 | 03536.bmp
2453 | 02483.bmp
2454 | 01754.bmp
2455 | 04742.bmp
2456 | 02960.bmp
2457 | 03851.bmp
2458 | 04580.bmp
2459 | 03770.bmp
2460 | 03932.bmp
2461 | 04661.bmp
2462 | 01196.bmp
2463 | 00467.bmp
2464 | 02249.bmp
2465 | 01358.bmp
2466 | 02087.bmp
2467 | 00629.bmp
2468 | 01277.bmp
2469 | 00548.bmp
2470 | 03059.bmp
2471 | 01439.bmp
2472 | 02168.bmp
2473 | 00386.bmp
2474 | 02546.bmp
2475 | 01817.bmp
2476 | 03275.bmp
2477 | 00764.bmp
2478 | 01493.bmp
2479 | 04328.bmp
2480 | 04166.bmp
2481 | 02708.bmp
2482 | 03437.bmp
2483 | 00926.bmp
2484 | 02384.bmp
2485 | 01655.bmp
2486 | 04085.bmp
2487 | 02627.bmp
2488 | 03356.bmp
2489 | 00845.bmp
2490 | 01574.bmp
2491 | 04409.bmp
2492 | 00683.bmp
2493 | 04247.bmp
2494 | 03518.bmp
2495 | 02465.bmp
2496 | 01736.bmp
2497 | 03194.bmp
2498 | 04724.bmp
2499 | 03671.bmp
2500 | 02942.bmp
2501 | 02780.bmp
2502 | 03833.bmp
2503 | 04562.bmp
2504 | 01970.bmp
2505 | 03752.bmp
2506 | 04481.bmp
2507 | 03590.bmp
2508 | 02861.bmp
2509 | 03914.bmp
2510 | 04643.bmp
2511 | 01178.bmp
2512 | 00449.bmp
2513 | 02069.bmp
2514 | 00287.bmp
2515 | 01259.bmp
2516 | a42044.jpg
2517 | 00368.bmp
2518 | 01097.bmp
2519 | 02582.bmp
2520 | 01853.bmp
2521 | 04364.bmp
2522 | 02906.bmp
2523 | 03635.bmp
2524 | 02744.bmp
2525 | 03473.bmp
2526 | 00962.bmp
2527 | 01691.bmp
2528 | 04526.bmp
2529 | 02663.bmp
2530 | 01934.bmp
2531 | a29030.jpg
2532 | 03392.bmp
2533 | 00881.bmp
2534 | 04445.bmp
2535 | 03716.bmp
2536 | 04283.bmp
2537 | 02825.bmp
2538 | 03554.bmp
2539 | 01772.bmp
2540 | 04607.bmp
2541 | 00089.bmp
2542 | 03950.bmp
2543 | 00485.bmp
2544 | a61034.jpg
2545 | 04049.bmp
2546 | 01538.bmp
2547 | 02267.bmp
2548 | 00809.bmp
2549 | 01376.bmp
2550 | 00647.bmp
2551 | 03158.bmp
2552 | 02429.bmp
2553 | 01295.bmp
2554 | 00566.bmp
2555 | 01619.bmp
2556 | 03077.bmp
2557 | 02348.bmp
2558 | 01457.bmp
2559 | 02186.bmp
2560 | 00728.bmp
2561 | 03239.bmp
2562 | 00100.bmp
2563 | a108041.jpg
2564 | a106025.jpg
2565 | a105053.jpg
2566 | a112082.jpg
2567 | a209021.jpg
2568 | 00001.bmp
2569 | a311081.jpg
2570 | 01000.bmp
2571 | a226022.jpg
2572 | a163004.jpg
2573 | a113009.jpg
2574 | a101084.jpg
2575 | a118031.jpg
2576 | a216041.jpg
2577 | a217013.jpg
2578 | a230063.jpg
2579 | 00010.bmp
2580 | a271031.jpg
2581 | 01021.bmp
2582 | 00130.bmp
2583 | 01102.bmp
2584 | 00211.bmp
2585 | a253016.jpg
2586 | a226043.jpg
2587 | 02110.bmp
2588 | 03001.bmp
2589 | a161045.jpg
2590 | 01300.bmp
2591 | a159002.jpg
2592 | a138032.jpg
2593 | 00013.bmp
2594 | a140075.jpg
2595 | a225017.jpg
2596 | 00310.bmp
2597 | 01201.bmp
2598 | 01120.bmp
2599 | 02011.bmp
2600 | a260081.jpg
2601 | a170054.jpg
2602 | 03100.bmp
2603 | a245051.jpg
2604 | a155060.jpg
2605 | 00031.bmp
2606 | 00112.bmp
2607 | 01003.bmp
2608 | a107045.jpg
2609 | a107072.jpg
2610 | 01030.bmp
2611 | 00301.bmp
2612 | 01111.bmp
2613 | 02002.bmp
2614 | 00220.bmp
2615 | a334025.jpg
2616 | 03010.bmp
2617 | a216053.jpg
2618 | 02200.bmp
2619 | a254033.jpg
2620 | 00022.bmp
2621 | 00103.bmp
2622 | a376001.jpg
2623 | 02101.bmp
2624 | 01210.bmp
2625 | a109034.jpg
2626 | 00400.bmp
2627 | 02020.bmp
2628 | 00004.bmp
2629 | 04000.bmp
2630 | a122048.jpg
2631 | 00040.bmp
2632 | 00202.bmp
2633 | 00121.bmp
2634 | 01012.bmp
2635 | 03449.bmp
2636 | 04178.bmp
2637 | 02396.bmp
2638 | 00938.bmp
2639 | 01667.bmp
2640 | 00776.bmp
2641 | 02558.bmp
2642 | 03287.bmp
2643 | 01829.bmp
2644 | 04259.bmp
2645 | 00695.bmp
2646 | 02477.bmp
2647 | 01748.bmp
2648 | 00857.bmp
2649 | 01586.bmp
2650 | 02639.bmp
2651 | 04097.bmp
2652 | 03368.bmp
2653 | 00299.bmp
2654 | 02792.bmp
2655 | 04574.bmp
2656 | 03845.bmp
2657 | 02954.bmp
2658 | 03683.bmp
2659 | 04736.bmp
2660 | 02873.bmp
2661 | 04655.bmp
2662 | 03926.bmp
2663 | 04493.bmp
2664 | 03764.bmp
2665 | 01982.bmp
2666 | 03485.bmp
2667 | 02756.bmp
2668 | 03809.bmp
2669 | 04538.bmp
2670 | 00974.bmp
2671 | 03647.bmp
2672 | 02918.bmp
2673 | 04376.bmp
2674 | 01865.bmp
2675 | 02594.bmp
2676 | 03566.bmp
2677 | 02837.bmp
2678 | 04295.bmp
2679 | 04619.bmp
2680 | 01784.bmp
2681 | 03728.bmp
2682 | 04457.bmp
2683 | 00893.bmp
2684 | 01946.bmp
2685 | 02675.bmp
2686 | 00578.bmp
2687 | 03089.bmp
2688 | 02198.bmp
2689 | 01469.bmp
2690 | 00659.bmp
2691 | 01388.bmp
2692 | 02279.bmp
2693 | 00497.bmp
2694 | 03881.bmp
2695 | 02990.bmp
2696 | 04691.bmp
2697 | 03962.bmp
2698 | 03467.bmp
2699 | 02738.bmp
2700 | 04196.bmp
2701 | 01685.bmp
2702 | 00956.bmp
2703 | 00794.bmp
2704 | 03629.bmp
2705 | 04358.bmp
2706 | 01847.bmp
2707 | 02576.bmp
2708 | 03548.bmp
2709 | 02819.bmp
2710 | 04277.bmp
2711 | 01766.bmp
2712 | 02495.bmp
2713 | 00875.bmp
2714 | 04439.bmp
2715 | 01928.bmp
2716 | 03386.bmp
2717 | 02657.bmp
2718 | 01289.bmp
2719 | 00398.bmp
2720 | 02099.bmp
2721 | 00479.bmp
2722 | 04592.bmp
2723 | 03863.bmp
2724 | 02972.bmp
2725 | 02891.bmp
2726 | 04673.bmp
2727 | 03944.bmp
2728 | 03782.bmp
2729 | a23084.jpg
2730 | a80090.jpg
2731 | 02774.bmp
2732 | 00992.bmp
2733 | 03827.bmp
2734 | 04556.bmp
2735 | 03665.bmp
2736 | 02936.bmp
2737 | 04394.bmp
2738 | 01883.bmp
2739 | 04718.bmp
2740 | 03584.bmp
2741 | 02855.bmp
2742 | 03908.bmp
2743 | 04637.bmp
2744 | 03746.bmp
2745 | 04475.bmp
2746 | 01964.bmp
2747 | 02693.bmp
2748 | 00596.bmp
2749 | 02378.bmp
2750 | 01649.bmp
2751 | 00758.bmp
2752 | 01487.bmp
2753 | 03269.bmp
2754 | 00677.bmp
2755 | 02459.bmp
2756 | 03188.bmp
2757 | 02297.bmp
2758 | 00839.bmp
2759 | 01568.bmp
2760 | 04079.bmp
2761 | 03980.bmp
2762 | 01676.bmp
2763 | 00947.bmp
2764 | 03458.bmp
2765 | 04187.bmp
2766 | 02729.bmp
2767 | 03296.bmp
2768 | 01838.bmp
2769 | 02567.bmp
2770 | 04349.bmp
2771 | 00785.bmp
2772 | 01757.bmp
2773 | 02486.bmp
2774 | 03539.bmp
2775 | 04268.bmp
2776 | 03377.bmp
2777 | 01919.bmp
2778 | 02648.bmp
2779 | 00866.bmp
2780 | 01595.bmp
2781 | a198087.jpg
2782 | 00389.bmp
2783 | a189096.jpg
2784 | 01199.bmp
2785 | a65132.jpg
2786 | 04583.bmp
2787 | 03854.bmp
2788 | 02963.bmp
2789 | 03692.bmp
2790 | 04664.bmp
2791 | 03935.bmp
2792 | 02882.bmp
2793 | 01991.bmp
2794 | 03773.bmp
2795 | 00983.bmp
2796 | 03818.bmp
2797 | 04547.bmp
2798 | 03494.bmp
2799 | 02765.bmp
2800 | 01874.bmp
2801 | 04709.bmp
2802 | 03656.bmp
2803 | 04385.bmp
2804 | 02927.bmp
2805 | 01793.bmp
2806 | 04628.bmp
2807 | 03575.bmp
2808 | 02846.bmp
2809 | 01955.bmp
2810 | 02684.bmp
2811 | 03737.bmp
2812 | 04466.bmp
2813 | 02369.bmp
2814 | 03098.bmp
2815 | 00587.bmp
2816 | 00749.bmp
2817 | 01478.bmp
2818 | 03179.bmp
2819 | 00668.bmp
2820 | 01397.bmp
2821 | 02288.bmp
2822 | 01559.bmp
2823 | 03890.bmp
2824 | 03971.bmp
2825 | 04529.bmp
2826 | 01694.bmp
2827 | 00965.bmp
2828 | 03476.bmp
2829 | 02747.bmp
2830 | 01856.bmp
2831 | 02585.bmp
2832 | 03638.bmp
2833 | 04367.bmp
2834 | 02909.bmp
2835 | 01775.bmp
2836 | 03557.bmp
2837 | 04286.bmp
2838 | 02828.bmp
2839 | 03395.bmp
2840 | 01937.bmp
2841 | 02666.bmp
2842 | 00884.bmp
2843 | 03719.bmp
2844 | 04448.bmp
2845 | 00569.bmp
2846 | 01298.bmp
2847 | 02189.bmp
2848 | 01379.bmp
2849 | 00488.bmp
2850 | 03872.bmp
2851 | 02981.bmp
2852 | 04682.bmp
2853 | 03953.bmp
2854 | a20069.jpg
2855 | 03791.bmp
2856 | a97010.jpg
2857 | 04565.bmp
2858 | 03836.bmp
2859 | a64061.jpg
2860 | 02783.bmp
2861 | 04727.bmp
2862 | 01892.bmp
2863 | 03674.bmp
2864 | 02945.bmp
2865 | 04646.bmp
2866 | 03917.bmp
2867 | 03593.bmp
2868 | 02864.bmp
2869 | 01973.bmp
2870 | 03755.bmp
2871 | 04484.bmp
2872 | 00929.bmp
2873 | 02387.bmp
2874 | 01658.bmp
2875 | 04169.bmp
2876 | 02549.bmp
2877 | 03278.bmp
2878 | 00767.bmp
2879 | 01496.bmp
2880 | 02468.bmp
2881 | 01739.bmp
2882 | 03197.bmp
2883 | 00686.bmp
2884 | 04088.bmp
2885 | 03359.bmp
2886 | 00848.bmp
2887 | 01577.bmp
2888 | 00219.bmp
2889 | a41004.jpg
2890 | 00057.bmp
2891 | 01029.bmp
2892 | 00138.bmp
2893 | 03522.bmp
2894 | 04251.bmp
2895 | 01740.bmp
2896 | 04413.bmp
2897 | 03360.bmp
2898 | 01902.bmp
2899 | 02631.bmp
2900 | 03603.bmp
2901 | 04332.bmp
2902 | 01821.bmp
2903 | 02550.bmp
2904 | 00930.bmp
2905 | 03441.bmp
2906 | 04170.bmp
2907 | 02712.bmp
2908 | 00615.bmp
2909 | 02073.bmp
2910 | 01344.bmp
2911 | 00291.bmp
2912 | 03126.bmp
2913 | 02235.bmp
2914 | 01506.bmp
2915 | 00453.bmp
2916 | 01182.bmp
2917 | 04017.bmp
2918 | 02154.bmp
2919 | 01425.bmp
2920 | 00372.bmp
2921 | 03207.bmp
2922 | 02316.bmp
2923 | 03045.bmp
2924 | 00534.bmp
2925 | 01263.bmp
2926 | 01308.bmp
2927 | 02037.bmp
2928 | 00255.bmp
2929 | 00093.bmp
2930 | 01146.bmp
2931 | 00417.bmp
2932 | 02118.bmp
2933 | 01065.bmp
2934 | 00336.bmp
2935 | 00174.bmp
2936 | 03009.bmp
2937 | 01227.bmp
2938 | 04611.bmp
2939 | 03720.bmp
2940 | 02910.bmp
2941 | 04530.bmp
2942 | 03801.bmp
2943 | 04215.bmp
2944 | 00651.bmp
2945 | 01380.bmp
2946 | 02433.bmp
2947 | 01704.bmp
2948 | 03162.bmp
2949 | 00813.bmp
2950 | 02271.bmp
2951 | 01542.bmp
2952 | 04053.bmp
2953 | a45000.jpg
2954 | 03324.bmp
2955 | 00732.bmp
2956 | 02190.bmp
2957 | 01461.bmp
2958 | 02514.bmp
2959 | 03243.bmp
2960 | 02352.bmp
2961 | 01623.bmp
2962 | 03081.bmp
2963 | 00570.bmp
2964 | 04134.bmp
2965 | 03405.bmp
2966 | 02019.bmp
2967 | 00237.bmp
2968 | 00075.bmp
2969 | 01128.bmp
2970 | 01047.bmp
2971 | 00318.bmp
2972 | 00156.bmp
2973 | 01209.bmp
2974 | 03540.bmp
2975 | 02811.bmp
2976 | 03702.bmp
2977 | 04431.bmp
2978 | 01920.bmp
2979 | 03621.bmp
2980 | 04350.bmp
2981 | 04512.bmp
2982 | 02730.bmp
2983 | 00633.bmp
2984 | 02091.bmp
2985 | 01362.bmp
2986 | 02415.bmp
2987 | 03144.bmp
2988 | 02253.bmp
2989 | 01524.bmp
2990 | 04035.bmp
2991 | 03306.bmp
2992 | 00471.bmp
2993 | 00714.bmp
2994 | 02172.bmp
2995 | 01443.bmp
2996 | a70011.jpg
2997 | 03225.bmp
2998 | 00390.bmp
2999 | 02334.bmp
3000 | 01605.bmp
3001 | 03063.bmp
3002 | 04116.bmp
3003 | 00552.bmp
3004 | 01281.bmp
3005 | a292066.jpg
3006 | 02055.bmp
3007 | 01326.bmp
3008 | 03108.bmp
3009 | 00273.bmp
3010 | 02217.bmp
3011 | 01164.bmp
3012 | 00435.bmp
3013 | 02136.bmp
3014 | 01407.bmp
3015 | 01083.bmp
3016 | 00354.bmp
3017 | 03027.bmp
3018 | 00192.bmp
3019 | 01245.bmp
3020 | 00516.bmp
3021 | 03900.bmp
3022 | 04710.bmp
3023 | 03504.bmp
3024 | 04233.bmp
3025 | 03180.bmp
3026 | 01722.bmp
3027 | 02451.bmp
3028 | 01560.bmp
3029 | 00831.bmp
3030 | 03342.bmp
3031 | 04071.bmp
3032 | 02613.bmp
3033 | 00750.bmp
3034 | 04314.bmp
3035 | 03261.bmp
3036 | 01803.bmp
3037 | 02532.bmp
3038 | 01641.bmp
3039 | 00912.bmp
3040 | 02370.bmp
3041 | 03423.bmp
3042 | 04152.bmp
3043 | a178054.jpg
3044 | 00039.bmp
3045 | 00228.bmp
3046 | 01119.bmp
3047 | 00066.bmp
3048 | 01038.bmp
3049 | 00309.bmp
3050 | 00147.bmp
3051 | 03531.bmp
3052 | 02802.bmp
3053 | 04260.bmp
3054 | 01911.bmp
3055 | 02640.bmp
3056 | a228076.jpg
3057 | 04422.bmp
3058 | 01830.bmp
3059 | 03612.bmp
3060 | 04341.bmp
3061 | 03450.bmp
3062 | 02721.bmp
3063 | 04503.bmp
3064 | 02406.bmp
3065 | 03135.bmp
3066 | 02082.bmp
3067 | 00624.bmp
3068 | a35010.jpg
3069 | 01353.bmp
3070 | 04026.bmp
3071 | 00462.bmp
3072 | 01191.bmp
3073 | a208078.jpg
3074 | 02244.bmp
3075 | 01515.bmp
3076 | 03216.bmp
3077 | 00381.bmp
3078 | 02163.bmp
3079 | 00705.bmp
3080 | 01434.bmp
3081 | 04107.bmp
3082 | 00543.bmp
3083 | 01272.bmp
3084 | 02325.bmp
3085 | 03054.bmp
3086 | a293029.jpg
3087 | 00264.bmp
3088 | 01317.bmp
3089 | 02046.bmp
3090 | 01155.bmp
3091 | 00426.bmp
3092 | 02208.bmp
3093 | 01074.bmp
3094 | 00345.bmp
3095 | 02127.bmp
3096 | 01236.bmp
3097 | 00507.bmp
3098 | 00183.bmp
3099 | 03018.bmp
3100 | 04620.bmp
3101 | 04701.bmp
3102 | 03810.bmp
3103 | 01713.bmp
3104 | 03171.bmp
3105 | 02442.bmp
3106 | 04224.bmp
3107 | 00660.bmp
3108 | 03333.bmp
3109 | 02604.bmp
3110 | 04062.bmp
3111 | 02280.bmp
3112 | 00822.bmp
3113 | 01551.bmp
3114 | 03252.bmp
3115 | 02523.bmp
3116 | 04305.bmp
3117 | 00741.bmp
3118 | 01470.bmp
3119 | 03414.bmp
3120 | 04143.bmp
3121 | 02361.bmp
3122 | 00903.bmp
3123 | 03090.bmp
3124 | 01632.bmp
3125 | a196027.jpg
3126 | a159091.jpg
3127 | a185092.jpg
3128 | 00246.bmp
3129 | 02028.bmp
3130 | 01137.bmp
3131 | 00408.bmp
3132 | 00084.bmp
3133 | 01056.bmp
3134 | 00327.bmp
3135 | 02109.bmp
3136 | 01218.bmp
3137 | 00165.bmp
3138 | 04602.bmp
3139 | 02820.bmp
3140 | 03711.bmp
3141 | 04440.bmp
3142 | 03630.bmp
3143 | 02901.bmp
3144 | 04521.bmp
3145 | 02424.bmp
3146 | 03153.bmp
3147 | 00642.bmp
3148 | 01371.bmp
3149 | 04206.bmp
3150 | 00480.bmp
3151 | 04044.bmp
3152 | 03315.bmp
3153 | 02262.bmp
3154 | 00804.bmp
3155 | 01533.bmp
3156 | 02505.bmp
3157 | 03234.bmp
3158 | 02181.bmp
3159 | 00723.bmp
3160 | 01452.bmp
3161 | 00561.bmp
3162 | 01290.bmp
3163 | 04125.bmp
3164 | 02343.bmp
3165 | 03072.bmp
3166 | 01614.bmp
3167 | 00282.bmp
3168 | 03117.bmp
3169 | 02064.bmp
3170 | 00606.bmp
3171 | 01335.bmp
3172 | 00444.bmp
3173 | 01173.bmp
3174 | 04008.bmp
3175 | 02226.bmp
3176 | 00363.bmp
3177 | 01092.bmp
3178 | a388006.jpg
3179 | 02145.bmp
3180 | 01416.bmp
3181 | 00525.bmp
3182 | 01254.bmp
3183 | 02307.bmp
3184 | 03036.bmp
3185 | 01731.bmp
3186 | 02460.bmp
3187 | 03513.bmp
3188 | 04242.bmp
3189 | 03351.bmp
3190 | 02622.bmp
3191 | 04080.bmp
3192 | 00840.bmp
3193 | 04404.bmp
3194 | 01812.bmp
3195 | a163096.jpg
3196 | 03270.bmp
3197 | 02541.bmp
3198 | 04323.bmp
3199 | 03432.bmp
3200 | 02703.bmp
3201 | 04161.bmp
3202 | 01650.bmp
3203 | 00921.bmp
3204 | 00129.bmp
3205 | 00048.bmp
3206 | a141012.jpg
3207 | a106020.jpg
3208 | a100080.jpg
3209 | 04699.bmp
3210 | 03889.bmp
3211 | a92059.jpg
3212 | 02998.bmp
3213 | a78019.jpg
3214 | a104022.jpg
3215 | 02899.bmp
3216 | a28096.jpg
3217 | a302022.jpg
3218 | 03988.bmp
3219 | a103041.jpg
3220 | a130014.jpg
3221 | 01999.bmp
3222 | 03979.bmp
3223 | 03898.bmp
3224 | 03799.bmp
3225 | 02989.bmp
3226 | 03997.bmp
3227 | a156054.jpg
3228 | a253092.jpg
3229 | 01025.bmp
3230 | 00134.bmp
3231 | 00053.bmp
3232 | 01106.bmp
3233 | a189003.jpg
3234 | 00215.bmp
3235 | a365025.jpg
3236 | 01421.bmp
3237 | 02150.bmp
3238 | 03203.bmp
3239 | 03041.bmp
3240 | 02312.bmp
3241 | 00530.bmp
3242 | 01502.bmp
3243 | 02231.bmp
3244 | 04013.bmp
3245 | 03122.bmp
3246 | 01340.bmp
3247 | 00611.bmp
3248 | 02114.bmp
3249 | 00332.bmp
3250 | 01061.bmp
3251 | 03005.bmp
3252 | 00170.bmp
3253 | 01223.bmp
3254 | 00413.bmp
3255 | 01142.bmp
3256 | 00251.bmp
3257 | 02033.bmp
3258 | 01304.bmp
3259 | 00017.bmp
3260 | 02510.bmp
3261 | 04130.bmp
3262 | 03401.bmp
3263 | 03320.bmp
3264 | 01700.bmp
3265 | a246009.jpg
3266 | 04211.bmp
3267 | 00314.bmp
3268 | 01043.bmp
3269 | 00152.bmp
3270 | 01205.bmp
3271 | 00071.bmp
3272 | 01124.bmp
3273 | a126039.jpg
3274 | 00233.bmp
3275 | 02015.bmp
3276 | 00710.bmp
3277 | 03221.bmp
3278 | 01601.bmp
3279 | 02330.bmp
3280 | 04112.bmp
3281 | 01520.bmp
3282 | 03302.bmp
3283 | 04031.bmp
3284 | 03140.bmp
3285 | 02411.bmp
3286 | 01403.bmp
3287 | 02132.bmp
3288 | 00350.bmp
3289 | 03023.bmp
3290 | 01241.bmp
3291 | 00512.bmp
3292 | a216066.jpg
3293 | 02213.bmp
3294 | 01160.bmp
3295 | 00431.bmp
3296 | a289011.jpg
3297 | 03104.bmp
3298 | 01322.bmp
3299 | 02051.bmp
3300 | 01007.bmp
3301 | 00116.bmp
3302 | 00035.bmp
3303 | 04310.bmp
3304 | 03500.bmp
3305 | a239007.jpg
3306 | 00305.bmp
3307 | 01034.bmp
3308 | 00143.bmp
3309 | 01115.bmp
3310 | a134049.jpg
3311 | 00062.bmp
3312 | 02006.bmp
3313 | 00224.bmp
3314 | 03212.bmp
3315 | 01430.bmp
3316 | 00701.bmp
3317 | 04103.bmp
3318 | 03050.bmp
3319 | 02321.bmp
3320 | 04022.bmp
3321 | 01511.bmp
3322 | 02240.bmp
3323 | 00620.bmp
3324 | 03131.bmp
3325 | 02402.bmp
3326 | 01070.bmp
3327 | 00341.bmp
3328 | 02123.bmp
3329 | 01232.bmp
3330 | 00503.bmp
3331 | 03014.bmp
3332 | 01151.bmp
3333 | 00422.bmp
3334 | 02204.bmp
3335 | 01313.bmp
3336 | 02042.bmp
3337 | 00260.bmp
3338 | 00107.bmp
3339 | 00026.bmp
3340 | a140088.jpg
3341 | 04301.bmp
3342 | 03410.bmp
3343 | 02600.bmp
3344 | a164046.jpg
3345 | 04220.bmp
3346 | 00323.bmp
3347 | 01052.bmp
3348 | 02105.bmp
3349 | 01214.bmp
3350 | 00161.bmp
3351 | a134067.jpg
3352 | 00404.bmp
3353 | 01133.bmp
3354 | 00080.bmp
3355 | 02024.bmp
3356 | 00242.bmp
3357 | 00008.bmp
3358 | 02501.bmp
3359 | 03230.bmp
3360 | 04121.bmp
3361 | a153093.jpg
3362 | a227046.jpg
3363 | 01610.bmp
3364 | 04040.bmp
3365 | 03311.bmp
3366 | 00800.bmp
3367 | 04202.bmp
3368 | 02420.bmp
3369 | 01412.bmp
3370 | 02141.bmp
3371 | 01250.bmp
3372 | 00521.bmp
3373 | a8049.jpg
3374 | 03032.bmp
3375 | 02303.bmp
3376 | 04004.bmp
3377 | 00440.bmp
3378 | 02222.bmp
3379 | 01331.bmp
3380 | 00602.bmp
3381 | 02060.bmp
3382 | 03113.bmp
3383 | 01016.bmp
3384 | 00125.bmp
3385 | 00044.bmp
3386 | 00206.bmp
3387 | 04400.bmp
3388 | a61086.jpg
3389 | 00699.bmp
3390 | 01986.bmp
3391 | 04497.bmp
3392 | 03768.bmp
3393 | 02877.bmp
3394 | 04659.bmp
3395 | 02796.bmp
3396 | 04578.bmp
3397 | 03849.bmp
3398 | 02958.bmp
3399 | 03687.bmp
3400 | 02679.bmp
3401 | 00897.bmp
3402 | 04299.bmp
3403 | 01788.bmp
3404 | 03489.bmp
3405 | 00978.bmp
3406 | 02598.bmp
3407 | 01869.bmp
3408 | 03966.bmp
3409 | 04695.bmp
3410 | 03885.bmp
3411 | 02994.bmp
3412 | a35049.jpg
3413 | a17067.jpg
3414 | 00879.bmp
3415 | 02499.bmp
3416 | 01689.bmp
3417 | 00798.bmp
3418 | 03786.bmp
3419 | 02895.bmp
3420 | 03948.bmp
3421 | 04677.bmp
3422 | 03867.bmp
3423 | 04596.bmp
3424 | 02976.bmp
3425 | a42078.jpg
3426 | 02697.bmp
3427 | 01968.bmp
3428 | 04479.bmp
3429 | a81066.jpg
3430 | 02859.bmp
3431 | 03588.bmp
3432 | 02778.bmp
3433 | 00996.bmp
3434 | 04398.bmp
3435 | 03669.bmp
3436 | 01887.bmp
3437 | 03984.bmp
3438 | 01599.bmp
3439 | 00789.bmp
3440 | 03777.bmp
3441 | 01995.bmp
3442 | 03939.bmp
3443 | 04668.bmp
3444 | 02886.bmp
3445 | 03858.bmp
3446 | 04587.bmp
3447 | 02967.bmp
3448 | 03696.bmp
3449 | a16068.jpg
3450 | a65019.jpg
3451 | 02688.bmp
3452 | 01959.bmp
3453 | 01797.bmp
3454 | 03579.bmp
3455 | a28083.jpg
3456 | 00987.bmp
3457 | a56028.jpg
3458 | a80085.jpg
3459 | 02769.bmp
3460 | 03498.bmp
3461 | 01878.bmp
3462 | 04389.bmp
3463 | 03975.bmp
3464 | 03894.bmp
3465 | a35058.jpg
3466 | 00888.bmp
3467 | 03399.bmp
3468 | 01779.bmp
3469 | a71076.jpg
3470 | 00969.bmp
3471 | 01698.bmp
3472 | 02589.bmp
3473 | a87015.jpg
3474 | 03795.bmp
3475 | 03957.bmp
3476 | 04686.bmp
3477 | 03876.bmp
3478 | 02985.bmp
3479 | 04488.bmp
3480 | 03759.bmp
3481 | 01977.bmp
3482 | 02868.bmp
3483 | 03597.bmp
3484 | 04569.bmp
3485 | 02787.bmp
3486 | 01896.bmp
3487 | 02949.bmp
3488 | 03678.bmp
3489 | 03993.bmp
3490 | 02716.bmp
3491 | 04174.bmp
3492 | 03445.bmp
3493 | 02392.bmp
3494 | 00934.bmp
3495 | 01663.bmp
3496 | 00772.bmp
3497 | 04336.bmp
3498 | 03607.bmp
3499 | 02554.bmp
3500 | 03283.bmp
3501 | 01825.bmp
3502 | 00691.bmp
3503 | 04255.bmp
3504 | 03526.bmp
3505 | 02473.bmp
3506 | 01744.bmp
3507 | 00853.bmp
3508 | 01582.bmp
3509 | 04417.bmp
3510 | 02635.bmp
3511 | 04093.bmp
3512 | 03364.bmp
3513 | 01906.bmp
3514 | 03841.bmp
3515 | 04570.bmp
3516 | 02950.bmp
3517 | 04732.bmp
3518 | 03922.bmp
3519 | 04651.bmp
3520 | 03760.bmp
3521 | 01348.bmp
3522 | 00619.bmp
3523 | 02077.bmp
3524 | 00295.bmp
3525 | 02239.bmp
3526 | 00457.bmp
3527 | 01186.bmp
3528 | 01429.bmp
3529 | 02158.bmp
3530 | 00376.bmp
3531 | 03049.bmp
3532 | 00538.bmp
3533 | 01267.bmp
3534 | 02752.bmp
3535 | 03481.bmp
3536 | 00970.bmp
3537 | 04534.bmp
3538 | 03805.bmp
3539 | 02914.bmp
3540 | 04372.bmp
3541 | 03643.bmp
3542 | 02590.bmp
3543 | 01861.bmp
3544 | 02833.bmp
3545 | 04291.bmp
3546 | 03562.bmp
3547 | 01780.bmp
3548 | 04615.bmp
3549 | 04453.bmp
3550 | 03724.bmp
3551 | 02671.bmp
3552 | 01942.bmp
3553 | 00259.bmp
3554 | 00097.bmp
3555 | a179084.jpg
3556 | a22090.jpg
3557 | 01069.bmp
3558 | 00178.bmp
3559 | 01384.bmp
3560 | 00655.bmp
3561 | 04219.bmp
3562 | 03166.bmp
3563 | 01708.bmp
3564 | 02437.bmp
3565 | 01546.bmp
3566 | 00817.bmp
3567 | 02275.bmp
3568 | 03328.bmp
3569 | 04057.bmp
3570 | 00493.bmp
3571 | 01465.bmp
3572 | 00736.bmp
3573 | 02194.bmp
3574 | 03247.bmp
3575 | 02518.bmp
3576 | 03085.bmp
3577 | 01627.bmp
3578 | 02356.bmp
3579 | 03409.bmp
3580 | 04138.bmp
3581 | 00574.bmp
3582 | 02734.bmp
3583 | 04192.bmp
3584 | 03463.bmp
3585 | 04516.bmp
3586 | 00952.bmp
3587 | 01681.bmp
3588 | 04354.bmp
3589 | 03625.bmp
3590 | 00790.bmp
3591 | 02572.bmp
3592 | 01843.bmp
3593 | 02815.bmp
3594 | 04273.bmp
3595 | 03544.bmp
3596 | 02491.bmp
3597 | 01762.bmp
3598 | 04435.bmp
3599 | 03706.bmp
3600 | 00871.bmp
3601 | 02653.bmp
3602 | 03382.bmp
3603 | 01924.bmp
3604 | a189029.jpg
3605 | 00079.bmp
3606 | a239096.jpg
3607 | 03940.bmp
3608 | 01366.bmp
3609 | 00637.bmp
3610 | 02095.bmp
3611 | 03148.bmp
3612 | 02419.bmp
3613 | 01528.bmp
3614 | 02257.bmp
3615 | 00475.bmp
3616 | 04039.bmp
3617 | 01447.bmp
3618 | 00718.bmp
3619 | 02176.bmp
3620 | 00394.bmp
3621 | 03229.bmp
3622 | 03067.bmp
3623 | 01609.bmp
3624 | 02338.bmp
3625 | 01285.bmp
3626 | 00556.bmp
3627 | 02770.bmp
3628 | 03823.bmp
3629 | 04552.bmp
3630 | 03661.bmp
3631 | 02932.bmp
3632 | 04390.bmp
3633 | 04714.bmp
3634 | 03580.bmp
3635 | 02851.bmp
3636 | 03904.bmp
3637 | 04633.bmp
3638 | 03742.bmp
3639 | 04471.bmp
3640 | 01960.bmp
3641 | 02059.bmp
3642 | 00277.bmp
3643 | a23080.jpg
3644 | 00439.bmp
3645 | 01168.bmp
3646 | 00358.bmp
3647 | 01087.bmp
3648 | 00196.bmp
3649 | 01249.bmp
3650 | 04237.bmp
3651 | 03508.bmp
3652 | 00673.bmp
3653 | 03184.bmp
3654 | 01726.bmp
3655 | 02455.bmp
3656 | 01564.bmp
3657 | 00835.bmp
3658 | 02293.bmp
3659 | 03346.bmp
3660 | a61060.jpg
3661 | 04075.bmp
3662 | 02617.bmp
3663 | 04318.bmp
3664 | 01483.bmp
3665 | 00754.bmp
3666 | 03265.bmp
3667 | 01807.bmp
3668 | 02536.bmp
3669 | 01645.bmp
3670 | 00916.bmp
3671 | 02374.bmp
3672 | 00592.bmp
3673 | 03427.bmp
3674 | 04156.bmp
3675 | 04507.bmp
3676 | 00943.bmp
3677 | 01672.bmp
3678 | 04183.bmp
3679 | 02725.bmp
3680 | 03454.bmp
3681 | 02563.bmp
3682 | 01834.bmp
3683 | 03292.bmp
3684 | 00781.bmp
3685 | 04345.bmp
3686 | 03616.bmp
3687 | 02482.bmp
3688 | 01753.bmp
3689 | 04264.bmp
3690 | 02806.bmp
3691 | 03535.bmp
3692 | 02644.bmp
3693 | 01915.bmp
3694 | 03373.bmp
3695 | 00862.bmp
3696 | 01591.bmp
3697 | 04426.bmp
3698 | 03850.bmp
3699 | 04741.bmp
3700 | 03931.bmp
3701 | 04660.bmp
3702 | 03139.bmp
3703 | 01357.bmp
3704 | a43033.jpg
3705 | 02086.bmp
3706 | 00628.bmp
3707 | 01195.bmp
3708 | 00466.bmp
3709 | 01519.bmp
3710 | 02248.bmp
3711 | 00385.bmp
3712 | 01438.bmp
3713 | 02167.bmp
3714 | 00709.bmp
3715 | 01276.bmp
3716 | 00547.bmp
3717 | 03058.bmp
3718 | 02329.bmp
3719 | 03814.bmp
3720 | 04543.bmp
3721 | 02761.bmp
3722 | 03490.bmp
3723 | 04705.bmp
3724 | 01870.bmp
3725 | 04381.bmp
3726 | 02923.bmp
3727 | 03652.bmp
3728 | 04624.bmp
3729 | 02842.bmp
3730 | 03571.bmp
3731 | 02680.bmp
3732 | 01951.bmp
3733 | 04462.bmp
3734 | 03733.bmp
3735 | 00268.bmp
3736 | 01159.bmp
3737 | 00349.bmp
3738 | 01078.bmp
3739 | 00187.bmp
3740 | 01717.bmp
3741 | 03175.bmp
3742 | 02446.bmp
3743 | 01393.bmp
3744 | 00664.bmp
3745 | 04228.bmp
3746 | 03337.bmp
3747 | 02608.bmp
3748 | 04066.bmp
3749 | 01555.bmp
3750 | 02284.bmp
3751 | 00826.bmp
3752 | 03256.bmp
3753 | 02527.bmp
3754 | 01474.bmp
3755 | 00745.bmp
3756 | 04309.bmp
3757 | 00583.bmp
3758 | 03418.bmp
3759 | 04147.bmp
3760 | 01636.bmp
3761 | 03094.bmp
3762 | 02365.bmp
3763 | 00907.bmp
3764 | 00961.bmp
3765 | 01690.bmp
3766 | 04525.bmp
3767 | 02743.bmp
3768 | 03472.bmp
3769 | 02581.bmp
3770 | 01852.bmp
3771 | 04363.bmp
3772 | 02905.bmp
3773 | 03634.bmp
3774 | 01771.bmp
3775 | 04606.bmp
3776 | 04282.bmp
3777 | 02824.bmp
3778 | 03553.bmp
3779 | 02662.bmp
3780 | 01933.bmp
3781 | 03391.bmp
3782 | 04444.bmp
3783 | 03715.bmp
3784 | 00880.bmp
3785 | 00088.bmp
3786 | 00169.bmp
3787 | 03157.bmp
3788 | 02428.bmp
3789 | 01375.bmp
3790 | a43051.jpg
3791 | 00646.bmp
3792 | 03319.bmp
3793 | 04048.bmp
3794 | 00484.bmp
3795 | 01537.bmp
3796 | 02266.bmp
3797 | 00808.bmp
3798 | 03238.bmp
3799 | 02509.bmp
3800 | 01456.bmp
3801 | 02185.bmp
3802 | 00727.bmp
3803 | 04129.bmp
3804 | 01294.bmp
3805 | 00565.bmp
3806 | 01618.bmp
3807 | 03076.bmp
3808 | 02347.bmp
3809 | 03832.bmp
3810 | 04561.bmp
3811 | 04723.bmp
3812 | 03670.bmp
3813 | 02941.bmp
3814 | 03913.bmp
3815 | 04642.bmp
3816 | 02860.bmp
3817 | 03751.bmp
3818 | 04480.bmp
3819 | 00286.bmp
3820 | 02068.bmp
3821 | 01339.bmp
3822 | 00448.bmp
3823 | 01177.bmp
3824 | 00367.bmp
3825 | 01096.bmp
3826 | 02149.bmp
3827 | 00529.bmp
3828 | 01258.bmp
3829 | a187058.jpg
3830 | 02464.bmp
3831 | 01735.bmp
3832 | 03193.bmp
3833 | 04246.bmp
3834 | 03517.bmp
3835 | 00682.bmp
3836 | 04084.bmp
3837 | 02626.bmp
3838 | 03355.bmp
3839 | 04408.bmp
3840 | 01573.bmp
3841 | 00844.bmp
3842 | 02545.bmp
3843 | 01816.bmp
3844 | 03274.bmp
3845 | 04327.bmp
3846 | 01492.bmp
3847 | 00763.bmp
3848 | 04165.bmp
3849 | 02707.bmp
3850 | 03436.bmp
3851 | 01654.bmp
3852 | 02383.bmp
3853 | 00925.bmp
3854 | a223060.jpg
3855 | a94079.jpg
3856 | a108004.jpg
3857 | a160006.jpg
3858 | a225022.jpg
3859 | a107014.jpg
3860 | a67079.jpg
3861 | a2092.jpg
3862 | a181021.jpg
3863 | a113044.jpg
3864 | a59078.jpg
3865 | a100075.jpg
3866 | a112090.jpg
3867 | a100039.jpg
3868 | 03201.bmp
3869 | 02310.bmp
3870 | 04011.bmp
3871 | a118072.jpg
3872 | 01500.bmp
3873 | 03120.bmp
3874 | a128035.jpg
3875 | 01023.bmp
3876 | 00132.bmp
3877 | 01104.bmp
3878 | 00051.bmp
3879 | 00213.bmp
3880 | a317080.jpg
3881 | a311068.jpg
3882 | 00015.bmp
3883 | a217090.jpg
3884 | 00330.bmp
3885 | 02112.bmp
3886 | 01221.bmp
3887 | 03003.bmp
3888 | 00411.bmp
3889 | 01140.bmp
3890 | a108073.jpg
3891 | 02031.bmp
3892 | 01302.bmp
3893 | a187003.jpg
3894 | a253036.jpg
3895 | 04110.bmp
3896 | 03300.bmp
3897 | 00312.bmp
3898 | 01041.bmp
3899 | 01203.bmp
3900 | 00150.bmp
3901 | 01122.bmp
3902 | 02013.bmp
3903 | 00231.bmp
3904 | 01005.bmp
3905 | 00114.bmp
3906 | 00033.bmp
3907 | a281017.jpg
3908 | a100099.jpg
3909 | a370036.jpg
3910 | 02130.bmp
3911 | 01401.bmp
3912 | 00510.bmp
3913 | 03021.bmp
3914 | 02211.bmp
3915 | 01320.bmp
3916 | 03102.bmp
3917 | a159022.jpg
3918 | a169012.jpg
3919 | 03210.bmp
3920 | a181018.jpg
3921 | 04101.bmp
3922 | 04020.bmp
3923 | a236017.jpg
3924 | 02400.bmp
3925 | 00303.bmp
3926 | 01032.bmp
3927 | 00141.bmp
3928 | 00060.bmp
3929 | 01113.bmp
3930 | 00222.bmp
3931 | 02004.bmp
3932 | a124084.jpg
3933 | a290035.jpg
3934 | a384022.jpg
3935 | 00105.bmp
3936 | 00024.bmp
3937 | a246016.jpg
3938 | 02121.bmp
3939 | 03012.bmp
3940 | 00501.bmp
3941 | 01230.bmp
3942 | 02202.bmp
3943 | 00420.bmp
3944 | 02040.bmp
3945 | 01311.bmp
3946 | a103078.jpg
3947 | a285022.jpg
3948 | 00006.bmp
3949 | 04200.bmp
3950 | 02103.bmp
3951 | a135037.jpg
3952 | 00321.bmp
3953 | 01050.bmp
3954 | 01212.bmp
3955 | 00402.bmp
3956 | 01131.bmp
3957 | 00240.bmp
3958 | 02022.bmp
3959 | 01014.bmp
3960 | 00123.bmp
3961 | 00042.bmp
3962 | 00204.bmp
3963 | 01410.bmp
3964 | 03030.bmp
3965 | 02301.bmp
3966 | 02220.bmp
3967 | 04002.bmp
3968 | 03111.bmp
3969 | 00600.bmp
3970 | 04495.bmp
3971 | 03766.bmp
3972 | 01984.bmp
3973 | 04657.bmp
3974 | 03928.bmp
3975 | 02875.bmp
3976 | 04576.bmp
3977 | 03847.bmp
3978 | 02794.bmp
3979 | 04738.bmp
3980 | 02956.bmp
3981 | 03685.bmp
3982 | 01669.bmp
3983 | 02398.bmp
3984 | 03289.bmp
3985 | 00778.bmp
3986 | 02479.bmp
3987 | 00697.bmp
3988 | 04099.bmp
3989 | 01588.bmp
3990 | 00859.bmp
3991 | 03964.bmp
3992 | 04693.bmp
3993 | 03883.bmp
3994 | 02992.bmp
3995 | 00499.bmp
3996 | 00976.bmp
3997 | 03487.bmp
3998 | 02758.bmp
3999 | 01867.bmp
4000 | 02596.bmp
4001 | 03649.bmp
4002 | 04378.bmp
4003 | 01786.bmp
4004 | 03568.bmp
4005 | 02839.bmp
4006 | 04297.bmp
4007 | 01948.bmp
4008 | 02677.bmp
4009 | 00895.bmp
4010 | 04459.bmp
4011 | a49024.jpg
4012 | 03784.bmp
4013 | 04675.bmp
4014 | 03946.bmp
4015 | 02893.bmp
4016 | 04594.bmp
4017 | 03865.bmp
4018 | 02974.bmp
4019 | a69022.jpg
4020 | 01687.bmp
4021 | 00958.bmp
4022 | 03469.bmp
4023 | 04198.bmp
4024 | 01849.bmp
4025 | 02578.bmp
4026 | 00796.bmp
4027 | 01768.bmp
4028 | 02497.bmp
4029 | 04279.bmp
4030 | 03388.bmp
4031 | 02659.bmp
4032 | 00877.bmp
4033 | 03982.bmp
4034 | 00598.bmp
4035 | 01489.bmp
4036 | 00679.bmp
4037 | 02299.bmp
4038 | 00994.bmp
4039 | 04558.bmp
4040 | 03829.bmp
4041 | 02776.bmp
4042 | 01885.bmp
4043 | 04396.bmp
4044 | 02938.bmp
4045 | 03667.bmp
4046 | 04639.bmp
4047 | 02857.bmp
4048 | 03586.bmp
4049 | 02695.bmp
4050 | 01966.bmp
4051 | 04477.bmp
4052 | 03748.bmp
4053 | 01993.bmp
4054 | 03775.bmp
4055 | 02884.bmp
4056 | 04666.bmp
4057 | 03937.bmp
4058 | 04585.bmp
4059 | 03856.bmp
4060 | 02965.bmp
4061 | 03694.bmp
4062 | 04189.bmp
4063 | 01678.bmp
4064 | 00949.bmp
4065 | 00787.bmp
4066 | 03298.bmp
4067 | 02569.bmp
4068 | 01759.bmp
4069 | 02488.bmp
4070 | 01597.bmp
4071 | 00868.bmp
4072 | 03379.bmp
4073 | 03973.bmp
4074 | 03892.bmp
4075 | 00589.bmp
4076 | 01399.bmp
4077 | 02767.bmp
4078 | 03496.bmp
4079 | 04549.bmp
4080 | 00985.bmp
4081 | 02929.bmp
4082 | 04387.bmp
4083 | 03658.bmp
4084 | 01876.bmp
4085 | 02848.bmp
4086 | 03577.bmp
4087 | 01795.bmp
4088 | 04468.bmp
4089 | 03739.bmp
4090 | 01957.bmp
4091 | 02686.bmp
4092 | 03793.bmp
4093 | 04684.bmp
4094 | 03955.bmp
4095 | 03874.bmp
4096 | 02983.bmp
4097 | 03478.bmp
4098 | 02749.bmp
4099 | 01696.bmp
4100 | 00967.bmp
4101 | 04369.bmp
4102 | 01858.bmp
4103 | 02587.bmp
4104 | 03559.bmp
4105 | 04288.bmp
4106 | 01777.bmp
4107 | 00886.bmp
4108 | 03397.bmp
4109 | 01939.bmp
4110 | 02668.bmp
4111 | 03991.bmp
4112 | 02389.bmp
4113 | a36046.jpg
4114 | 01498.bmp
4115 | 00769.bmp
4116 | 00688.bmp
4117 | 03199.bmp
4118 | 01579.bmp
4119 | a48025.jpg
4120 | 02785.bmp
4121 | 04567.bmp
4122 | 03838.bmp
4123 | 02947.bmp
4124 | 03676.bmp
4125 | 01894.bmp
4126 | 04729.bmp
4127 | 02866.bmp
4128 | 03595.bmp
4129 | 04648.bmp
4130 | 03919.bmp
4131 | 04486.bmp
4132 | 03757.bmp
4133 | 01975.bmp
4134 | 04730.bmp
4135 | 03920.bmp
4136 | 00293.bmp
4137 | 03128.bmp
4138 | 00617.bmp
4139 | 02075.bmp
4140 | 01346.bmp
4141 | 00455.bmp
4142 | 01184.bmp
4143 | 04019.bmp
4144 | 02237.bmp
4145 | 01508.bmp
4146 | 00374.bmp
4147 | 03209.bmp
4148 | 02156.bmp
4149 | 01427.bmp
4150 | 00536.bmp
4151 | 01265.bmp
4152 | 02318.bmp
4153 | 03047.bmp
4154 | a41006.jpg
4155 | 00059.bmp
4156 | 01742.bmp
4157 | 02471.bmp
4158 | 03524.bmp
4159 | 04253.bmp
4160 | 03362.bmp
4161 | 01904.bmp
4162 | 04091.bmp
4163 | 02633.bmp
4164 | 01580.bmp
4165 | 00851.bmp
4166 | a138078.jpg
4167 | 04415.bmp
4168 | 03281.bmp
4169 | 01823.bmp
4170 | 02552.bmp
4171 | 00770.bmp
4172 | 03605.bmp
4173 | 04334.bmp
4174 | 03443.bmp
4175 | 04172.bmp
4176 | 02714.bmp
4177 | 01661.bmp
4178 | 00932.bmp
4179 | 02390.bmp
4180 | a187029.jpg
4181 | 03164.bmp
4182 | 01706.bmp
4183 | 02435.bmp
4184 | 01382.bmp
4185 | 00653.bmp
4186 | 04217.bmp
4187 | 00491.bmp
4188 | 03326.bmp
4189 | 04055.bmp
4190 | 01544.bmp
4191 | 00815.bmp
4192 | 02273.bmp
4193 | 03245.bmp
4194 | 02516.bmp
4195 | 01463.bmp
4196 | 00734.bmp
4197 | 02192.bmp
4198 | 00572.bmp
4199 | 03407.bmp
4200 | 04136.bmp
4201 | 03083.bmp
4202 | 01625.bmp
4203 | 02354.bmp
4204 | 00257.bmp
4205 | 02039.bmp
4206 | 00419.bmp
4207 | 01148.bmp
4208 | 00095.bmp
4209 | 00338.bmp
4210 | 01067.bmp
4211 | 01229.bmp
4212 | 00176.bmp
4213 | 04613.bmp
4214 | 02831.bmp
4215 | 03560.bmp
4216 | 01940.bmp
4217 | 04451.bmp
4218 | 03722.bmp
4219 | 02912.bmp
4220 | 04370.bmp
4221 | 03641.bmp
4222 | 02750.bmp
4223 | 04532.bmp
4224 | 03803.bmp
4225 | 03146.bmp
4226 | 02417.bmp
4227 | 00635.bmp
4228 | 02093.bmp
4229 | 01364.bmp
4230 | 03308.bmp
4231 | 04037.bmp
4232 | 00473.bmp
4233 | 02255.bmp
4234 | 01526.bmp
4235 | 03227.bmp
4236 | 00392.bmp
4237 | 00716.bmp
4238 | 02174.bmp
4239 | 01445.bmp
4240 | 04118.bmp
4241 | 00554.bmp
4242 | 01283.bmp
4243 | 02336.bmp
4244 | 01607.bmp
4245 | 03065.bmp
4246 | 00239.bmp
4247 | a187083.jpg
4248 | 00077.bmp
4249 | 01049.bmp
4250 | a368037.jpg
4251 | a296028.jpg
4252 | 00158.bmp
4253 | 01760.bmp
4254 | 02813.bmp
4255 | 04271.bmp
4256 | 03542.bmp
4257 | 02651.bmp
4258 | 03380.bmp
4259 | 01922.bmp
4260 | 04433.bmp
4261 | 03704.bmp
4262 | 02570.bmp
4263 | 01841.bmp
4264 | a335088.jpg
4265 | 04352.bmp
4266 | 03623.bmp
4267 | 02732.bmp
4268 | 04190.bmp
4269 | 03461.bmp
4270 | 04514.bmp
4271 | 00950.bmp
4272 | 03182.bmp
4273 | 01724.bmp
4274 | 02453.bmp
4275 | 03506.bmp
4276 | 04235.bmp
4277 | 00671.bmp
4278 | 03344.bmp
4279 | 04073.bmp
4280 | 02615.bmp
4281 | 01562.bmp
4282 | 00833.bmp
4283 | 02291.bmp
4284 | 03263.bmp
4285 | 01805.bmp
4286 | 02534.bmp
4287 | 04316.bmp
4288 | 01481.bmp
4289 | 00752.bmp
4290 | 03425.bmp
4291 | 04154.bmp
4292 | 00590.bmp
4293 | 01643.bmp
4294 | a235098.jpg
4295 | 00914.bmp
4296 | 02372.bmp
4297 | 00275.bmp
4298 | 02057.bmp
4299 | 01328.bmp
4300 | 00437.bmp
4301 | 01166.bmp
4302 | 02219.bmp
4303 | 00356.bmp
4304 | 01085.bmp
4305 | 02138.bmp
4306 | 01409.bmp
4307 | a188091.jpg
4308 | a198054.jpg
4309 | 00518.bmp
4310 | 01247.bmp
4311 | 00194.bmp
4312 | 03029.bmp
4313 | 04631.bmp
4314 | 03902.bmp
4315 | 03740.bmp
4316 | 04712.bmp
4317 | 02930.bmp
4318 | a183087.jpg
4319 | 04550.bmp
4320 | 03821.bmp
4321 | 02084.bmp
4322 | 00626.bmp
4323 | 01355.bmp
4324 | 02408.bmp
4325 | 03137.bmp
4326 | 02246.bmp
4327 | 01517.bmp
4328 | 00464.bmp
4329 | 01193.bmp
4330 | 04028.bmp
4331 | 02165.bmp
4332 | 00707.bmp
4333 | 01436.bmp
4334 | 00383.bmp
4335 | 03218.bmp
4336 | 02327.bmp
4337 | 03056.bmp
4338 | 00545.bmp
4339 | 01274.bmp
4340 | 04109.bmp
4341 | 00068.bmp
4342 | 00149.bmp
4343 | a268074.jpg
4344 | 04262.bmp
4345 | 02804.bmp
4346 | 03533.bmp
4347 | 01751.bmp
4348 | 02480.bmp
4349 | 04424.bmp
4350 | 00860.bmp
4351 | 01913.bmp
4352 | 03371.bmp
4353 | 02642.bmp
4354 | 04343.bmp
4355 | 03614.bmp
4356 | 01832.bmp
4357 | 03290.bmp
4358 | 02561.bmp
4359 | 04505.bmp
4360 | 01670.bmp
4361 | 00941.bmp
4362 | 03452.bmp
4363 | 02723.bmp
4364 | 04181.bmp
4365 | a168084.jpg
4366 | a374067.jpg
4367 | 04226.bmp
4368 | 01391.bmp
4369 | 00662.bmp
4370 | 01715.bmp
4371 | 03173.bmp
4372 | 02444.bmp
4373 | 01553.bmp
4374 | 02282.bmp
4375 | 00824.bmp
4376 | 03335.bmp
4377 | 02606.bmp
4378 | 04064.bmp
4379 | 04307.bmp
4380 | 01472.bmp
4381 | 00743.bmp
4382 | 03254.bmp
4383 | 02525.bmp
4384 | 01634.bmp
4385 | 03092.bmp
4386 | 02363.bmp
4387 | 00905.bmp
4388 | 00581.bmp
4389 | 03416.bmp
4390 | 04145.bmp
4391 | 02048.bmp
4392 | 01319.bmp
4393 | 00266.bmp
4394 | 00428.bmp
4395 | 01157.bmp
4396 | 02129.bmp
4397 | 00347.bmp
4398 | 01076.bmp
4399 | a286092.jpg
4400 | 00185.bmp
4401 | 00509.bmp
4402 | 01238.bmp
4403 | 02840.bmp
4404 | 04622.bmp
4405 | 04460.bmp
4406 | 03731.bmp
4407 | 02921.bmp
4408 | 03650.bmp
4409 | 04703.bmp
4410 | 04541.bmp
4411 | 03812.bmp
4412 | 01373.bmp
4413 | 00644.bmp
4414 | 04208.bmp
4415 | 03155.bmp
4416 | 02426.bmp
4417 | 01535.bmp
4418 | 02264.bmp
4419 | 00806.bmp
4420 | 03317.bmp
4421 | 04046.bmp
4422 | 00482.bmp
4423 | 01454.bmp
4424 | 02183.bmp
4425 | 00725.bmp
4426 | 03236.bmp
4427 | 02507.bmp
4428 | 01616.bmp
4429 | 03074.bmp
4430 | 02345.bmp
4431 | 04127.bmp
4432 | 00563.bmp
4433 | 01292.bmp
4434 | 00248.bmp
4435 | 00086.bmp
4436 | 01139.bmp
4437 | 01058.bmp
4438 | 00329.bmp
4439 | 00167.bmp
4440 | a16004.jpg
4441 | 04280.bmp
4442 | 02822.bmp
4443 | 03551.bmp
4444 | 04604.bmp
4445 | 04442.bmp
4446 | 03713.bmp
4447 | 02660.bmp
4448 | 01931.bmp
4449 | 04361.bmp
4450 | 02903.bmp
4451 | 03632.bmp
4452 | 01850.bmp
4453 | 04523.bmp
4454 | 02741.bmp
4455 | 03470.bmp
4456 | 00680.bmp
4457 | 03515.bmp
4458 | 04244.bmp
4459 | 01733.bmp
4460 | 03191.bmp
4461 | 02462.bmp
4462 | 01571.bmp
4463 | 00842.bmp
4464 | 04406.bmp
4465 | 03353.bmp
4466 | 02624.bmp
4467 | 04082.bmp
4468 | 01490.bmp
4469 | 00761.bmp
4470 | 04325.bmp
4471 | 01814.bmp
4472 | 03272.bmp
4473 | 02543.bmp
4474 | 01652.bmp
4475 | 02381.bmp
4476 | 00923.bmp
4477 | 03434.bmp
4478 | 02705.bmp
4479 | 04163.bmp
4480 | 02066.bmp
4481 | 00608.bmp
4482 | 01337.bmp
4483 | 03119.bmp
4484 | 00284.bmp
4485 | 02228.bmp
4486 | 00446.bmp
4487 | 01175.bmp
4488 | 02147.bmp
4489 | 01418.bmp
4490 | 00365.bmp
4491 | 01094.bmp
4492 | 02309.bmp
4493 | 03038.bmp
4494 | 00527.bmp
4495 | 01256.bmp
4496 | 04640.bmp
4497 | 03911.bmp
4498 | 04721.bmp
4499 | 03830.bmp
4500 | a102062.jpg
4501 | a201080.jpg
4502 | a140006.jpg
4503 | a223004.jpg
4504 | a310007.jpg
4505 | a94095.jpg
4506 | a101027.jpg
4507 | a301007.jpg
4508 | a2018.jpg
4509 | a130034.jpg
4510 | 03999.bmp
4511 | 03124.bmp
4512 | 01342.bmp
4513 | 02071.bmp
4514 | 00613.bmp
4515 | 04015.bmp
4516 | 01180.bmp
4517 | 00451.bmp
4518 | 01504.bmp
4519 | 02233.bmp
4520 | 03205.bmp
4521 | 00370.bmp
4522 | 01423.bmp
4523 | 02152.bmp
4524 | 01261.bmp
4525 | 00532.bmp
4526 | 03043.bmp
4527 | 02314.bmp
4528 | 03520.bmp
4529 | 01900.bmp
4530 | 04411.bmp
4531 | 03601.bmp
4532 | 04330.bmp
4533 | 02710.bmp
4534 | 01027.bmp
4535 | 00136.bmp
4536 | 01108.bmp
4537 | 00055.bmp
4538 | 00217.bmp
4539 | 02431.bmp
4540 | 01702.bmp
4541 | 03160.bmp
4542 | 04213.bmp
4543 | 04051.bmp
4544 | 03322.bmp
4545 | 00811.bmp
4546 | 01540.bmp
4547 | 02512.bmp
4548 | 03241.bmp
4549 | 00730.bmp
4550 | 04132.bmp
4551 | 03403.bmp
4552 | 02350.bmp
4553 | 01621.bmp
4554 | a243095.jpg
4555 | 00019.bmp
4556 | 01063.bmp
4557 | 00334.bmp
4558 | 02116.bmp
4559 | 01225.bmp
4560 | 00172.bmp
4561 | 03007.bmp
4562 | 01144.bmp
4563 | 00415.bmp
4564 | 00091.bmp
4565 | 01306.bmp
4566 | 02035.bmp
4567 | 00253.bmp
4568 | 02413.bmp
4569 | 03142.bmp
4570 | 00631.bmp
4571 | 01360.bmp
4572 | 04033.bmp
4573 | 03304.bmp
4574 | 02251.bmp
4575 | 01522.bmp
4576 | 03223.bmp
4577 | 00712.bmp
4578 | 02170.bmp
4579 | 01441.bmp
4580 | 00550.bmp
4581 | 04114.bmp
4582 | 02332.bmp
4583 | 01603.bmp
4584 | 03061.bmp
4585 | 03700.bmp
4586 | 04510.bmp
4587 | 01045.bmp
4588 | 00316.bmp
4589 | 01207.bmp
4590 | 00154.bmp
4591 | 01126.bmp
4592 | 00073.bmp
4593 | 02017.bmp
4594 | 00235.bmp
4595 | 01720.bmp
4596 | 04231.bmp
4597 | 03502.bmp
4598 | 02611.bmp
4599 | 03340.bmp
4600 | 02530.bmp
4601 | 01801.bmp
4602 | 04312.bmp
4603 | 04150.bmp
4604 | 03421.bmp
4605 | 00910.bmp
4606 | 01009.bmp
4607 | 00118.bmp
4608 | 00037.bmp
4609 | 01081.bmp
4610 | 00352.bmp
4611 | 01405.bmp
4612 | 02134.bmp
4613 | 01243.bmp
4614 | 00514.bmp
4615 | 03025.bmp
4616 | 00190.bmp
4617 | 01162.bmp
4618 | 00433.bmp
4619 | 02215.bmp
4620 | 01324.bmp
4621 | 02053.bmp
4622 | 03106.bmp
4623 | 00271.bmp
4624 | 02080.bmp
4625 | 00622.bmp
4626 | 01351.bmp
4627 | 02404.bmp
4628 | 03133.bmp
4629 | 02242.bmp
4630 | 01513.bmp
4631 | 04024.bmp
4632 | 00460.bmp
4633 | 02161.bmp
4634 | 00703.bmp
4635 | 01432.bmp
4636 | 03214.bmp
4637 | 02323.bmp
4638 | 03052.bmp
4639 | 04105.bmp
4640 | 01270.bmp
4641 | a153077.jpg
4642 | 00541.bmp
4643 | 02800.bmp
4644 | 04420.bmp
4645 | 03610.bmp
4646 | 04501.bmp
4647 | 00307.bmp
4648 | 01036.bmp
4649 | 00145.bmp
4650 | 00064.bmp
4651 | 01117.bmp
4652 | 00226.bmp
4653 | a279005.jpg
4654 | 02008.bmp
4655 | 04222.bmp
4656 | 02440.bmp
4657 | 01711.bmp
4658 | 00820.bmp
4659 | 02602.bmp
4660 | 04060.bmp
4661 | 03331.bmp
4662 | 04303.bmp
4663 | 02521.bmp
4664 | 03250.bmp
4665 | 00901.bmp
4666 | 01630.bmp
4667 | 04141.bmp
4668 | 03412.bmp
4669 | 00109.bmp
4670 | 00028.bmp
4671 | a365072.jpg
4672 | a372047.jpg
4673 | 02125.bmp
4674 | 01072.bmp
4675 | 00343.bmp
4676 | 03016.bmp
4677 | 00181.bmp
4678 | 01234.bmp
4679 | 00505.bmp
4680 | 02206.bmp
4681 | 01153.bmp
4682 | 00424.bmp
4683 | 00262.bmp
4684 | 01315.bmp
4685 | 02044.bmp
4686 | 04204.bmp
4687 | 00640.bmp
4688 | 02422.bmp
4689 | 03151.bmp
4690 | 02260.bmp
4691 | 00802.bmp
4692 | 01531.bmp
4693 | 04042.bmp
4694 | 03313.bmp
4695 | 00721.bmp
4696 | 01450.bmp
4697 | 02503.bmp
4698 | 03232.bmp
4699 | 02341.bmp
4700 | 03070.bmp
4701 | 01612.bmp
4702 | 04123.bmp
4703 | 04600.bmp
4704 | 02107.bmp
4705 | 01054.bmp
4706 | 00325.bmp
4707 | 00163.bmp
4708 | 01216.bmp
4709 | a198023.jpg
4710 | 00082.bmp
4711 | 01135.bmp
4712 | 00406.bmp
4713 | 00244.bmp
4714 | 02026.bmp
4715 | 03511.bmp
4716 | 04240.bmp
4717 | 04402.bmp
4718 | 02620.bmp
4719 | 04321.bmp
4720 | 01810.bmp
4721 | 02701.bmp
4722 | 03430.bmp
4723 | 01018.bmp
4724 | 00127.bmp
4725 | 00046.bmp
4726 | a393035.jpg
4727 | 00208.bmp
4728 | 01414.bmp
4729 | 02143.bmp
4730 | 01090.bmp
4731 | 00361.bmp
4732 | 03034.bmp
4733 | 02305.bmp
4734 | 01252.bmp
4735 | 00523.bmp
4736 | 02224.bmp
4737 | 01171.bmp
4738 | 00442.bmp
4739 | 04006.bmp
4740 | 00280.bmp
4741 | 03115.bmp
4742 | 01333.bmp
4743 | 00604.bmp
4744 | 02062.bmp
4745 | a242078.jpg
4746 | 04499.bmp
4747 | 01988.bmp
4748 | 02879.bmp
4749 | 02798.bmp
4750 | 03689.bmp
4751 | a202012.jpg
4752 | a65084.jpg
4753 | 03968.bmp
4754 | 04697.bmp
4755 | 03887.bmp
4756 | 02996.bmp
4757 | 00899.bmp
4758 | 03788.bmp
4759 | 04679.bmp
4760 | 02897.bmp
4761 | 03869.bmp
4762 | 04598.bmp
4763 | 02978.bmp
4764 | 03986.bmp
4765 | 02699.bmp
4766 | a55067.jpg
4767 | 00998.bmp
4768 | 01889.bmp
4769 | a46076.jpg
4770 | 01997.bmp
4771 | a81095.jpg
4772 | 03779.bmp
4773 | 02888.bmp
4774 | 04589.bmp
4775 | 03698.bmp
4776 | 02969.bmp
4777 | a220003.jpg
4778 | 03977.bmp
4779 | 03896.bmp
4780 | 01799.bmp
4781 | 00989.bmp
4782 | 03797.bmp
4783 | 03959.bmp
4784 | 04688.bmp
4785 | 03878.bmp
4786 | 02987.bmp
4787 | a45077.jpg
4788 | a27059.jpg
4789 | 03995.bmp
4790 | 01979.bmp
4791 | 03599.bmp
4792 | 02789.bmp
4793 | 01898.bmp
4794 | 01269.bmp
4795 | 00378.bmp
4796 | 00297.bmp
4797 | 02079.bmp
4798 | 01188.bmp
4799 | 00459.bmp
4800 | 03843.bmp
4801 | 04572.bmp
4802 | 02790.bmp
4803 | 04734.bmp
4804 | 03681.bmp
4805 | 02952.bmp
4806 | 03924.bmp
4807 | 04653.bmp
4808 | 02871.bmp
4809 | 01980.bmp
4810 | 03762.bmp
4811 | 04491.bmp
4812 | 02394.bmp
4813 | 00936.bmp
4814 | 01665.bmp
4815 | 02718.bmp
4816 | 04176.bmp
4817 | 03447.bmp
4818 | 02556.bmp
4819 | 03285.bmp
4820 | 01827.bmp
4821 | 04338.bmp
4822 | 03609.bmp
4823 | 00774.bmp
4824 | 02475.bmp
4825 | 01746.bmp
4826 | 04257.bmp
4827 | 03528.bmp
4828 | 00693.bmp
4829 | 02637.bmp
4830 | 04095.bmp
4831 | 03366.bmp
4832 | 01908.bmp
4833 | 04419.bmp
4834 | 00855.bmp
4835 | 01584.bmp
4836 | a69000.jpg
4837 | 02358.bmp
4838 | 03087.bmp
4839 | 01629.bmp
4840 | 00576.bmp
4841 | 03249.bmp
4842 | 01467.bmp
4843 | 00738.bmp
4844 | 02196.bmp
4845 | 02439.bmp
4846 | 03168.bmp
4847 | 01386.bmp
4848 | 00657.bmp
4849 | 04059.bmp
4850 | 00495.bmp
4851 | 01548.bmp
4852 | 00819.bmp
4853 | 02277.bmp
4854 | a257098.jpg
4855 | 03960.bmp
4856 | 00972.bmp
4857 | 03807.bmp
4858 | 04536.bmp
4859 | 03483.bmp
4860 | 02754.bmp
4861 | 01863.bmp
4862 | 02592.bmp
4863 | 03645.bmp
4864 | 02916.bmp
4865 | 04374.bmp
4866 | 01782.bmp
4867 | 04617.bmp
4868 | 03564.bmp
4869 | 02835.bmp
4870 | 04293.bmp
4871 | 01944.bmp
4872 | 02673.bmp
4873 | 03726.bmp
4874 | 04455.bmp
4875 | 00891.bmp
4876 | 00099.bmp
4877 | 03069.bmp
4878 | 01287.bmp
4879 | 00558.bmp
4880 | 00396.bmp
4881 | 01449.bmp
4882 | 02178.bmp
4883 | 01368.bmp
4884 | 00639.bmp
4885 | 02097.bmp
4886 | 00477.bmp
4887 | 02259.bmp
4888 | 04590.bmp
4889 | 03861.bmp
4890 | 02970.bmp
4891 | 04671.bmp
4892 | 03942.bmp
4893 | 03780.bmp
4894 | 04518.bmp
4895 | 00954.bmp
4896 | 01683.bmp
4897 | 02736.bmp
4898 | 04194.bmp
4899 | 03465.bmp
4900 | 02574.bmp
4901 | 01845.bmp
4902 | 00792.bmp
4903 | 04356.bmp
4904 | 03627.bmp
4905 | 02493.bmp
4906 | 01764.bmp
4907 | 02817.bmp
4908 | 04275.bmp
4909 | 03546.bmp
4910 | 02655.bmp
4911 | 03384.bmp
4912 | 01926.bmp
4913 | 00873.bmp
4914 | 04437.bmp
4915 | 03708.bmp
4916 | 02376.bmp
4917 | 00918.bmp
4918 | 01647.bmp
4919 | 00594.bmp
4920 | 04158.bmp
4921 | 03429.bmp
4922 | 02538.bmp
4923 | 03267.bmp
4924 | 01809.bmp
4925 | 00756.bmp
4926 | 01485.bmp
4927 | 02457.bmp
4928 | 03186.bmp
4929 | 01728.bmp
4930 | 00675.bmp
4931 | 04239.bmp
4932 | 02619.bmp
4933 | 04077.bmp
4934 | 03348.bmp
4935 | 02295.bmp
4936 | 00837.bmp
4937 | 01566.bmp
4938 | 03825.bmp
4939 | 04554.bmp
4940 | 00990.bmp
4941 | 02772.bmp
4942 | 04716.bmp
4943 | 01881.bmp
4944 | 03663.bmp
4945 | 02934.bmp
4946 | 04392.bmp
4947 | 03906.bmp
4948 | 04635.bmp
4949 | 03582.bmp
4950 | 02853.bmp
4951 | 01962.bmp
4952 | 02691.bmp
4953 | 03744.bmp
4954 | 04473.bmp
4955 | 00279.bmp
4956 | 01089.bmp
4957 | 00198.bmp
4958 | 01278.bmp
4959 | 00549.bmp
4960 | 02169.bmp
4961 | 00387.bmp
4962 | 01359.bmp
4963 | 02088.bmp
4964 | 01197.bmp
4965 | 00468.bmp
4966 | 03852.bmp
4967 | 04581.bmp
4968 | 03690.bmp
4969 | 02961.bmp
4970 | 04743.bmp
4971 | 02880.bmp
4972 | 03933.bmp
4973 | 04662.bmp
4974 | 03771.bmp
4975 | 04185.bmp
4976 | 02727.bmp
4977 | 03456.bmp
4978 | 00945.bmp
4979 | 01674.bmp
4980 | 04509.bmp
4981 | 00783.bmp
4982 | 04347.bmp
4983 | 03618.bmp
4984 | 02565.bmp
4985 | 01836.bmp
4986 | 03294.bmp
4987 | 04266.bmp
4988 | 02808.bmp
4989 | 03537.bmp
4990 | 02484.bmp
4991 | 01755.bmp
4992 | 00864.bmp
4993 | 01593.bmp
4994 | 04428.bmp
4995 | 02646.bmp
4996 | 01917.bmp
4997 | 03375.bmp
4998 | 00585.bmp
4999 | 04149.bmp
5000 | 00909.bmp
5001 | 02367.bmp
5002 | 01638.bmp
5003 | 03096.bmp
5004 | 00747.bmp
5005 | 01476.bmp
5006 | 02529.bmp
5007 | 03258.bmp
5008 | 00666.bmp
5009 | 01395.bmp
5010 | 02448.bmp
5011 | 01719.bmp
5012 | 03177.bmp
5013 | 00828.bmp
5014 | 02286.bmp
5015 | 01557.bmp
5016 | 04068.bmp
5017 | 03339.bmp
5018 | 03492.bmp
5019 | 02763.bmp
5020 | 00981.bmp
5021 | 03816.bmp
5022 | 04545.bmp
5023 | 03654.bmp
5024 | 04383.bmp
5025 | 02925.bmp
5026 | 01872.bmp
5027 | 04707.bmp
5028 | 03573.bmp
5029 | 02844.bmp
5030 | 01791.bmp
5031 | 04626.bmp
5032 | 03735.bmp
5033 | 04464.bmp
5034 | 01953.bmp
5035 | 02682.bmp
5036 | 00189.bmp
5037 | 01296.bmp
5038 | 00567.bmp
5039 | 03078.bmp
5040 | 02349.bmp
5041 | 01458.bmp
5042 | 02187.bmp
5043 | 00729.bmp
5044 | 01377.bmp
5045 | 00648.bmp
5046 | 03159.bmp
5047 | 01539.bmp
5048 | 02268.bmp
5049 | 00486.bmp
5050 | 03870.bmp
5051 | a76002.jpg
5052 | 04680.bmp
5053 | 03951.bmp
5054 | 03474.bmp
5055 | 02745.bmp
5056 | 04527.bmp
5057 | 00963.bmp
5058 | 01692.bmp
5059 | 03636.bmp
5060 | 04365.bmp
5061 | 02907.bmp
5062 | 02583.bmp
5063 | 01854.bmp
5064 | 03555.bmp
5065 | 04284.bmp
5066 | 02826.bmp
5067 | 04608.bmp
5068 | 01773.bmp
5069 | 03717.bmp
5070 | 04446.bmp
5071 | 00882.bmp
5072 | 02664.bmp
5073 | 01935.bmp
5074 | 03393.bmp
5075 | 04167.bmp
5076 | 02709.bmp
5077 | 03438.bmp
5078 | 00927.bmp
5079 | 02385.bmp
5080 | 01656.bmp
5081 | 04329.bmp
5082 | 00765.bmp
5083 | 01494.bmp
5084 | 02547.bmp
5085 | 01818.bmp
5086 | 03276.bmp
5087 | 04248.bmp
5088 | 03519.bmp
5089 | 00684.bmp
5090 | a35070.jpg
5091 | 02466.bmp
5092 | 01737.bmp
5093 | 03195.bmp
5094 | 00846.bmp
5095 | 01575.bmp
5096 | 04086.bmp
5097 | 02628.bmp
5098 | 03357.bmp
5099 | 02781.bmp
5100 | 03834.bmp
5101 | 04563.bmp
5102 | 03672.bmp
5103 | 02943.bmp
5104 | 04725.bmp
5105 | 01890.bmp
5106 | 03591.bmp
5107 | 02862.bmp
5108 | 03915.bmp
5109 | 04644.bmp
5110 | 03753.bmp
5111 | 04482.bmp
5112 | 01971.bmp
5113 | 00288.bmp
5114 | 01179.bmp
5115 | 01098.bmp
5116 | 00369.bmp
5117 | a24063.jpg
5118 | 02000.bmp
5119 | a323016.jpg
5120 | a353013.jpg
5121 | 00020.bmp
5122 | 00101.bmp
5123 | a145014.jpg
5124 | a227040.jpg
5125 | 00002.bmp
5126 | a238011.jpg
5127 | 00200.bmp
5128 | 01010.bmp
5129 | a163014.jpg
5130 | a172032.jpg
5131 | a140055.jpg
5132 | a134052.jpg
5133 | 00110.bmp
5134 | 01001.bmp
5135 | a120093.jpg
5136 | a104055.jpg
5137 | a105027.jpg
5138 | a306051.jpg
5139 | a147021.jpg
5140 | 00011.bmp
5141 | a112056.jpg
5142 | a103029.jpg
5143 | 01100.bmp
5144 | a314016.jpg
5145 |
--------------------------------------------------------------------------------
/data_dir/rainy/rainTrain.txt:
--------------------------------------------------------------------------------
1 | rainy/rain-100.png
2 | rainy/rain-101.png
3 | rainy/rain-102.png
4 | rainy/rain-103.png
5 | rainy/rain-104.png
6 | rainy/rain-105.png
7 | rainy/rain-106.png
8 | rainy/rain-107.png
9 | rainy/rain-108.png
10 | rainy/rain-109.png
11 | rainy/rain-10.png
12 | rainy/rain-110.png
13 | rainy/rain-111.png
14 | rainy/rain-112.png
15 | rainy/rain-113.png
16 | rainy/rain-114.png
17 | rainy/rain-115.png
18 | rainy/rain-116.png
19 | rainy/rain-117.png
20 | rainy/rain-118.png
21 | rainy/rain-119.png
22 | rainy/rain-11.png
23 | rainy/rain-120.png
24 | rainy/rain-121.png
25 | rainy/rain-122.png
26 | rainy/rain-123.png
27 | rainy/rain-124.png
28 | rainy/rain-125.png
29 | rainy/rain-126.png
30 | rainy/rain-127.png
31 | rainy/rain-128.png
32 | rainy/rain-129.png
33 | rainy/rain-12.png
34 | rainy/rain-130.png
35 | rainy/rain-131.png
36 | rainy/rain-132.png
37 | rainy/rain-133.png
38 | rainy/rain-134.png
39 | rainy/rain-135.png
40 | rainy/rain-136.png
41 | rainy/rain-137.png
42 | rainy/rain-138.png
43 | rainy/rain-139.png
44 | rainy/rain-13.png
45 | rainy/rain-140.png
46 | rainy/rain-141.png
47 | rainy/rain-142.png
48 | rainy/rain-143.png
49 | rainy/rain-144.png
50 | rainy/rain-145.png
51 | rainy/rain-146.png
52 | rainy/rain-147.png
53 | rainy/rain-148.png
54 | rainy/rain-149.png
55 | rainy/rain-14.png
56 | rainy/rain-150.png
57 | rainy/rain-151.png
58 | rainy/rain-152.png
59 | rainy/rain-153.png
60 | rainy/rain-154.png
61 | rainy/rain-155.png
62 | rainy/rain-156.png
63 | rainy/rain-157.png
64 | rainy/rain-158.png
65 | rainy/rain-159.png
66 | rainy/rain-15.png
67 | rainy/rain-160.png
68 | rainy/rain-161.png
69 | rainy/rain-162.png
70 | rainy/rain-163.png
71 | rainy/rain-164.png
72 | rainy/rain-165.png
73 | rainy/rain-166.png
74 | rainy/rain-167.png
75 | rainy/rain-168.png
76 | rainy/rain-169.png
77 | rainy/rain-16.png
78 | rainy/rain-170.png
79 | rainy/rain-171.png
80 | rainy/rain-172.png
81 | rainy/rain-173.png
82 | rainy/rain-174.png
83 | rainy/rain-175.png
84 | rainy/rain-176.png
85 | rainy/rain-177.png
86 | rainy/rain-178.png
87 | rainy/rain-179.png
88 | rainy/rain-17.png
89 | rainy/rain-180.png
90 | rainy/rain-181.png
91 | rainy/rain-182.png
92 | rainy/rain-183.png
93 | rainy/rain-184.png
94 | rainy/rain-185.png
95 | rainy/rain-186.png
96 | rainy/rain-187.png
97 | rainy/rain-188.png
98 | rainy/rain-189.png
99 | rainy/rain-18.png
100 | rainy/rain-190.png
101 | rainy/rain-191.png
102 | rainy/rain-192.png
103 | rainy/rain-193.png
104 | rainy/rain-194.png
105 | rainy/rain-195.png
106 | rainy/rain-196.png
107 | rainy/rain-197.png
108 | rainy/rain-198.png
109 | rainy/rain-199.png
110 | rainy/rain-19.png
111 | rainy/rain-1.png
112 | rainy/rain-200.png
113 | rainy/rain-20.png
114 | rainy/rain-21.png
115 | rainy/rain-22.png
116 | rainy/rain-23.png
117 | rainy/rain-24.png
118 | rainy/rain-25.png
119 | rainy/rain-26.png
120 | rainy/rain-27.png
121 | rainy/rain-28.png
122 | rainy/rain-29.png
123 | rainy/rain-2.png
124 | rainy/rain-30.png
125 | rainy/rain-31.png
126 | rainy/rain-32.png
127 | rainy/rain-33.png
128 | rainy/rain-34.png
129 | rainy/rain-35.png
130 | rainy/rain-36.png
131 | rainy/rain-37.png
132 | rainy/rain-38.png
133 | rainy/rain-39.png
134 | rainy/rain-3.png
135 | rainy/rain-40.png
136 | rainy/rain-41.png
137 | rainy/rain-42.png
138 | rainy/rain-43.png
139 | rainy/rain-44.png
140 | rainy/rain-45.png
141 | rainy/rain-46.png
142 | rainy/rain-47.png
143 | rainy/rain-48.png
144 | rainy/rain-49.png
145 | rainy/rain-4.png
146 | rainy/rain-50.png
147 | rainy/rain-51.png
148 | rainy/rain-52.png
149 | rainy/rain-53.png
150 | rainy/rain-54.png
151 | rainy/rain-55.png
152 | rainy/rain-56.png
153 | rainy/rain-57.png
154 | rainy/rain-58.png
155 | rainy/rain-59.png
156 | rainy/rain-5.png
157 | rainy/rain-60.png
158 | rainy/rain-61.png
159 | rainy/rain-62.png
160 | rainy/rain-63.png
161 | rainy/rain-64.png
162 | rainy/rain-65.png
163 | rainy/rain-66.png
164 | rainy/rain-67.png
165 | rainy/rain-68.png
166 | rainy/rain-69.png
167 | rainy/rain-6.png
168 | rainy/rain-70.png
169 | rainy/rain-71.png
170 | rainy/rain-72.png
171 | rainy/rain-73.png
172 | rainy/rain-74.png
173 | rainy/rain-75.png
174 | rainy/rain-76.png
175 | rainy/rain-77.png
176 | rainy/rain-78.png
177 | rainy/rain-79.png
178 | rainy/rain-7.png
179 | rainy/rain-80.png
180 | rainy/rain-81.png
181 | rainy/rain-82.png
182 | rainy/rain-83.png
183 | rainy/rain-84.png
184 | rainy/rain-85.png
185 | rainy/rain-86.png
186 | rainy/rain-87.png
187 | rainy/rain-88.png
188 | rainy/rain-89.png
189 | rainy/rain-8.png
190 | rainy/rain-90.png
191 | rainy/rain-91.png
192 | rainy/rain-92.png
193 | rainy/rain-93.png
194 | rainy/rain-94.png
195 | rainy/rain-95.png
196 | rainy/rain-96.png
197 | rainy/rain-97.png
198 | rainy/rain-98.png
199 | rainy/rain-99.png
200 | rainy/rain-9.png
--------------------------------------------------------------------------------
/env.yaml:
--------------------------------------------------------------------------------
1 | name: AdaIR
2 | channels:
3 | - nvidia
4 | - pytorch
5 | - https://mirrors.ustc.edu.cn/anaconda/pkgs/main
6 | - conda-forge
7 | - defaults
8 | dependencies:
9 | - _libgcc_mutex=0.1=main
10 | - _openmp_mutex=4.5=1_gnu
11 | - blas=1.0=mkl
12 | - bzip2=1.0.8=h7b6447c_0
13 | - ca-certificates=2022.12.7=ha878542_0
14 | - certifi=2022.12.7=pyhd8ed1ab_0
15 | - cpuonly=1.0=0
16 | - cuda=11.6.1=0
17 | - cuda-cccl=11.6.55=hf6102b2_0
18 | - cuda-command-line-tools=11.6.2=0
19 | - cuda-compiler=11.6.2=0
20 | - cuda-cudart=11.6.55=he381448_0
21 | - cuda-cudart-dev=11.6.55=h42ad0f4_0
22 | - cuda-cuobjdump=11.6.124=h2eeebcb_0
23 | - cuda-cupti=11.6.124=h86345e5_0
24 | - cuda-cuxxfilt=11.6.124=hecbf4f6_0
25 | - cuda-driver-dev=11.6.55=0
26 | - cuda-gdb=12.1.55=0
27 | - cuda-libraries=11.6.1=0
28 | - cuda-libraries-dev=11.6.1=0
29 | - cuda-memcheck=11.8.86=0
30 | - cuda-nsight=12.1.55=0
31 | - cuda-nsight-compute=12.1.0=0
32 | - cuda-nvcc=11.6.124=hbba6d2d_0
33 | - cuda-nvdisasm=12.1.55=0
34 | - cuda-nvml-dev=11.6.55=haa9ef22_0
35 | - cuda-nvprof=12.1.55=0
36 | - cuda-nvprune=11.6.124=he22ec0a_0
37 | - cuda-nvrtc=11.6.124=h020bade_0
38 | - cuda-nvrtc-dev=11.6.124=h249d397_0
39 | - cuda-nvtx=11.6.124=h0630a44_0
40 | - cuda-nvvp=12.1.55=0
41 | - cuda-runtime=11.6.1=0
42 | - cuda-samples=11.6.101=h8efea70_0
43 | - cuda-sanitizer-api=12.1.55=0
44 | - cuda-toolkit=11.6.1=0
45 | - cuda-tools=11.6.1=0
46 | - cuda-visual-tools=11.6.1=0
47 | - cudatoolkit=11.3.1=h2bc3f7f_2
48 | - ffmpeg=4.3=hf484d3e_0
49 | - freetype=2.10.4=h5ab3b9f_0
50 | - gds-tools=1.6.0.25=0
51 | - giflib=5.2.1=h7b6447c_0
52 | - gmp=6.2.1=h295c915_3
53 | - gnutls=3.6.15=he1e5248_0
54 | - intel-openmp=2021.3.0=h06a4308_3350
55 | - joblib=1.1.0=pyhd3eb1b0_0
56 | - jpeg=9b=h024ee3a_2
57 | - lame=3.100=h7b6447c_0
58 | - lcms2=2.12=h3be6417_0
59 | - ld_impl_linux-64=2.35.1=h7274673_9
60 | - libcublas=11.9.2.110=h5e84587_0
61 | - libcublas-dev=11.9.2.110=h5c901ab_0
62 | - libcufft=10.7.1.112=hf425ae0_0
63 | - libcufft-dev=10.7.1.112=ha5ce4c0_0
64 | - libcufile=1.6.0.25=0
65 | - libcufile-dev=1.6.0.25=0
66 | - libcurand=10.3.2.56=0
67 | - libcurand-dev=10.3.2.56=0
68 | - libcusolver=11.3.4.124=h33c3c4e_0
69 | - libcusparse=11.7.2.124=h7538f96_0
70 | - libcusparse-dev=11.7.2.124=hbbe9722_0
71 | - libffi=3.3=he6710b0_2
72 | - libgcc-ng=9.3.0=h5101ec6_17
73 | - libgfortran-ng=7.5.0=ha8ba4b0_17
74 | - libgfortran4=7.5.0=ha8ba4b0_17
75 | - libgomp=9.3.0=h5101ec6_17
76 | - libiconv=1.16=h7f8727e_2
77 | - libidn2=2.3.2=h7f8727e_0
78 | - libnpp=11.6.3.124=hd2722f0_0
79 | - libnpp-dev=11.6.3.124=h3c42840_0
80 | - libnvjpeg=11.6.2.124=hd473ad6_0
81 | - libnvjpeg-dev=11.6.2.124=hb5906b9_0
82 | - libpng=1.6.37=hbc83047_0
83 | - libstdcxx-ng=9.3.0=hd4cf53a_17
84 | - libtasn1=4.16.0=h27cfd23_0
85 | - libtiff=4.2.0=h85742a9_0
86 | - libunistring=0.9.10=h27cfd23_0
87 | - libuv=1.40.0=h7b6447c_0
88 | - libwebp=1.2.0=h89dd481_0
89 | - libwebp-base=1.2.0=h27cfd23_0
90 | - lz4-c=1.9.3=h295c915_1
91 | - mkl=2021.3.0=h06a4308_520
92 | - mkl-service=2.4.0=py38h7f8727e_0
93 | - mkl_fft=1.3.0=py38h42c9631_2
94 | - mkl_random=1.2.2=py38h51133e4_0
95 | - ncurses=6.2=he6710b0_1
96 | - nettle=3.7.3=hbbd107a_1
97 | - nsight-compute=2023.1.0.15=0
98 | - numpy=1.20.3=py38hf144106_0
99 | - numpy-base=1.20.3=py38h74d4b33_0
100 | - olefile=0.46=py_0
101 | - openh264=2.1.1=h4ff587b_0
102 | - openjpeg=2.3.0=h05c96fa_1
103 | - openssl=1.1.1k=h27cfd23_0
104 | - pip=21.0.1=py38h06a4308_0
105 | - python=3.8.11=h12debd9_0_cpython
106 | - pytorch-cuda=11.6=h867d48c_1
107 | - readline=8.1=h27cfd23_0
108 | - scikit-learn=1.0.1=py38h51133e4_0
109 | - scipy=1.6.2=py38had2a1c9_1
110 | - setuptools=52.0.0=py38h06a4308_0
111 | - six=1.16.0=pyhd3eb1b0_0
112 | - sqlite=3.36.0=hc218d9a_0
113 | - threadpoolctl=2.2.0=pyh0d69192_0
114 | - tk=8.6.10=hbc83047_0
115 | - torchaudio=0.8.1=py38
116 | - torchvision=0.9.1=py38_cpu
117 | - tqdm=4.62.0=pyhd3eb1b0_1
118 | - wheel=0.37.0=pyhd3eb1b0_0
119 | - xz=5.2.5=h7b6447c_0
120 | - zlib=1.2.11=h7b6447c_3
121 | - zstd=1.4.9=haebb681_0
122 | - pip:
123 | - accelerate==0.18.0
124 | - addict==2.4.0
125 | - aiohttp==3.8.4
126 | - aiosignal==1.3.1
127 | - anyio==3.6.2
128 | - appdirs==1.4.4
129 | - arrow==1.2.3
130 | - async-timeout==4.0.2
131 | - attrs==22.2.0
132 | - beautifulsoup4==4.12.1
133 | - blessed==1.20.0
134 | - charset-normalizer==3.0.1
135 | - click==8.1.3
136 | - cmake==3.26.1
137 | - contourpy==1.0.7
138 | - croniter==1.3.8
139 | - cycler==0.11.0
140 | - dataclasses==0.6
141 | - dateutils==0.6.12
142 | - deepdiff==6.3.0
143 | - deepspeed==0.8.3
144 | - dnspython==2.3.0
145 | - docker-pycreds==0.4.0
146 | - einops==0.6.0
147 | - email-validator==1.3.1
148 | - fastapi==0.88.0
149 | - filelock==3.9.0
150 | - fonttools==4.38.0
151 | - frozenlist==1.3.3
152 | - fsspec==2023.3.0
153 | - future==0.18.3
154 | - gitdb==4.0.10
155 | - gitpython==3.1.30
156 | - h11==0.14.0
157 | - hjson==3.1.0
158 | - httpcore==0.16.3
159 | - httptools==0.5.0
160 | - httpx==0.23.3
161 | - huggingface-hub==0.12.0
162 | - idna==3.4
163 | - imageio==2.25.0
164 | - inquirer==3.1.3
165 | - itsdangerous==2.1.2
166 | - jinja2==3.1.2
167 | - kiwisolver==1.4.4
168 | - lightning==2.0.1
169 | - lightning-cloud==0.5.32
170 | - lightning-utilities==0.8.0
171 | - lit==16.0.0
172 | - markdown-it-py==2.2.0
173 | - markupsafe==2.1.2
174 | - matplotlib==3.6.3
175 | - mdurl==0.1.2
176 | - mmcv==1.7.1
177 | - mmcv-full==1.7.1
178 | - mpmath==1.3.0
179 | - multidict==6.0.4
180 | - networkx==3.0
181 | - ninja==1.11.1
182 | - nvidia-cublas-cu11==11.10.3.66
183 | - nvidia-cuda-cupti-cu11==11.7.101
184 | - nvidia-cuda-nvrtc-cu11==11.7.99
185 | - nvidia-cuda-runtime-cu11==11.7.99
186 | - nvidia-cudnn-cu11==8.5.0.96
187 | - nvidia-cufft-cu11==10.9.0.58
188 | - nvidia-curand-cu11==10.2.10.91
189 | - nvidia-cusolver-cu11==11.4.0.1
190 | - nvidia-cusparse-cu11==11.7.4.91
191 | - nvidia-nccl-cu11==2.14.3
192 | - nvidia-nvtx-cu11==11.7.91
193 | - opencv-python==4.7.0.68
194 | - ordered-set==4.1.0
195 | - orjson==3.8.9
196 | - packaging==23.1
197 | - pandas==1.5.3
198 | - pathtools==0.1.2
199 | - pillow==9.4.0
200 | - protobuf==4.21.12
201 | - psutil==5.9.8
202 | - ptflops==0.7.2.2
203 | - py-cpuinfo==9.0.0
204 | - pydantic==1.10.7
205 | - pygments==2.17.2
206 | - pyjwt==2.6.0
207 | - pyparsing==3.0.9
208 | - python-dateutil==2.8.2
209 | - python-dotenv==1.0.0
210 | - python-editor==1.0.4
211 | - python-multipart==0.0.6
212 | - pytorch-fid==0.3.0
213 | - pytorch-lightning==2.0.1
214 | - pytz==2022.7.1
215 | - pywavelets==1.4.1
216 | - pyyaml==6.0
217 | - readchar==4.0.5
218 | - requests==2.28.2
219 | - rfc3986==1.5.0
220 | - rich==13.3.3
221 | - scikit-image==0.19.3
222 | - scikit-video==1.1.11
223 | - seaborn==0.12.2
224 | - sentry-sdk==1.14.0
225 | - setproctitle==1.3.2
226 | - smmap==5.0.0
227 | - sniffio==1.3.0
228 | - soupsieve==2.4
229 | - starlette==0.22.0
230 | - starsessions==1.3.0
231 | - sympy==1.11.1
232 | - tifffile==2023.1.23.1
233 | - timm==0.6.12
234 | - torch==1.13.1
235 | - torchmetrics==0.11.4
236 | - torchsummary==1.5.1
237 | - traitlets==5.14.1
238 | - triton==2.0.0
239 | - tsnecuda==3.0.1
240 | - typing-extensions==4.5.0
241 | - ujson==5.7.0
242 | - urllib3==1.26.14
243 | - uvicorn==0.21.1
244 | - uvloop==0.17.0
245 | - wandb==0.13.9
246 | - watchfiles==0.19.0
247 | - wcwidth==0.2.13
248 | - websocket-client==1.5.1
249 | - websockets==11.0.1
250 | - yapf==0.32.0
251 | - yarl==1.8.2
252 |
--------------------------------------------------------------------------------
/figs/AdaIR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/c-yn/AdaIR/ab14c4b960e3fa7000eabd6ec102eee49fd24488/figs/AdaIR.png
--------------------------------------------------------------------------------
/figs/adair3d.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/c-yn/AdaIR/ab14c4b960e3fa7000eabd6ec102eee49fd24488/figs/adair3d.PNG
--------------------------------------------------------------------------------
/figs/adair5d.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/c-yn/AdaIR/ab14c4b960e3fa7000eabd6ec102eee49fd24488/figs/adair5d.PNG
--------------------------------------------------------------------------------
/net/model.py:
--------------------------------------------------------------------------------
1 | ## AdaIR: Adaptive All-in-One Image Restoration via Frequency Mining and Modulation
2 | ## Yuning Cui, Syed Waqas Zamir, Salman Khan, Alois Knoll, Mubarak Shah, and Fahad Shahbaz Khan
3 | ## https://arxiv.org/abs/2403.14614
4 |
5 |
6 | import torch
7 | import torch.nn as nn
8 | import torch.nn.functional as F
9 | from pdb import set_trace as stx
10 | import numbers
11 | from einops import rearrange
12 |
13 |
14 | ##########################################################################
15 | ## Layer Norm
16 |
17 | def to_3d(x):
18 | return rearrange(x, 'b c h w -> b (h w) c')
19 |
20 | def to_4d(x,h,w):
21 | return rearrange(x, 'b (h w) c -> b c h w',h=h,w=w)
22 |
23 |
24 | class BiasFree_LayerNorm(nn.Module):
25 | def __init__(self, normalized_shape):
26 | super(BiasFree_LayerNorm, self).__init__()
27 | if isinstance(normalized_shape, numbers.Integral):
28 | normalized_shape = (normalized_shape,)
29 | normalized_shape = torch.Size(normalized_shape)
30 |
31 | assert len(normalized_shape) == 1
32 |
33 | self.weight = nn.Parameter(torch.ones(normalized_shape))
34 | self.normalized_shape = normalized_shape
35 |
36 | def forward(self, x):
37 | sigma = x.var(-1, keepdim=True, unbiased=False)
38 | return x / torch.sqrt(sigma+1e-5) * self.weight
39 |
40 |
41 | class WithBias_LayerNorm(nn.Module):
42 | def __init__(self, normalized_shape):
43 | super(WithBias_LayerNorm, self).__init__()
44 | if isinstance(normalized_shape, numbers.Integral):
45 | normalized_shape = (normalized_shape,)
46 | normalized_shape = torch.Size(normalized_shape)
47 |
48 | assert len(normalized_shape) == 1
49 |
50 | self.weight = nn.Parameter(torch.ones(normalized_shape))
51 | self.bias = nn.Parameter(torch.zeros(normalized_shape))
52 | self.normalized_shape = normalized_shape
53 |
54 | def forward(self, x):
55 | mu = x.mean(-1, keepdim=True)
56 | sigma = x.var(-1, keepdim=True, unbiased=False)
57 | return (x - mu) / torch.sqrt(sigma+1e-5) * self.weight + self.bias
58 |
59 |
60 | class LayerNorm(nn.Module):
61 | def __init__(self, dim, LayerNorm_type):
62 | super(LayerNorm, self).__init__()
63 | if LayerNorm_type =='BiasFree':
64 | self.body = BiasFree_LayerNorm(dim)
65 | else:
66 | self.body = WithBias_LayerNorm(dim)
67 |
68 | def forward(self, x):
69 | h, w = x.shape[-2:]
70 | return to_4d(self.body(to_3d(x)), h, w)
71 |
72 |
73 | ##########################################################################
74 | ## Gated-Dconv Feed-Forward Network (GDFN)
75 | class FeedForward(nn.Module):
76 | def __init__(self, dim, ffn_expansion_factor, bias):
77 | super(FeedForward, self).__init__()
78 |
79 | hidden_features = int(dim*ffn_expansion_factor)
80 |
81 | self.project_in = nn.Conv2d(dim, hidden_features*2, kernel_size=1, bias=bias)
82 |
83 | self.dwconv = nn.Conv2d(hidden_features*2, hidden_features*2, kernel_size=3, stride=1, padding=1, groups=hidden_features*2, bias=bias)
84 |
85 | self.project_out = nn.Conv2d(hidden_features, dim, kernel_size=1, bias=bias)
86 |
87 | def forward(self, x):
88 | x = self.project_in(x)
89 | x1, x2 = self.dwconv(x).chunk(2, dim=1)
90 | x = F.gelu(x1) * x2
91 | x = self.project_out(x)
92 | return x
93 |
94 |
95 | ##########################################################################
96 | ## Multi-DConv Head Transposed Self-Attention (MDTA)
97 | class Attention(nn.Module):
98 | def __init__(self, dim, num_heads, bias):
99 | super(Attention, self).__init__()
100 | self.num_heads = num_heads
101 | self.temperature = nn.Parameter(torch.ones(num_heads, 1, 1))
102 |
103 | self.qkv = nn.Conv2d(dim, dim*3, kernel_size=1, bias=bias)
104 | self.qkv_dwconv = nn.Conv2d(dim*3, dim*3, kernel_size=3, stride=1, padding=1, groups=dim*3, bias=bias)
105 | self.project_out = nn.Conv2d(dim, dim, kernel_size=1, bias=bias)
106 |
107 | def forward(self, x):
108 | b,c,h,w = x.shape
109 |
110 | qkv = self.qkv_dwconv(self.qkv(x))
111 | q,k,v = qkv.chunk(3, dim=1)
112 |
113 | q = rearrange(q, 'b (head c) h w -> b head c (h w)', head=self.num_heads)
114 | k = rearrange(k, 'b (head c) h w -> b head c (h w)', head=self.num_heads)
115 | v = rearrange(v, 'b (head c) h w -> b head c (h w)', head=self.num_heads)
116 |
117 | q = torch.nn.functional.normalize(q, dim=-1)
118 | k = torch.nn.functional.normalize(k, dim=-1)
119 |
120 | attn = (q @ k.transpose(-2, -1)) * self.temperature
121 | attn = attn.softmax(dim=-1)
122 |
123 | out = (attn @ v)
124 |
125 | out = rearrange(out, 'b head c (h w) -> b (head c) h w', head=self.num_heads, h=h, w=w)
126 |
127 | out = self.project_out(out)
128 | return out
129 |
130 |
131 | ##########################################################################
132 | ## Resizing modules
133 | class Downsample(nn.Module):
134 | def __init__(self, n_feat):
135 | super(Downsample, self).__init__()
136 |
137 | self.body = nn.Sequential(nn.Conv2d(n_feat, n_feat//2, kernel_size=3, stride=1, padding=1, bias=False),
138 | nn.PixelUnshuffle(2))
139 |
140 | def forward(self, x):
141 | return self.body(x)
142 |
143 | class Upsample(nn.Module):
144 | def __init__(self, n_feat):
145 | super(Upsample, self).__init__()
146 |
147 | self.body = nn.Sequential(nn.Conv2d(n_feat, n_feat*2, kernel_size=3, stride=1, padding=1, bias=False),
148 | nn.PixelShuffle(2))
149 |
150 | def forward(self, x):
151 | return self.body(x)
152 |
153 |
154 | ##########################################################################
155 | ## Transformer Block
156 | class TransformerBlock(nn.Module):
157 | def __init__(self, dim, num_heads, ffn_expansion_factor, bias, LayerNorm_type):
158 | super(TransformerBlock, self).__init__()
159 |
160 | self.norm1 = LayerNorm(dim, LayerNorm_type)
161 | self.attn = Attention(dim, num_heads, bias)
162 | self.norm2 = LayerNorm(dim, LayerNorm_type)
163 | self.ffn = FeedForward(dim, ffn_expansion_factor, bias)
164 |
165 | def forward(self, x):
166 | x = x + self.attn(self.norm1(x))
167 | x = x + self.ffn(self.norm2(x))
168 |
169 | return x
170 |
171 | ##########################################################################
172 | ## Channel-Wise Cross Attention (CA)
173 | class Chanel_Cross_Attention(nn.Module):
174 | def __init__(self, dim, num_head, bias):
175 | super(Chanel_Cross_Attention, self).__init__()
176 | self.num_head = num_head
177 | self.temperature = nn.Parameter(torch.ones(num_head, 1, 1), requires_grad=True)
178 |
179 | self.q = nn.Conv2d(dim, dim, kernel_size=1, bias=bias)
180 | self.q_dwconv = nn.Conv2d(dim, dim, kernel_size=3, stride=1, padding=1, groups=dim, bias=bias)
181 |
182 |
183 | self.kv = nn.Conv2d(dim, dim*2, kernel_size=1, bias=bias)
184 | self.kv_dwconv = nn.Conv2d(dim*2, dim*2, kernel_size=3, stride=1, padding=1, groups=dim*2, bias=bias)
185 |
186 | self.project_out = nn.Conv2d(dim, dim, kernel_size=1, bias=bias)
187 |
188 | def forward(self, x, y):
189 | # x -> q, y -> kv
190 | assert x.shape == y.shape, 'The shape of feature maps from image and features are not equal!'
191 |
192 | b, c, h, w = x.shape
193 |
194 | q = self.q_dwconv(self.q(x))
195 | kv = self.kv_dwconv(self.kv(y))
196 | k, v = kv.chunk(2, dim=1)
197 |
198 | q = rearrange(q, 'b (head c) h w -> b head c (h w)', head=self.num_head)
199 | k = rearrange(k, 'b (head c) h w -> b head c (h w)', head=self.num_head)
200 | v = rearrange(v, 'b (head c) h w -> b head c (h w)', head=self.num_head)
201 |
202 | q = torch.nn.functional.normalize(q, dim=-1)
203 | k = torch.nn.functional.normalize(k, dim=-1)
204 |
205 | attn = q @ k.transpose(-2, -1) * self.temperature
206 | attn = attn.softmax(dim=-1)
207 |
208 | out = attn @ v
209 |
210 | out = rearrange(out, 'b head c (h w) -> b (head c) h w', head=self.num_head, h=h, w=w)
211 |
212 | out = self.project_out(out)
213 | return out
214 |
215 |
216 | ##########################################################################
217 | ## Overlapped image patch embedding with 3x3 Conv
218 | class OverlapPatchEmbed(nn.Module):
219 | def __init__(self, in_c=3, embed_dim=48, bias=False):
220 | super(OverlapPatchEmbed, self).__init__()
221 |
222 | self.proj = nn.Conv2d(in_c, embed_dim, kernel_size=3, stride=1, padding=1, bias=bias)
223 |
224 | def forward(self, x):
225 | x = self.proj(x)
226 | return x
227 |
228 |
229 | ##########################################################################
230 | ## H-L Unit
231 | class SpatialGate(nn.Module):
232 | def __init__(self):
233 | super(SpatialGate, self).__init__()
234 |
235 | self.spatial = nn.Conv2d(2, 1, kernel_size=7, padding=3, bias=False)
236 |
237 | def forward(self, x):
238 | max = torch.max(x,1,keepdim=True)[0]
239 | mean = torch.mean(x,1,keepdim=True)
240 | scale = torch.cat((max, mean), dim=1)
241 | scale =self.spatial(scale)
242 | scale = F.sigmoid(scale)
243 | return scale
244 |
245 | ##########################################################################
246 | ## L-H Unit
247 | class ChannelGate(nn.Module):
248 | def __init__(self, dim):
249 | super(ChannelGate, self).__init__()
250 | self.avg = nn.AdaptiveAvgPool2d((1,1))
251 | self.max = nn.AdaptiveMaxPool2d((1,1))
252 |
253 | self.mlp = nn.Sequential(
254 | nn.Conv2d(dim, dim//16, 1, bias=False),
255 | nn.ReLU(),
256 | nn.Conv2d(dim//16, dim, 1, bias=False)
257 | )
258 |
259 | def forward(self, x):
260 | avg = self.mlp(self.avg(x))
261 | max = self.mlp(self.max(x))
262 |
263 | scale = avg + max
264 | scale = F.sigmoid(scale)
265 | return scale
266 |
267 | ##########################################################################
268 | ## Frequency Modulation Module (FMoM)
269 | class FreRefine(nn.Module):
270 | def __init__(self, dim):
271 | super(FreRefine, self).__init__()
272 |
273 | self.SpatialGate = SpatialGate()
274 | self.ChannelGate = ChannelGate(dim)
275 | self.proj = nn.Conv2d(dim, dim, kernel_size=1)
276 |
277 | def forward(self, low, high):
278 | spatial_weight = self.SpatialGate(high)
279 | channel_weight = self.ChannelGate(low)
280 | high = high * channel_weight
281 | low = low * spatial_weight
282 |
283 | out = low + high
284 | out = self.proj(out)
285 | return out
286 |
287 | ##########################################################################
288 | ## Adaptive Frequency Learning Block (AFLB)
289 | class FreModule(nn.Module):
290 | def __init__(self, dim, num_heads, bias, in_dim=3):
291 | super(FreModule, self).__init__()
292 |
293 | self.conv = nn.Conv2d(in_dim, dim, kernel_size=3, stride=1, padding=1, bias=False)
294 | self.conv1 = nn.Conv2d(in_dim, dim, kernel_size=3, stride=1, padding=1, bias=False)
295 |
296 | self.score_gen = nn.Conv2d(2, 2, 7, padding=3)
297 |
298 | self.para1 = nn.Parameter(torch.zeros(dim, 1, 1))
299 | self.para2 = nn.Parameter(torch.ones(dim, 1, 1))
300 |
301 | self.channel_cross_l = Chanel_Cross_Attention(dim, num_head=num_heads, bias=bias)
302 | self.channel_cross_h = Chanel_Cross_Attention(dim, num_head=num_heads, bias=bias)
303 | self.channel_cross_agg = Chanel_Cross_Attention(dim, num_head=num_heads, bias=bias)
304 |
305 | self.frequency_refine = FreRefine(dim)
306 |
307 | self.rate_conv = nn.Sequential(
308 | nn.Conv2d(dim, dim//8, 1, bias=False),
309 | nn.GELU(),
310 | nn.Conv2d(dim//8, 2, 1, bias=False),
311 | )
312 |
313 | def forward(self, x, y):
314 | _, _, H, W = y.size()
315 | x = F.interpolate(x, (H,W), mode='bilinear')
316 |
317 | high_feature, low_feature = self.fft(x)
318 |
319 | high_feature = self.channel_cross_l(high_feature, y)
320 | low_feature = self.channel_cross_h(low_feature, y)
321 |
322 | agg = self.frequency_refine(low_feature, high_feature)
323 | out = self.channel_cross_agg(y, agg)
324 |
325 | return out * self.para1 + y * self.para2
326 |
327 | def shift(self, x):
328 | '''shift FFT feature map to center'''
329 | b, c, h, w = x.shape
330 | return torch.roll(x, shifts=(int(h/2), int(w/2)), dims=(2,3))
331 |
332 | def unshift(self, x):
333 | """converse to shift operation"""
334 | b, c, h ,w = x.shape
335 | return torch.roll(x, shifts=(-int(h/2), -int(w/2)), dims=(2,3))
336 |
337 | def fft(self, x, n=128):
338 | """obtain high/low-frequency features from input"""
339 | x = self.conv1(x)
340 | mask = torch.zeros(x.shape).to(x.device)
341 | h, w = x.shape[-2:]
342 | threshold = F.adaptive_avg_pool2d(x, 1)
343 | threshold = self.rate_conv(threshold).sigmoid()
344 |
345 | for i in range(mask.shape[0]):
346 | h_ = (h//n * threshold[i,0,:,:]).int()
347 | w_ = (w//n * threshold[i,1,:,:]).int()
348 |
349 | mask[i, :, h//2-h_:h//2+h_, w//2-w_:w//2+w_] = 1
350 |
351 | fft = torch.fft.fft2(x, norm='forward', dim=(-2,-1))
352 | fft = self.shift(fft)
353 |
354 | fft_high = fft * (1 - mask)
355 |
356 | high = self.unshift(fft_high)
357 | high = torch.fft.ifft2(high, norm='forward', dim=(-2,-1))
358 | high = torch.abs(high)
359 |
360 | fft_low = fft * mask
361 |
362 | low = self.unshift(fft_low)
363 | low = torch.fft.ifft2(low, norm='forward', dim=(-2,-1))
364 | low = torch.abs(low)
365 |
366 | return high, low
367 |
368 |
369 | ##########################################################################
370 | ##---------- AdaIR -----------------------
371 |
372 | class AdaIR(nn.Module):
373 | def __init__(self,
374 | inp_channels=3,
375 | out_channels=3,
376 | dim = 48,
377 | num_blocks = [4,6,6,8],
378 | num_refinement_blocks = 4,
379 | heads = [1,2,4,8],
380 | ffn_expansion_factor = 2.66,
381 | bias = False,
382 | LayerNorm_type = 'WithBias',
383 | decoder = True,
384 | ):
385 |
386 | super(AdaIR, self).__init__()
387 |
388 | self.patch_embed = OverlapPatchEmbed(inp_channels, dim)
389 | self.decoder = decoder
390 |
391 | if self.decoder:
392 | self.fre1 = FreModule(dim*2**3, num_heads=heads[2], bias=bias)
393 | self.fre2 = FreModule(dim*2**2, num_heads=heads[2], bias=bias)
394 | self.fre3 = FreModule(dim*2**1, num_heads=heads[2], bias=bias)
395 |
396 | self.encoder_level1 = nn.Sequential(*[TransformerBlock(dim=dim, num_heads=heads[0], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[0])])
397 |
398 | self.down1_2 = Downsample(dim) ## From Level 1 to Level 2
399 |
400 | self.encoder_level2 = nn.Sequential(*[TransformerBlock(dim=int(dim*2**1), num_heads=heads[1], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[1])])
401 |
402 | self.down2_3 = Downsample(int(dim*2**1)) ## From Level 2 to Level 3
403 |
404 | self.encoder_level3 = nn.Sequential(*[TransformerBlock(dim=int(dim*2**2), num_heads=heads[2], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[2])])
405 |
406 | self.down3_4 = Downsample(int(dim*2**2)) ## From Level 3 to Level 4
407 | self.latent = nn.Sequential(*[TransformerBlock(dim=int(dim*2**3), num_heads=heads[3], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[3])])
408 |
409 | self.up4_3 = Upsample(int(dim*2**3)) ## From Level 4 to Level 3
410 | self.reduce_chan_level3 = nn.Conv2d(int(dim*2**3), int(dim*2**2), kernel_size=1, bias=bias)
411 |
412 | self.decoder_level3 = nn.Sequential(*[TransformerBlock(dim=int(dim*2**2), num_heads=heads[2], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[2])])
413 |
414 | self.up3_2 = Upsample(int(dim*2**2))
415 | self.reduce_chan_level2 = nn.Conv2d(int(dim*2**2), int(dim*2**1), kernel_size=1, bias=bias)
416 | self.decoder_level2 = nn.Sequential(*[TransformerBlock(dim=int(dim*2**1), num_heads=heads[1], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[1])])
417 |
418 | self.up2_1 = Upsample(int(dim*2**1))
419 |
420 | self.decoder_level1 = nn.Sequential(*[TransformerBlock(dim=int(dim*2**1), num_heads=heads[0], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_blocks[0])])
421 |
422 | self.refinement = nn.Sequential(*[TransformerBlock(dim=int(dim*2**1), num_heads=heads[0], ffn_expansion_factor=ffn_expansion_factor, bias=bias, LayerNorm_type=LayerNorm_type) for i in range(num_refinement_blocks)])
423 |
424 | self.output = nn.Conv2d(int(dim*2**1), out_channels, kernel_size=3, stride=1, padding=1, bias=bias)
425 |
426 | def forward(self, inp_img,noise_emb = None):
427 |
428 | inp_enc_level1 = self.patch_embed(inp_img)
429 |
430 | out_enc_level1 = self.encoder_level1(inp_enc_level1)
431 |
432 | inp_enc_level2 = self.down1_2(out_enc_level1)
433 |
434 | out_enc_level2 = self.encoder_level2(inp_enc_level2)
435 |
436 | inp_enc_level3 = self.down2_3(out_enc_level2)
437 |
438 | out_enc_level3 = self.encoder_level3(inp_enc_level3)
439 |
440 | inp_enc_level4 = self.down3_4(out_enc_level3)
441 | latent = self.latent(inp_enc_level4)
442 |
443 | if self.decoder:
444 | latent = self.fre1(inp_img, latent)
445 |
446 | inp_dec_level3 = self.up4_3(latent)
447 |
448 | inp_dec_level3 = torch.cat([inp_dec_level3, out_enc_level3], 1)
449 | inp_dec_level3 = self.reduce_chan_level3(inp_dec_level3)
450 |
451 | out_dec_level3 = self.decoder_level3(inp_dec_level3)
452 |
453 | if self.decoder:
454 | out_dec_level3 = self.fre2(inp_img, out_dec_level3)
455 |
456 | inp_dec_level2 = self.up3_2(out_dec_level3)
457 | inp_dec_level2 = torch.cat([inp_dec_level2, out_enc_level2], 1)
458 | inp_dec_level2 = self.reduce_chan_level2(inp_dec_level2)
459 |
460 | out_dec_level2 = self.decoder_level2(inp_dec_level2)
461 |
462 | if self.decoder:
463 | out_dec_level2 = self.fre3(inp_img, out_dec_level2)
464 |
465 | inp_dec_level1 = self.up2_1(out_dec_level2)
466 | inp_dec_level1 = torch.cat([inp_dec_level1, out_enc_level1], 1)
467 |
468 | out_dec_level1 = self.decoder_level1(inp_dec_level1)
469 |
470 | out_dec_level1 = self.refinement(out_dec_level1)
471 |
472 | out_dec_level1 = self.output(out_dec_level1) + inp_img
473 |
474 | return out_dec_level1
475 |
476 |
--------------------------------------------------------------------------------
/options.py:
--------------------------------------------------------------------------------
1 | import argparse
2 |
3 | parser = argparse.ArgumentParser()
4 |
5 | # Input Parameters
6 | parser.add_argument('--cuda', type=int, default=0)
7 |
8 | parser.add_argument('--epochs', type=int, default=150, help='maximum number of epochs to train the total model.')
9 | parser.add_argument('--batch_size', type=int,default=8,help="Batch size to use per GPU")
10 | parser.add_argument('--lr', type=float, default=2e-4, help='learning rate of encoder.')
11 |
12 | parser.add_argument('--de_type', nargs='+', default=['denoise_15', 'denoise_25', 'denoise_50', 'derain', 'dehaze', 'deblur', 'enhance'],
13 | help='which type of degradations is training and testing for.')
14 |
15 | parser.add_argument('--patch_size', type=int, default=128, help='patchsize of input.')
16 | parser.add_argument('--num_workers', type=int, default=16, help='number of workers.')
17 |
18 | # path
19 | parser.add_argument('--data_file_dir', type=str, default='data_dir/', help='where clean images of denoising saves.')
20 | parser.add_argument('--denoise_dir', type=str, default='data/Train/Denoise/',
21 | help='where clean images of denoising saves.')
22 | parser.add_argument('--gopro_dir', type=str, default='data/Train/Deblur/',
23 | help='where clean images of denoising saves.')
24 | parser.add_argument('--enhance_dir', type=str, default='data/Train/Enhance/',
25 | help='where clean images of denoising saves.')
26 | parser.add_argument('--derain_dir', type=str, default='data/Train/Derain/',
27 | help='where training images of deraining saves.')
28 | parser.add_argument('--dehaze_dir', type=str, default='data/Train/Dehaze/',
29 | help='where training images of dehazing saves.')
30 | parser.add_argument('--output_path', type=str, default="output/", help='output save path')
31 | parser.add_argument('--ckpt_path', type=str, default="ckpt/Denoise/", help='checkpoint save path')
32 | parser.add_argument("--wblogger",type=str,default="AdaIR",help = "Determine to log to wandb or not and the project name")
33 | parser.add_argument("--ckpt_dir",type=str,default="AdaIR",help = "Name of the Directory where the checkpoint is to be saved")
34 | parser.add_argument("--num_gpus",type=int,default= 4, help = "Number of GPUs to use for training")
35 |
36 | options = parser.parse_args()
37 |
38 |
--------------------------------------------------------------------------------
/test.py:
--------------------------------------------------------------------------------
1 | import os
2 | import numpy as np
3 | import argparse
4 | import subprocess
5 | from tqdm import tqdm
6 |
7 | import torch
8 | import torch.nn as nn
9 | from torch.utils.data import DataLoader
10 | import lightning.pytorch as pl
11 |
12 | from utils.dataset_utils import DenoiseTestDataset, DerainDehazeDataset
13 | from utils.val_utils import AverageMeter, compute_psnr_ssim
14 | from utils.image_io import save_image_tensor
15 | from net.model import AdaIR
16 |
17 |
18 | class AdaIRModel(pl.LightningModule):
19 | def __init__(self):
20 | super().__init__()
21 | self.net = AdaIR(decoder=True)
22 | self.loss_fn = nn.L1Loss()
23 |
24 | def forward(self,x):
25 | return self.net(x)
26 |
27 | def training_step(self, batch, batch_idx):
28 | # training_step defines the train loop.
29 | # it is independent of forward
30 | ([clean_name, de_id], degrad_patch, clean_patch) = batch
31 | restored = self.net(degrad_patch)
32 |
33 | loss = self.loss_fn(restored,clean_patch)
34 | # Logging to TensorBoard (if installed) by default
35 | self.log("train_loss", loss)
36 | return loss
37 |
38 | def lr_scheduler_step(self,scheduler,metric):
39 | scheduler.step(self.current_epoch)
40 | lr = scheduler.get_lr()
41 |
42 | def configure_optimizers(self):
43 | optimizer = optim.AdamW(self.parameters(), lr=2e-4)
44 | scheduler = LinearWarmupCosineAnnealingLR(optimizer=optimizer,warmup_epochs=15,max_epochs=180)
45 |
46 | return [optimizer],[scheduler]
47 |
48 |
49 | def test_Denoise(net, dataset, sigma=15):
50 | output_path = testopt.output_path + 'denoise/' + str(sigma) + '/'
51 | subprocess.check_output(['mkdir', '-p', output_path])
52 |
53 | dataset.set_sigma(sigma)
54 | testloader = DataLoader(dataset, batch_size=1, pin_memory=True, shuffle=False, num_workers=0)
55 |
56 | psnr = AverageMeter()
57 | ssim = AverageMeter()
58 |
59 | with torch.no_grad():
60 | for ([clean_name], degrad_patch, clean_patch) in tqdm(testloader):
61 | degrad_patch, clean_patch = degrad_patch.cuda(), clean_patch.cuda()
62 |
63 | restored = net(degrad_patch)
64 | temp_psnr, temp_ssim, N = compute_psnr_ssim(restored, clean_patch)
65 |
66 | psnr.update(temp_psnr, N)
67 | ssim.update(temp_ssim, N)
68 | save_image_tensor(restored, output_path + clean_name[0] + '.png')
69 |
70 | print("Denoise sigma=%d: psnr: %.2f, ssim: %.4f" % (sigma, psnr.avg, ssim.avg))
71 |
72 |
73 | def test_Derain_Dehaze(net, dataset, task="derain"):
74 | output_path = testopt.output_path + task + '/'
75 | subprocess.check_output(['mkdir', '-p', output_path])
76 |
77 | dataset.set_dataset(task)
78 | testloader = DataLoader(dataset, batch_size=1, pin_memory=True, shuffle=False, num_workers=0)
79 |
80 | psnr = AverageMeter()
81 | ssim = AverageMeter()
82 |
83 | with torch.no_grad():
84 | for ([degraded_name], degrad_patch, clean_patch) in tqdm(testloader):
85 | degrad_patch, clean_patch = degrad_patch.cuda(), clean_patch.cuda()
86 |
87 | restored = net(degrad_patch)
88 |
89 | temp_psnr, temp_ssim, N = compute_psnr_ssim(restored, clean_patch)
90 | psnr.update(temp_psnr, N)
91 | ssim.update(temp_ssim, N)
92 |
93 | save_image_tensor(restored, output_path + degraded_name[0] + '.png')
94 | print("PSNR: %.2f, SSIM: %.4f" % (psnr.avg, ssim.avg))
95 |
96 |
97 | if __name__ == '__main__':
98 | parser = argparse.ArgumentParser()
99 | # Input Parameters
100 | parser.add_argument('--cuda', type=int, default=0)
101 | parser.add_argument('--mode', type=int, default=6,
102 | help='0 for denoise, 1 for derain, 2 for dehaze, 3 for deblur, 4 for enhance, 5 for all-in-one (three tasks), 6 for all-in-one (five tasks)')
103 |
104 | parser.add_argument('--gopro_path', type=str, default="data/test/deblur/", help='save path of test hazy images')
105 | parser.add_argument('--enhance_path', type=str, default="data/test/enhance/", help='save path of test hazy images')
106 | parser.add_argument('--denoise_path', type=str, default="data/test/denoise/", help='save path of test noisy images')
107 | parser.add_argument('--derain_path', type=str, default="data/test/derain/", help='save path of test raining images')
108 | parser.add_argument('--dehaze_path', type=str, default="data/test/dehaze/", help='save path of test hazy images')
109 |
110 | parser.add_argument('--output_path', type=str, default="AdaIR_results/", help='output save path')
111 | parser.add_argument('--ckpt_name', type=str, default="adair5d.ckpt", help='checkpoint save path')
112 | testopt = parser.parse_args()
113 |
114 | np.random.seed(0)
115 | torch.manual_seed(0)
116 | torch.cuda.set_device(testopt.cuda)
117 |
118 | ckpt_path = "ckpt/" + testopt.ckpt_name
119 |
120 | denoise_splits = ["bsd68/"]
121 | derain_splits = ["Rain100L/"]
122 | deblur_splits = ["gopro/"]
123 | enhance_splits = ["lol/"]
124 |
125 | denoise_tests = []
126 | derain_tests = []
127 |
128 | base_path = testopt.denoise_path
129 | for i in denoise_splits:
130 | testopt.denoise_path = os.path.join(base_path,i)
131 | denoise_testset = DenoiseTestDataset(testopt)
132 | denoise_tests.append(denoise_testset)
133 |
134 | print("CKPT name : {}".format(ckpt_path))
135 |
136 | net = AdaIRModel().load_from_checkpoint(ckpt_path).cuda()
137 | net.eval()
138 |
139 | if testopt.mode == 0:
140 | for testset,name in zip(denoise_tests,denoise_splits) :
141 | print('Start {} testing Sigma=15...'.format(name))
142 | test_Denoise(net, testset, sigma=15)
143 |
144 | print('Start {} testing Sigma=25...'.format(name))
145 | test_Denoise(net, testset, sigma=25)
146 |
147 | print('Start {} testing Sigma=50...'.format(name))
148 | test_Denoise(net, testset, sigma=50)
149 |
150 | elif testopt.mode == 1:
151 | print('Start testing rain streak removal...')
152 | derain_base_path = testopt.derain_path
153 | for name in derain_splits:
154 | print('Start testing {} rain streak removal...'.format(name))
155 | testopt.derain_path = os.path.join(derain_base_path,name)
156 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=15)
157 | test_Derain_Dehaze(net, derain_set, task="derain")
158 |
159 | elif testopt.mode == 2:
160 | print('Start testing SOTS...')
161 | derain_base_path = testopt.derain_path
162 | name = derain_splits[0]
163 | testopt.derain_path = os.path.join(derain_base_path,name)
164 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=15)
165 | test_Derain_Dehaze(net, derain_set, task="dehaze")
166 |
167 | elif testopt.mode == 3:
168 | print('Start testing GOPRO...')
169 | deblur_base_path = testopt.gopro_path
170 | name = deblur_splits[0]
171 | testopt.gopro_path = os.path.join(deblur_base_path,name)
172 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=15, task='deblur')
173 | test_Derain_Dehaze(net, derain_set, task="deblur")
174 |
175 | elif testopt.mode == 4:
176 | print('Start testing LOL...')
177 | enhance_base_path = testopt.enhance_path
178 | name = derain_splits[0]
179 | testopt.enhance_path = os.path.join(enhance_base_path,name, task='enhance')
180 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=15)
181 | test_Derain_Dehaze(net, derain_set, task="enhance")
182 |
183 | elif testopt.mode == 5:
184 | for testset,name in zip(denoise_tests,denoise_splits) :
185 | print('Start {} testing Sigma=15...'.format(name))
186 | test_Denoise(net, testset, sigma=15)
187 |
188 | print('Start {} testing Sigma=25...'.format(name))
189 | test_Denoise(net, testset, sigma=25)
190 |
191 | print('Start {} testing Sigma=50...'.format(name))
192 | test_Denoise(net, testset, sigma=50)
193 |
194 | derain_base_path = testopt.derain_path
195 | print(derain_splits)
196 | for name in derain_splits:
197 |
198 | print('Start testing {} rain streak removal...'.format(name))
199 | testopt.derain_path = os.path.join(derain_base_path,name)
200 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=55)
201 | test_Derain_Dehaze(net, derain_set, task="derain")
202 |
203 | print('Start testing SOTS...')
204 | test_Derain_Dehaze(net, derain_set, task="dehaze")
205 |
206 | elif testopt.mode == 6:
207 | for testset,name in zip(denoise_tests,denoise_splits) :
208 | print('Start {} testing Sigma=15...'.format(name))
209 | test_Denoise(net, testset, sigma=15)
210 |
211 | print('Start {} testing Sigma=25...'.format(name))
212 | test_Denoise(net, testset, sigma=25)
213 |
214 | print('Start {} testing Sigma=50...'.format(name))
215 | test_Denoise(net, testset, sigma=50)
216 |
217 | derain_base_path = testopt.derain_path
218 | print(derain_splits)
219 | for name in derain_splits:
220 |
221 | print('Start testing {} rain streak removal...'.format(name))
222 | testopt.derain_path = os.path.join(derain_base_path,name)
223 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=55)
224 | test_Derain_Dehaze(net, derain_set, task="derain")
225 |
226 | print('Start testing SOTS...')
227 | test_Derain_Dehaze(net, derain_set, task="dehaze")
228 |
229 | deblur_base_path = testopt.gopro_path
230 | for name in deblur_splits:
231 | print('Start testing GOPRO...')
232 |
233 | # print('Start testing {} rain streak removal...'.format(name))
234 | testopt.gopro_path = os.path.join(deblur_base_path,name)
235 | deblur_set = DerainDehazeDataset(testopt,addnoise=False,sigma=55, task='deblur')
236 | test_Derain_Dehaze(net, deblur_set, task="deblur")
237 |
238 | enhance_base_path = testopt.enhance_path
239 | for name in enhance_splits:
240 |
241 | print('Start testing LOL...')
242 | testopt.enhance_path = os.path.join(enhance_base_path,name)
243 | derain_set = DerainDehazeDataset(testopt,addnoise=False,sigma=55, task='enhance')
244 | test_Derain_Dehaze(net, derain_set, task="enhance")
245 |
--------------------------------------------------------------------------------
/train.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torch.nn as nn
3 | import torch.optim as optim
4 | from torch.utils.data import DataLoader
5 |
6 | from utils.dataset_utils import AdaIRTrainDataset
7 | from net.model import AdaIR
8 | from utils.schedulers import LinearWarmupCosineAnnealingLR
9 | import numpy as np
10 | import wandb
11 | from options import options as opt
12 | import lightning.pytorch as pl
13 | from lightning.pytorch.loggers import WandbLogger,TensorBoardLogger
14 | from lightning.pytorch.callbacks import ModelCheckpoint
15 |
16 |
17 | class AdaIRModel(pl.LightningModule):
18 | def __init__(self):
19 | super().__init__()
20 | self.net = AdaIR(decoder=True)
21 | self.loss_fn = nn.L1Loss()
22 |
23 | def forward(self,x):
24 | return self.net(x)
25 |
26 | def training_step(self, batch, batch_idx):
27 | # training_step defines the train loop.
28 | # it is independent of forward
29 | ([clean_name, de_id], degrad_patch, clean_patch) = batch
30 | restored = self.net(degrad_patch)
31 |
32 | loss = self.loss_fn(restored,clean_patch)
33 | # Logging to TensorBoard (if installed) by default
34 | self.log("train_loss", loss)
35 | return loss
36 |
37 | def lr_scheduler_step(self,scheduler,metric):
38 | scheduler.step(self.current_epoch)
39 | lr = scheduler.get_lr()
40 |
41 | def configure_optimizers(self):
42 | optimizer = optim.AdamW(self.parameters(), lr=2e-4)
43 | scheduler = LinearWarmupCosineAnnealingLR(optimizer=optimizer,warmup_epochs=15,max_epochs=180)
44 |
45 | return [optimizer],[scheduler]
46 |
47 |
48 | def main():
49 | print("Options")
50 | print(opt)
51 | if opt.wblogger is not None:
52 | logger = WandbLogger(project=opt.wblogger,name="AdaIR-Train")
53 | else:
54 | logger = TensorBoardLogger(save_dir = "logs/")
55 |
56 | trainset = AdaIRTrainDataset(opt)
57 | checkpoint_callback = ModelCheckpoint(dirpath = opt.ckpt_dir,every_n_epochs = 1,save_top_k=-1)
58 | trainloader = DataLoader(trainset, batch_size=opt.batch_size, pin_memory=True, shuffle=True,
59 | drop_last=True, num_workers=opt.num_workers)
60 |
61 | model = AdaIRModel()
62 |
63 | trainer = pl.Trainer( max_epochs=opt.epochs,accelerator="gpu",devices=opt.num_gpus,strategy="ddp_find_unused_parameters_true",logger=logger,callbacks=[checkpoint_callback])
64 | trainer.fit(model=model, train_dataloaders=trainloader)
65 |
66 |
67 | if __name__ == '__main__':
68 | main()
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/c-yn/AdaIR/ab14c4b960e3fa7000eabd6ec102eee49fd24488/utils/__init__.py
--------------------------------------------------------------------------------
/utils/dataset_utils.py:
--------------------------------------------------------------------------------
1 | import os
2 | import random
3 | import copy
4 | from PIL import Image
5 | import numpy as np
6 |
7 | from torch.utils.data import Dataset
8 | from torchvision.transforms import ToPILImage, Compose, RandomCrop, ToTensor
9 | import torch
10 |
11 | from utils.image_utils import random_augmentation, crop_img
12 | from utils.degradation_utils import Degradation
13 |
14 |
15 | class AdaIRTrainDataset(Dataset):
16 | def __init__(self, args):
17 | super(AdaIRTrainDataset, self).__init__()
18 | self.args = args
19 | self.rs_ids = []
20 | self.hazy_ids = []
21 | self.D = Degradation(args)
22 | self.de_temp = 0
23 | self.de_type = self.args.de_type
24 | print(self.de_type)
25 |
26 | self.de_dict = {'denoise_15': 0, 'denoise_25': 1, 'denoise_50': 2, 'derain': 3, 'dehaze': 4, 'deblur' : 5, 'enhance' : 6}
27 |
28 | self._init_ids()
29 | self._merge_ids()
30 |
31 | self.crop_transform = Compose([
32 | ToPILImage(),
33 | RandomCrop(args.patch_size),
34 | ])
35 |
36 | self.toTensor = ToTensor()
37 |
38 | def _init_ids(self):
39 | if 'denoise_15' in self.de_type or 'denoise_25' in self.de_type or 'denoise_50' in self.de_type:
40 | self._init_clean_ids()
41 | if 'derain' in self.de_type:
42 | self._init_rs_ids()
43 | if 'dehaze' in self.de_type:
44 | self._init_hazy_ids()
45 | if 'deblur' in self.de_type:
46 | self._init_deblur_ids()
47 | if 'enhance' in self.de_type:
48 | self._init_enhance_ids()
49 |
50 | random.shuffle(self.de_type)
51 |
52 | def _init_clean_ids(self):
53 | ref_file = self.args.data_file_dir + "noisy/denoise.txt"
54 | temp_ids = []
55 | temp_ids+= [id_.strip() for id_ in open(ref_file)]
56 | clean_ids = []
57 | name_list = os.listdir(self.args.denoise_dir)
58 | clean_ids += [self.args.denoise_dir + id_ for id_ in name_list if id_.strip() in temp_ids]
59 |
60 | if 'denoise_15' in self.de_type:
61 | self.s15_ids = [{"clean_id": x,"de_type":0} for x in clean_ids]
62 | self.s15_ids = self.s15_ids * 3
63 | random.shuffle(self.s15_ids)
64 | self.s15_counter = 0
65 | if 'denoise_25' in self.de_type:
66 | self.s25_ids = [{"clean_id": x,"de_type":1} for x in clean_ids]
67 | self.s25_ids = self.s25_ids * 3
68 | random.shuffle(self.s25_ids)
69 | self.s25_counter = 0
70 | if 'denoise_50' in self.de_type:
71 | self.s50_ids = [{"clean_id": x,"de_type":2} for x in clean_ids]
72 | self.s50_ids = self.s50_ids * 3
73 | random.shuffle(self.s50_ids)
74 | self.s50_counter = 0
75 |
76 | self.num_clean = len(clean_ids)
77 | print("Total Denoise Ids : {}".format(self.num_clean))
78 |
79 | def _init_hazy_ids(self):
80 | temp_ids = []
81 | hazy = self.args.data_file_dir + "hazy/hazy_outside.txt"
82 | temp_ids+= [self.args.dehaze_dir + id_.strip() for id_ in open(hazy)]
83 | self.hazy_ids = [{"clean_id" : x,"de_type":4} for x in temp_ids]
84 |
85 | self.hazy_counter = 0
86 |
87 | self.num_hazy = len(self.hazy_ids)
88 | print("Total Hazy Ids : {}".format(self.num_hazy))
89 |
90 | def _init_deblur_ids(self):
91 | temp_ids = []
92 |
93 | image_list = os.listdir(os.path.join(self.args.gopro_dir, 'blur/'))
94 | temp_ids = image_list
95 | self.deblur_ids = [{"clean_id" : x,"de_type":5} for x in temp_ids]
96 | self.deblur_ids = self.deblur_ids * 5
97 | self.deblur_counter = 0
98 | self.num_deblur = len(self.deblur_ids)
99 | print('Total Blur Ids : {}'.format(self.num_deblur))
100 |
101 | def _init_enhance_ids(self):
102 | temp_ids = []
103 | image_list = os.listdir(os.path.join(self.args.enhance_dir, 'low/'))
104 | temp_ids = image_list
105 | self.enhance_ids= [{"clean_id" : x,"de_type":6} for x in temp_ids]
106 | self.enhance_ids = self.enhance_ids * 20
107 | self.num_enhance = len(self.enhance_ids)
108 | print('Total enhance Ids : {}'.format(self.num_enhance))
109 |
110 | def _init_rs_ids(self):
111 | temp_ids = []
112 | rs = self.args.data_file_dir + "rainy/rainTrain.txt"
113 | temp_ids+= [self.args.derain_dir + id_.strip() for id_ in open(rs)]
114 | self.rs_ids = [{"clean_id":x,"de_type":3} for x in temp_ids]
115 | self.rs_ids = self.rs_ids * 120
116 |
117 | self.rl_counter = 0
118 | self.num_rl = len(self.rs_ids)
119 | print("Total Rainy Ids : {}".format(self.num_rl))
120 |
121 | def _crop_patch(self, img_1, img_2):
122 | H = img_1.shape[0]
123 | W = img_1.shape[1]
124 | ind_H = random.randint(0, H - self.args.patch_size)
125 | ind_W = random.randint(0, W - self.args.patch_size)
126 |
127 | patch_1 = img_1[ind_H:ind_H + self.args.patch_size, ind_W:ind_W + self.args.patch_size]
128 | patch_2 = img_2[ind_H:ind_H + self.args.patch_size, ind_W:ind_W + self.args.patch_size]
129 |
130 | return patch_1, patch_2
131 |
132 | def _get_gt_name(self, rainy_name):
133 | gt_name = rainy_name.split("rainy")[0] + 'gt/norain-' + rainy_name.split('rain-')[-1]
134 | return gt_name
135 |
136 |
137 | def _get_deblur_name(self, deblur_name):
138 | gt_name = deblur_name.replace("blur", "sharp")
139 | return gt_name
140 |
141 |
142 | def _get_enhance_name(self, enhance_name):
143 | gt_name = enhance_name.replace("low", "gt")
144 | return gt_name
145 |
146 |
147 | def _get_nonhazy_name(self, hazy_name):
148 | dir_name = hazy_name.split("synthetic")[0] + 'original/'
149 | name = hazy_name.split('/')[-1].split('_')[0]
150 | suffix = '.' + hazy_name.split('.')[-1]
151 | nonhazy_name = dir_name + name + suffix
152 | return nonhazy_name
153 |
154 | def _merge_ids(self):
155 | self.sample_ids = []
156 | if "denoise_15" in self.de_type:
157 | self.sample_ids += self.s15_ids
158 | self.sample_ids += self.s25_ids
159 | self.sample_ids += self.s50_ids
160 | if "derain" in self.de_type:
161 | self.sample_ids+= self.rs_ids
162 |
163 | if "dehaze" in self.de_type:
164 | self.sample_ids+= self.hazy_ids
165 | if "deblur" in self.de_type:
166 | self.sample_ids += self.deblur_ids
167 | if "enhance" in self.de_type:
168 | self.sample_ids += self.enhance_ids
169 |
170 | print(len(self.sample_ids))
171 |
172 | def __getitem__(self, idx):
173 | sample = self.sample_ids[idx]
174 | de_id = sample["de_type"]
175 | if de_id < 3:
176 | if de_id == 0:
177 | clean_id = sample["clean_id"]
178 | elif de_id == 1:
179 | clean_id = sample["clean_id"]
180 | elif de_id == 2:
181 | clean_id = sample["clean_id"]
182 |
183 | clean_img = crop_img(np.array(Image.open(clean_id).convert('RGB')), base=16)
184 | clean_patch = self.crop_transform(clean_img)
185 | clean_patch= np.array(clean_patch)
186 |
187 | clean_name = clean_id.split("/")[-1].split('.')[0]
188 |
189 | clean_patch = random_augmentation(clean_patch)[0]
190 |
191 | degrad_patch = self.D.single_degrade(clean_patch, de_id)
192 | else:
193 | if de_id == 3:
194 | # Rain Streak Removal
195 | degrad_img = crop_img(np.array(Image.open(sample["clean_id"]).convert('RGB')), base=16)
196 | clean_name = self._get_gt_name(sample["clean_id"])
197 | clean_img = crop_img(np.array(Image.open(clean_name).convert('RGB')), base=16)
198 | elif de_id == 4:
199 | # Dehazing with SOTS outdoor training set
200 | degrad_img = crop_img(np.array(Image.open(sample["clean_id"]).convert('RGB')), base=16)
201 | clean_name = self._get_nonhazy_name(sample["clean_id"])
202 | clean_img = crop_img(np.array(Image.open(clean_name).convert('RGB')), base=16)
203 | elif de_id == 5:
204 | # Deblur with Gopro set
205 | degrad_img = crop_img(np.array(Image.open(os.path.join(self.args.gopro_dir, 'blur/', sample["clean_id"])).convert('RGB')), base=16)
206 | clean_img = crop_img(np.array(Image.open(os.path.join(self.args.gopro_dir, 'sharp/', sample["clean_id"])).convert('RGB')), base=16)
207 | clean_name = self._get_deblur_name(sample["clean_id"])
208 | elif de_id == 6:
209 | # Enhancement with LOL training set
210 | degrad_img = crop_img(np.array(Image.open(os.path.join(self.args.enhance_dir, 'low/', sample["clean_id"])).convert('RGB')), base=16)
211 | clean_img = crop_img(np.array(Image.open(os.path.join(self.args.enhance_dir, 'gt/', sample["clean_id"])).convert('RGB')), base=16)
212 | clean_name = self._get_enhance_name(sample["clean_id"])
213 |
214 | degrad_patch, clean_patch = random_augmentation(*self._crop_patch(degrad_img, clean_img))
215 |
216 | clean_patch = self.toTensor(clean_patch)
217 | degrad_patch = self.toTensor(degrad_patch)
218 |
219 |
220 | return [clean_name, de_id], degrad_patch, clean_patch
221 |
222 | def __len__(self):
223 | return len(self.sample_ids)
224 |
225 |
226 | class DenoiseTestDataset(Dataset):
227 | def __init__(self, args):
228 | super(DenoiseTestDataset, self).__init__()
229 | self.args = args
230 | self.clean_ids = []
231 | self.sigma = 15
232 |
233 | self._init_clean_ids()
234 |
235 | self.toTensor = ToTensor()
236 |
237 | def _init_clean_ids(self):
238 | name_list = os.listdir(self.args.denoise_path)
239 | self.clean_ids += [self.args.denoise_path + id_ for id_ in name_list]
240 |
241 | self.num_clean = len(self.clean_ids)
242 |
243 | def _add_gaussian_noise(self, clean_patch):
244 | noise = np.random.randn(*clean_patch.shape)
245 | noisy_patch = np.clip(clean_patch + noise * self.sigma, 0, 255).astype(np.uint8)
246 | return noisy_patch, clean_patch
247 |
248 | def set_sigma(self, sigma):
249 | self.sigma = sigma
250 |
251 | def __getitem__(self, clean_id):
252 | clean_img = crop_img(np.array(Image.open(self.clean_ids[clean_id]).convert('RGB')), base=16)
253 | clean_name = self.clean_ids[clean_id].split("/")[-1].split('.')[0]
254 |
255 | noisy_img, _ = self._add_gaussian_noise(clean_img)
256 | clean_img, noisy_img = self.toTensor(clean_img), self.toTensor(noisy_img)
257 |
258 | return [clean_name], noisy_img, clean_img
259 | def tile_degrad(input_,tile=128,tile_overlap =0):
260 | sigma_dict = {0:0,1:15,2:25,3:50}
261 | b, c, h, w = input_.shape
262 | tile = min(tile, h, w)
263 | assert tile % 8 == 0, "tile size should be multiple of 8"
264 |
265 | stride = tile - tile_overlap
266 | h_idx_list = list(range(0, h-tile, stride)) + [h-tile]
267 | w_idx_list = list(range(0, w-tile, stride)) + [w-tile]
268 | E = torch.zeros(b, c, h, w).type_as(input_)
269 | W = torch.zeros_like(E)
270 | s = 0
271 | for h_idx in h_idx_list:
272 | for w_idx in w_idx_list:
273 | in_patch = input_[..., h_idx:h_idx+tile, w_idx:w_idx+tile]
274 | out_patch = in_patch
275 | out_patch_mask = torch.ones_like(in_patch)
276 |
277 | E[..., h_idx:(h_idx+tile), w_idx:(w_idx+tile)].add_(out_patch)
278 | W[..., h_idx:(h_idx+tile), w_idx:(w_idx+tile)].add_(out_patch_mask)
279 |
280 | restored = torch.clamp(restored, 0, 1)
281 | return restored
282 | def __len__(self):
283 | return self.num_clean
284 |
285 |
286 | class DerainDehazeDataset(Dataset):
287 | def __init__(self, args, task="derain",addnoise = False,sigma = None):
288 | super(DerainDehazeDataset, self).__init__()
289 | self.ids = []
290 | self.task_idx = 0
291 | self.args = args
292 |
293 | self.task_dict = {'derain': 0, 'dehaze': 1, 'deblur': 2, 'enhance': 3}
294 | self.toTensor = ToTensor()
295 | self.addnoise = addnoise
296 | self.sigma = sigma
297 |
298 | self.set_dataset(task)
299 | def _add_gaussian_noise(self, clean_patch):
300 | noise = np.random.randn(*clean_patch.shape)
301 | noisy_patch = np.clip(clean_patch + noise * self.sigma, 0, 255).astype(np.uint8)
302 | return noisy_patch, clean_patch
303 |
304 | def _init_input_ids(self):
305 | if self.task_idx == 0:
306 | self.ids = []
307 | name_list = os.listdir(self.args.derain_path + 'input/')
308 | self.ids += [self.args.derain_path + 'input/' + id_ for id_ in name_list]
309 | elif self.task_idx == 1:
310 | self.ids = []
311 | name_list = os.listdir(self.args.dehaze_path + 'input/')
312 | self.ids += [self.args.dehaze_path + 'input/' + id_ for id_ in name_list]
313 | elif self.task_idx == 2:
314 | self.ids = []
315 | name_list = os.listdir(self.args.gopro_path +'input/')
316 | self.ids += [self.args.gopro_path + 'input/' + id_ for id_ in name_list]
317 | elif self.task_idx == 3:
318 | self.ids = []
319 | name_list = os.listdir(self.args.enhance_path + 'input/')
320 | self.ids += [self.args.enhance_path + 'input/' + id_ for id_ in name_list]
321 |
322 |
323 | self.length = len(self.ids)
324 |
325 | def _get_gt_path(self, degraded_name):
326 | if self.task_idx == 0:
327 | gt_name = degraded_name.replace("input", "target")
328 | elif self.task_idx == 1:
329 | dir_name = degraded_name.split("input")[0] + 'target/'
330 | name = degraded_name.split('/')[-1].split('_')[0] + '.png'
331 | gt_name = dir_name + name
332 | elif self.task_idx == 2:
333 | gt_name = degraded_name.replace("input", "target")
334 |
335 | elif self.task_idx == 3:
336 | gt_name = degraded_name.replace("input", "target")
337 |
338 | return gt_name
339 |
340 | def set_dataset(self, task):
341 | self.task_idx = self.task_dict[task]
342 | self._init_input_ids()
343 |
344 | def __getitem__(self, idx):
345 | degraded_path = self.ids[idx]
346 | clean_path = self._get_gt_path(degraded_path)
347 |
348 | degraded_img = crop_img(np.array(Image.open(degraded_path).convert('RGB')), base=16)
349 | if self.addnoise:
350 | degraded_img,_ = self._add_gaussian_noise(degraded_img)
351 | clean_img = crop_img(np.array(Image.open(clean_path).convert('RGB')), base=16)
352 |
353 | clean_img, degraded_img = self.toTensor(clean_img), self.toTensor(degraded_img)
354 | degraded_name = degraded_path.split('/')[-1][:-4]
355 |
356 | return [degraded_name], degraded_img, clean_img
357 |
358 | def __len__(self):
359 | return self.length
360 |
361 |
362 | class TestSpecificDataset(Dataset):
363 | def __init__(self, args):
364 | super(TestSpecificDataset, self).__init__()
365 | self.args = args
366 | self.degraded_ids = []
367 | self._init_clean_ids(args.test_path)
368 |
369 | self.toTensor = ToTensor()
370 |
371 | def _init_clean_ids(self, root):
372 | extensions = ['jpg', 'JPG', 'png', 'PNG', 'jpeg', 'JPEG', 'bmp', 'BMP']
373 | if os.path.isdir(root):
374 | name_list = []
375 | for image_file in os.listdir(root):
376 | if any([image_file.endswith(ext) for ext in extensions]):
377 | name_list.append(image_file)
378 | if len(name_list) == 0:
379 | raise Exception('The input directory does not contain any image files')
380 | self.degraded_ids += [root + id_ for id_ in name_list]
381 | else:
382 | if any([root.endswith(ext) for ext in extensions]):
383 | name_list = [root]
384 | else:
385 | raise Exception('Please pass an Image file')
386 | self.degraded_ids = name_list
387 | print("Total Images : {}".format(name_list))
388 |
389 | self.num_img = len(self.degraded_ids)
390 |
391 | def __getitem__(self, idx):
392 | degraded_img = crop_img(np.array(Image.open(self.degraded_ids[idx]).convert('RGB')), base=16)
393 | name = self.degraded_ids[idx].split('/')[-1][:-4]
394 |
395 | degraded_img = self.toTensor(degraded_img)
396 |
397 | return [name], degraded_img
398 |
399 | def __len__(self):
400 | return self.num_img
401 |
402 |
--------------------------------------------------------------------------------
/utils/degradation_utils.py:
--------------------------------------------------------------------------------
1 | import torch
2 | from torchvision.transforms import ToPILImage, Compose, RandomCrop, ToTensor, Grayscale
3 |
4 | from PIL import Image
5 | import random
6 | import numpy as np
7 |
8 | from utils.image_utils import crop_img
9 |
10 |
11 | class Degradation(object):
12 | def __init__(self, args):
13 | super(Degradation, self).__init__()
14 | self.args = args
15 | self.toTensor = ToTensor()
16 | self.crop_transform = Compose([
17 | ToPILImage(),
18 | RandomCrop(args.patch_size),
19 | ])
20 |
21 | def _add_gaussian_noise(self, clean_patch, sigma):
22 |
23 | noise = np.random.randn(*clean_patch.shape)
24 | noisy_patch = np.clip(clean_patch + noise * sigma, 0, 255).astype(np.uint8)
25 | return noisy_patch, clean_patch
26 |
27 | def _degrade_by_type(self, clean_patch, degrade_type):
28 | if degrade_type == 0:
29 | # denoise sigma=15
30 | degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=15)
31 | elif degrade_type == 1:
32 | # denoise sigma=25
33 | degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=25)
34 | elif degrade_type == 2:
35 | # denoise sigma=50
36 | degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=50)
37 |
38 | return degraded_patch, clean_patch
39 |
40 | def degrade(self, clean_patch_1, clean_patch_2, degrade_type=None):
41 | if degrade_type == None:
42 | degrade_type = random.randint(0, 3)
43 | else:
44 | degrade_type = degrade_type
45 |
46 | degrad_patch_1, _ = self._degrade_by_type(clean_patch_1, degrade_type)
47 | degrad_patch_2, _ = self._degrade_by_type(clean_patch_2, degrade_type)
48 | return degrad_patch_1, degrad_patch_2
49 |
50 | def single_degrade(self,clean_patch,degrade_type = None):
51 | if degrade_type == None:
52 | degrade_type = random.randint(0, 3)
53 | else:
54 | degrade_type = degrade_type
55 |
56 | degrad_patch_1, _ = self._degrade_by_type(clean_patch, degrade_type)
57 | return degrad_patch_1
58 |
--------------------------------------------------------------------------------
/utils/image_io.py:
--------------------------------------------------------------------------------
1 | import glob
2 |
3 | import torch
4 | import torchvision
5 | import matplotlib
6 | import matplotlib.pyplot as plt
7 | import numpy as np
8 | from PIL import Image
9 |
10 | # import skvideo.io
11 |
12 | matplotlib.use('agg')
13 |
14 |
15 | def prepare_hazy_image(file_name):
16 | img_pil = crop_image(get_image(file_name, -1)[0], d=32)
17 | return pil_to_np(img_pil)
18 |
19 |
20 | def prepare_gt_img(file_name, SOTS=True):
21 | if SOTS:
22 | img_pil = crop_image(crop_a_image(get_image(file_name, -1)[0], d=10), d=32)
23 | else:
24 | img_pil = crop_image(get_image(file_name, -1)[0], d=32)
25 |
26 | return pil_to_np(img_pil)
27 |
28 |
29 | def crop_a_image(img, d=10):
30 | bbox = [
31 | int((d)),
32 | int((d)),
33 | int((img.size[0] - d)),
34 | int((img.size[1] - d)),
35 | ]
36 | img_cropped = img.crop(bbox)
37 | return img_cropped
38 |
39 |
40 | def crop_image(img, d=32):
41 | """
42 | Make dimensions divisible by d
43 |
44 | :param pil img:
45 | :param d:
46 | :return:
47 | """
48 |
49 | new_size = (img.size[0] - img.size[0] % d,
50 | img.size[1] - img.size[1] % d)
51 |
52 | bbox = [
53 | int((img.size[0] - new_size[0]) / 2),
54 | int((img.size[1] - new_size[1]) / 2),
55 | int((img.size[0] + new_size[0]) / 2),
56 | int((img.size[1] + new_size[1]) / 2),
57 | ]
58 |
59 | img_cropped = img.crop(bbox)
60 | return img_cropped
61 |
62 |
63 | def crop_np_image(img_np, d=32):
64 | return torch_to_np(crop_torch_image(np_to_torch(img_np), d))
65 |
66 |
67 | def crop_torch_image(img, d=32):
68 | """
69 | Make dimensions divisible by d
70 | image is [1, 3, W, H] or [3, W, H]
71 | :param pil img:
72 | :param d:
73 | :return:
74 | """
75 | new_size = (img.shape[-2] - img.shape[-2] % d,
76 | img.shape[-1] - img.shape[-1] % d)
77 | pad = ((img.shape[-2] - new_size[-2]) // 2, (img.shape[-1] - new_size[-1]) // 2)
78 |
79 | if len(img.shape) == 4:
80 | return img[:, :, pad[-2]: pad[-2] + new_size[-2], pad[-1]: pad[-1] + new_size[-1]]
81 | assert len(img.shape) == 3
82 | return img[:, pad[-2]: pad[-2] + new_size[-2], pad[-1]: pad[-1] + new_size[-1]]
83 |
84 |
85 | def get_params(opt_over, net, net_input, downsampler=None):
86 | """
87 | Returns parameters that we want to optimize over.
88 | :param opt_over: comma separated list, e.g. "net,input" or "net"
89 | :param net: network
90 | :param net_input: torch.Tensor that stores input `z`
91 | :param downsampler:
92 | :return:
93 | """
94 |
95 | opt_over_list = opt_over.split(',')
96 | params = []
97 |
98 | for opt in opt_over_list:
99 |
100 | if opt == 'net':
101 | params += [x for x in net.parameters()]
102 | elif opt == 'down':
103 | assert downsampler is not None
104 | params = [x for x in downsampler.parameters()]
105 | elif opt == 'input':
106 | net_input.requires_grad = True
107 | params += [net_input]
108 | else:
109 | assert False, 'what is it?'
110 |
111 | return params
112 |
113 |
114 | def get_image_grid(images_np, nrow=8):
115 | """
116 | Creates a grid from a list of images by concatenating them.
117 | :param images_np:
118 | :param nrow:
119 | :return:
120 | """
121 | images_torch = [torch.from_numpy(x).type(torch.FloatTensor) for x in images_np]
122 | torch_grid = torchvision.utils.make_grid(images_torch, nrow)
123 |
124 | return torch_grid.numpy()
125 |
126 |
127 | def plot_image_grid(name, images_np, interpolation='lanczos', output_path="output/"):
128 | """
129 | Draws images in a grid
130 |
131 | Args:
132 | images_np: list of images, each image is np.array of size 3xHxW or 1xHxW
133 | nrow: how many images will be in one row
134 | interpolation: interpolation used in plt.imshow
135 | """
136 | assert len(images_np) == 2
137 | n_channels = max(x.shape[0] for x in images_np)
138 | assert (n_channels == 3) or (n_channels == 1), "images should have 1 or 3 channels"
139 |
140 | images_np = [x if (x.shape[0] == n_channels) else np.concatenate([x, x, x], axis=0) for x in images_np]
141 |
142 | grid = get_image_grid(images_np, 2)
143 |
144 | if images_np[0].shape[0] == 1:
145 | plt.imshow(grid[0], cmap='gray', interpolation=interpolation)
146 | else:
147 | plt.imshow(grid.transpose(1, 2, 0), interpolation=interpolation)
148 |
149 | plt.savefig(output_path + "{}.png".format(name))
150 |
151 |
152 | def save_image_np(name, image_np, output_path="output/"):
153 | p = np_to_pil(image_np)
154 | p.save(output_path + "{}.png".format(name))
155 |
156 |
157 | def save_image_tensor(image_tensor, output_path="output/"):
158 | image_np = torch_to_np(image_tensor)
159 | p = np_to_pil(image_np)
160 | p.save(output_path)
161 |
162 |
163 | def video_to_images(file_name, name):
164 | video = prepare_video(file_name)
165 | for i, f in enumerate(video):
166 | save_image(name + "_{0:03d}".format(i), f)
167 |
168 |
169 | def images_to_video(images_dir, name, gray=True):
170 | num = len(glob.glob(images_dir + "/*.jpg"))
171 | c = []
172 | for i in range(num):
173 | if gray:
174 | img = prepare_gray_image(images_dir + "/" + name + "_{}.jpg".format(i))
175 | else:
176 | img = prepare_image(images_dir + "/" + name + "_{}.jpg".format(i))
177 | print(img.shape)
178 | c.append(img)
179 | save_video(name, np.array(c))
180 |
181 |
182 | def save_heatmap(name, image_np):
183 | cmap = plt.get_cmap('jet')
184 |
185 | rgba_img = cmap(image_np)
186 | rgb_img = np.delete(rgba_img, 3, 2)
187 | save_image(name, rgb_img.transpose(2, 0, 1))
188 |
189 |
190 | def save_graph(name, graph_list, output_path="output/"):
191 | plt.clf()
192 | plt.plot(graph_list)
193 | plt.savefig(output_path + name + ".png")
194 |
195 |
196 | def create_augmentations(np_image):
197 | """
198 | convention: original, left, upside-down, right, rot1, rot2, rot3
199 | :param np_image:
200 | :return:
201 | """
202 | aug = [np_image.copy(), np.rot90(np_image, 1, (1, 2)).copy(),
203 | np.rot90(np_image, 2, (1, 2)).copy(), np.rot90(np_image, 3, (1, 2)).copy()]
204 | flipped = np_image[:, ::-1, :].copy()
205 | aug += [flipped.copy(), np.rot90(flipped, 1, (1, 2)).copy(), np.rot90(flipped, 2, (1, 2)).copy(),
206 | np.rot90(flipped, 3, (1, 2)).copy()]
207 | return aug
208 |
209 |
210 | def create_video_augmentations(np_video):
211 | """
212 | convention: original, left, upside-down, right, rot1, rot2, rot3
213 | :param np_video:
214 | :return:
215 | """
216 | aug = [np_video.copy(), np.rot90(np_video, 1, (2, 3)).copy(),
217 | np.rot90(np_video, 2, (2, 3)).copy(), np.rot90(np_video, 3, (2, 3)).copy()]
218 | flipped = np_video[:, :, ::-1, :].copy()
219 | aug += [flipped.copy(), np.rot90(flipped, 1, (2, 3)).copy(), np.rot90(flipped, 2, (2, 3)).copy(),
220 | np.rot90(flipped, 3, (2, 3)).copy()]
221 | return aug
222 |
223 |
224 | def save_graphs(name, graph_dict, output_path="output/"):
225 | """
226 |
227 | :param name:
228 | :param dict graph_dict: a dict from the name of the list to the list itself.
229 | :return:
230 | """
231 | plt.clf()
232 | fig, ax = plt.subplots()
233 | for k, v in graph_dict.items():
234 | ax.plot(v, label=k)
235 | ax.set_xlabel('iterations')
236 | ax.set_ylabel('MSE-loss')
237 | plt.legend()
238 | plt.savefig(output_path + name + ".png")
239 |
240 |
241 | def load(path):
242 | """Load PIL image."""
243 | img = Image.open(path)
244 | return img
245 |
246 |
247 | def get_image(path, imsize=-1):
248 | """Load an image and resize to a cpecific size.
249 |
250 | Args:
251 | path: path to image
252 | imsize: tuple or scalar with dimensions; -1 for `no resize`
253 | """
254 | img = load(path)
255 | if isinstance(imsize, int):
256 | imsize = (imsize, imsize)
257 |
258 | if imsize[0] != -1 and img.size != imsize:
259 | if imsize[0] > img.size[0]:
260 | img = img.resize(imsize, Image.BICUBIC)
261 | else:
262 | img = img.resize(imsize, Image.ANTIALIAS)
263 |
264 | img_np = pil_to_np(img)
265 |
266 | return img, img_np
267 |
268 |
269 | def prepare_gt(file_name):
270 | """
271 | loads makes it divisible
272 | :param file_name:
273 | :return: the numpy representation of the image
274 | """
275 | img = get_image(file_name, -1)
276 |
277 | img_pil = img[0].crop([10, 10, img[0].size[0] - 10, img[0].size[1] - 10])
278 |
279 | img_pil = crop_image(img_pil, d=32)
280 |
281 | return pil_to_np(img_pil)
282 |
283 |
284 | def prepare_image(file_name):
285 | """
286 | loads makes it divisible
287 | :param file_name:
288 | :return: the numpy representation of the image
289 | """
290 | img = get_image(file_name, -1)
291 |
292 | img_pil = crop_image(img[0], d=16)
293 |
294 | return pil_to_np(img_pil)
295 |
296 |
297 | def prepare_gray_image(file_name):
298 | img = prepare_image(file_name)
299 | return np.array([np.mean(img, axis=0)])
300 |
301 |
302 | def pil_to_np(img_PIL, with_transpose=True):
303 | """
304 | Converts image in PIL format to np.array.
305 |
306 | From W x H x C [0...255] to C x W x H [0..1]
307 | """
308 | ar = np.array(img_PIL)
309 | if len(ar.shape) == 3 and ar.shape[-1] == 4:
310 | ar = ar[:, :, :3]
311 | # this is alpha channel
312 | if with_transpose:
313 | if len(ar.shape) == 3:
314 | ar = ar.transpose(2, 0, 1)
315 | else:
316 | ar = ar[None, ...]
317 |
318 | return ar.astype(np.float32) / 255.
319 |
320 |
321 | def median(img_np_list):
322 | """
323 | assumes C x W x H [0..1]
324 | :param img_np_list:
325 | :return:
326 | """
327 | assert len(img_np_list) > 0
328 | l = len(img_np_list)
329 | shape = img_np_list[0].shape
330 | result = np.zeros(shape)
331 | for c in range(shape[0]):
332 | for w in range(shape[1]):
333 | for h in range(shape[2]):
334 | result[c, w, h] = sorted(i[c, w, h] for i in img_np_list)[l // 2]
335 | return result
336 |
337 |
338 | def average(img_np_list):
339 | """
340 | assumes C x W x H [0..1]
341 | :param img_np_list:
342 | :return:
343 | """
344 | assert len(img_np_list) > 0
345 | l = len(img_np_list)
346 | shape = img_np_list[0].shape
347 | result = np.zeros(shape)
348 | for i in img_np_list:
349 | result += i
350 | return result / l
351 |
352 |
353 | def np_to_pil(img_np):
354 | """
355 | Converts image in np.array format to PIL image.
356 |
357 | From C x W x H [0..1] to W x H x C [0...255]
358 | :param img_np:
359 | :return:
360 | """
361 | ar = np.clip(img_np * 255, 0, 255).astype(np.uint8)
362 |
363 | if img_np.shape[0] == 1:
364 | ar = ar[0]
365 | else:
366 | assert img_np.shape[0] == 3, img_np.shape
367 | ar = ar.transpose(1, 2, 0)
368 |
369 | return Image.fromarray(ar)
370 |
371 |
372 | def np_to_torch(img_np):
373 | """
374 | Converts image in numpy.array to torch.Tensor.
375 |
376 | From C x W x H [0..1] to C x W x H [0..1]
377 |
378 | :param img_np:
379 | :return:
380 | """
381 | return torch.from_numpy(img_np)[None, :]
382 |
383 |
384 | def torch_to_np(img_var):
385 | """
386 | Converts an image in torch.Tensor format to np.array.
387 |
388 | From 1 x C x W x H [0..1] to C x W x H [0..1]
389 | :param img_var:
390 | :return:
391 | """
392 | return img_var.detach().cpu().numpy()[0]
393 |
--------------------------------------------------------------------------------
/utils/image_utils.py:
--------------------------------------------------------------------------------
1 | """
2 | Created on 2020/9/8
3 |
4 | @author: Boyun Li
5 | """
6 | import os
7 | import numpy as np
8 | import torch
9 | import random
10 | import torch.nn as nn
11 | from torch.nn import init
12 | from PIL import Image
13 |
14 | class EdgeComputation(nn.Module):
15 | def __init__(self, test=False):
16 | super(EdgeComputation, self).__init__()
17 | self.test = test
18 | def forward(self, x):
19 | if self.test:
20 | x_diffx = torch.abs(x[:, :, :, 1:] - x[:, :, :, :-1])
21 | x_diffy = torch.abs(x[:, :, 1:, :] - x[:, :, :-1, :])
22 |
23 | # y = torch.Tensor(x.size()).cuda()
24 | y = torch.Tensor(x.size())
25 | y.fill_(0)
26 | y[:, :, :, 1:] += x_diffx
27 | y[:, :, :, :-1] += x_diffx
28 | y[:, :, 1:, :] += x_diffy
29 | y[:, :, :-1, :] += x_diffy
30 | y = torch.sum(y, 1, keepdim=True) / 3
31 | y /= 4
32 | return y
33 | else:
34 | x_diffx = torch.abs(x[:, :, 1:] - x[:, :, :-1])
35 | x_diffy = torch.abs(x[:, 1:, :] - x[:, :-1, :])
36 |
37 | y = torch.Tensor(x.size())
38 | y.fill_(0)
39 | y[:, :, 1:] += x_diffx
40 | y[:, :, :-1] += x_diffx
41 | y[:, 1:, :] += x_diffy
42 | y[:, :-1, :] += x_diffy
43 | y = torch.sum(y, 0) / 3
44 | y /= 4
45 | return y.unsqueeze(0)
46 |
47 |
48 | # randomly crop a patch from image
49 | def crop_patch(im, pch_size):
50 | H = im.shape[0]
51 | W = im.shape[1]
52 | ind_H = random.randint(0, H - pch_size)
53 | ind_W = random.randint(0, W - pch_size)
54 | pch = im[ind_H:ind_H + pch_size, ind_W:ind_W + pch_size]
55 | return pch
56 |
57 |
58 | # crop an image to the multiple of base
59 | def crop_img(image, base=64):
60 | h = image.shape[0]
61 | w = image.shape[1]
62 | crop_h = h % base
63 | crop_w = w % base
64 | return image[crop_h // 2:h - crop_h + crop_h // 2, crop_w // 2:w - crop_w + crop_w // 2, :]
65 |
66 |
67 | # image (H, W, C) -> patches (B, H, W, C)
68 | def slice_image2patches(image, patch_size=64, overlap=0):
69 | assert image.shape[0] % patch_size == 0 and image.shape[1] % patch_size == 0
70 | H = image.shape[0]
71 | W = image.shape[1]
72 | patches = []
73 | image_padding = np.pad(image, ((overlap, overlap), (overlap, overlap), (0, 0)), mode='edge')
74 | for h in range(H // patch_size):
75 | for w in range(W // patch_size):
76 | idx_h = [h * patch_size, (h + 1) * patch_size + overlap]
77 | idx_w = [w * patch_size, (w + 1) * patch_size + overlap]
78 | patches.append(np.expand_dims(image_padding[idx_h[0]:idx_h[1], idx_w[0]:idx_w[1], :], axis=0))
79 | return np.concatenate(patches, axis=0)
80 |
81 |
82 | # patches (B, H, W, C) -> image (H, W, C)
83 | def splice_patches2image(patches, image_size, overlap=0):
84 | assert len(image_size) > 1
85 | assert patches.shape[-3] == patches.shape[-2]
86 | H = image_size[0]
87 | W = image_size[1]
88 | patch_size = patches.shape[-2] - overlap
89 | image = np.zeros(image_size)
90 | idx = 0
91 | for h in range(H // patch_size):
92 | for w in range(W // patch_size):
93 | image[h * patch_size:(h + 1) * patch_size, w * patch_size:(w + 1) * patch_size, :] = patches[idx,
94 | overlap:patch_size + overlap,
95 | overlap:patch_size + overlap,
96 | :]
97 | idx += 1
98 | return image
99 |
100 |
101 | def data_augmentation(image, mode):
102 | if mode == 0:
103 | # original
104 | out = image.numpy()
105 | elif mode == 1:
106 | # flip up and down
107 | out = np.flipud(image)
108 | elif mode == 2:
109 | # rotate counterwise 90 degree
110 | out = np.rot90(image)
111 | elif mode == 3:
112 | # rotate 90 degree and flip up and down
113 | out = np.rot90(image)
114 | out = np.flipud(out)
115 | elif mode == 4:
116 | # rotate 180 degree
117 | out = np.rot90(image, k=2)
118 | elif mode == 5:
119 | # rotate 180 degree and flip
120 | out = np.rot90(image, k=2)
121 | out = np.flipud(out)
122 | elif mode == 6:
123 | # rotate 270 degree
124 | out = np.rot90(image, k=3)
125 | elif mode == 7:
126 | # rotate 270 degree and flip
127 | out = np.rot90(image, k=3)
128 | out = np.flipud(out)
129 | else:
130 | raise Exception('Invalid choice of image transformation')
131 | return out
132 |
133 |
134 | def random_augmentation(*args):
135 | out = []
136 | flag_aug = random.randint(1, 7)
137 | for data in args:
138 | out.append(data_augmentation(data, flag_aug).copy())
139 | return out
140 |
141 |
142 | def weights_init_normal_(m):
143 | classname = m.__class__.__name__
144 | if classname.find('Conv') != -1:
145 | init.uniform(m.weight.data, 0.0, 0.02)
146 | elif classname.find('Linear') != -1:
147 | init.uniform(m.weight.data, 0.0, 0.02)
148 | elif classname.find('BatchNorm2d') != -1:
149 | init.uniform(m.weight.data, 1.0, 0.02)
150 | init.constant(m.bias.data, 0.0)
151 |
152 |
153 | def weights_init_normal(m):
154 | classname = m.__class__.__name__
155 | if classname.find('Conv2d') != -1:
156 | m.apply(weights_init_normal_)
157 | elif classname.find('Linear') != -1:
158 | init.uniform(m.weight.data, 0.0, 0.02)
159 | elif classname.find('BatchNorm2d') != -1:
160 | init.uniform(m.weight.data, 1.0, 0.02)
161 | init.constant(m.bias.data, 0.0)
162 |
163 |
164 | def weights_init_xavier(m):
165 | classname = m.__class__.__name__
166 | if classname.find('Conv') != -1:
167 | init.xavier_normal(m.weight.data, gain=1)
168 | elif classname.find('Linear') != -1:
169 | init.xavier_normal(m.weight.data, gain=1)
170 | elif classname.find('BatchNorm2d') != -1:
171 | init.uniform(m.weight.data, 1.0, 0.02)
172 | init.constant(m.bias.data, 0.0)
173 |
174 |
175 | def weights_init_kaiming(m):
176 | classname = m.__class__.__name__
177 | if classname.find('Conv') != -1:
178 | init.kaiming_normal(m.weight.data, a=0, mode='fan_in')
179 | elif classname.find('Linear') != -1:
180 | init.kaiming_normal(m.weight.data, a=0, mode='fan_in')
181 | elif classname.find('BatchNorm2d') != -1:
182 | init.uniform(m.weight.data, 1.0, 0.02)
183 | init.constant(m.bias.data, 0.0)
184 |
185 |
186 | def weights_init_orthogonal(m):
187 | classname = m.__class__.__name__
188 | print(classname)
189 | if classname.find('Conv') != -1:
190 | init.orthogonal(m.weight.data, gain=1)
191 | elif classname.find('Linear') != -1:
192 | init.orthogonal(m.weight.data, gain=1)
193 | elif classname.find('BatchNorm2d') != -1:
194 | init.uniform(m.weight.data, 1.0, 0.02)
195 | init.constant(m.bias.data, 0.0)
196 |
197 |
198 | def init_weights(net, init_type='normal'):
199 | print('initialization method [%s]' % init_type)
200 | if init_type == 'normal':
201 | net.apply(weights_init_normal)
202 | elif init_type == 'xavier':
203 | net.apply(weights_init_xavier)
204 | elif init_type == 'kaiming':
205 | net.apply(weights_init_kaiming)
206 | elif init_type == 'orthogonal':
207 | net.apply(weights_init_orthogonal)
208 | else:
209 | raise NotImplementedError('initialization method [%s] is not implemented' % init_type)
210 |
211 |
212 | def np_to_torch(img_np):
213 | """
214 | Converts image in numpy.array to torch.Tensor.
215 |
216 | From C x W x H [0..1] to C x W x H [0..1]
217 |
218 | :param img_np:
219 | :return:
220 | """
221 | return torch.from_numpy(img_np)[None, :]
222 |
223 |
224 | def torch_to_np(img_var):
225 | """
226 | Converts an image in torch.Tensor format to np.array.
227 |
228 | From 1 x C x W x H [0..1] to C x W x H [0..1]
229 | :param img_var:
230 | :return:
231 | """
232 | return img_var.detach().cpu().numpy()
233 | # return img_var.detach().cpu().numpy()[0]
234 |
235 |
236 | def save_image(name, image_np, output_path="output/normal/"):
237 | if not os.path.exists(output_path):
238 | os.mkdir(output_path)
239 |
240 | p = np_to_pil(image_np)
241 | p.save(output_path + "{}.png".format(name))
242 |
243 |
244 | def np_to_pil(img_np):
245 | """
246 | Converts image in np.array format to PIL image.
247 |
248 | From C x W x H [0..1] to W x H x C [0...255]
249 | :param img_np:
250 | :return:
251 | """
252 | ar = np.clip(img_np * 255, 0, 255).astype(np.uint8)
253 |
254 | if img_np.shape[0] == 1:
255 | ar = ar[0]
256 | else:
257 | assert img_np.shape[0] == 3, img_np.shape
258 | ar = ar.transpose(1, 2, 0)
259 |
260 | return Image.fromarray(ar)
--------------------------------------------------------------------------------
/utils/imresize.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | from scipy.ndimage import filters, measurements, interpolation
3 | from math import pi
4 |
5 |
6 | def imresize(im, scale_factor=None, output_shape=None, kernel=None, antialiasing=True, kernel_shift_flag=False):
7 | # First standardize values and fill missing arguments (if needed) by deriving scale from output shape or vice versa
8 | scale_factor, output_shape = fix_scale_and_size(im.shape, output_shape, scale_factor)
9 |
10 | # For a given numeric kernel case, just do convolution and sub-sampling (downscaling only)
11 | if type(kernel) == np.ndarray and scale_factor[0] <= 1:
12 | return numeric_kernel(im, kernel, scale_factor, output_shape, kernel_shift_flag)
13 |
14 | # Choose interpolation method, each method has the matching kernel size
15 | method, kernel_width = {
16 | "cubic": (cubic, 4.0),
17 | "lanczos2": (lanczos2, 4.0),
18 | "lanczos3": (lanczos3, 6.0),
19 | "box": (box, 1.0),
20 | "linear": (linear, 2.0),
21 | None: (cubic, 4.0) # set default interpolation method as cubic
22 | }.get(kernel)
23 |
24 | # Antialiasing is only used when downscaling
25 | antialiasing *= (scale_factor[0] < 1)
26 |
27 | # Sort indices of dimensions according to scale of each dimension. since we are going dim by dim this is efficient
28 | sorted_dims = np.argsort(np.array(scale_factor)).tolist()
29 |
30 | # Iterate over dimensions to calculate local weights for resizing and resize each time in one direction
31 | out_im = np.copy(im)
32 | for dim in sorted_dims:
33 | # No point doing calculations for scale-factor 1. nothing will happen anyway
34 | if scale_factor[dim] == 1.0:
35 | continue
36 |
37 | # for each coordinate (along 1 dim), calculate which coordinates in the input image affect its result and the
38 | # weights that multiply the values there to get its result.
39 | weights, field_of_view = contributions(im.shape[dim], output_shape[dim], scale_factor[dim],
40 | method, kernel_width, antialiasing)
41 |
42 | # Use the affecting position values and the set of weights to calculate the result of resizing along this 1 dim
43 | out_im = resize_along_dim(out_im, dim, weights, field_of_view)
44 |
45 | return out_im
46 |
47 |
48 | def fix_scale_and_size(input_shape, output_shape, scale_factor):
49 | # First fixing the scale-factor (if given) to be standardized the function expects (a list of scale factors in the
50 | # same size as the number of input dimensions)
51 | if scale_factor is not None:
52 | # By default, if scale-factor is a scalar we assume 2d resizing and duplicate it.
53 | if np.isscalar(scale_factor):
54 | scale_factor = [scale_factor, scale_factor]
55 |
56 | # We extend the size of scale-factor list to the size of the input by assigning 1 to all the unspecified scales
57 | scale_factor = list(scale_factor)
58 | scale_factor.extend([1] * (len(input_shape) - len(scale_factor)))
59 |
60 | # Fixing output-shape (if given): extending it to the size of the input-shape, by assigning the original input-size
61 | # to all the unspecified dimensions
62 | if output_shape is not None:
63 | output_shape = list(np.uint(np.array(output_shape))) + list(input_shape[len(output_shape):])
64 |
65 | # Dealing with the case of non-give scale-factor, calculating according to output-shape. note that this is
66 | # sub-optimal, because there can be different scales to the same output-shape.
67 | if scale_factor is None:
68 | scale_factor = 1.0 * np.array(output_shape) / np.array(input_shape)
69 |
70 | # Dealing with missing output-shape. calculating according to scale-factor
71 | if output_shape is None:
72 | output_shape = np.uint(np.ceil(np.array(input_shape) * np.array(scale_factor)))
73 |
74 | return scale_factor, output_shape
75 |
76 |
77 | def contributions(in_length, out_length, scale, kernel, kernel_width, antialiasing):
78 | # This function calculates a set of 'filters' and a set of field_of_view that will later on be applied
79 | # such that each position from the field_of_view will be multiplied with a matching filter from the
80 | # 'weights' based on the interpolation method and the distance of the sub-pixel location from the pixel centers
81 | # around it. This is only done for one dimension of the image.
82 |
83 | # When anti-aliasing is activated (default and only for downscaling) the receptive field is stretched to size of
84 | # 1/sf. this means filtering is more 'low-pass filter'.
85 | fixed_kernel = (lambda arg: scale * kernel(scale * arg)) if antialiasing else kernel
86 | kernel_width *= 1.0 / scale if antialiasing else 1.0
87 |
88 | # These are the coordinates of the output image
89 | out_coordinates = np.arange(1, out_length+1)
90 |
91 | # These are the matching positions of the output-coordinates on the input image coordinates.
92 | # Best explained by example: say we have 4 horizontal pixels for HR and we downscale by SF=2 and get 2 pixels:
93 | # [1,2,3,4] -> [1,2]. Remember each pixel number is the middle of the pixel.
94 | # The scaling is done between the distances and not pixel numbers (the right boundary of pixel 4 is transformed to
95 | # the right boundary of pixel 2. pixel 1 in the small image matches the boundary between pixels 1 and 2 in the big
96 | # one and not to pixel 2. This means the position is not just multiplication of the old pos by scale-factor).
97 | # So if we measure distance from the left border, middle of pixel 1 is at distance d=0.5, border between 1 and 2 is
98 | # at d=1, and so on (d = p - 0.5). we calculate (d_new = d_old / sf) which means:
99 | # (p_new-0.5 = (p_old-0.5) / sf) -> p_new = p_old/sf + 0.5 * (1-1/sf)
100 | match_coordinates = 1.0 * out_coordinates / scale + 0.5 * (1 - 1.0 / scale)
101 |
102 | # This is the left boundary to start multiplying the filter from, it depends on the size of the filter
103 | left_boundary = np.floor(match_coordinates - kernel_width / 2)
104 |
105 | # Kernel width needs to be enlarged because when covering has sub-pixel borders, it must 'see' the pixel centers
106 | # of the pixels it only covered a part from. So we add one pixel at each side to consider (weights can zeroize them)
107 | expanded_kernel_width = np.ceil(kernel_width) + 2
108 |
109 | # Determine a set of field_of_view for each each output position, these are the pixels in the input image
110 | # that the pixel in the output image 'sees'. We get a matrix whos horizontal dim is the output pixels (big) and the
111 | # vertical dim is the pixels it 'sees' (kernel_size + 2)
112 | field_of_view = np.squeeze(np.uint(np.expand_dims(left_boundary, axis=1) + np.arange(expanded_kernel_width) - 1))
113 |
114 | # Assign weight to each pixel in the field of view. A matrix whos horizontal dim is the output pixels and the
115 | # vertical dim is a list of weights matching to the pixel in the field of view (that are specified in
116 | # 'field_of_view')
117 | weights = fixed_kernel(1.0 * np.expand_dims(match_coordinates, axis=1) - field_of_view - 1)
118 |
119 | # Normalize weights to sum up to 1. be careful from dividing by 0
120 | sum_weights = np.sum(weights, axis=1)
121 | sum_weights[sum_weights == 0] = 1.0
122 | weights = 1.0 * weights / np.expand_dims(sum_weights, axis=1)
123 |
124 | # We use this mirror structure as a trick for reflection padding at the boundaries
125 | mirror = np.uint(np.concatenate((np.arange(in_length), np.arange(in_length - 1, -1, step=-1))))
126 | field_of_view = mirror[np.mod(field_of_view, mirror.shape[0])]
127 |
128 | # Get rid of weights and pixel positions that are of zero weight
129 | non_zero_out_pixels = np.nonzero(np.any(weights, axis=0))
130 | weights = np.squeeze(weights[:, non_zero_out_pixels])
131 | field_of_view = np.squeeze(field_of_view[:, non_zero_out_pixels])
132 |
133 | # Final products are the relative positions and the matching weights, both are output_size X fixed_kernel_size
134 | return weights, field_of_view
135 |
136 |
137 | def resize_along_dim(im, dim, weights, field_of_view):
138 | # To be able to act on each dim, we swap so that dim 0 is the wanted dim to resize
139 | tmp_im = np.swapaxes(im, dim, 0)
140 |
141 | # We add singleton dimensions to the weight matrix so we can multiply it with the big tensor we get for
142 | # tmp_im[field_of_view.T], (bsxfun style)
143 | weights = np.reshape(weights.T, list(weights.T.shape) + (np.ndim(im) - 1) * [1])
144 |
145 | # This is a bit of a complicated multiplication: tmp_im[field_of_view.T] is a tensor of order image_dims+1.
146 | # for each pixel in the output-image it matches the positions the influence it from the input image (along 1 dim
147 | # only, this is why it only adds 1 dim to the shape). We then multiply, for each pixel, its set of positions with
148 | # the matching set of weights. we do this by this big tensor element-wise multiplication (MATLAB bsxfun style:
149 | # matching dims are multiplied element-wise while singletons mean that the matching dim is all multiplied by the
150 | # same number
151 | tmp_out_im = np.sum(tmp_im[field_of_view.T] * weights, axis=0)
152 |
153 | # Finally we swap back the axes to the original order
154 | return np.swapaxes(tmp_out_im, dim, 0)
155 |
156 |
157 | def numeric_kernel(im, kernel, scale_factor, output_shape, kernel_shift_flag):
158 | # See kernel_shift function to understand what this is
159 | if kernel_shift_flag:
160 | kernel = kernel_shift(kernel, scale_factor)
161 |
162 | # First run a correlation (convolution with flipped kernel)
163 | out_im = np.zeros_like(im)
164 | for channel in range(np.ndim(im)):
165 | out_im[:, :, channel] = filters.correlate(im[:, :, channel], kernel)
166 |
167 | # Then subsample and return
168 | return out_im[np.round(np.linspace(0, im.shape[0] - 1 / scale_factor[0], output_shape[0])).astype(int)[:, None],
169 | np.round(np.linspace(0, im.shape[1] - 1 / scale_factor[1], output_shape[1])).astype(int), :]
170 |
171 |
172 | def kernel_shift(kernel, sf):
173 | # There are two reasons for shifting the kernel:
174 | # 1. Center of mass is not in the center of the kernel which creates ambiguity. There is no possible way to know
175 | # the degradation process included shifting so we always assume center of mass is center of the kernel.
176 | # 2. We further shift kernel center so that top left result pixel corresponds to the middle of the sfXsf first
177 | # pixels. Default is for odd size to be in the middle of the first pixel and for even sized kernel to be at the
178 | # top left corner of the first pixel. that is why different shift size needed between od and even size.
179 | # Given that these two conditions are fulfilled, we are happy and aligned, the way to test it is as follows:
180 | # The input image, when interpolated (regular bicubic) is exactly aligned with ground truth.
181 |
182 | # First calculate the current center of mass for the kernel
183 | current_center_of_mass = measurements.center_of_mass(kernel)
184 |
185 | # The second ("+ 0.5 * ....") is for applying condition 2 from the comments above
186 | wanted_center_of_mass = np.array(kernel.shape) / 2 + 0.5 * (sf - (kernel.shape[0] % 2))
187 |
188 | # Define the shift vector for the kernel shifting (x,y)
189 | shift_vec = wanted_center_of_mass - current_center_of_mass
190 |
191 | # Before applying the shift, we first pad the kernel so that nothing is lost due to the shift
192 | # (biggest shift among dims + 1 for safety)
193 | kernel = np.pad(kernel, np.int(np.ceil(np.max(shift_vec))) + 1, 'constant')
194 |
195 | # Finally shift the kernel and return
196 | return interpolation.shift(kernel, shift_vec)
197 |
198 |
199 | # These next functions are all interpolation methods. x is the distance from the left pixel center
200 |
201 |
202 | def cubic(x):
203 | absx = np.abs(x)
204 | absx2 = absx ** 2
205 | absx3 = absx ** 3
206 | return ((1.5*absx3 - 2.5*absx2 + 1) * (absx <= 1) +
207 | (-0.5*absx3 + 2.5*absx2 - 4*absx + 2) * ((1 < absx) & (absx <= 2)))
208 |
209 |
210 | def lanczos2(x):
211 | return (((np.sin(pi*x) * np.sin(pi*x/2) + np.finfo(np.float32).eps) /
212 | ((pi**2 * x**2 / 2) + np.finfo(np.float32).eps))
213 | * (abs(x) < 2))
214 |
215 |
216 | def box(x):
217 | return ((-0.5 <= x) & (x < 0.5)) * 1.0
218 |
219 |
220 | def lanczos3(x):
221 | return (((np.sin(pi*x) * np.sin(pi*x/3) + np.finfo(np.float32).eps) /
222 | ((pi**2 * x**2 / 3) + np.finfo(np.float32).eps))
223 | * (abs(x) < 3))
224 |
225 |
226 | def linear(x):
227 | return (x + 1) * ((-1 <= x) & (x < 0)) + (1 - x) * ((0 <= x) & (x <= 1))
228 |
229 |
230 | def np_imresize(im, scale_factor=None, output_shape=None, kernel=None, antialiasing=True, kernel_shift_flag=False):
231 | return np.clip(imresize(im.transpose(1, 2, 0), scale_factor, output_shape, kernel, antialiasing,
232 | kernel_shift_flag).transpose(2, 0, 1), 0, 1)
--------------------------------------------------------------------------------
/utils/loss_utils.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torch.nn as nn
3 | from torch.nn.functional import mse_loss
4 |
5 |
6 | class GANLoss(nn.Module):
7 | def __init__(self, use_lsgan=True, target_real_label=1.0, target_fake_label=0.0,
8 | tensor=torch.FloatTensor):
9 | super(GANLoss, self).__init__()
10 | self.real_label = target_real_label
11 | self.fake_label = target_fake_label
12 | self.real_label_var = None
13 | self.fake_label_var = None
14 | self.Tensor = tensor
15 | if use_lsgan:
16 | self.loss = nn.MSELoss()
17 | else:
18 | self.loss = nn.BCELoss()
19 |
20 | def get_target_tensor(self, input, target_is_real):
21 | target_tensor = None
22 | if target_is_real:
23 | create_label = ((self.real_label_var is None) or(self.real_label_var.numel() != input.numel()))
24 | if create_label:
25 | real_tensor = self.Tensor(input.size()).fill_(self.real_label)
26 | self.real_label_var = real_tensor
27 | target_tensor = self.real_label_var
28 | else:
29 | create_label = ((self.fake_label_var is None) or (self.fake_label_var.numel() != input.numel()))
30 | if create_label:
31 | fake_tensor = self.Tensor(input.size()).fill_(self.fake_label)
32 | self.fake_label_var = fake_tensor
33 | target_tensor = self.fake_label_var
34 | return target_tensor
35 |
36 | def __call__(self, input, target_is_real):
37 | target_tensor = self.get_target_tensor(input, target_is_real)
38 | return self.loss(input, target_tensor)
39 |
40 |
--------------------------------------------------------------------------------
/utils/pytorch_ssim/__init__.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torch.nn.functional as F
3 | from torch.autograd import Variable
4 | import numpy as np
5 | from math import exp
6 |
7 | # Matlab style 1D gaussian filter.
8 | def gaussian(window_size, sigma):
9 | gauss = torch.Tensor([exp(-(x - window_size//2)**2/float(2*sigma**2)) for x in range(window_size)])
10 | return gauss/gauss.sum()
11 |
12 | # Matlab style n_D gaussian filter.
13 | def create_window(window_size, channel):
14 | _1D_window = gaussian(window_size, 1.5).unsqueeze(1)
15 | _2D_window = _1D_window.mm(_1D_window.t()).float().unsqueeze(0).unsqueeze(0)
16 | window = Variable(_2D_window.expand(channel, 1, window_size, window_size).contiguous())
17 | return window
18 |
19 | def _ssim(img1, img2, window, window_size, channel, size_average = True):
20 | mu1 = F.conv2d(img1, window, padding = window_size//2, groups = channel)
21 | mu2 = F.conv2d(img2, window, padding = window_size//2, groups = channel)
22 |
23 | mu1_sq = mu1.pow(2)
24 | mu2_sq = mu2.pow(2)
25 | mu1_mu2 = mu1*mu2
26 |
27 | sigma1_sq = F.conv2d(img1*img1, window, padding = window_size//2, groups = channel) - mu1_sq
28 | sigma2_sq = F.conv2d(img2*img2, window, padding = window_size//2, groups = channel) - mu2_sq
29 | sigma12 = F.conv2d(img1*img2, window, padding = window_size//2, groups = channel) - mu1_mu2
30 |
31 | C1 = 0.01**2
32 | C2 = 0.03**2
33 |
34 | ssim_map = ((2*mu1_mu2 + C1)*(2*sigma12 + C2))/((mu1_sq + mu2_sq + C1)*(sigma1_sq + sigma2_sq + C2))
35 |
36 |
37 | # I added this for sm
38 | # ssim_map = torch.exp(1 + ssim_map)
39 |
40 | if size_average:
41 | return ssim_map.mean()
42 | else:
43 | return ssim_map.mean(1).mean(1).mean(1)
44 |
45 | class SSIM(torch.nn.Module):
46 | def __init__(self, window_size = 11, size_average = True):
47 | super(SSIM, self).__init__()
48 | self.window_size = window_size
49 | self.size_average = size_average
50 | self.channel = 1
51 | self.window = create_window(window_size, self.channel)
52 |
53 | def forward(self, img1, img2):
54 | (_, channel, _, _) = img1.size()
55 |
56 | if channel == self.channel and self.window.data.type() == img1.data.type():
57 | window = self.window
58 | else:
59 | window = create_window(self.window_size, channel)
60 |
61 | if img1.is_cuda:
62 | window = window.cuda(img1.get_device())
63 | window = window.type_as(img1)
64 |
65 | self.window = window
66 | self.channel = channel
67 |
68 | return _ssim(img1, img2, window, self.window_size, channel, self.size_average)
69 |
70 | def ssim(img1, img2, window_size = 11, size_average = True):
71 | (_, channel, _, _) = img1.size()
72 | window = create_window(window_size, channel)
73 |
74 | if img1.is_cuda:
75 | window = window.cuda(img1.get_device())
76 | window = window.type_as(img1)
77 |
78 | return _ssim(img1, img2, window, window_size, channel, size_average)
79 |
--------------------------------------------------------------------------------
/utils/schedulers.py:
--------------------------------------------------------------------------------
1 | import math
2 | from collections import Counter
3 | from torch.optim.lr_scheduler import _LRScheduler
4 | import torch
5 | import warnings
6 | from typing import List
7 |
8 | from torch import nn
9 | from torch.optim import Adam, Optimizer
10 |
11 | class MultiStepRestartLR(_LRScheduler):
12 | """ MultiStep with restarts learning rate scheme.
13 |
14 | Args:
15 | optimizer (torch.nn.optimizer): Torch optimizer.
16 | milestones (list): Iterations that will decrease learning rate.
17 | gamma (float): Decrease ratio. Default: 0.1.
18 | restarts (list): Restart iterations. Default: [0].
19 | restart_weights (list): Restart weights at each restart iteration.
20 | Default: [1].
21 | last_epoch (int): Used in _LRScheduler. Default: -1.
22 | """
23 |
24 | def __init__(self,
25 | optimizer,
26 | milestones,
27 | gamma=0.1,
28 | restarts=(0, ),
29 | restart_weights=(1, ),
30 | last_epoch=-1):
31 | self.milestones = Counter(milestones)
32 | self.gamma = gamma
33 | self.restarts = restarts
34 | self.restart_weights = restart_weights
35 | assert len(self.restarts) == len(
36 | self.restart_weights), 'restarts and their weights do not match.'
37 | super(MultiStepRestartLR, self).__init__(optimizer, last_epoch)
38 |
39 | def get_lr(self):
40 | if self.last_epoch in self.restarts:
41 | weight = self.restart_weights[self.restarts.index(self.last_epoch)]
42 | return [
43 | group['initial_lr'] * weight
44 | for group in self.optimizer.param_groups
45 | ]
46 | if self.last_epoch not in self.milestones:
47 | return [group['lr'] for group in self.optimizer.param_groups]
48 | return [
49 | group['lr'] * self.gamma**self.milestones[self.last_epoch]
50 | for group in self.optimizer.param_groups
51 | ]
52 |
53 | class LinearLR(_LRScheduler):
54 | """
55 |
56 | Args:
57 | optimizer (torch.nn.optimizer): Torch optimizer.
58 | milestones (list): Iterations that will decrease learning rate.
59 | gamma (float): Decrease ratio. Default: 0.1.
60 | last_epoch (int): Used in _LRScheduler. Default: -1.
61 | """
62 |
63 | def __init__(self,
64 | optimizer,
65 | total_iter,
66 | last_epoch=-1):
67 | self.total_iter = total_iter
68 | super(LinearLR, self).__init__(optimizer, last_epoch)
69 |
70 | def get_lr(self):
71 | process = self.last_epoch / self.total_iter
72 | weight = (1 - process)
73 | # print('get lr ', [weight * group['initial_lr'] for group in self.optimizer.param_groups])
74 | return [weight * group['initial_lr'] for group in self.optimizer.param_groups]
75 |
76 | class VibrateLR(_LRScheduler):
77 | """
78 |
79 | Args:
80 | optimizer (torch.nn.optimizer): Torch optimizer.
81 | milestones (list): Iterations that will decrease learning rate.
82 | gamma (float): Decrease ratio. Default: 0.1.
83 | last_epoch (int): Used in _LRScheduler. Default: -1.
84 | """
85 |
86 | def __init__(self,
87 | optimizer,
88 | total_iter,
89 | last_epoch=-1):
90 | self.total_iter = total_iter
91 | super(VibrateLR, self).__init__(optimizer, last_epoch)
92 |
93 | def get_lr(self):
94 | process = self.last_epoch / self.total_iter
95 |
96 | f = 0.1
97 | if process < 3 / 8:
98 | f = 1 - process * 8 / 3
99 | elif process < 5 / 8:
100 | f = 0.2
101 |
102 | T = self.total_iter // 80
103 | Th = T // 2
104 |
105 | t = self.last_epoch % T
106 |
107 | f2 = t / Th
108 | if t >= Th:
109 | f2 = 2 - f2
110 |
111 | weight = f * f2
112 |
113 | if self.last_epoch < Th:
114 | weight = max(0.1, weight)
115 |
116 | # print('f {}, T {}, Th {}, t {}, f2 {}'.format(f, T, Th, t, f2))
117 | return [weight * group['initial_lr'] for group in self.optimizer.param_groups]
118 |
119 | def get_position_from_periods(iteration, cumulative_period):
120 | """Get the position from a period list.
121 |
122 | It will return the index of the right-closest number in the period list.
123 | For example, the cumulative_period = [100, 200, 300, 400],
124 | if iteration == 50, return 0;
125 | if iteration == 210, return 2;
126 | if iteration == 300, return 2.
127 |
128 | Args:
129 | iteration (int): Current iteration.
130 | cumulative_period (list[int]): Cumulative period list.
131 |
132 | Returns:
133 | int: The position of the right-closest number in the period list.
134 | """
135 | for i, period in enumerate(cumulative_period):
136 | if iteration <= period:
137 | return i
138 |
139 |
140 | class CosineAnnealingRestartLR(_LRScheduler):
141 | """ Cosine annealing with restarts learning rate scheme.
142 |
143 | An example of config:
144 | periods = [10, 10, 10, 10]
145 | restart_weights = [1, 0.5, 0.5, 0.5]
146 | eta_min=1e-7
147 |
148 | It has four cycles, each has 10 iterations. At 10th, 20th, 30th, the
149 | scheduler will restart with the weights in restart_weights.
150 |
151 | Args:
152 | optimizer (torch.nn.optimizer): Torch optimizer.
153 | periods (list): Period for each cosine anneling cycle.
154 | restart_weights (list): Restart weights at each restart iteration.
155 | Default: [1].
156 | eta_min (float): The mimimum lr. Default: 0.
157 | last_epoch (int): Used in _LRScheduler. Default: -1.
158 | """
159 |
160 | def __init__(self,
161 | optimizer,
162 | periods,
163 | restart_weights=(1, ),
164 | eta_min=0,
165 | last_epoch=-1):
166 | self.periods = periods
167 | self.restart_weights = restart_weights
168 | self.eta_min = eta_min
169 | assert (len(self.periods) == len(self.restart_weights)
170 | ), 'periods and restart_weights should have the same length.'
171 | self.cumulative_period = [
172 | sum(self.periods[0:i + 1]) for i in range(0, len(self.periods))
173 | ]
174 | super(CosineAnnealingRestartLR, self).__init__(optimizer, last_epoch)
175 |
176 | def get_lr(self):
177 | idx = get_position_from_periods(self.last_epoch,
178 | self.cumulative_period)
179 | current_weight = self.restart_weights[idx]
180 | nearest_restart = 0 if idx == 0 else self.cumulative_period[idx - 1]
181 | current_period = self.periods[idx]
182 |
183 | return [
184 | self.eta_min + current_weight * 0.5 * (base_lr - self.eta_min) *
185 | (1 + math.cos(math.pi * (
186 | (self.last_epoch - nearest_restart) / current_period)))
187 | for base_lr in self.base_lrs
188 | ]
189 |
190 | class CosineAnnealingRestartCyclicLR(_LRScheduler):
191 | """ Cosine annealing with restarts learning rate scheme.
192 | An example of config:
193 | periods = [10, 10, 10, 10]
194 | restart_weights = [1, 0.5, 0.5, 0.5]
195 | eta_min=1e-7
196 | It has four cycles, each has 10 iterations. At 10th, 20th, 30th, the
197 | scheduler will restart with the weights in restart_weights.
198 | Args:
199 | optimizer (torch.nn.optimizer): Torch optimizer.
200 | periods (list): Period for each cosine anneling cycle.
201 | restart_weights (list): Restart weights at each restart iteration.
202 | Default: [1].
203 | eta_min (float): The mimimum lr. Default: 0.
204 | last_epoch (int): Used in _LRScheduler. Default: -1.
205 | """
206 |
207 | def __init__(self,
208 | optimizer,
209 | periods,
210 | restart_weights=(1, ),
211 | eta_mins=(0, ),
212 | last_epoch=-1):
213 | self.periods = periods
214 | self.restart_weights = restart_weights
215 | self.eta_mins = eta_mins
216 | assert (len(self.periods) == len(self.restart_weights)
217 | ), 'periods and restart_weights should have the same length.'
218 | self.cumulative_period = [
219 | sum(self.periods[0:i + 1]) for i in range(0, len(self.periods))
220 | ]
221 | super(CosineAnnealingRestartCyclicLR, self).__init__(optimizer, last_epoch)
222 |
223 | def get_lr(self):
224 | idx = get_position_from_periods(self.last_epoch,
225 | self.cumulative_period)
226 | current_weight = self.restart_weights[idx]
227 | nearest_restart = 0 if idx == 0 else self.cumulative_period[idx - 1]
228 | current_period = self.periods[idx]
229 | eta_min = self.eta_mins[idx]
230 |
231 | return [
232 | eta_min + current_weight * 0.5 * (base_lr - eta_min) *
233 | (1 + math.cos(math.pi * (
234 | (self.last_epoch - nearest_restart) / current_period)))
235 | for base_lr in self.base_lrs
236 | ]
237 |
238 |
239 | class LinearWarmupCosineAnnealingLR(_LRScheduler):
240 | """Sets the learning rate of each parameter group to follow a linear warmup schedule between warmup_start_lr
241 | and base_lr followed by a cosine annealing schedule between base_lr and eta_min.
242 | .. warning::
243 | It is recommended to call :func:`.step()` for :class:`LinearWarmupCosineAnnealingLR`
244 | after each iteration as calling it after each epoch will keep the starting lr at
245 | warmup_start_lr for the first epoch which is 0 in most cases.
246 | .. warning::
247 | passing epoch to :func:`.step()` is being deprecated and comes with an EPOCH_DEPRECATION_WARNING.
248 | It calls the :func:`_get_closed_form_lr()` method for this scheduler instead of
249 | :func:`get_lr()`. Though this does not change the behavior of the scheduler, when passing
250 | epoch param to :func:`.step()`, the user should call the :func:`.step()` function before calling
251 | train and validation methods.
252 | Example:
253 | >>> layer = nn.Linear(10, 1)
254 | >>> optimizer = Adam(layer.parameters(), lr=0.02)
255 | >>> scheduler = LinearWarmupCosineAnnealingLR(optimizer, warmup_epochs=10, max_epochs=40)
256 | >>> #
257 | >>> # the default case
258 | >>> for epoch in range(40):
259 | ... # train(...)
260 | ... # validate(...)
261 | ... scheduler.step()
262 | >>> #
263 | >>> # passing epoch param case
264 | >>> for epoch in range(40):
265 | ... scheduler.step(epoch)
266 | ... # train(...)
267 | ... # validate(...)
268 | """
269 |
270 | def __init__(
271 | self,
272 | optimizer: Optimizer,
273 | warmup_epochs: int,
274 | max_epochs: int,
275 | warmup_start_lr: float = 0.0,
276 | eta_min: float = 0.0,
277 | last_epoch: int = -1,
278 | ) -> None:
279 | """
280 | Args:
281 | optimizer (Optimizer): Wrapped optimizer.
282 | warmup_epochs (int): Maximum number of iterations for linear warmup
283 | max_epochs (int): Maximum number of iterations
284 | warmup_start_lr (float): Learning rate to start the linear warmup. Default: 0.
285 | eta_min (float): Minimum learning rate. Default: 0.
286 | last_epoch (int): The index of last epoch. Default: -1.
287 | """
288 | self.warmup_epochs = warmup_epochs
289 | self.max_epochs = max_epochs
290 | self.warmup_start_lr = warmup_start_lr
291 | self.eta_min = eta_min
292 |
293 | super().__init__(optimizer, last_epoch)
294 |
295 | def get_lr(self) -> List[float]:
296 | """Compute learning rate using chainable form of the scheduler."""
297 | if not self._get_lr_called_within_step:
298 | warnings.warn(
299 | "To get the last learning rate computed by the scheduler, " "please use `get_last_lr()`.",
300 | UserWarning,
301 | )
302 |
303 | if self.last_epoch == 0:
304 | return [self.warmup_start_lr] * len(self.base_lrs)
305 | if self.last_epoch < self.warmup_epochs:
306 | return [
307 | group["lr"] + (base_lr - self.warmup_start_lr) / (self.warmup_epochs - 1)
308 | for base_lr, group in zip(self.base_lrs, self.optimizer.param_groups)
309 | ]
310 | if self.last_epoch == self.warmup_epochs:
311 | return self.base_lrs
312 | if (self.last_epoch - 1 - self.max_epochs) % (2 * (self.max_epochs - self.warmup_epochs)) == 0:
313 | return [
314 | group["lr"]
315 | + (base_lr - self.eta_min) * (1 - math.cos(math.pi / (self.max_epochs - self.warmup_epochs))) / 2
316 | for base_lr, group in zip(self.base_lrs, self.optimizer.param_groups)
317 | ]
318 |
319 | return [
320 | (1 + math.cos(math.pi * (self.last_epoch - self.warmup_epochs) / (self.max_epochs - self.warmup_epochs)))
321 | / (
322 | 1
323 | + math.cos(
324 | math.pi * (self.last_epoch - self.warmup_epochs - 1) / (self.max_epochs - self.warmup_epochs)
325 | )
326 | )
327 | * (group["lr"] - self.eta_min)
328 | + self.eta_min
329 | for group in self.optimizer.param_groups
330 | ]
331 |
332 | def _get_closed_form_lr(self) -> List[float]:
333 | """Called when epoch is passed as a param to the `step` function of the scheduler."""
334 | if self.last_epoch < self.warmup_epochs:
335 | return [
336 | self.warmup_start_lr + self.last_epoch * (base_lr - self.warmup_start_lr) / (self.warmup_epochs - 1)
337 | for base_lr in self.base_lrs
338 | ]
339 |
340 | return [
341 | self.eta_min
342 | + 0.5
343 | * (base_lr - self.eta_min)
344 | * (1 + math.cos(math.pi * (self.last_epoch - self.warmup_epochs) / (self.max_epochs - self.warmup_epochs)))
345 | for base_lr in self.base_lrs
346 | ]
347 |
348 |
349 | # warmup + decay as a function
350 | def linear_warmup_decay(warmup_steps, total_steps, cosine=True, linear=False):
351 | """Linear warmup for warmup_steps, optionally with cosine annealing or linear decay to 0 at total_steps."""
352 | assert not (linear and cosine)
353 |
354 | def fn(step):
355 | if step < warmup_steps:
356 | return float(step) / float(max(1, warmup_steps))
357 |
358 | if not (cosine or linear):
359 | # no decay
360 | return 1.0
361 |
362 | progress = float(step - warmup_steps) / float(max(1, total_steps - warmup_steps))
363 | if cosine:
364 | # cosine decay
365 | return 0.5 * (1.0 + math.cos(math.pi * progress))
366 |
367 | # linear decay
368 | return 1.0 - progress
369 |
370 | return fn
371 |
--------------------------------------------------------------------------------
/utils/val_utils.py:
--------------------------------------------------------------------------------
1 |
2 | import time
3 | import numpy as np
4 | from skimage.metrics import peak_signal_noise_ratio, structural_similarity
5 | from skvideo.measure import niqe
6 |
7 |
8 | class AverageMeter():
9 | """ Computes and stores the average and current value """
10 |
11 | def __init__(self):
12 | self.reset()
13 |
14 | def reset(self):
15 | """ Reset all statistics """
16 | self.val = 0
17 | self.avg = 0
18 | self.sum = 0
19 | self.count = 0
20 |
21 | def update(self, val, n=1):
22 | """ Update statistics """
23 | self.val = val
24 | self.sum += val * n
25 | self.count += n
26 | self.avg = self.sum / self.count
27 |
28 |
29 | def accuracy(output, target, topk=(1,)):
30 | """ Computes the precision@k for the specified values of k """
31 | maxk = max(topk)
32 | batch_size = target.size(0)
33 |
34 | _, pred = output.topk(maxk, 1, True, True)
35 | pred = pred.t()
36 | # one-hot case
37 | if target.ndimension() > 1:
38 | target = target.max(1)[1]
39 |
40 | correct = pred.eq(target.view(1, -1).expand_as(pred))
41 |
42 | res = []
43 | for k in topk:
44 | correct_k = correct[:k].view(-1).float().sum(0)
45 | res.append(correct_k.mul_(1.0 / batch_size))
46 |
47 | return res
48 |
49 |
50 | def compute_psnr_ssim(recoverd, clean):
51 | assert recoverd.shape == clean.shape
52 | recoverd = np.clip(recoverd.detach().cpu().numpy(), 0, 1)
53 | clean = np.clip(clean.detach().cpu().numpy(), 0, 1)
54 |
55 | recoverd = recoverd.transpose(0, 2, 3, 1)
56 | clean = clean.transpose(0, 2, 3, 1)
57 | psnr = 0
58 | ssim = 0
59 |
60 | for i in range(recoverd.shape[0]):
61 | psnr += peak_signal_noise_ratio(clean[i], recoverd[i], data_range=1)
62 | ssim += structural_similarity(clean[i], recoverd[i], data_range=1, multichannel=True)
63 |
64 | return psnr / recoverd.shape[0], ssim / recoverd.shape[0], recoverd.shape[0]
65 |
66 |
67 | def compute_niqe(image):
68 | image = np.clip(image.detach().cpu().numpy(), 0, 1)
69 | image = image.transpose(0, 2, 3, 1)
70 | niqe_val = niqe(image)
71 |
72 | return niqe_val.mean()
73 |
74 | class timer():
75 | def __init__(self):
76 | self.acc = 0
77 | self.tic()
78 |
79 | def tic(self):
80 | self.t0 = time.time()
81 |
82 | def toc(self):
83 | return time.time() - self.t0
84 |
85 | def hold(self):
86 | self.acc += self.toc()
87 |
88 | def release(self):
89 | ret = self.acc
90 | self.acc = 0
91 |
92 | return ret
93 |
94 | def reset(self):
95 | self.acc = 0
--------------------------------------------------------------------------------