├── .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 --------------------------------------------------------------------------------