├── .gitignore ├── LICENSE ├── README.md ├── assets ├── 10min.png ├── 2min.png ├── generalization-plot.png ├── relations.png ├── relative-scale.png ├── scale_demo.png ├── teaser.png └── world-space-measure.png ├── data ├── dataset_jsons │ └── megadepth │ │ ├── bigben.json │ │ ├── florence.json │ │ ├── notredame.json │ │ └── venice.json └── overlap_data │ └── megadepth │ ├── bigben │ ├── images_with_depth.txt │ ├── test.txt │ ├── train.txt │ └── val.txt │ ├── florence │ ├── images_with_depth.txt │ ├── test.txt │ ├── train.txt │ └── val.txt │ ├── notredame │ ├── images_with_depth.txt │ ├── test.txt │ ├── train.txt │ └── val.txt │ └── venice │ ├── images_with_depth.txt │ ├── test.txt │ ├── train.txt │ └── val.txt ├── environment.yml ├── generate_dataset.sh ├── relative_scale_example.ipynb ├── src ├── __init__.py ├── datasets │ ├── __init__.py │ ├── dataset_generator │ │ ├── __init__.py │ │ ├── compute_normals.py │ │ ├── compute_overlap.py │ │ ├── options.py │ │ └── utils.py │ └── megadepth_loader.py ├── model.py ├── options.py ├── test.py ├── train.py ├── trainer.py └── utils.py ├── test.sh └── train.sh /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .DS_Store 3 | __pycache__/ 4 | .mypy_cache 5 | *.egg-info 6 | 7 | # scripts for running experiments 8 | .idea/ 9 | 10 | # testing 11 | .coverage 12 | .coverage.* 13 | *,cover 14 | .pytest_cache 15 | 16 | # Python related 17 | # Byte-compiled / optimized / DLL files 18 | __pycache__/ 19 | *.py[cod] 20 | *$py.class 21 | 22 | # C extensions 23 | *.so 24 | 25 | # Distribution / packaging 26 | .gradle 27 | .Python 28 | build/ 29 | develop-eggs/ 30 | dist/ 31 | downloads/ 32 | eggs/ 33 | .eggs/ 34 | lib/ 35 | lib64/ 36 | parts/ 37 | sdist/ 38 | var/ 39 | wheels/ 40 | pip-wheel-metadata/ 41 | share/python-wheels/ 42 | *.egg-info/ 43 | .installed.cfg 44 | *.egg 45 | MANIFEST 46 | 47 | # PyInstaller 48 | # Usually these files are written by a python script from a template 49 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 50 | *.manifest 51 | *.spec 52 | 53 | # Installer logs 54 | pip-log.txt 55 | pip-delete-this-directory.txt 56 | 57 | # Unit test / coverage reports 58 | htmlcov/ 59 | .tox/ 60 | .nox/ 61 | .coverage 62 | .coverage.* 63 | .cache 64 | nosetests.xml 65 | coverage.xml 66 | *.cover 67 | .hypothesis/ 68 | .pytest_cache/ 69 | 70 | # Translations 71 | *.mo 72 | *.pot 73 | 74 | # Django stuff: 75 | *.log 76 | local_settings.py 77 | db.sqlite3 78 | db.sqlite3-journal 79 | 80 | # Flask stuff: 81 | instance/ 82 | .webassets-cache 83 | 84 | # Scrapy stuff: 85 | .scrapy 86 | 87 | # Sphinx documentation 88 | docs/_build/ 89 | 90 | # PyBuilder 91 | target/ 92 | 93 | # Jupyter Notebook 94 | .ipynb_checkpoints 95 | 96 | # IPython 97 | profile_default/ 98 | ipython_config.py 99 | 100 | # pyenv 101 | .python-version 102 | 103 | # pipenv 104 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 105 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 106 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 107 | # install all needed dependencies. 108 | #Pipfile.lock 109 | 110 | # celery beat schedule file 111 | celerybeat-schedule 112 | 113 | # SageMath parsed files 114 | *.sage.py 115 | 116 | # Environments 117 | .env 118 | .venv 119 | env/ 120 | venv/ 121 | ENV/ 122 | env.bak/ 123 | venv.bak/ 124 | 125 | # Spyder project settings 126 | .spyderproject 127 | .spyproject 128 | 129 | # Rope project settings 130 | .ropeproject 131 | 132 | # mkdocs documentation 133 | /site 134 | 135 | # mypy 136 | .mypy_cache/ 137 | .dmypy.json 138 | dmypy.json 139 | 140 | # Pyre type checker 141 | .pyre/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © Niantic, Inc. 2020. Patent Pending. 2 | 3 | All rights reserved. 4 | 5 | 6 | 7 | ================================================================================ 8 | 9 | 10 | 11 | This Software is licensed under the terms of the following Image-box-overlap license 12 | which allows for non-commercial use only. For any other use of the software not 13 | covered by the terms of this license, please contact partnerships@nianticlabs.com 14 | 15 | 16 | 17 | ================================================================================ 18 | 19 | 20 | 21 | Image-box-overlap License 22 | 23 | 24 | This Agreement is made by and between the Licensor and the Licensee as 25 | defined and identified below. 26 | 27 | 28 | 1. Definitions. 29 | 30 | In this Agreement (“the Agreement”) the following words shall have the 31 | following meanings: 32 | 33 | "Authors" shall mean A. Rau, G. Garcia-Hernando, D. Stoyanov, G. Brostow, D. Turmukhambetov 34 | "Licensee" Shall mean the person or organization agreeing to use the 35 | Software in accordance with these terms and conditions. 36 | "Licensor" shall mean Niantic Inc., a company organized and existing under 37 | the laws of Delaware, whose principal place of business is at 1 Ferry Building, 38 | Suite 200, San Francisco, 94111. 39 | "Software" shall mean the Image-box-overlap Software uploaded by Licensor to the 40 | GitHub repository at [URL] on [DATE] in source code or object code form and any 41 | accompanying documentation as well as any modifications or additions uploaded 42 | to the same GitHub repository by Licensor. 43 | 44 | 45 | 2. License. 46 | 47 | 2.1 The Licensor has all necessary rights to grant a license under: (i) 48 | copyright and rights in the nature of copyright subsisting in the Software; and 49 | (ii) certain patent rights resulting from a patent application filed by the 50 | Licensor in the United States in connection with the Software. The Licensor 51 | grants the Licensee for the duration of this Agreement, a free of charge, 52 | non-sublicenseable, non-exclusive, non-transferable copyright and patent 53 | license (in consequence of said patent application) to use the Software for 54 | non-commercial purpose only, including teaching and research at educational 55 | institutions and research at not-for-profit research institutions in accordance 56 | with the provisions of this Agreement. Non-commercial use expressly excludes 57 | any profit-making or commercial activities, including without limitation sale, 58 | license, manufacture or development of commercial products, use in 59 | commercially-sponsored research, use at a laboratory or other facility owned or 60 | controlled (whether in whole or in part) by a commercial entity, provision of 61 | consulting service, use for or on behalf of any commercial entity, and use in 62 | research where a commercial party obtains rights to research results or any 63 | other benefit. Any use of the Software for any purpose other than 64 | non-commercial research shall automatically terminate this License. 65 | 66 | 67 | 2.2 The Licensee is permitted to make modifications to the Software 68 | provided that any distribution of such modifications is in accordance with 69 | Clause 3. 70 | 71 | 2.3 Except as expressly permitted by this Agreement and save to the 72 | extent and in the circumstances expressly required to be permitted by law, the 73 | Licensee is not permitted to rent, lease, sell, offer to sell, or loan the 74 | Software or its associated documentation. 75 | 76 | 77 | 3. Redistribution and modifications 78 | 79 | 3.1 The Licensee may reproduce and distribute copies of the Software, with 80 | or without modifications, in source format only and only to this same GitHub 81 | repository , and provided that any and every distribution is accompanied by an 82 | unmodified copy of this License and that the following copyright notice is 83 | always displayed in an obvious manner: Copyright © Niantic, Inc. 2020. All 84 | rights reserved. 85 | 86 | 87 | 3.2 In the case where the Software has been modified, any distribution must 88 | include prominent notices indicating which files have been changed. 89 | 90 | 3.3 The Licensee shall cause any work that it distributes or publishes, 91 | that in whole or in part contains or is derived from the Software or any part 92 | thereof (“Work based on the Software”), to be licensed as a whole at no charge 93 | to all third parties entitled to a license to the Software under the terms of 94 | this License and on the same terms provided in this License. 95 | 96 | 97 | 4. Duration. 98 | 99 | This Agreement is effective until the Licensee terminates it by destroying 100 | the Software, any Work based on the Software, and its documentation together 101 | with all copies. It will also terminate automatically if the Licensee fails to 102 | abide by its terms. Upon automatic termination the Licensee agrees to destroy 103 | all copies of the Software, Work based on the Software, and its documentation. 104 | 105 | 106 | 5. Disclaimer of Warranties. 107 | 108 | The Software is provided as is. To the maximum extent permitted by law, 109 | Licensor provides no warranties or conditions of any kind, either express or 110 | implied, including without limitation, any warranties or condition of title, 111 | non-infringement or fitness for a particular purpose. 112 | 113 | 114 | 6. LIMITATION OF LIABILITY. 115 | 116 | IN NO EVENT SHALL THE LICENSOR AND/OR AUTHORS BE LIABLE FOR ANY DIRECT, 117 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING 118 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 119 | DATA OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 120 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 121 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 122 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 123 | 124 | 125 | 7. Indemnity. 126 | 127 | The Licensee shall indemnify the Licensor and/or Authors against all third 128 | party claims that may be asserted against or suffered by the Licensor and/or 129 | Authors and which relate to use of the Software by the Licensee. 130 | 131 | 132 | 8. Intellectual Property. 133 | 134 | 8.1 As between the Licensee and Licensor, copyright and all other 135 | intellectual property rights subsisting in or in connection with the Software 136 | and supporting information shall remain at all times the property of the 137 | Licensor. The Licensee shall acquire no rights in any such material except as 138 | expressly provided in this Agreement. 139 | 140 | 8.2 No permission is granted to use the trademarks or product names of the 141 | Licensor except as required for reasonable and customary use in describing the 142 | origin of the Software and for the purposes of abiding by the terms of Clause 143 | 3.1. 144 | 145 | 8.3 The Licensee shall promptly notify the Licensor of any improvement or 146 | new use of the Software (“Improvements”) in sufficient detail for Licensor to 147 | evaluate the Improvements. The Licensee hereby grants the Licensor and its 148 | affiliates a non-exclusive, fully paid-up, royalty-free, irrevocable and 149 | perpetual license to all Improvements for non-commercial academic research and 150 | teaching purposes upon creation of such improvements. 151 | 152 | 8.4 The Licensee grants an exclusive first option to the Licensor to be 153 | exercised by the Licensor within three (3) years of the date of notification of 154 | an Improvement under Clause 8.3 to use any the Improvement for commercial 155 | purposes on terms to be negotiated and agreed by Licensee and Licensor in good 156 | faith within a period of six (6) months from the date of exercise of the said 157 | option (including without limitation any royalty share in net income from such 158 | commercialization payable to the Licensee, as the case may be). 159 | 160 | 161 | 9. Acknowledgements. 162 | 163 | The Licensee shall acknowledge the Authors and use of the Software in the 164 | publication of any work that uses, or results that are achieved through, the 165 | use of the Software. The following citation shall be included in the 166 | acknowledgement: “Predicting Visual Overlap of Images Through Interpretable 167 | Non-Metric Box Embeddings, 168 | by A. Rau, G. Garcia-Hernando, D. Stoyanov, G. Brostow, D. Turmukhambetov, 169 | European Conference on Computer Vision 2020”. 170 | 171 | 172 | 10. Governing Law. 173 | 174 | This Agreement shall be governed by, construed and interpreted in 175 | accordance with English law and the parties submit to the exclusive 176 | jurisdiction of the English courts. 177 | 178 | 179 | 11. Termination. 180 | 181 | Upon termination of this Agreement, the licenses granted hereunder will 182 | terminate and Sections 5, 6, 7, 8, 9, 10 and 11 shall survive any termination 183 | of this Agreement. 184 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings](https://arxiv.org/abs/2008.05785) 2 | 3 | **[Anita Rau](https://anitarau.github.io), [Guillermo Garcia-Hernando](https://guiggh.github.io/), [Danail Stoyanov](https://scholar.google.co.uk/citations?user=pGfEK6UAAAAJ&hl=en), [Gabriel J. Brostow](http://www0.cs.ucl.ac.uk/staff/g.brostow/) and [Daniyar Turmukhambetov](http://dantkz.github.io/about) – ECCV 2020 (Spotlight presentation)** 4 | 5 | [Supplementary pdf](https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/Predicting_Visual_Overlap_Supplement.pdf) 6 | 7 |

8 | 9 | 2 minute ECCV presentation video link 10 | 11 |

12 | 13 | 14 |

15 | 16 | 10 minute ECCV presentation video link 17 | 18 |

19 | 20 |

21 | Our box representation versus traditional vector representation of images 22 |

23 | 24 | To what extent are two images picturing the same 3D surfaces? Even when this is a known scene, the answer typically 25 | requires an expensive search across scale space, with matching and geometric verification of large sets of 26 | local features. This expense is further multiplied when a query image is evaluated against 27 | a gallery, e.g. in visual relocalization. While we don’t obviate the need for geometric 28 | verification, we propose an interpretable image-embedding that cuts the search in scale space to essentially a lookup. 29 | 30 | Neural networks can be trained to predict a vector representations for images, such that the relative camera position between 31 | pairs of images is approximated by a distance in vector space. And there are a few versions of such relations, that 32 | unfortunately are not interpretable. 33 |

34 | Different ways of encoding positional relationship between pairs of images 35 |

36 | 37 | 38 | We propose to capture camera position relations through normalized surface overlap (NSO). 39 | NSO measure is not symmetric, but it is interpretable. 40 |

41 | Normalize surface overlap measure provides interpretable relationships between pairs of images 42 |

43 | 44 | We propose to represent images as boxes, not vectors. Two boxes can intersect, and boxes can have different volumes. 45 | The ratio of intersection over volume can be used to approximate normalized surface overlap. So, box representation 46 | allows us to model non-symmetric (non-metric) relations between pairs of images. The result is that with box embeddings 47 | we can quickly identify, for example, which test image is a close-up version of another. 48 | 49 | Next we plot the predicted NSO relationship between a test query image and a set of test images. We say "enclosure" for NSO of query pixels visible in the retrieved image, and concentration for NSO of retrieved image pixels visible in the query image. 50 |

51 | Our box embeddings can provide interpretable relationships between images from the test set 52 |

53 | In the figure above, we show a query image from the test set (lower left corner) and the concentration and enclosure between randomly sampled test images from the same scene. The query image shows Big Ben from the view of the Westminster Bridge. (i) It can be observed that close-ups on the tower clock are clustered around the coordinates (80, 15). (ii) The images in the upper right corner show the waterfront side of Westminster Palace. These are crop-outs of the query image. In fact, the tower in the lower left corner of the query is one of the two towers that mark the corners of the water-front side of the palace. The retrievals in the upper right quadrant of the cluster therefore extends the view of the query. (iii) The images in the lower right area of the cluster clearly show zoom outs, with the pointy bell tower visible in all images. (iv) Lastly, one can observe that the images in the clone-like category are in fact similar views on Big Ben. 54 | 55 | 56 | Finally, the predicted normalized surface overlap can be used to derive relative scale factor between a pair of images. 57 | 58 |

59 | Predicted normalized surfaces overlap can be used to compute relative scale between pairs of images 60 |

61 | Figure above illustrates several examples of how our method can estimate geometric relationships between images. For each pair the enclosure and concentration are calculated from which the relative estimated scaled can be derived. Based on that scale, the first image is resized and shown in the third position. The resized images match the scale of the scene in the first image to the scale in the second image. The two numbers below each image pair show the estimated enclosure and concentration. Note that although some scale estimates are inaccurate, overwhelmingly the rescaling does not increase the scale difference between the two images, but only reduces it. 62 | 63 | Subsequently, local features need only be detected at that scale. We validate our scene-specific 64 | model by showing how this embedding yields competitive image-matching results, while being simpler, faster, 65 | and also interpretable by humans. 66 | 67 | ## ⚙ Setup 68 | 69 | This codebase is a minimal implementation of the training data generation and the training function using [PyTorch Lightning](https://github.com/PyTorchLightning/pytorch-lightning). 70 | A minimal working [Anaconda](https://www.anaconda.com/products/individual) environment is provided with the codebase: [environment.yml](environment.yml). 71 | You can install and activate a new conda environment from this file with: 72 | 73 | ```bash 74 | conda env create -f environment.yml -n boxes 75 | conda activate boxes 76 | ``` 77 | 78 | ## 💾 MegaDepth data and splits 79 | 80 | To run the provided scripts the [MegaDepth](https://research.cs.cornell.edu/megadepth/) dataset needs to be downloaded. 81 | Once downloaded, update the fields `path_sfm` and `path_depth` with the correct paths of you machine in (each of) the dataset files on 82 | `data/dataset_jsons/megadepth/`. 83 | 84 | We provide training, validation and test splits for the image overlap prediction task on four scenes: Big Ben, Notre Dame 85 | Venice and Florence. You can find them on the folders 86 | `data/overlap_data/megadepth//`. Each file (`train.txt`, `val.txt` and `test.txt`) contains the filenames of 87 | pairs of images and their computed ground-truth overlap. 88 | 89 | If you wish to generate this date yourself, check the next section. 90 | 91 | ## 🌍 Generating normalized surface overlap datasets 92 | 93 | Code to generate normalized surface overlaps between pairs of MegaDepth images can be found in the Python package 94 | `src/datasets/dataset_generator`. The package has two main components i)`compute_normals.py` and ii)`compute_overlap.py`. 95 | 96 | i. `compute_normals.py` computes the surface normals using available depth images. The list of available for each scene 97 | depth images can be found in `data/overlap_data/megadepth//images_with_depth`. Don't forget to update the 98 | json paths as described above. 99 | ii. `compute_overlap.py` computes the normalized surface overlap between image pairs given the surface normals from 100 | the previous step. 101 | 102 | For convenience we provide an example bash script in `generate_dataset.sh`. NOTE: Normal data is stored uncompressed and 103 | it is about `50MB` per image in average, so storage size requirement can easily escalate. 104 | 105 | 106 | ## ⏳ Training 107 | 108 | To train a model run: 109 | ``` 110 | python -m src.train \ 111 | --name my_box_model \ 112 | --dataset_json data/dataset_jsons/megadepth/bigben.json \ 113 | --box_ndim 32 \ 114 | --batch_size 32 \ 115 | --model resnet50 \ 116 | --num_gpus 1 \ 117 | --backend dp 118 | ``` 119 | 120 | where `box_ndim` are the dimensions of the embedding space. `backend` is the PyTorch Lightning [distributed backend](https://pytorch-lightning.readthedocs.io/en/latest/multi_gpu.html#data-parallel) which is flexible (we have only tested this implementation on `dp` and `ddp`) and can be used with different `num_gpus`. 121 | We also provide a training bash script `train.sh`. By default tensorboard logs and models are saved on a folder with the same name as the experiment `/`. 122 | 123 | ## 📊 MegaDepth evaluation 124 | 125 | To evaluate model on surface overlap prediction and reproduce the results on the paper (Table 1) you can run: 126 | ``` 127 | python -m src.test \ 128 | --model_scene bigben \ 129 | --model resnet50 \ 130 | --dataset_json data/dataset_jsons/megadepth/bigben.json 131 | ``` 132 | 133 | or, alternatively, run the bash script provided `test.sh`. 134 | 135 | ## 🖼️ Estimating relative scale between two images estimation 136 | 137 | For an interactive example using our models to predict the relative scale of two images you can run the following [Jupyter 138 | Notebook](https://jupyter.org/) `relative_scale_example.ipynb`. 139 | 140 |

141 | Relative scale estimation demo 142 |

143 | 144 | ## 📦 Trained models on MegaDepth 145 | | Scene | Input size and model | filesize | Link | 146 | |-------------------|-------------|-----------------|-----------------------------------------------------------------------------------------------| 147 | | Big Ben | 256 x 456 ResNet50 | 95 MB | [Download 🔗](https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/bigben.zip) | 148 | | Notre Dame | 256 x 456 ResNet50 | 95 MB | [Download 🔗](https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/notredame.zip) | 149 | | Venice | 256 x 456 ResNet50 | 95 MB | [Download 🔗](https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/venice.zip) | 150 | | Florence | 256 x 456 ResNet50| 95 MB | [Download 🔗](https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/florence.zip) | 151 | 152 | ## ✏️ 📄 Citation 153 | 154 | If you find our work useful or interesting, please consider citing [our paper](https://arxiv.org/abs/2008.05785): 155 | 156 | ``` 157 | @inproceedings{rau-2020-image-box-overlap, 158 | title = {Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings}, 159 | author = {Anita Rau and 160 | Guillermo Garcia-Hernando and 161 | Danail Stoyanov and 162 | Gabriel J. Brostow and 163 | Daniyar Turmukhambetov 164 | }, 165 | booktitle = {European Conference on Computer Vision ({ECCV})}, 166 | year = {2020} 167 | } 168 | ``` 169 | 170 | 171 | # 👩‍⚖️ License 172 | Copyright © Niantic, Inc. 2020. Patent Pending. All rights reserved. Please see the license file for terms. 173 | -------------------------------------------------------------------------------- /assets/10min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/10min.png -------------------------------------------------------------------------------- /assets/2min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/2min.png -------------------------------------------------------------------------------- /assets/generalization-plot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/generalization-plot.png -------------------------------------------------------------------------------- /assets/relations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/relations.png -------------------------------------------------------------------------------- /assets/relative-scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/relative-scale.png -------------------------------------------------------------------------------- /assets/scale_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/scale_demo.png -------------------------------------------------------------------------------- /assets/teaser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/teaser.png -------------------------------------------------------------------------------- /assets/world-space-measure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/assets/world-space-measure.png -------------------------------------------------------------------------------- /data/dataset_jsons/megadepth/bigben.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "scene": "0003", 4 | "path_sfm": "/path_to/megadepth/MegaDepth_v1_SfM/", 5 | "train_file": "data/overlap_data/megadepth/bigben/train.txt", 6 | "val_file": "data/overlap_data/megadepth/bigben/val.txt", 7 | "test_file": "data/overlap_data/megadepth/bigben/test.txt", 8 | "path_depth": "/path_to/phoenix/S6/zl548/MegaDepth_v1/", 9 | "list_images_with_depth": "data/overlap_data/megadepth/bigben/images_with_depth.txt" 10 | 11 | } 12 | ] 13 | 14 | -------------------------------------------------------------------------------- /data/dataset_jsons/megadepth/florence.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "scene": "0032", 4 | "path_sfm": "/path_to/megadepth/MegaDepth_v1_SfM/", 5 | "train_file": "data/overlap_data/megadepth/florence/train.txt", 6 | "val_file": "data/overlap_data/megadepth/florence/val.txt", 7 | "test_file": "data/overlap_data/megadepth/florence/test.txt", 8 | "path_depth": "/path_to/phoenix/S6/zl548/MegaDepth_v1/", 9 | "list_images_with_depth": "data/overlap_data/megadepth/florence/images_with_depth.txt" 10 | } 11 | ] 12 | 13 | -------------------------------------------------------------------------------- /data/dataset_jsons/megadepth/notredame.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "scene": "0004", 4 | "path_sfm": "/path_to/megadepth/MegaDepth_v1_SfM/", 5 | "train_file": "data/overlap_data/megadepth/notredame/train.txt", 6 | "val_file": "data/overlap_data/megadepth/notredame/val.txt", 7 | "test_file": "data/overlap_data/megadepth/notredame/test.txt", 8 | "path_depth": "/path_to/phoenix/S6/zl548/MegaDepth_v1/", 9 | "list_images_with_depth": "data/overlap_data/megadepth/notredame/images_with_depth.txt" 10 | } 11 | ] -------------------------------------------------------------------------------- /data/dataset_jsons/megadepth/venice.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "scene": "0008", 4 | "path_sfm": "/path_to/megadepth/MegaDepth_v1_SfM/", 5 | "train_file": "data/overlap_data/megadepth/venice/train.txt", 6 | "val_file": "data/overlap_data/megadepth/venice/val.txt", 7 | "test_file": "data/overlap_data/megadepth/venice/test.txt", 8 | "path_depth": "/path_to/phoenix/S6/zl548/MegaDepth_v1/", 9 | "list_images_with_depth": "data/overlap_data/megadepth/venice/images_with_depth.txt" 10 | } 11 | ] 12 | 13 | -------------------------------------------------------------------------------- /data/overlap_data/megadepth/bigben/images_with_depth.txt: -------------------------------------------------------------------------------- 1 | 1805810131_87381d07e6_o.jpg 2 | 2757104048_2a4ebbaaec_o.jpg 3 | 3509564755_7d836dde49_o.jpg 4 | 2935401233_1ae873ff80_o.jpg 5 | 380406113_19240f6e1d_o.jpg 6 | 2250812407_6994fbdde9_o.jpg 7 | 3616186095_cb753aa4a3_o.jpg 8 | 888573377_238af8acaa_o.jpg 9 | 7485844346_ca907b5241_o.jpg 10 | 8040303438_09e4e5e9c6_b.jpg 11 | 3555114746_75ed9b6ab2_b.jpg 12 | 726349916_61820d7877_o.jpg 13 | 2973814723_f179ffeb70_o.jpg 14 | 3901599617_a1f2969107_o.jpg 15 | 8410317642_f4562807e0_b.jpg 16 | 3393410882_1cfb83d025_o.jpg 17 | 2231507737_638a7a3283_o.jpg 18 | 4117957438_7483aa34ac_b.jpg 19 | 4222388835_bef1748aec_b.jpg 20 | 3617004372_689699ef95_o.jpg 21 | 4928617500_02dcc53e3f_o.jpg 22 | 3519454849_fec2c67c47_o.jpg 23 | 5238209169_2074e86c02_b.jpg 24 | 3098090676_0f7c2147b6_o.jpg 25 | 2930246086_8905f88a1e_o.jpg 26 | 8710146438_a7459a98eb_o.jpg 27 | 3160116793_5092529402_b.jpg 28 | 183303903_b094ee1dc5_o.jpg 29 | 4753093514_ce9a341dea_o.jpg 30 | 3329279585_671c6b6235_o.jpg 31 | 491415178_5b18077fdf_o.jpg 32 | 5231754873_ce1d956c08_b.jpg 33 | 2648409429_99faa194ef_o.jpg 34 | 6594288079_94682f3ddc_o.jpg 35 | 2590591378_04d014ed84_o.jpg 36 | 4823768543_916496a609_o.jpg 37 | 2914692069_f6469bdec5_o.jpg 38 | 2771954658_cb9c161382_o.jpg 39 | 3187342867_434edefeb8_o.jpg 40 | 2912511063_ed2c1f5400_o.jpg 41 | 3520104362_f2a774bb39_o.jpg 42 | 335879962_a6bd95b82c_o.jpg 43 | 3595386229_61cfd291ab_o.jpg 44 | 2249093768_cc19d2ea57_o.jpg 45 | 481054906_67a8eda9d3_o.jpg 46 | 5432402323_2c9f082980_o.jpg 47 | 1391194253_07f9cd292d_o.jpg 48 | 2566660341_9b2cc4046a_o.jpg 49 | 2724567165_72d78fe4d8_o.jpg 50 | 1732704656_5145ddb5bb_o.jpg 51 | 1418032076_fc8b905e8c_o.jpg 52 | 3519289327_ef817e3e1f_o.jpg 53 | 2771931630_a61a41b60d_o.jpg 54 | 9360969137_7eced3cd6e_o.jpg 55 | 3408181791_69158771dd_o.jpg 56 | 820344471_15f5f9f9ef_o.jpg 57 | 497239291_4c27b0eb87_o.jpg 58 | 729269122_e061439889_o.jpg 59 | 124110454_2dbb0954be_o.jpg 60 | 3739978971_18c2284143_o.jpg 61 | 2961673731_9fa7f63839_o.jpg 62 | 501040894_1971b0205a_o.jpg 63 | 3420988293_636031a265_o.jpg 64 | 265561795_acf5045656_o.jpg 65 | 2895855917_bf189bac9c_b.jpg 66 | 3422484274_78a712deeb_o.jpg 67 | 2652369513_f93b44798e_o.jpg 68 | 3290693205_becbe8f23e_o.jpg 69 | 4707349967_9e7cd9cc2c_b.jpg 70 | 3274123079_c106cb890b_b.jpg 71 | 199687203_cdfb43b415_o.jpg 72 | 3724814980_13c7428348_o.jpg 73 | 6130530831_9fc39bbdb9_o.jpg 74 | 318465876_55b1f62d20_o.jpg 75 | 9620455512_fa29f0815f_b.jpg 76 | 2853247450_871da8ac40_o.jpg 77 | 4697771488_28f477b294_b.jpg 78 | 7395214960_b3f125a62e_b.jpg 79 | 3393362066_8882462a34_o.jpg 80 | 2871854307_ef1cd953a5_o.jpg 81 | 9805937335_d59a36e645_o.jpg 82 | 663874108_1d2f4efb81_o.jpg 83 | 2622313991_8ba4348bdf_o.jpg 84 | 203106699_1991d4cab4_o.jpg 85 | 4119096509_4e4925f57f_o.jpg 86 | 3816658533_1dc545c8f8_o.jpg 87 | 3862070783_25fca23592_o.jpg 88 | 2334299889_6484718190_o.jpg 89 | 3293141253_250a8f3b17_o.jpg 90 | 2534292307_8f823d0859_o.jpg 91 | 2930533388_88cca10785_o.jpg 92 | 2327258695_eda63cd2df_o.jpg 93 | 3151754318_e2f03b13c9_o.jpg 94 | 942765413_a4bb17713b_o.jpg 95 | 98249661_9f8fcd26b7_o.jpg 96 | 2980272673_af194692e8_o.jpg 97 | 3884549270_960b1b3b62_o.jpg 98 | 14008420280_ae1c94055e_b.jpg 99 | 398893144_93b17ff2ec_o.jpg 100 | 2407372453_bfb7dd47c0_o.jpg 101 | 3541801823_a916953c93_o.jpg 102 | 251938119_99a4c6c8e5_o.jpg 103 | 2124799536_546d4eea5d_o.jpg 104 | 358038558_f3f5985124_o.jpg 105 | 488979830_e27074c695_o.jpg 106 | 2343560366_077c3993bb_o.jpg 107 | 2772052968_139501f4a7_o.jpg 108 | 13886806822_c4f33c2059_o.jpg 109 | 3160079753_4cd604dd47_b.jpg 110 | 3547860155_97a18c0372_o.jpg 111 | 3661618129_e68e476150_o.jpg 112 | 3902716146_437f3bdd4f_o.jpg 113 | 1449063942_4446163e53_o.jpg 114 | 2453074293_f3026dd8b4_o.jpg 115 | 2664574120_10ce4dfb24_o.jpg 116 | 749009103_c7fd6006d6_o.jpg 117 | 99329624_35ea3a6f2e_o.jpg 118 | 1238986327_65ed204052_o.jpg 119 | 2983898508_b960c15bd3_o.jpg 120 | 9526706412_5d5fc6bebf_o.jpg 121 | 2335910679_9983fc4fbb_o.jpg 122 | 3575642924_f2781f1784_o.jpg 123 | 3520270430_325c83fac3_o.jpg 124 | 1148317618_740ce37a9b_o.jpg 125 | 2944763015_6953b64619_o.jpg 126 | 293820089_2077b3e2ea_o.jpg 127 | 2349040158_4be8ca4476_o.jpg 128 | 2711068661_5bcde0a502_o.jpg 129 | 1369535475_3223d02329_o.jpg 130 | 7126827289_caf8ef0af2_o.jpg 131 | 2914814641_fd017706a4_o.jpg 132 | 2792861676_509e9d056d_o.jpg 133 | 2456920983_6eddac869f_o.jpg 134 | 7994908554_a637334b71_b.jpg 135 | 2972448344_d4f9d4d09a_o.jpg 136 | 4864515410_9fc5016e4f_o.jpg 137 | 3713493228_7702c8838a_o.jpg 138 | 501982773_733f99eded_o.jpg 139 | 2800000025_828f1be782_o.jpg 140 | 3317060993_1ec0544b5c_o.jpg 141 | 137961111_0acb905b32_o.jpg 142 | 2090244584_5994faec11_o.jpg 143 | 4403691823_0bc8b7040e_o.jpg 144 | 2335329834_53905f0723_o.jpg 145 | 9092586698_e3b09db396_b.jpg 146 | 2617069622_5676b024d5_o.jpg 147 | 430337514_cfe990fa33_o.jpg 148 | 3713825720_871ec5920b_o.jpg 149 | 676036994_4a4891f8a5_o.jpg 150 | 5872476152_091c0a934c_b.jpg 151 | 2565360190_df362403f9_o.jpg 152 | 7718532082_2f46ee850f_b.jpg 153 | 2403211309_9208f7dcb7_o.jpg 154 | 2573213031_6cbd68ed10_o.jpg 155 | 6071355674_77069330b1_o.jpg 156 | 3784605426_e33d9b0091_b.jpg 157 | 3177482397_60682b7e3a_o.jpg 158 | 1156790882_c45864e49b_o.jpg 159 | 1239091413_cb153d3941_o.jpg 160 | 2930205946_64c697f250_o.jpg 161 | 1219111382_6bf501715d_o.jpg 162 | 395432105_f6e3cf6a9c_o.jpg 163 | 2258279233_41054d0247_o.jpg 164 | 2403038996_ec21c35db1_o.jpg 165 | 163944966_7a0087fca7_o.jpg 166 | 2962015194_5a35c379b7_o.jpg 167 | 2547125463_cea4dfb832_o.jpg 168 | 2955359631_8618d08315_o.jpg 169 | 287969535_977c3dac6a_o.jpg 170 | 937399419_6fc4fa3d59_o.jpg 171 | 8332526839_e408f7dc28_o.jpg 172 | 6797263857_a91fbe07ca_o.jpg 173 | 7810084326_18aa303b08_o.jpg 174 | 2317716690_fb64aacff2_o.jpg 175 | 460813812_7f0fc6a26c_o.jpg 176 | 115117027_73e8fd6191_o.jpg 177 | 2436824606_48e5c31800_o.jpg 178 | 2910714738_bc00548e75_o.jpg 179 | 562799371_083a8d6ac0_o.jpg 180 | 8720951907_95a0198e39_b.jpg 181 | 3646236942_73723fafa5_o.jpg 182 | 11559118_ce013ea0fd_o.jpg 183 | 458957723_d4f8d2cc83_o.jpg 184 | 6201902365_bbd9af6430_o.jpg 185 | 2425020805_0cbd591fb7_o.jpg 186 | 2089918720_0dc0a986a5_o.jpg 187 | 3520267640_4d4fb1f111_o.jpg 188 | 2457752368_b616344aee_o.jpg 189 | 7257368158_85bebc92de_b.jpg 190 | 5659514371_48b656cb85_b.jpg 191 | 1171580571_f477356c48_o.jpg 192 | 1130163385_ada6361979_o.jpg 193 | 2972480246_b33fe32f05_o.jpg 194 | 3770029302_f1896826d9_o.jpg 195 | 2782072250_c0369180df_o.jpg 196 | 510798611_dcbf99e0da_o.jpg 197 | 2785021192_ff7af31a2c_o.jpg 198 | 566023996_d4af65b207_o.jpg 199 | 3472776057_d75ef8f4ed_o.jpg 200 | 265656950_207bd957df_o.jpg 201 | 3520106816_7ee078e0aa_o.jpg 202 | 2318339526_97b0dbd9e7_o.jpg 203 | 2425017441_1b51237493_o.jpg 204 | 2470657918_5e7b77db60_o.jpg 205 | 2281566477_faeb30210a_o.jpg 206 | 3643049523_f3f763de88_o.jpg 207 | 3641916329_c3dec64ecc_b.jpg 208 | 2952564106_05d9f3159d_o.jpg 209 | 2698285096_285815f2c9_o.jpg 210 | 543358763_6f72f142f9_o.jpg 211 | 2591566957_f531c5ac8b_o.jpg 212 | 1108687842_c8a9da505b_o.jpg 213 | 2141482140_4a4a808262_o.jpg 214 | 2124010211_297c8399ff_o.jpg 215 | 3062647787_1cc5910e52_o.jpg 216 | 2860814420_945f195061_o.jpg 217 | 2234757173_f538db6068_o.jpg 218 | 2661233704_d91a1e0dd8_o.jpg 219 | 539553372_d213d493cb_o.jpg 220 | 3547411492_eb1244c261_o.jpg 221 | 864674844_8b85e3f7ae_o.jpg 222 | 2334305241_f8e4a8caee_o.jpg 223 | 1294276806_9a5e58d78d_o.jpg 224 | 233809129_fe5784bb61_o.jpg 225 | 2929637563_735147bd64_o.jpg 226 | 5338374007_d4a0b56b21_o.jpg 227 | 3520100616_245a73c90d_o.jpg 228 | 2318339762_37ca64c312_o.jpg 229 | 2094514534_63cce9c4d6_o.jpg 230 | 2206749345_99e4096417_o.jpg 231 | 2764399629_39710db437_o.jpg 232 | 3322263825_22e4f9999e_o.jpg 233 | 3530984815_b3f911df86_o.jpg 234 | 2696367159_7fc73904a5_o.jpg 235 | 2660688552_7362207713_o.jpg 236 | 6549049601_3aa7a011bc_b.jpg 237 | 2115341340_445c2bda8a_o.jpg 238 | 2453076047_6fc6537694_o.jpg 239 | 166496234_b47774b394_o.jpg 240 | 380762342_18b994a388_o.jpg 241 | 305648605_97b72f2739_o.jpg 242 | 2562160141_98f24b85fc_o.jpg 243 | 2906588215_c3fa916006_o.jpg 244 | 2570387396_a3aa4b606b_o.jpg 245 | 2296016817_0dc5a15514_o.jpg 246 | 217841438_a1ad4b89b9_o.jpg 247 | 3899570221_6f9fb08bfd_o.jpg 248 | 2845045808_6ebcf3bdeb_o.jpg 249 | 2782063536_b26dae74e8_o.jpg 250 | 270634913_b9d357cfbc_o.jpg 251 | 329120601_85057b4baa_o.jpg 252 | 2595113149_6703cbe9bd_o.jpg 253 | 2851163987_14903f78fb_o.jpg 254 | 520123595_1cbad0dda8_o.jpg 255 | 3818705175_33f770e4d5_o.jpg 256 | 2444004370_775a5fc004_o.jpg 257 | 2639737968_6bc8c9285d_o.jpg 258 | 6179412161_77e2a5ba64_o.jpg 259 | 3090652644_a87af4d16e_o.jpg 260 | 8471355684_69c0d9c56b_o.jpg 261 | 262210602_f744fbe5d9_o.jpg 262 | 1091133219_d6e4ed6cf8_o.jpg 263 | 3672382439_b3461df9b3_o.jpg 264 | 3540426430_c8498565d6_o.jpg 265 | 8438984457_f00b3c0584_b.jpg 266 | 3295226500_7e860650b8_o.jpg 267 | 2553025117_0ce6c2b81d_o.jpg 268 | 2334304279_9eedd7a5f3_o.jpg 269 | 5660482819_c5e5d5cf4c_b.jpg 270 | 9363198_8e6c681bf7_o.jpg 271 | 3774685268_32d5f1e904_o.jpg 272 | 10119621745_461e8d60c1_o.jpg 273 | 2725391658_6df725264e_o.jpg 274 | 2453894946_181aa66f7f_o.jpg 275 | 500112935_8576b7ab13_o.jpg 276 | 2574037806_6e0424fac7_o.jpg 277 | 380624324_8eebe812e4_o.jpg 278 | 189216540_1ea2459a9b_o.jpg 279 | 5122780725_6cfedfb75c_o.jpg 280 | 2238704459_6ab3e243c4_o.jpg 281 | 3033242284_335ff520ee_o.jpg 282 | 6793914631_ef77d4e6ca_o.jpg 283 | 6087750322_3f22d7a3cf_o.jpg 284 | 1913527070_1b736b5513_o.jpg 285 | 342472055_f2404f1ee2_o.jpg 286 | 262219471_4a5067d222_o.jpg 287 | 6045760585_1f046b95ce_o.jpg 288 | 2488651060_0bf9c74cf9_o.jpg 289 | 2925208666_e8fd2b8fc1_o.jpg 290 | 6672994021_e10415affa_o.jpg 291 | 262211018_6da7800500_o.jpg 292 | 3642676932_32cb6571f9_o.jpg 293 | 764749854_12624fa9cf_o.jpg 294 | 2615911063_f64f8c12f3_o.jpg 295 | 110948027_eb5a60868d_o.jpg 296 | 823916278_7dce6307be_o.jpg 297 | 2647268451_8bfab96d86_o.jpg 298 | 262175332_1bb4721fef_o.jpg 299 | 6640373011_8cc206eea6_o.jpg 300 | 3488929550_f2419340cd_o.jpg 301 | 290727674_0db140eaf2_o.jpg 302 | 3270805968_a521a048ea_o.jpg 303 | 3309932731_5680ec1ed6_o.jpg 304 | 3947913465_64498a7183_b.jpg 305 | 3160733449_43af8f0059_o.jpg 306 | 885156442_036deb81aa_o.jpg 307 | 314394054_04c9c185de_o.jpg 308 | 4576512216_25d4788f35_o.jpg 309 | 2408206520_0daa210562_o.jpg 310 | 286295551_f7a70d59de_o.jpg 311 | 748629103_9a1998f7ba_o.jpg 312 | 4841962478_ea822db67b_o.jpg 313 | 155058821_f48ee7bc3b_o.jpg 314 | 3585146294_1351525c92_o.jpg 315 | 266181507_689424ca7d_o.jpg 316 | 672965747_104d951cde_o.jpg 317 | 3636194613_3080fc968c_b.jpg 318 | 3445887870_1b7bd49f6f_b.jpg 319 | 436221336_e01449455b_o.jpg 320 | 458996344_4c9b03183a_o.jpg 321 | 1137794977_b3a60a34f2_o.jpg 322 | 2824638196_5410f96599_o.jpg 323 | 539101235_589b021ca2_o.jpg 324 | 1485164102_1d3c7ed1c8_o.jpg 325 | 1805280279_2346566897_o.jpg 326 | 2061694098_a1b1b91075_o.jpg 327 | 2155207460_11fdd44e59_o.jpg 328 | 3645431067_00894c4661_o.jpg 329 | 2251753535_d53de76b9f_o.jpg 330 | 3559450113_23eff86d6e_o.jpg 331 | 5731890562_276945dc17_o.jpg 332 | 10577446343_fe19afe39a_o.jpg 333 | 1371897874_69f0b72dab_o.jpg 334 | 2268669736_7b8d2722a5_o.jpg 335 | 2858784493_96fbeacac4_o.jpg 336 | 2796777525_c68cbbc169_o.jpg 337 | 1267352218_08b28563a4_o.jpg 338 | 3620912019_249f996b2b_o.jpg 339 | 3151528550_f89f66e317_o.jpg 340 | 253131023_a6828cf1a8_o.jpg 341 | 696670891_3747d6f7f0_o.jpg 342 | 4908879492_0c4ed7ec13_b.jpg 343 | 1805279695_43cb287bac_o.jpg 344 | 3262138870_a47b5b3b21_o.jpg 345 | 2364303649_43694d9c13_o.jpg 346 | 3713493228_8a76b48e4c_b.jpg 347 | 324698989_b2349a28f6_o.jpg 348 | 6153793284_17109666d0_b.jpg 349 | 6481485335_44f471a5fc_b.jpg 350 | 3930376340_51830cbe59_o.jpg 351 | 1091994536_0d4aee66c5_o.jpg 352 | 2714281207_daa215091a_o.jpg 353 | 3616180999_69201201a8_o.jpg 354 | 3584338885_e8c9b1f5b3_o.jpg 355 | 3676197204_fcd435b81a_o.jpg 356 | 3266786619_86179f691a_o.jpg 357 | 2110197954_614b7d5995_o.jpg 358 | 888549399_1337aa9984_o.jpg 359 | 697293156_620711f4c7_o.jpg 360 | 200595447_d19e6f9382_o.jpg 361 | 3422479708_d0f9c767db_o.jpg 362 | 3715575072_8e41e65b5d_o.jpg 363 | 1007456594_e3ae317e98_o.jpg 364 | 208404905_a5c9fabe52_o.jpg 365 | 3296652465_0e29935627_o.jpg 366 | 2906588495_d702c01a56_o.jpg 367 | 284380746_553ef8db30_o.jpg 368 | 4987468589_10404a12b9_o.jpg 369 | 6030172754_2d6a15caa5_b.jpg 370 | 5209930100_246e0aee0b_o.jpg 371 | 3422481276_8aa529d768_o.jpg 372 | 1727593087_db50967439_o.jpg 373 | 168659760_72d4e93f59_o.jpg 374 | 163944964_743bfff0c8_o.jpg 375 | 7227067748_ff458d4b4a_o.jpg 376 | 3269980239_a43371fef9_o.jpg 377 | 2062982391_623f89c39c_o.jpg 378 | 3838538896_51d5d5bb60_o.jpg 379 | 3254230888_309ce5b45c_o.jpg 380 | 501080923_32bd36d470_o.jpg 381 | 2800237924_3e2741d3eb_o.jpg 382 | 373616343_ecc8a34f2a_o.jpg 383 | 8742079048_a86c072b92_o.jpg 384 | 3708577492_b256bb849d_o.jpg 385 | 395805158_4d4e3ffbe5_o.jpg 386 | 3315091036_9175245848_b.jpg 387 | 226041194_1f6430f495_o.jpg 388 | 50458173_b9e3907cfc_o.jpg 389 | 144526966_eabba50265_o.jpg 390 | 2985410841_06197148be_o.jpg 391 | 3786727576_b8aa0cb9ab_o.jpg 392 | 3151559192_345675c23d_o.jpg 393 | 3774685272_cea84fff38_o.jpg 394 | 4783138959_89e490bb25_o.jpg 395 | 2112055926_337982b6b9_o.jpg 396 | 2642049947_76cf0634c6_o.jpg 397 | 6927997546_a6e0de7309_b.jpg 398 | 3182647438_63d060fab3_o.jpg 399 | 1332347669_14932b594d_o.jpg 400 | 3894607961_c0eb3d6299_o.jpg 401 | 124110247_ed99122de1_o.jpg 402 | 2802439173_65779ffa55_o.jpg 403 | 16718991296_a05298d202_o.jpg 404 | 3920226401_cb1780a31c_o.jpg 405 | 2040441554_05a4fc3e4a_o.jpg 406 | 399049455_574a55657b_o.jpg 407 | 1053809974_ff7410d0c6_o.jpg 408 | 2483819598_12b8389f25_o.jpg 409 | 427597827_bc4cca6c15_o.jpg 410 | 6723057027_bf54096f88_b.jpg 411 | 3456647252_c75a4f2e56_o.jpg 412 | 214043998_51b4996fcf_o.jpg 413 | 8079233694_61ed014cf2_o.jpg 414 | 6862816907_7b605a064f_o.jpg 415 | 543256944_c97bacbdc0_o.jpg 416 | 2335173374_df8ca6893a_o.jpg 417 | 2548498648_ab412a1bcc_o.jpg 418 | 3093933030_1256cdeb15_o.jpg 419 | 3705698730_cdc240dc31_o.jpg 420 | 938228098_ed15c94e4d_o.jpg 421 | 3524799049_ee0436aee9_o.jpg 422 | 2359367128_f0cb5139c4_o.jpg 423 | 3998809723_43857fdc2d_o.jpg 424 | 3884553628_72055b781d_o.jpg 425 | 2331469103_ef19ae1a14_o.jpg 426 | 1083209821_d27eaff23d_o.jpg 427 | 1088044306_01eaace07b_o.jpg 428 | 272158252_b5be46b80c_o.jpg 429 | 93140331_1dbbd7dffc_o.jpg 430 | 2247952479_f1f3797cc5_o.jpg 431 | 3274635084_84f0c6888e_o.jpg 432 | 1622749707_9091411254_o.jpg 433 | 9643188705_4772c93592_o.jpg 434 | 3200372150_5f6c640a77_o.jpg 435 | 4515427057_ec0bce99a5_o.jpg 436 | 1271779605_717b3fd556_o.jpg 437 | 481065647_6e620c03bc_o.jpg 438 | 2247650510_35b1e34125_o.jpg 439 | 3089196859_02be410537_o.jpg 440 | 3701915715_090dbc771c_o.jpg 441 | 764747966_235b74b267_o.jpg 442 | 714385282_27817a65ce_o.jpg 443 | 288962480_9d53929038_o.jpg 444 | 5659513245_033b003e59_b.jpg 445 | 2559973454_b34c5b4883_o.jpg 446 | 2210942472_981bbb8b34_o.jpg 447 | 3433679591_022468f1f1_o.jpg 448 | 4162635444_f38acd5516_o.jpg 449 | 2930226842_69c02a4ec1_o.jpg 450 | 3421677467_519ec00098_o.jpg 451 | 2439144226_e72757acce_o.jpg 452 | 2598244171_db3198baf2_b.jpg 453 | 21025511_09f63b2360_o.jpg 454 | 2592389593_7573b00959_o.jpg 455 | 14417880013_1855ba5b55_b.jpg 456 | 1239092771_afcac42d68_o.jpg 457 | 8245373477_b53612344e_o.jpg 458 | 9584571764_69c3cdf128_o.jpg 459 | 1183596546_c2198e48e6_o.jpg 460 | 5660085048_265bbcf053_b.jpg 461 | 166496796_bf004ef8be_o.jpg 462 | 3263301_3751c056ac_o.jpg 463 | 50458283_60d519016a_o.jpg 464 | 6038484973_0c574dda6f_o.jpg 465 | 616521589_6a9ef8397e_o.jpg 466 | 3497115139_ba019eb261_o.jpg 467 | 2625078696_ddbddc5739_b.jpg 468 | 3621142454_0189e891b1_o.jpg 469 | 2784970354_804678f978_b.jpg 470 | 2504002130_49e256baf1_o.jpg 471 | 3987981500_824438223c_o.jpg 472 | 3022661618_11eb2f58f9_b.jpg 473 | 436221558_0309d121c7_o.jpg 474 | 3151544360_37b879c77c_o.jpg 475 | 1091133341_e48b087690_o.jpg 476 | 476944765_c73b6bc56f_o.jpg 477 | 2436824600_b089e24476_o.jpg 478 | 2724567981_6aa40fe37b_o.jpg 479 | 449506533_46a5e194a0_o.jpg 480 | 2496960316_c03f8133e9_o.jpg 481 | 8566097889_0abf3a9f2d_o.jpg 482 | 2265363055_87dde1af33_o.jpg 483 | 299403720_ee53fc24e1_o.jpg 484 | 2718171866_41099eae4e_o.jpg 485 | 2648408261_ccbf4552a3_o.jpg 486 | 9611984042_c864ed334c_o.jpg 487 | 8645830699_f513a3cb0d_o.jpg 488 | 2979119134_97d9513e48_b.jpg 489 | 305845756_eeceb24944_o.jpg 490 | 4100560052_7a8077d0f9_o.jpg 491 | 2649232892_a858d7d35a_o.jpg 492 | 562526764_53514c645d_o.jpg 493 | 3501001990_2f16953c35_o.jpg 494 | 6336965560_02cd6ace37_o.jpg 495 | 324698502_a210066211_o.jpg 496 | 3715542262_9d30cbcfcb_o.jpg 497 | 5823946869_f2d738855f_o.jpg 498 | 5691833446_9cf6c0a1b4_b.jpg 499 | 244765090_d5f75b5d84_o.jpg 500 | 3452053675_f059362e72_o.jpg 501 | 87707324_6dd09ff85c_o.jpg 502 | 2055534582_4506a5a42e_o.jpg 503 | 8217368739_03bfa23d35_b.jpg 504 | 1369535459_eb335ff374_o.jpg 505 | 7269062910_d9b282a741_o.jpg 506 | 285004192_743d1ada54_o.jpg 507 | 3623242255_8c6497cf80_o.jpg 508 | 2821028059_5f632b5cdd_o.jpg 509 | 8515066235_1eddb7a489_o.jpg 510 | 1412233152_54a7d4aa9c_o.jpg 511 | 2379412802_2a3129a18e_b.jpg 512 | 3230538556_a76c338a0b_o.jpg 513 | 4158982890_a32490d491_o.jpg 514 | 2286430462_c5a8509cc4_o.jpg 515 | 4403694303_6419fa419c_o.jpg 516 | 2502338766_6bf629fc7f_o.jpg 517 | 3177248557_d128c177c0_o.jpg 518 | 5897075281_98946753d3_b.jpg 519 | 3716536546_e854e44023_o.jpg 520 | 5107744648_564ffb5190_o.jpg 521 | 1806130724_ddd55f5cd7_o.jpg 522 | 2718171474_1a512636d9_o.jpg 523 | 1690980302_a084f925de_o.jpg 524 | 2470689686_dd2623922b_o.jpg 525 | 2041623454_0443416883_o.jpg 526 | 3953156400_214842dd34_o.jpg 527 | 1130851317_ad234e2cf2_o.jpg 528 | 481078863_d6e26c898d_o.jpg 529 | 2111275719_3211f0ff54_o.jpg 530 | 64430321_c0b3649585_o.jpg 531 | 3067175036_50e8c89129_o.jpg 532 | 2600996980_d5c78b2628_o.jpg 533 | 2934481626_c842045de7_o.jpg 534 | 3036233600_702a2d9fd7_o.jpg 535 | 3204621763_8a463c61e5_o.jpg 536 | 1053805464_4132970753_o.jpg 537 | 2936261040_f51f30bee7_o.jpg 538 | 3616180897_6395f65437_o.jpg 539 | 145009029_66fefd48e7_o.jpg 540 | 305648052_91903d7e59_o.jpg 541 | 508530434_426abec22d_o.jpg 542 | 3393415470_5262f5bb15_o.jpg 543 | 1414966504_300bcc1748_o.jpg 544 | 3293612955_41a0d0bee7_o.jpg 545 | 286294087_f0fabe5233_o.jpg 546 | 4022797530_e765eafaf9_b.jpg 547 | 2172524897_fb72c30b3a_o.jpg 548 | 863212275_90e8f13f1b_o.jpg 549 | 2710273433_2ba6ecfaf2_o.jpg 550 | 3675380327_d8309037ae_o.jpg 551 | 3519288957_fc67672782_o.jpg 552 | 853878626_47e473eeda_o.jpg 553 | 2769404510_d7e9f59579_o.jpg 554 | 8246440842_ae73766330_o.jpg 555 | 229190655_a8b8ed3caa_o.jpg 556 | 3133170276_3a22a52cd3_o.jpg 557 | 2184167574_35a99603a6_o.jpg 558 | 103220455_8420b92579_o.jpg 559 | 1354164267_f1619984a4_o.jpg 560 | 3270803174_9447ab26fd_o.jpg 561 | 7794096830_da6c6fbf3b_o.jpg 562 | 380626113_0bcfc8c148_o.jpg 563 | 2231614722_3d4ce912ef_o.jpg 564 | 3540429170_55b50807db_o.jpg 565 | 2762084654_493b225979_o.jpg 566 | 2308394084_8fcf73766b_o.jpg 567 | 3340937180_36ae5ee1ee_o.jpg 568 | 3520105528_3806db7ea6_o.jpg 569 | 160052916_17d51b0f3a_o.jpg 570 | 2667261133_6211ef74d0_o.jpg 571 | 4460451363_91c7c3308d_o.jpg 572 | 2297603338_85bc58ebf4_o.jpg 573 | 4142758175_5f86cee32b_o.jpg 574 | 170785028_e3f02220ed_o.jpg 575 | 8105099932_afab80fe8c_o.jpg 576 | 2378561492_a1cd5eea4c_o.jpg 577 | 2676011853_fce8fd6f52_o.jpg 578 | 9977866736_1bc4b40ce2_o.jpg 579 | 33457130566_967fa147ff_o.jpg 580 | 3739416241_74bbe917a8_o.jpg 581 | 3447189790_43a2d1af1e_b.jpg 582 | 2377932280_4a776e95fe_o.jpg 583 | 270633915_c8214473b6_o.jpg 584 | 195858942_bce21b38c5_o.jpg 585 | 2970093182_64f4e20b27_o.jpg 586 | 339921732_c9239ce43e_o.jpg 587 | 1357103850_f03ed4ee1d_o.jpg 588 | 6220537065_e9380ae76e_o.jpg 589 | 2463774936_840324ce20_o.jpg 590 | 290727580_4774659673_o.jpg 591 | 2259227930_fddb159b31_o.jpg 592 | 374112090_d07a3ea519_o.jpg 593 | 3533729498_fe3fc36dee_o.jpg 594 | 5421885462_7a4a003dc5_o.jpg 595 | 2040441552_b15b0fe6c6_o.jpg 596 | 498894507_efeca5e23a_o.jpg 597 | 3177487495_457c5d30d6_o.jpg 598 | 4555943560_c79876a6d4_o.jpg 599 | 6973072858_22116dd80e_o.jpg 600 | 3133932878_2260aa1854_o.jpg 601 | 1731850585_abe7bbda8b_o.jpg 602 | 235928468_f10dd96565_o.jpg 603 | 2061696014_8b4c187fa9_o.jpg 604 | 2648400641_718bdd5b6a_o.jpg 605 | 1342710311_e1c4f20fd9_o.jpg 606 | 3056967629_2da6e0ce7c_o.jpg 607 | 2494849256_e6eb91c621_o.jpg 608 | 3177480525_6f0df1ccce_o.jpg 609 | 3739394657_f17340ca87_o.jpg 610 | 269638922_e0c407f1d2_o.jpg 611 | 481068990_0fcc96155d_o.jpg 612 | 8684164356_27d4808aa2_o.jpg 613 | 13655312135_52b0146549_b.jpg 614 | 696428033_a9d780223e_o.jpg 615 | 4137536721_ae43b6eb37_o.jpg 616 | 342472181_cb53335484_o.jpg 617 | 2232882848_603e618eb4_o.jpg 618 | 481068552_6141420a6f_o.jpg 619 | 1414964796_582b2aafac_o.jpg 620 | 2535094714_02409fe05e_o.jpg 621 | 3535594305_b487a34052_o.jpg 622 | 3392547127_490f9f2078_o.jpg 623 | 5876331969_1d53115808_o.jpg 624 | 3952378587_cd579146ff_o.jpg 625 | 888576063_2b6154f479_o.jpg 626 | 3269980965_8e64cf1d30_o.jpg 627 | 9694173102_0dbc858e57_o.jpg 628 | 2511652944_749e048a81_o.jpg 629 | 864880924_c84e515444_o.jpg 630 | 4224098854_5b06bb1e8a_o.jpg 631 | 1574535705_ba53aefbe4_o.jpg 632 | 2409483359_cb6c70e311_o.jpg 633 | 6588853667_33ab810348_o.jpg 634 | 275083396_c96d613d14_o.jpg 635 | 115211021_93b6e190ba_o.jpg 636 | 2756415799_264ea16dde_o.jpg 637 | 3468633231_1108b7be06_o.jpg 638 | 8246068494_c68fdf3503_b.jpg 639 | 3214671756_7153eb7194_o.jpg 640 | 3032958182_33452c5d87_o.jpg 641 | 2972474534_a9aed32f8c_o.jpg 642 | 2255969030_7368e43a45_o.jpg 643 | 3955474975_e9a8da622c_o.jpg 644 | 8503356143_d9cd753303_o.jpg 645 | 2425827528_80b554f00b_o.jpg 646 | 392792603_87ba32bb99_o.jpg 647 | 3619351211_29229fdea2_b.jpg 648 | 2508912517_675479f31d_o.jpg 649 | 2929657727_a65cfcdc9d_o.jpg 650 | 1472678183_2ae4fe9209_o.jpg 651 | 6742549605_b49af185f7_o.jpg 652 | 2318339816_a685dccd05_o.jpg 653 | 2535080932_41802ba289_o.jpg 654 | 269629779_8726c0954e_o.jpg 655 | 2989056513_c3196154fd_o.jpg 656 | 4041573566_7bd18d8ced_o.jpg 657 | 9646418118_2658a23cb4_o.jpg 658 | 501080937_fa9ea28ed0_o.jpg 659 | 1224896617_603cb7177d_o.jpg 660 | 2115341050_bac5cf6362_o.jpg 661 | 6006102183_6e3ac8b1e2_o.jpg 662 | 190568502_899aa5de7a_o.jpg 663 | 6672234897_e5e266a5bf_b.jpg 664 | 3201407494_1d0f256bfc_o.jpg 665 | 3403415625_1e024d701f_o.jpg 666 | 2851996922_fd3b68b461_o.jpg 667 | 8037541559_90eea2e69f_o.jpg 668 | 2512786117_eb658ea996_o.jpg 669 | 2630673146_009e86ce05_o.jpg 670 | 2341413858_8fe810baea_o.jpg 671 | 2474209900_1a5860a81d_o.jpg 672 | 313530430_4824b3ad97_o.jpg 673 | 1239952626_6f2d623c00_o.jpg 674 | 506475881_ae29b90cc5_o.jpg 675 | 2204923979_11cbaf7f20_o.jpg 676 | 3118108926_2b7fef09f2_o.jpg 677 | 559275049_8d7df87850_o.jpg 678 | 505110175_5ece7d9131_o.jpg 679 | 103564148_b44a2d5c16_o.jpg 680 | 3519285901_6ebc54ac86_o.jpg 681 | 620191680_38618eaf17_o.jpg 682 | 3667903408_6aa66fdb04_o.jpg 683 | 2038464749_12020c51d6_o.jpg 684 | 889394902_5865631653_o.jpg 685 | 3234410114_3d87e533c5_o.jpg 686 | 2743649007_e5f45cb8c2_b.jpg 687 | 2547125463_be06807588_b.jpg 688 | 2111277651_b9a570f738_o.jpg 689 | 11310297184_8dbb3bc1e5_b.jpg 690 | 49040372_398a9fec42_o.jpg 691 | 3708764452_2411d249e5_o.jpg 692 | 3397943606_7ca6b3c592_o.jpg 693 | 8517929959_3bbf1b7ee5_b.jpg 694 | 3955488745_efc62f14c5_o.jpg 695 | 501080973_aac2820fcd_o.jpg 696 | 3520271638_df1538ebf1_o.jpg 697 | 514858022_0581aa02d4_o.jpg 698 | 501040728_0216036e6b_o.jpg 699 | 4738223206_95fe8c8b49_o.jpg 700 | 3408991976_9110df0193_o.jpg 701 | 3739398765_4ab018bd31_o.jpg 702 | 1545544909_7a6a0fa303_o.jpg 703 | 3468839852_333f861791_o.jpg 704 | 530634431_777c2b5d95_o.jpg 705 | 3724907176_97e07dc858_o.jpg 706 | 2821934635_696d352e7d_o.jpg 707 | 3566681943_e2c6c0055d_o.jpg 708 | 2484579004_26627569da_o.jpg 709 | 2235524084_cf1c255f53_o.jpg 710 | 2351021378_48e5e0a5d9_o.jpg 711 | 3065792141_9417d3a84f_o.jpg 712 | 162560526_6310dcb4d4_o.jpg 713 | 95558184_90adbedc53_o.jpg 714 | 2647255761_4beb4955e5_o.jpg 715 | 4117185181_cfcd665e82_b.jpg 716 | 2080570552_65b1a48a66_o.jpg 717 | 2312401153_e63fd67dc4_o.jpg 718 | 2055533334_60a1a5b263_o.jpg 719 | 3314894623_89f80e3cf5_o.jpg 720 | 900188597_51d711616f_o.jpg 721 | 145271935_2d32b00688_o.jpg 722 | 6742559423_88e13b7664_o.jpg 723 | 9557789202_c2ab200456_o.jpg 724 | 1172951221_1601924557_o.jpg 725 | 8685790649_783d8f752f_o.jpg 726 | 11585988864_875e47ebd4_b.jpg 727 | 2725390298_7a9cc4f91a_o.jpg 728 | 1225543328_75bfacd959_o.jpg 729 | 3270659274_d7e23e9124_o.jpg 730 | 2912030921_80a6783376_o.jpg 731 | 2676828946_d29bcebdb6_o.jpg 732 | 2502340656_e1527f806f_o.jpg 733 | 5570916652_83fe4841f4_b.jpg 734 | 2724783812_64a9723baf_o.jpg 735 | 7452625226_b116a54c08_b.jpg 736 | 3862853412_2c1382c763_o.jpg 737 | 6549052411_0998dd197e_b.jpg 738 | 3609703697_70b6d09cd3_o.jpg 739 | 2844192521_89fd54c981_o.jpg 740 | 3884530698_c74c008c51_o.jpg 741 | 155878721_ed94af40e6_o.jpg 742 | 4050332753_81db45c55b_b.jpg 743 | 3879220242_6f4ab4e554_o.jpg 744 | 8397542244_49170d7fdf_b.jpg 745 | 4064433402_a4098a2797_b.jpg 746 | 2166510979_892a132f27_o.jpg 747 | 6345273328_6ca81b1ed1_o.jpg 748 | 1354161257_dfbb8ea2a5_o.jpg 749 | 1731849419_eb46b263be_o.jpg 750 | 2676011773_787458580b_o.jpg 751 | 3322317172_5781ba5a90_o.jpg 752 | 2851995944_bcaedc9ae6_o.jpg 753 | 3887892854_f32c283174_o.jpg 754 | 2372261469_a83a722b2c_o.jpg 755 | 1334054787_50abab5c6d_o.jpg 756 | 2570387806_5b17a21917_o.jpg 757 | 2479595745_b5c535d90c_o.jpg 758 | 167862203_73cb65365f_o.jpg 759 | 251704853_b90a2b1b9d_o.jpg 760 | 3253730092_56c9623238_o.jpg 761 | 2374277816_a2981c8313_o.jpg 762 | 3386880958_5547ac67cd_o.jpg 763 | 137961110_7c68953045_o.jpg 764 | 3540497966_820ce7c1ca_o.jpg 765 | 3500919375_a256da1b60_o.jpg 766 | 438486321_972cbbca22_o.jpg 767 | 5982552589_e92fd550ef_b.jpg 768 | 5159721306_3d15d23a32_o.jpg 769 | 2534316641_ca019e18cf_o.jpg 770 | 5735369884_0a7d939fde_b.jpg 771 | 3269983745_054a6b0f5b_o.jpg 772 | 3876245213_d09b34766b_o.jpg 773 | 3652138444_2935619df8_o.jpg 774 | 2851996378_d1a63d3eb5_o.jpg 775 | 1000209737_ca0c200206_o.jpg 776 | 2851163595_348f967b74_o.jpg 777 | 2343527722_6752b45005_o.jpg 778 | 3714759771_28680151ab_o.jpg 779 | 1266373596_e8b66f1d50_o.jpg 780 | 888172191_874a8b8e1d_o.jpg 781 | 1007451228_456e532c3b_o.jpg 782 | 2724568095_f49816d891_o.jpg 783 | 395805043_2646828c3d_o.jpg 784 | 4940573446_554370c900_o.jpg 785 | 3571101240_cbaea5cf92_o.jpg 786 | 224171911_964da009d6_o.jpg 787 | 2483759055_3a7f7627e1_o.jpg 788 | 14765916612_ce22e98e10_o.jpg 789 | 543358209_f4c1e48125_o.jpg 790 | 3066333159_f743187b44_o.jpg 791 | 50458388_ea398b4ac8_o.jpg 792 | 3658447078_a516aeb5fe_o.jpg 793 | 47400306_262a6d77dd_o.jpg 794 | 566393129_4df6142cf0_o.jpg 795 | 1733441067_e1b87e79a0_o.jpg 796 | 3847409905_25f841af33_b.jpg 797 | 2518074908_7636978bb5_b.jpg 798 | 10492999384_671424756e_o.jpg 799 | 11310804685_93146e2659_o.jpg 800 | 6216644337_cbfa10551e_o.jpg 801 | 179453447_af35252e9e_o.jpg 802 | 5154440898_ccca945a42_o.jpg 803 | 2724567581_7d046a3705_o.jpg 804 | 3580659219_666fc178cb_o.jpg 805 | 479048023_eac259c218_o.jpg 806 | 8647424914_b5d755843a_o.jpg 807 | 2407429377_4b52b1147e_o.jpg 808 | 3771220139_15388db66d_o.jpg 809 | 2343556116_423f557455_o.jpg 810 | 3751992876_3dfb91e5b9_o.jpg 811 | 2039666247_7772a96133_o.jpg 812 | 2571608244_7a67d0ee5f_o.jpg 813 | 23205404_fbf77cd562_o.jpg 814 | 3644648254_9b2522a322_o.jpg 815 | 2340577019_4e37c01908_o.jpg 816 | 6320391211_64fda87630_b.jpg 817 | 8042899224_a0f753476c_o.jpg 818 | 2791292813_5a07ba99ec_o.jpg 819 | 498847648_7d02a564cf_o.jpg 820 | 7126828115_f23a2129c8_o.jpg 821 | 6290316497_f5dd0877dd_o.jpg 822 | 2979127030_4fb28eb402_b.jpg 823 | 2792358430_4bc76abf68_o.jpg 824 | 3408182387_8fe84fcbb1_o.jpg 825 | 3645431633_4f3d143388_o.jpg 826 | 3715566760_b4f83c0ecd_o.jpg 827 | 2335548930_8373af05a7_o.jpg 828 | 3784602558_11f542426f_b.jpg 829 | 6426092929_f31410e494_b.jpg 830 | 3697526726_e0a5f0bd49_o.jpg 831 | 3044159158_2e56916a02_o.jpg 832 | 3300415442_5b1fed9000_o.jpg 833 | 2061693430_bd7ac476c7_o.jpg 834 | 438487149_1ec55dbac3_o.jpg 835 | 2111276775_749de2f82b_o.jpg 836 | 262214138_1a79035657_o.jpg 837 | 145274798_65329184a6_o.jpg 838 | 3645429659_85b3082b9b_o.jpg 839 | 2234736987_8d3a4fb9c6_o.jpg 840 | 2268668676_e6937f8428_o.jpg 841 | 3581469718_a03282bda7_o.jpg 842 | 4650598987_50e3b1aa36_b.jpg 843 | 1138290601_307e0471be_o.jpg 844 | 4526520042_b69c678fdf_o.jpg 845 | 4519399581_4f398d4551_o.jpg 846 | 2658701022_8747c931a8_o.jpg 847 | 3519455239_286defcdfc_o.jpg 848 | 2548497618_b4ca182659_o.jpg 849 | 380636775_774d159c64_o.jpg 850 | 3645433245_13061ecb0f_o.jpg 851 | 388489713_6025982a5a_o.jpg 852 | 3160579279_af76930f03_o.jpg 853 | 1247222869_09173b48ce_o.jpg 854 | 2317531665_1b5df019b6_o.jpg 855 | 11559156_30a0eb1055_o.jpg 856 | 481070704_71865f662a_o.jpg 857 | 3539616919_029442dd01_o.jpg 858 | 194768107_9ee16a8864_o.jpg 859 | 3861152645_cbb201c38c_o.jpg 860 | 7871819178_651244ff2e_o.jpg 861 | 2285641011_96fb89aaa3_o.jpg 862 | 3667908630_e6ddaab6ee_o.jpg 863 | 1038544150_d6610b46d7_o.jpg 864 | 2847659943_3919641901_o.jpg 865 | 462060392_d9669fb8c5_o.jpg 866 | 3056975899_8a9e582a03_o.jpg 867 | 16821490444_bffa0cc11f_o.jpg 868 | 496422498_ca0a4d25c0_o.jpg 869 | 2490448380_f8401109b1_o.jpg 870 | 160052215_bd60419f94_o.jpg 871 | 8686905178_d6be1b15c9_o.jpg 872 | 7093668417_ac181687dd_b.jpg 873 | 4230011526_7424996faa_o.jpg 874 | 6128900414_ae67120f1a_o.jpg 875 | 3714767319_1e20a5b974_o.jpg 876 | 2672708049_e3330a51b8_o.jpg 877 | 211835338_ab7f5564b4_o.jpg 878 | 3979887377_a692c516d3_b.jpg 879 | 3226832260_b0182e0cbc_o.jpg 880 | 1537037840_339d5e6645_o.jpg 881 | 274005936_45d51ccf6d_o.jpg 882 | 2330666831_ca795fac01_o.jpg 883 | 173697599_b2cb1dea5a_o.jpg 884 | 874921611_658fb9fe11_o.jpg 885 | 2969126164_69d5022380_o.jpg 886 | 1356235913_55bddca9ce_o.jpg 887 | 2542047013_4264b3d718_o.jpg 888 | 8269863468_c704ab3117_o.jpg 889 | 2335020898_5ee4618343_o.jpg 890 | 3475871169_f6fee55139_b.jpg 891 | 2566855514_e79d385471_o.jpg 892 | 3328796640_9664682c04_b.jpg 893 | 2402860919_41e945f637_o.jpg 894 | 889422888_9cc4ff7be9_o.jpg 895 | 4967538613_67f8bd3de8_o.jpg 896 | 2467650605_7ae402411c_o.jpg 897 | 2090249384_1b2f1cff30_o.jpg 898 | 6254533191_71c7ea33a1_o.jpg 899 | 4149246893_bd20ab97f1_o.jpg 900 | 2859997141_2ee6c23b69_o.jpg 901 | 2319281152_6fcdba53e7_o.jpg 902 | 5764805745_779a485cea_b.jpg 903 | 11471493335_be72ab25a7_o.jpg 904 | 988136060_16c80a4ba3_o.jpg 905 | 2429340144_fbe92727c7_o.jpg 906 | 3520104768_386f4476c8_o.jpg 907 | 5901645127_097c10ed1f_o.jpg 908 | 3786142747_68c70a9c87_b.jpg 909 | 4222237457_661553a818_b.jpg 910 | 2141534494_4454cbcf8e_o.jpg 911 | 8323467545_58edbe5e07_o.jpg 912 | 1806131344_ccd85c5804_o.jpg 913 | 3519669380_a0aec5f8f3_o.jpg 914 | 2453069109_96d365a5b3_o.jpg 915 | 8712530774_738350b324_b.jpg 916 | 2648125586_e5b561dde7_o.jpg 917 | 2408204560_aa79f371fc_o.jpg 918 | 1418033358_7c0b150b2a_o.jpg 919 | 3657044303_b68c20a13b_o.jpg 920 | 2715014270_9f4325f25f_o.jpg 921 | 2457757990_ecafc7ea34_o.jpg 922 | 162559414_e46c58584d_o.jpg 923 | 2247651680_8bc7bd3eb3_o.jpg 924 | 9611991460_f09caa46b4_o.jpg 925 | 7873481530_77640276a5_o.jpg 926 | 421523033_815c4c7477_o.jpg 927 | 2568279182_f61a8d6db6_o.jpg 928 | 6659948093_8a20c2c578_o.jpg 929 | 465420336_8d05461385_o.jpg 930 | 2896170044_5057ba9240_o.jpg 931 | 2739380782_93c62ebd05_o.jpg 932 | 2450986925_163a960fab_o.jpg 933 | 2635208207_1037e0ce84_o.jpg 934 | 2566858138_b973f33036_o.jpg 935 | 1127186150_d876c29e25_o.jpg 936 | 15607122181_c43db9e132_b.jpg 937 | 2756414883_5d2a094bba_o.jpg 938 | 2204381067_ee863f8bb9_o.jpg 939 | 3971945061_484849cdc0_b.jpg 940 | 7632783114_a186b198a1_b.jpg 941 | 14008412380_f3e9d1fe54_b.jpg 942 | 2483819842_3bcf590491_o.jpg 943 | 3545038457_36535045b8_o.jpg 944 | 8098374142_fd6dcf9f8c_o.jpg 945 | 118505590_97aecba2b7_o.jpg 946 | 2451170278_2045dc108c_o.jpg 947 | 2717355275_5b6683c621_o.jpg 948 | 110646156_c6b0f8297f_o.jpg 949 | 262218904_47fe94736d_o.jpg 950 | 171415744_e4bbe4e6dc_o.jpg 951 | 5560412120_09eef69142_o.jpg 952 | 100994187_d749d3631a_o.jpg 953 | 2971631455_054ec81f75_o.jpg 954 | 3641097399_1fa58fccb5_o.jpg 955 | 2379201315_c82d49e32a_o.jpg 956 | 2977223311_e14f5fe673_o.jpg 957 | 6274810796_4dabf572ac_b.jpg 958 | 7176975295_a5acb7c089_b.jpg 959 | 2479595745_c9ccdd7440_b.jpg 960 | 3406914470_d9998e392c_b.jpg 961 | 2255257743_dcec266334_o.jpg 962 | 3520271226_548fb6a0d7_o.jpg 963 | 262217165_e7aaa428a6_o.jpg 964 | 3667908962_6af2469afa_o.jpg 965 | 214045149_0d8467910c_o.jpg 966 | 4340492735_e04fc809df_o.jpg 967 | 2928069569_d5b38db2e1_o.jpg 968 | 3952365283_c163e540f3_o.jpg 969 | 3057707609_8c7d1261cc_o.jpg 970 | 4015336506_cf77978334_o.jpg 971 | 3270806660_dafac8cd21_o.jpg 972 | 251411934_e0196df654_o.jpg 973 | 2750852461_4ae4fc72ea_o.jpg 974 | 2566854858_032706fc19_o.jpg 975 | 2682516163_bb45c45c3b_o.jpg 976 | 3641099091_235cc79924_o.jpg 977 | 2456915719_46eb067969_o.jpg 978 | 1380526630_aca6218f29_o.jpg 979 | 194766752_cdc2235ac4_o.jpg 980 | 3160746765_f6b408ac8b_o.jpg 981 | 3665819580_04b2d0282e_b.jpg 982 | 3887893462_530c367fdd_o.jpg 983 | 2112056856_d870b6c6c5_o.jpg 984 | 6086088553_ea03007f82_o.jpg 985 | 3270807246_c104783585_o.jpg 986 | 2021642971_653243cd97_o.jpg 987 | 3219331903_89beb1f9b6_o.jpg 988 | 35644693_8f8ff27c4e_o.jpg 989 | 3803330117_dfcb1c964e_o.jpg 990 | 3161417924_5e87f9d1e4_o.jpg 991 | 660900244_a03394899c_o.jpg 992 | 2268935185_0065155dee_o.jpg 993 | 523587772_4f97dde6a1_o.jpg 994 | 500959107_167dff8f2f_o.jpg 995 | 3555114746_118d6c1fc6_o.jpg 996 | 2241125710_503e2da664_o.jpg 997 | 2714277807_5627691e88_o.jpg 998 | 3390189317_4b85b0c943_o.jpg 999 | 5133182562_0d0f7973e5_o.jpg 1000 | 3229689105_10d8977715_o.jpg 1001 | 2335132470_9e6af1d2f6_o.jpg 1002 | 262226070_5aeb4aaecc_o.jpg 1003 | 9977866276_a0a3543b33_o.jpg 1004 | 3533730124_8c3ff3df21_o.jpg 1005 | 3646240490_cf01442d87_o.jpg 1006 | 1083208421_7cf5112d3e_o.jpg 1007 | 2714247738_5741f68b1e_o.jpg 1008 | 6947591980_89007c98a6_b.jpg 1009 | 3188873302_298fcf2af1_o.jpg 1010 | 3677483339_589feccbff_o.jpg 1011 | 3930376480_4f06f7682e_o.jpg 1012 | 3176787329_696c2523ca_o.jpg 1013 | 4458376586_be0679edd6_o.jpg 1014 | 2089885282_c4fabe51df_o.jpg 1015 | 3617004592_972c3b5169_o.jpg 1016 | 438486001_39dc64437c_o.jpg 1017 | 10893691936_9082dd1469_b.jpg 1018 | 113735722_cfe31a9d4e_o.jpg 1019 | 7864663080_c18cdc82d1_b.jpg 1020 | 2931388716_b9ed7317af_o.jpg 1021 | 5908213005_e77605af2c_b.jpg 1022 | 2519104950_3a67da4d24_o.jpg 1023 | 3174003733_5bfd192906_o.jpg 1024 | 3520101858_c99bff3685_o.jpg 1025 | 110951212_9426c69950_o.jpg 1026 | 8600106955_ccd5b5dc8b_o.jpg 1027 | 3400499134_980df130de_o.jpg 1028 | 1113673716_1accb0efe9_o.jpg 1029 | 7824863684_55c9ec1a98_o.jpg 1030 | 1414086159_aa79f0fa37_o.jpg 1031 | 405108429_7680ed15cd_o.jpg 1032 | 8901663519_aa0a1ed603_b.jpg 1033 | 194766965_bacf1ed92f_o.jpg 1034 | 10296929795_a9d2ba5020_o.jpg 1035 | 8550001046_ae72b5ed4b_o.jpg 1036 | 2425833458_593e2b1420_o.jpg 1037 | 2073081512_1653863ea4_o.jpg 1038 | 3708572118_a9f1a0fb11_o.jpg 1039 | 2324830413_81cb388466_o.jpg 1040 | 4000891590_58f08deb51_o.jpg 1041 | 2486568881_ec5af261b1_o.jpg 1042 | 194767363_1d8fe585e7_o.jpg 1043 | 1749015829_a898606f16_o.jpg 1044 | 3841273440_9f494b420e_o.jpg 1045 | 515636991_e51459898c_o.jpg 1046 | 3473153833_08091da4be_o.jpg 1047 | 3869052730_a1c5299deb_o.jpg 1048 | 2923425555_509d8b2f58_o.jpg 1049 | 131414796_6b1b577e0d_o.jpg 1050 | 2408203716_1351e1a7f2_o.jpg 1051 | 2366540922_34aabcabac_o.jpg 1052 | 460827992_60af7344b8_o.jpg 1053 | 2535079618_3af38914c5_o.jpg 1054 | 4697782312_6821d17232_b.jpg 1055 | 2574380718_a110683606_o.jpg 1056 | 2929398443_31df5f52cc_o.jpg 1057 | 2808599998_72215d7134_o.jpg 1058 | 8708677646_12cee61388_o.jpg 1059 | 7093664215_043c3e9a06_b.jpg 1060 | 2449974056_032552831a_o.jpg 1061 | 2204306646_c2a8f8abd1_o.jpg 1062 | 2906588133_1b3cf87d25_o.jpg 1063 | 2330666825_7882be6f6c_o.jpg 1064 | 3120751943_73e646180d_o.jpg 1065 | 3886092907_7e973dd0ec_o.jpg 1066 | 362339210_74340a9380_o.jpg 1067 | 482954525_78c6476fba_o.jpg 1068 | 9329384838_f612905ea9_o.jpg 1069 | 1219111078_69b7eb60cc_o.jpg 1070 | 262223434_990ae74b3e_o.jpg 1071 | 625013850_92fb5a55e5_o.jpg 1072 | 943903700_b9fbb89fa3_o.jpg 1073 | 1059250895_adebe69b9d_o.jpg 1074 | 2803237082_25243e99e7_o.jpg 1075 | 1119624387_3fdedb3673_o.jpg 1076 | 2998118765_b9a4f13fdb_o.jpg 1077 | 8413066278_9a9cdf2da5_o.jpg 1078 | 1428272167_ad8ca9acb9_o.jpg 1079 | 2220040772_aa25460a41_o.jpg 1080 | 3616186177_995a4fb6a8_o.jpg 1081 | 5227995661_0353b9d6cf_o.jpg 1082 | 2509780660_1ff2b0e981_o.jpg 1083 | 5058613170_c8f0c2b098_o.jpg 1084 | 3907763372_e42209ed25_o.jpg 1085 | 3066360247_86d48aa09c_o.jpg 1086 | 1537937418_2663e778fa_o.jpg 1087 | 2914663459_848a3732ee_o.jpg 1088 | 523613553_8b7e3e1cc7_o.jpg 1089 | 2296611622_789abc8309_o.jpg 1090 | 3388238050_8b26a08c39_o.jpg 1091 | 3229690041_a61f107123_o.jpg 1092 | 6606969291_7820daff68_o.jpg 1093 | 2888179573_57c95a7304_o.jpg 1094 | 2318471999_9d9040abdd_o.jpg 1095 | 3335938390_59630ec3be_o.jpg 1096 | 2014252518_ec9d9e1118_o.jpg 1097 | 5659514191_eb2a9573ab_b.jpg 1098 | 8708677856_6553a12d44_o.jpg 1099 | 4640437854_e19d2609ec_o.jpg 1100 | 47400158_ddcab7cf32_o.jpg 1101 | 5011495506_085a25fec0_b.jpg 1102 | 3429666256_2cf4556368_o.jpg 1103 | 3202370084_443760228c_o.jpg 1104 | 3544006138_1827858c0c_o.jpg 1105 | 3691748_6e4efd0cb6_o.jpg 1106 | 2210942466_21f33ae1d1_o.jpg 1107 | 3154309894_0d584e9662_o.jpg 1108 | 511296739_c90c350288_o.jpg 1109 | 2468475128_74ec9e5056_o.jpg 1110 | 2244206337_25b6250383_o.jpg 1111 | 3773125020_26122e989f_o.jpg 1112 | 3519292187_9146344e7c_o.jpg 1113 | 2648108052_c5b3408441_o.jpg 1114 | 2973813657_7c9551ac70_o.jpg 1115 | 11912020043_346f086b53_b.jpg 1116 | 225038088_0ad7fa438d_o.jpg 1117 | 136140160_485b99ea8a_o.jpg 1118 | 1172947673_2fb67d753d_o.jpg 1119 | 2724566797_7fde75b1b3_o.jpg 1120 | 3399780640_ecc09c17e9_o.jpg 1121 | 3180200725_8ef7b7ae45_o.jpg 1122 | 3338211563_1d494ab3b1_b.jpg 1123 | 6269992359_40de55c9ed_o.jpg 1124 | 3160922048_5c46498008_b.jpg 1125 | 3621731182_1dc21ef4b3_o.jpg 1126 | 6195969265_3c1a4e9868_o.jpg 1127 | 425846204_19bf5f4ef8_o.jpg 1128 | 1366208519_999b169e4a_o.jpg 1129 | 2424507211_925a83ce6e_o.jpg 1130 | 1369535443_ee46ac9cdd_o.jpg 1131 | 481053784_d7723dd8c5_o.jpg 1132 | 3429876416_37a2bbb236_o.jpg 1133 | 505068218_9bc4133eda_o.jpg 1134 | 2255155385_81e8aef6d6_o.jpg 1135 | 262214872_d02615708e_o.jpg 1136 | 2084086750_841c86b4d1_o.jpg 1137 | 321296923_4f05763b1f_o.jpg 1138 | 2124794618_56606d269d_o.jpg 1139 | 10900550356_7ca2407e84_b.jpg 1140 | 8092804013_c89d787a3d_o.jpg 1141 | 749865484_0943e2c682_o.jpg 1142 | 262215702_59341425fe_o.jpg 1143 | 2784970354_1cbe7cd2e3_o.jpg 1144 | 3519454113_564e678b6e_o.jpg 1145 | 2929652645_ecec07fd32_o.jpg 1146 | 2286429080_f8658e0644_o.jpg 1147 | 6297854026_f75ede166b_b.jpg 1148 | 1543057143_d468ca0bf7_o.jpg 1149 | 154549673_4db1cbd719_o.jpg 1150 | 500111583_b5b7f9fb48_o.jpg 1151 | 3740182754_884b019321_o.jpg 1152 | 3208223956_3fb1e3124e_o.jpg 1153 | 3515048145_8ef1a2a142_o.jpg 1154 | 2403687712_555e940a91_o.jpg 1155 | 3090029658_4a04d73b1d_o.jpg 1156 | 5731340985_11e2c9d6a6_o.jpg 1157 | 3971942455_4234f6743c_b.jpg 1158 | 38365113_40f8c3f20f_o.jpg 1159 | 2166117358_ceef776d6c_o.jpg 1160 | 3270964134_8791318dd3_o.jpg 1161 | 3103008169_72e4752e66_o.jpg 1162 | 477404193_b445d53bff_o.jpg 1163 | 3662432284_9ff7f7133e_o.jpg 1164 | 682990960_5916f2d00f_o.jpg 1165 | 2977221941_eefe8b63b0_o.jpg 1166 | 3715573174_c510786387_o.jpg 1167 | 2296015353_e48a5ffe27_o.jpg 1168 | 2459406697_52d45aec20_o.jpg 1169 | 6153892442_76ee0a125e_b.jpg 1170 | 2956205352_a56b8c03c2_o.jpg 1171 | 3201521613_cafdd9da27_o.jpg 1172 | 248136342_43e3d37582_o.jpg 1173 | 824280572_9fec550924_o.jpg 1174 | 500062954_1939ccb978_o.jpg 1175 | 2397394956_c594d7014d_o.jpg 1176 | 3327063248_831d88b558_b.jpg 1177 | 3638534648_6d37a0740f_o.jpg 1178 | 1681937734_da057de2dd_o.jpg 1179 | 1020206218_320fadfd7c_o.jpg 1180 | 431916230_ed44dde1af_o.jpg 1181 | 6179983722_212b077740_o.jpg 1182 | 3188742195_fb7c51af65_o.jpg 1183 | 2578441688_7362bba306_o.jpg 1184 | 2804830321_92e4ea7b8c_o.jpg 1185 | 2470689788_9b1bf17a60_o.jpg 1186 | 2317531405_d9b22da897_o.jpg 1187 | 3170646293_cff4fa45b5_o.jpg 1188 | 3262135174_5a41a88200_o.jpg 1189 | 2318471259_785fc95e58_o.jpg 1190 | 122317585_6c7db97a26_o.jpg 1191 | 2617070566_bdbca1de4f_o.jpg 1192 | 2706622902_b6ae85af3f_o.jpg 1193 | 7202904134_4afb2b8fea_o.jpg 1194 | 3902715590_5bc2e25971_o.jpg 1195 | 3958776194_83c67d7862_o.jpg 1196 | 2440663403_182739585a_o.jpg 1197 | 3294400437_1fd6f3ef79_o.jpg 1198 | 3476512777_46774ca268_o.jpg 1199 | 682956545_e98140bd6d_o.jpg 1200 | 2107228307_6148dec98b_o.jpg 1201 | 2239121937_5574de9b82_o.jpg 1202 | 3422484494_a4c3a9d184_o.jpg 1203 | 3616186391_531a892310_o.jpg 1204 | 4466052070_785917c866_o.jpg 1205 | 5115231665_7fb8e7076a_o.jpg 1206 | 380634262_43eb8030c5_o.jpg 1207 | 2250581531_a3267b38e0_o.jpg 1208 | 481061299_4045727169_o.jpg 1209 | 3739411581_959d576f05_o.jpg 1210 | 96493140_21d690d9f7_o.jpg 1211 | 2166113590_3230ace2ec_o.jpg 1212 | 3206751677_930d664806_b.jpg 1213 | 23205402_40ad101f84_o.jpg 1214 | 2508761447_b8b7aa7e7b_o.jpg 1215 | 3930376322_df8936302d_o.jpg 1216 | 3562738250_981c4c8635_o.jpg 1217 | 460826524_d1a92764b5_o.jpg 1218 | 6789391039_4f70338d4d_o.jpg 1219 | 5506524443_6f262b714d_b.jpg 1220 | 2622318715_995320b0cf_o.jpg 1221 | 3573583449_09a51994f7_o.jpg 1222 | 2061696818_475a2d8ee2_o.jpg 1223 | 4168736728_45aa11b1be_o.jpg 1224 | 2365707187_3521e6072f_o.jpg 1225 | 8928239950_c6be09658d_o.jpg 1226 | 3205572864_4fdf84c712_o.jpg 1227 | 3532912281_cbc065403e_o.jpg 1228 | 271231103_5fb7157376_o.jpg 1229 | 1183599932_016655b869_o.jpg 1230 | 2118457538_b3d68476a0_o.jpg 1231 | 84955922_26ee1b28e6_o.jpg 1232 | 2341410900_7f4ecaa5f9_o.jpg 1233 | 1380532732_4c21c83289_o.jpg 1234 | 228649174_0e3d41482c_o.jpg 1235 | 427572616_ed76f7fcc5_o.jpg 1236 | 6389006869_c395dd8385_o.jpg 1237 | 4224089478_80cdff6630_o.jpg 1238 | 2676011669_4e4f6c5987_o.jpg 1239 | 2533079675_328be6c01a_o.jpg 1240 | 5752539748_bf1ef0b687_o.jpg 1241 | 7658197056_73e64af540_o.jpg 1242 | 3620326545_285a2901d2_o.jpg 1243 | 1091435371_e4170cc935_o.jpg 1244 | 3520266660_23e525ab86_o.jpg 1245 | 262212533_148c87cb4e_o.jpg 1246 | 2971605999_5abb21997e_o.jpg 1247 | 2667260335_fddabeb7ba_o.jpg 1248 | 2234733695_5e4ce32919_o.jpg 1249 | 1130158793_aa9bdcb1a7_o.jpg 1250 | 6863633426_12ec03df7a_o.jpg 1251 | 432380270_2bee74dd0c_o.jpg 1252 | 2403041960_07592d0255_o.jpg 1253 | 5380307033_2fca376a1f_o.jpg 1254 | 5188060147_b5a636294c_b.jpg 1255 | 3906987051_1b09677379_o.jpg 1256 | 5139397005_8b7221559f_o.jpg 1257 | 2771935864_a905ef899b_o.jpg 1258 | 2114563031_596760aa4c_o.jpg 1259 | 1097548376_ab578a9f0e_o.jpg 1260 | 6670109915_9d893fcf06_o.jpg 1261 | 2931300677_f8c25189c9_o.jpg 1262 | 3929596961_578c191ac6_o.jpg 1263 | 262225464_2c31ddf35c_o.jpg 1264 | 184666997_477696e326_o.jpg 1265 | 3392610465_9de2fdeb10_o.jpg 1266 | 563048998_8df251b0a0_o.jpg 1267 | 189216031_1bc2754c41_o.jpg 1268 | 3519909876_a84e93a144_o.jpg 1269 | 273625987_497209abd3_o.jpg 1270 | 3714754141_845dd8b80c_o.jpg 1271 | 271231009_125ae6eefa_o.jpg 1272 | 3067175550_94718a788a_o.jpg 1273 | 1279633659_f0fac9a8cc_o.jpg 1274 | 3519451959_7b71ffb509_o.jpg 1275 | 3548404353_8f3199980a_o.jpg 1276 | 369871717_e1e750d8f4_o.jpg 1277 | 3617004444_2928ceed7d_o.jpg 1278 | 79443572_3ecd382876_o.jpg 1279 | 2915373346_11fd1db409_o.jpg 1280 | 9365683837_e97866669f_o.jpg 1281 | 6851335616_e5e4dc3607_b.jpg 1282 | 3082375560_8c745c74ce_o.jpg 1283 | 1260536175_cdf8949cda_o.jpg 1284 | 2165319565_4a44e683ec_o.jpg 1285 | 494099871_7f91b63f59_o.jpg 1286 | 450811619_84b5d075fc_o.jpg 1287 | 342471837_8acf706c64_o.jpg 1288 | 5788515360_ae4948f10a_b.jpg 1289 | 2542821448_46720397b8_o.jpg 1290 | 3123162485_e1feae3bbe_o.jpg 1291 | 2052368170_0a5a215e61_o.jpg 1292 | 4751548906_4d3090fdd5_b.jpg 1293 | 3365698878_05118dcfde_o.jpg 1294 | 698808420_a5ea50983e_o.jpg 1295 | 2069093263_9ca3f88375_o.jpg 1296 | 2865853029_e93a6b729e_o.jpg 1297 | 2259291660_9940cf12d8_o.jpg 1298 | 5011496054_3a19fd23a6_b.jpg 1299 | 14260701776_1827fe6562_o.jpg 1300 | 395505355_bda8e700a9_o.jpg 1301 | 2165314289_fb6d94e929_o.jpg 1302 | 5662120043_bc72359591_b.jpg 1303 | 2930237910_02f9a272e0_o.jpg 1304 | 183304080_36a13e2c04_o.jpg 1305 | 2319281392_9dc90672e9_o.jpg 1306 | 3704873015_662f6e0cd8_o.jpg 1307 | 2050224687_906ea1517a_o.jpg 1308 | 2724587771_ec0a38da84_o.jpg 1309 | 2561337180_069e524b86_o.jpg 1310 | 35640123_1754cd356a_o.jpg 1311 | 227267150_ab9dc335a1_o.jpg 1312 | 889813998_207e17c626_o.jpg 1313 | 2561483887_992fec6c00_o.jpg 1314 | 2312375439_2d3f35d987_o.jpg 1315 | 373625611_1616707ad4_o.jpg 1316 | 5314329484_7b67a64d49_b.jpg 1317 | 5425668880_c09571b0df_o.jpg 1318 | 4248634735_7e9fdbe307_b.jpg 1319 | 458998358_7fee51384d_o.jpg 1320 | 3177626972_91c34473e6_o.jpg 1321 | 3609467136_16257128e0_o.jpg 1322 | 2443216099_14d84935df_o.jpg 1323 | 3740230833_5f7fd86696_o.jpg 1324 | 4732895306_b3da6fd8fe_b.jpg 1325 | 2986266516_48fe8d24c1_o.jpg 1326 | 3548404555_62aca83b7c_o.jpg 1327 | 3461325298_a08ff620cd_o.jpg 1328 | 3649709356_03f5a0b872_o.jpg 1329 | 501080913_ddc407b670_o.jpg 1330 | 2525204264_22a58543a7_o.jpg 1331 | 2971612027_89cf23633e_o.jpg 1332 | 7796853336_fa7447862f_o.jpg 1333 | 1472678423_ed554c100b_o.jpg 1334 | 500067744_588fb1dac9_o.jpg 1335 | 2166948565_13f692ee43_o.jpg 1336 | 339921606_9b813dfe97_o.jpg 1337 | 3519454481_36e50b88a1_o.jpg 1338 | 937711188_a84bf5013f_o.jpg 1339 | 430337700_f596979666_o.jpg 1340 | 7214300272_f8c7e23346_b.jpg 1341 | 2518620747_a7255d037e_o.jpg 1342 | 2425836578_cac6b06aab_o.jpg 1343 | 2477831417_5898627811_o.jpg 1344 | 299403719_41d5b0c0cf_o.jpg 1345 | 108386516_e5382e0c25_o.jpg 1346 | 59379695_485922d8c0_o.jpg 1347 | 8543622835_8f93596eab_o.jpg 1348 | 410263020_5bc358f02b_o.jpg 1349 | 2951710335_e203f93b24_o.jpg 1350 | 6255076534_21d602caa6_o.jpg 1351 | 3123162485_293953e1ab_b.jpg 1352 | 3922805614_4fa5864498_b.jpg 1353 | 2335127830_eb02e8cfcc_o.jpg 1354 | 7872324398_4a70f6bf2d_o.jpg 1355 | 501941712_7b36e79aa3_o.jpg 1356 | 245528963_17293391fa_o.jpg 1357 | 436228804_1232f8dcfe_o.jpg 1358 | 3408184697_9c72ee2085_o.jpg 1359 | 2377936006_e9770ce117_o.jpg 1360 | 2762961976_e33793cbd9_b.jpg 1361 | 2771973960_60b3d1486f_o.jpg 1362 | 2930519088_b4f80f122f_o.jpg 1363 | 1200769265_82a77ca08e_o.jpg 1364 | 2998961836_08ab0221eb_o.jpg 1365 | 7653839618_88c248bc18_b.jpg 1366 | 1526589704_8cea9c7bb5_o.jpg 1367 | 2561483577_b077f51df9_o.jpg 1368 | 3229681939_311579426a_o.jpg 1369 | 3929596413_5c6f7ecb94_o.jpg 1370 | 2845029708_b6236d1ef2_o.jpg 1371 | 3062647135_02e5904315_o.jpg 1372 | 3610516174_7dfe9b2913_o.jpg 1373 | 383026936_08fc56cbfe_o.jpg 1374 | 2969493293_b51936a0af_o.jpg 1375 | 262216413_f04ab31fcb_o.jpg 1376 | 316549167_0d37f5b321_o.jpg 1377 | 542320947_4a0111ecf7_o.jpg 1378 | 682126951_6fe04d9730_o.jpg 1379 | 2714768842_5eb53e08f8_o.jpg 1380 | 301406794_06eef2537a_o.jpg 1381 | 3519291775_146b53f344_o.jpg 1382 | 2097303780_3c4e7a593e_o.jpg 1383 | 725823396_1b5c10ccb1_o.jpg 1384 | 3028138034_0bac9aba4e_o.jpg 1385 | 2526273646_0375469fdc_o.jpg 1386 | 3776366594_371022d8cb_o.jpg 1387 | 3662432342_fe4b82584b_o.jpg 1388 | 824262480_155887b286_o.jpg 1389 | 2758818327_33069ba17c_o.jpg 1390 | 2429340392_608af549a0_o.jpg 1391 | 4644168572_e688f4ab0f_b.jpg 1392 | 937725094_1f3f8c844e_o.jpg 1393 | 9977865576_cf1b80b3b3_o.jpg 1394 | 124110857_fe1098516b_o.jpg 1395 | 3786108290_3178945fcc_b.jpg 1396 | 3783794155_9129d38b67_b.jpg 1397 | 3204614779_84de998bef_o.jpg 1398 | 183304341_58aeff19a1_o.jpg 1399 | 1517091983_fcb72daa7d_o.jpg 1400 | 2771680214_7ae59813e1_o.jpg 1401 | 3123145704_a9853e91c9_o.jpg 1402 | 2631011065_9ddb3929c8_o.jpg 1403 | 9286148408_ffc971e334_o.jpg 1404 | 2501517533_cfa2b9a4c9_o.jpg 1405 | 3123991152_5c4ca1c557_o.jpg 1406 | 3043322653_573dc04f00_o.jpg 1407 | 175094566_d903040c0f_o.jpg 1408 | 377537343_83ea1204a6_o.jpg 1409 | 3901760136_86b0f56239_o.jpg 1410 | 271230779_bc7d33783b_o.jpg 1411 | 3820829876_9b14bbc252_o.jpg 1412 | 1556041343_7c549e4953_o.jpg 1413 | 3757991241_3a668445a7_o.jpg 1414 | 3714755471_a5acc288c0_o.jpg 1415 | 3593419966_0b3285922d_o.jpg 1416 | 3991783477_97c88f8405_o.jpg 1417 | 2052364602_fbbed675bc_o.jpg 1418 | 1556044697_f5f7eaadc6_o.jpg 1419 | 271230882_93af2f00e0_o.jpg 1420 | 3862844562_65006248a9_o.jpg 1421 | 5796177771_52cbf9e834_o.jpg 1422 | 235982850_6d37132afd_o.jpg 1423 | 4683282978_7f36caaa36_b.jpg 1424 | 98249665_787388a452_o.jpg 1425 | 1380425712_3cfd35ccf1_o.jpg 1426 | 3623242179_7c7c441020_o.jpg 1427 | 2804830841_95771fb69e_o.jpg 1428 | 144527367_979a67340d_o.jpg 1429 | 2805769756_237973f6b3_o.jpg 1430 | 3520103924_a52d4706cc_o.jpg 1431 | 3172991684_5afc0e48f8_o.jpg 1432 | 3249246801_874f27708a_o.jpg 1433 | 6970549030_3ef5947089_b.jpg 1434 | 1806662896_4101de5c13_o.jpg 1435 | 2334299709_6c47d838bc_o.jpg 1436 | 1613689212_9ed6759d84_o.jpg 1437 | 4526091956_b41350f228_o.jpg 1438 | 6318609651_45765da62a_o.jpg 1439 | 2652503714_1db6e1dcf1_o.jpg 1440 | 559274095_2e811d7620_o.jpg 1441 | 724902937_62934432ed_o.jpg 1442 | 369871648_082b5100d7_o.jpg 1443 | 6549046705_96bdd72bc0_b.jpg 1444 | 1399456476_1e2ba76fd7_o.jpg 1445 | 2056956283_e285149045_o.jpg 1446 | 286681521_e073a3fcd3_o.jpg 1447 | 460822205_545c9bc19c_o.jpg 1448 | 2364796272_2ef25c3dc9_o.jpg 1449 | 262220505_7334f34e80_o.jpg 1450 | 2725390558_f4bd7fa233_o.jpg 1451 | 3460509947_52cc674475_o.jpg 1452 | 2470689714_e1bf9754a9_o.jpg 1453 | 2724040729_74eed09fa9_o.jpg 1454 | 160053256_1378487aa7_o.jpg 1455 | 1556048469_42e255d2a7_o.jpg 1456 | 2943567938_68a549f0bc_b.jpg 1457 | 3414570898_ce20cc283a_o.jpg 1458 | 2334301069_d823ef3c36_o.jpg 1459 | 3847946139_22a4f1cd81_o.jpg 1460 | 3269983083_91eb6cb8da_o.jpg 1461 | 2053815766_7b1289b441_o.jpg 1462 | 2591664336_92b62c762a_o.jpg 1463 | 262212032_506b2f658d_o.jpg 1464 | 2111565932_de1740bf5f_o.jpg 1465 | 3979524357_6159c9ddce_b.jpg 1466 | 262213222_32343d679a_o.jpg 1467 | 2915655458_9b108949c1_o.jpg 1468 | 3177486007_6baf3ca403_o.jpg 1469 | 2639011638_a55277d68f_b.jpg 1470 | 2531409009_6b6d05653e_o.jpg 1471 | 3421676183_316d1684be_o.jpg 1472 | 14880485409_d861f62802_b.jpg 1473 | 272158292_5eca0ff321_o.jpg 1474 | 1665335890_28e0406e72_o.jpg 1475 | 3066334605_c0cf25d9df_o.jpg 1476 | 335879998_dfe5eca62a_o.jpg 1477 | 262223910_505c740336_o.jpg 1478 | 2936243564_eb5b7089c0_o.jpg 1479 | 7876283504_35c5501bca_o.jpg 1480 | 3317884160_b0235a6b71_o.jpg 1481 | 2343484256_78c60421c3_o.jpg 1482 | 3979528207_a7cf289f83_b.jpg 1483 | 511296601_79a1a367d7_o.jpg 1484 | 3335937298_9d88125014_o.jpg 1485 | 1357132410_39e16d48c5_o.jpg 1486 | 11028875154_f8a034c30b_o.jpg 1487 | 448528706_1395bf2c20_o.jpg 1488 | 3703733755_8753d8ca48_o.jpg 1489 | 122317583_f2264b060d_o.jpg 1490 | 2334343971_0be75a4cda_o.jpg 1491 | 297495163_3e2506222e_o.jpg 1492 | 1302109049_e750206de2_o.jpg 1493 | 4223340987_b6ca4a691a_o.jpg 1494 | 1549357630_bf2955c862_o.jpg 1495 | 1913526118_e7a63e4158_o.jpg 1496 | 319202828_b21602e548_o.jpg 1497 | 881455078_2cd5ef4e00_o.jpg 1498 | 2220042474_2e6a3b4654_o.jpg 1499 | 2104624413_1eed947d9e_o.jpg 1500 | 349247052_7d543e9c95_o.jpg 1501 | 2710277765_d5d258a2d1_o.jpg 1502 | 2508763947_d5cf057665_o.jpg 1503 | 827635402_8b2e8340f8_o.jpg 1504 | 2756418409_6f06829048_o.jpg 1505 | 2501515369_5bef5f6759_o.jpg 1506 | 2750853381_9885bffff7_o.jpg 1507 | 3172913933_49b4d1034f_o.jpg 1508 | 2509778366_3aff0d2119_o.jpg 1509 | 3066332927_c897b20f2e_o.jpg 1510 | 3883745865_6d24bbf579_o.jpg 1511 | 1267397894_63dbde6ea9_o.jpg 1512 | 3322263239_86e366cbfd_o.jpg 1513 | 4115757332_e647e86615_b.jpg 1514 | 5767795307_ffa1e14ea6_o.jpg 1515 | 2317519737_0be438fef0_o.jpg 1516 | 97345857_56c12d2650_o.jpg 1517 | 6099083799_221873eb26_o.jpg 1518 | 2824637104_ba1bde503e_o.jpg 1519 | 2652392901_516f212e0e_o.jpg 1520 | 3622556036_ab7c341af2_b.jpg 1521 | 875782577_43a35e0cd3_o.jpg 1522 | 2437458496_2896890fb5_b.jpg 1523 | 262211540_17cf98e9ef_o.jpg 1524 | 2535076026_02a6619636_o.jpg 1525 | 2124003899_bcaf5ca94b_o.jpg 1526 | 3060314807_9501c6b1a4_o.jpg 1527 | 7988799663_1cab3414b1_o.jpg 1528 | 7830174040_4f7e721f3b_o.jpg 1529 | 3660255087_e75e39af26_b.jpg 1530 | 2395886129_c655a27151_o.jpg 1531 | 6179924894_30426618ab_o.jpg 1532 | 9177464667_8bfce2c550_o.jpg 1533 | 3518856891_00453a36da_o.jpg 1534 | 3672382439_da023a5553_b.jpg 1535 | 339921102_5e83642b2e_o.jpg 1536 | 5298978652_93a7f73e2f_b.jpg 1537 | 3528449620_4d6f5d9b1d_o.jpg 1538 | 2258709757_c1715cc54c_b.jpg 1539 | 194767663_84004ce2b3_o.jpg 1540 | 3102276260_68b4475409_b.jpg 1541 | 2971610093_07629f9dec_o.jpg 1542 | 3173750636_f7a246967d_o.jpg 1543 | 543265928_9cedfbb79b_o.jpg 1544 | 2648407143_762fa66089_o.jpg 1545 | 3952365097_cee8971862_o.jpg 1546 | 162560730_3e4e9965eb_o.jpg 1547 | 2299973531_71c5a6a405_o.jpg 1548 | 3013500097_eb90ee2ca6_b.jpg 1549 | 1038648082_e888cf3eb7_o.jpg 1550 | 8672506776_53ef6e5735_o.jpg 1551 | 2321275986_1c22d23657_o.jpg 1552 | 8468562164_2483628c7b_b.jpg 1553 | 160052619_803694349b_o.jpg 1554 | 2425021291_2fa6150c48_o.jpg 1555 | 191148883_2e9ad40722_o.jpg 1556 | 3118108928_143f901b91_o.jpg 1557 | 6797708274_ef01f8be49_o.jpg 1558 | 145279978_33f0bd3f37_o.jpg 1559 | 2220030696_2b15f7f801_o.jpg 1560 | 714385588_2bac6db442_o.jpg 1561 | 5835513407_499aa44dce_b.jpg 1562 | 3797401867_47a28e5e17_o.jpg 1563 | 3482824587_b7db26bd29_o.jpg 1564 | 2334304829_4633935725_o.jpg 1565 | 5659511683_183f513d53_b.jpg 1566 | 1148303262_bd9010e74b_o.jpg 1567 | 69356794_8b9e077487_o.jpg 1568 | 4761796790_822582a5ae_o.jpg 1569 | 5124904242_583c99fcda_o.jpg 1570 | 3628747207_ff26e631ee_o.jpg 1571 | 8072205851_20235907f2_o.jpg 1572 | 3266787321_6bb4d228a9_o.jpg -------------------------------------------------------------------------------- /data/overlap_data/megadepth/venice/val.txt: -------------------------------------------------------------------------------- 1 | 1404148060_a7b4168ba7_o.jpg 312464707_de3b29b309_o.jpg 0.0 2 | 1257429089_2be4fc4020_o.jpg 2647278875_0f97443590_o.jpg 0.14915498083829878 3 | 1091463641_4691abbe0f_o.jpg 2979310998_d8ca252e5d_o.jpg 0.0 4 | 3454295605_ec7384d4d9_o.jpg 3623320231_3386b5458b_o.jpg 0.0 5 | 2647278875_0f97443590_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 6 | 312464707_de3b29b309_o.jpg 2580670249_f882806951_o.jpg 0.4571871530234814 7 | 475819303_b9bfef9bfb_o.jpg 342365448_b40e395c36_o.jpg 0.0 8 | 3487933880_3b2d286d74_o.jpg 1598798269_7b090fb565_o.jpg 0.4710706014215946 9 | 375089040_0e23a22a30_o.jpg 2720268280_0052b37cae_o.jpg 0.0 10 | 2907341741_64cd58ba8c_o.jpg 2577276677_e945f5b993_o.jpg 0.0 11 | 3784107745_51085d9217_o.jpg 3535626117_3b8604fc61_o.jpg 0.0 12 | 2286671923_740c8e0328_o.jpg 519579959_471530a809_o.jpg 0.0 13 | 373210474_d62250e4c0_o.jpg 2959179552_7b79b2100f_o.jpg 0.000484318870306015 14 | 3391388615_9dfebe6e3d_o.jpg 3440840638_cc41f14d43_o.jpg 0.001401827323436737 15 | 2464337916_1c8a62e0cb_o.jpg 3900594627_f595d4cbc9_o.jpg 0.12903209646344185 16 | 3551513323_0e3a6a5d06_o.jpg 3487933880_3b2d286d74_o.jpg 0.00016740413308143616 17 | 1748268283_8eafa6ee14_o.jpg 373210474_d62250e4c0_o.jpg 0.05936307448744774 18 | 3535626117_3b8604fc61_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 19 | 3501592474_cd87e1a6b8_o.jpg 2720268280_0052b37cae_o.jpg 0.00927468158006668 20 | 3293053485_8ae3eb6740_o.jpg 3107227785_6c0c05da0d_o.jpg 0.0 21 | 2577276677_e945f5b993_o.jpg 2056631628_0ed19e7707_o.jpg 0.02134443074464798 22 | 318866989_d3ff85a4d9_o.jpg 2158032873_3547d6763e_o.jpg 0.0 23 | 453223587_3f5bb0154d_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 24 | 1338975641_c11151605f_o.jpg 2577276677_e945f5b993_o.jpg 0.0 25 | 3007780778_b4003c7f5f_o.jpg 2686020433_5237099cdb_o.jpg 0.0 26 | 3528888375_3878a6c9e2_o.jpg 3292523267_3870c81e66_o.jpg 0.0 27 | 3666591632_c65eefc18b_o.jpg 342365448_b40e395c36_o.jpg 0.0 28 | 3807960365_3c0f71380b_o.jpg 318865108_b36f72679d_o.jpg 0.17370838001966477 29 | 345780792_08afde7e99_o.jpg 342365448_b40e395c36_o.jpg 0.0 30 | 1860570086_47ad17e15e_o.jpg 2862233520_a6835e9b83_o.jpg 0.0 31 | 3501592474_cd87e1a6b8_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 32 | 3292523267_3870c81e66_o.jpg 2764108983_c2dedc42ed_o.jpg 0.0 33 | 512510727_8b8e856101_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 34 | 2464337916_1c8a62e0cb_o.jpg 1338975641_c11151605f_o.jpg 0.11168912897109985 35 | 453223587_3f5bb0154d_o.jpg 464558681_f3eac58f21_o.jpg 0.0026418385922908783 36 | 3630531747_635abe7af4_o.jpg 2712949061_462b394427_o.jpg 0.0 37 | 716665111_132d21abd2_o.jpg 768149130_e41b346ddc_o.jpg 0.0 38 | 2286671923_740c8e0328_o.jpg 2764108983_c2dedc42ed_o.jpg 0.0 39 | 3528888375_3878a6c9e2_o.jpg 475819303_b9bfef9bfb_o.jpg 0.0 40 | 2972304330_688c362199_o.jpg 3623320231_3386b5458b_o.jpg 0.0 41 | 3203946708_949ef8c21e_o.jpg 3107227785_6c0c05da0d_o.jpg 0.16621781249046325 42 | 3900594627_f595d4cbc9_o.jpg 2918094295_382c50af39_o.jpg 0.0 43 | 2636009691_5aac8b1a15_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 44 | 3487933880_3b2d286d74_o.jpg 716626675_e573cb7804_o.jpg 0.0 45 | 3292523267_3870c81e66_o.jpg 2485179814_14aec1e27c_o.jpg 0.0 46 | 716665111_132d21abd2_o.jpg 3900594627_f595d4cbc9_o.jpg 0.0 47 | 3623320231_3386b5458b_o.jpg 285107588_1f76167079_o.jpg 0.0 48 | 2577276677_e945f5b993_o.jpg 2347986891_865f87fa93_o.jpg 0.0 49 | 18372617_8da504a40e_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 50 | 375089040_0e23a22a30_o.jpg 2630908591_808f1d065b_o.jpg 0.0 51 | 2056631628_0ed19e7707_o.jpg 2485179814_14aec1e27c_o.jpg 0.8744354993700981 52 | 2951554821_ed6a73b1cd_o.jpg 18372617_8da504a40e_o.jpg 0.0006106877446174621 53 | 1257429089_2be4fc4020_o.jpg 2577276677_e945f5b993_o.jpg 0.548014326930046 54 | 2764108983_c2dedc42ed_o.jpg 312464707_de3b29b309_o.jpg 0.005813958978652954 55 | 2972304330_688c362199_o.jpg 3454295605_ec7384d4d9_o.jpg 0.0 56 | 345764148_deca30defb_o.jpg 2228360255_a5f8fec802_o.jpg 0.08706277306079864 57 | 2764108983_c2dedc42ed_o.jpg 3309979889_e77ce06693_o.jpg 0.02930385016798973 58 | 475819303_b9bfef9bfb_o.jpg 312464707_de3b29b309_o.jpg 0.16455197376012803 59 | 349388910_4c7785016f_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 60 | 2764108983_c2dedc42ed_o.jpg 2485179814_14aec1e27c_o.jpg 0.0 61 | 716665111_132d21abd2_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 62 | 1598798269_7b090fb565_o.jpg 3487933880_3b2d286d74_o.jpg 0.11057492628097534 63 | 2712949061_462b394427_o.jpg 1338975641_c11151605f_o.jpg 0.0 64 | 2647278875_0f97443590_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 65 | 1748268283_8eafa6ee14_o.jpg 318865108_b36f72679d_o.jpg 0.0 66 | 2347986891_865f87fa93_o.jpg 302068464_7069d2769f_o.jpg 0.0 67 | 2286669485_83c29403d7_o.jpg 345764148_deca30defb_o.jpg 0.013065256690979004 68 | 3418896579_a73ba6c13e_o.jpg 2129800002_2a721cc8bc_o.jpg 0.0 69 | 3501592474_cd87e1a6b8_o.jpg 385698393_baf7b40f70_o.jpg 0.0 70 | 2966947703_1aeb9cc87b_o.jpg 3107227785_6c0c05da0d_o.jpg 0.0 71 | 1860570086_47ad17e15e_o.jpg 768149130_e41b346ddc_o.jpg 0.033414879816770555 72 | 3440840638_cc41f14d43_o.jpg 1356845356_e1e060a853_o.jpg 0.0 73 | 2130191931_ca7060a558_o.jpg 1257429089_2be4fc4020_o.jpg 0.0 74 | 3403308203_9f6a08490d_o.jpg 1598798269_7b090fb565_o.jpg 0.0 75 | 2061831653_df26671ce4_o.jpg 349388910_4c7785016f_o.jpg 0.0 76 | 2918094295_382c50af39_o.jpg 373210474_d62250e4c0_o.jpg 0.531044183743 77 | 2993590526_58b68a78dc_o.jpg 3178037569_1801bdda20_o.jpg 0.0 78 | 2286671923_740c8e0328_o.jpg 345780792_08afde7e99_o.jpg 0.0 79 | 3536482052_d59a9f7ea2_o.jpg 1860570086_47ad17e15e_o.jpg 0.0 80 | 3535626117_3b8604fc61_o.jpg 768149130_e41b346ddc_o.jpg 0.0 81 | 1338975641_c11151605f_o.jpg 2130191931_ca7060a558_o.jpg 0.0 82 | 349388910_4c7785016f_o.jpg 318865108_b36f72679d_o.jpg 0.0 83 | 3203946708_949ef8c21e_o.jpg 3784107745_51085d9217_o.jpg 0.0 84 | 2862233520_a6835e9b83_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 85 | 2764108983_c2dedc42ed_o.jpg 1356845356_e1e060a853_o.jpg 0.0020723446786403655 86 | 3536482052_d59a9f7ea2_o.jpg 1356845356_e1e060a853_o.jpg 0.0 87 | 318865108_b36f72679d_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 88 | 302068464_7069d2769f_o.jpg 3454295605_ec7384d4d9_o.jpg 0.10140100453495979 89 | 3807960365_3c0f71380b_o.jpg 3784107745_51085d9217_o.jpg 0.0 90 | 2918094295_382c50af39_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 91 | 2862233520_a6835e9b83_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 92 | 166617667_bff1bba0b9_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 93 | 18372617_8da504a40e_o.jpg 531067385_617531f27f_o.jpg 0.0 94 | 3323445213_4e917d44ac_o.jpg 2056631628_0ed19e7707_o.jpg 0.001329289472103119 95 | 2228360255_a5f8fec802_o.jpg 2061831653_df26671ce4_o.jpg 0.0 96 | 2061831653_df26671ce4_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.2919243951559067 97 | 345780792_08afde7e99_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 98 | 2764108983_c2dedc42ed_o.jpg 2720268280_0052b37cae_o.jpg 0.005497573226690292 99 | 2286669485_83c29403d7_o.jpg 3420966709_28414527f2_o.jpg 0.0038964985132217407 100 | 3784107745_51085d9217_o.jpg 345764148_deca30defb_o.jpg 0.80062670378685 101 | 2993590526_58b68a78dc_o.jpg 2979310998_d8ca252e5d_o.jpg 0.0 102 | 3551513323_0e3a6a5d06_o.jpg 312464707_de3b29b309_o.jpg 0.0 103 | 2972304330_688c362199_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.5578538478434086 104 | 1404148060_a7b4168ba7_o.jpg 166617667_bff1bba0b9_o.jpg 0.0 105 | 1860570086_47ad17e15e_o.jpg 1356845356_e1e060a853_o.jpg 0.0 106 | 464558681_f3eac58f21_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0 107 | 302068464_7069d2769f_o.jpg 2862233520_a6835e9b83_o.jpg 0.0 108 | 1748268283_8eafa6ee14_o.jpg 519579959_471530a809_o.jpg 0.0 109 | 3807960365_3c0f71380b_o.jpg 2647278875_0f97443590_o.jpg 0.0 110 | 531067385_617531f27f_o.jpg 3489719852_c81414f425_o.jpg 0.0 111 | 2129800002_2a721cc8bc_o.jpg 2918094295_382c50af39_o.jpg 0.0 112 | 2972269700_9f294537c4_o.jpg 302068464_7069d2769f_o.jpg 0.0 113 | 2918094295_382c50af39_o.jpg 3386900381_13784078f8_o.jpg 0.0 114 | 1748268283_8eafa6ee14_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 115 | 3800495669_a1dfbe1455_o.jpg 1338975641_c11151605f_o.jpg 0.0 116 | 3454295605_ec7384d4d9_o.jpg 3784107745_51085d9217_o.jpg 0.0 117 | 2647278875_0f97443590_o.jpg 2712949061_462b394427_o.jpg 0.0 118 | 1748268283_8eafa6ee14_o.jpg 512510727_8b8e856101_o.jpg 0.0 119 | 768149130_e41b346ddc_o.jpg 2580670249_f882806951_o.jpg 0.00042101568579673766 120 | 3535626117_3b8604fc61_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 121 | 2485179814_14aec1e27c_o.jpg 224270391_aa1fbf020e_o.jpg 0.0 122 | 349388910_4c7785016f_o.jpg 3489719852_c81414f425_o.jpg 0.0 123 | 3489719852_c81414f425_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 124 | 1598798269_7b090fb565_o.jpg 312464707_de3b29b309_o.jpg 0.7213932724237442 125 | 3323445213_4e917d44ac_o.jpg 3623320231_3386b5458b_o.jpg 0.0 126 | 2972269700_9f294537c4_o.jpg 312464707_de3b29b309_o.jpg 0.7315335305333137 127 | 3800495669_a1dfbe1455_o.jpg 345764148_deca30defb_o.jpg 0.0 128 | 3528888375_3878a6c9e2_o.jpg 3292523267_3870c81e66_o.jpg 0.0 129 | 2286671923_740c8e0328_o.jpg 1598798269_7b090fb565_o.jpg 0.07386031916737557 130 | 2485179814_14aec1e27c_o.jpg 18372617_8da504a40e_o.jpg 0.43604271475672723 131 | 3801333240_6ddbdf6e81_o.jpg 3900594627_f595d4cbc9_o.jpg 0.7108541837453842 132 | 3420966709_28414527f2_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 133 | 3801333240_6ddbdf6e81_o.jpg 302068464_7069d2769f_o.jpg 0.0 134 | 2347986891_865f87fa93_o.jpg 312464707_de3b29b309_o.jpg 0.0 135 | 2061831653_df26671ce4_o.jpg 2686020433_5237099cdb_o.jpg 0.0 136 | 453223587_3f5bb0154d_o.jpg 2720268280_0052b37cae_o.jpg 0.13470103293061256 137 | 3420966709_28414527f2_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 138 | 2966947703_1aeb9cc87b_o.jpg 2580670249_f882806951_o.jpg 0.01445571300983429 139 | 2130191931_ca7060a558_o.jpg 1356845356_e1e060a853_o.jpg 0.0 140 | 3536482052_d59a9f7ea2_o.jpg 2286671923_740c8e0328_o.jpg 0.0 141 | 3618477197_afef2dcea9_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 142 | 3292523267_3870c81e66_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 143 | 2228360255_a5f8fec802_o.jpg 3805956430_d7625c8662_o.jpg 0.8000574177861214 144 | 18372617_8da504a40e_o.jpg 2686020433_5237099cdb_o.jpg 0.8446365349888801 145 | 2129800002_2a721cc8bc_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.005262485545873642 146 | 345780792_08afde7e99_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 147 | 2099875810_e57c1c4103_o.jpg 2972269700_9f294537c4_o.jpg 0.0 148 | 716626675_e573cb7804_o.jpg 2278368684_56d2294672_o.jpg 0.057724046128988266 149 | 3292523267_3870c81e66_o.jpg 475819303_b9bfef9bfb_o.jpg 0.7601781744122506 150 | 3666591632_c65eefc18b_o.jpg 2686020433_5237099cdb_o.jpg 0.0 151 | 2056631628_0ed19e7707_o.jpg 3666591632_c65eefc18b_o.jpg 0.0 152 | 345780792_08afde7e99_o.jpg 3309979889_e77ce06693_o.jpg 0.0 153 | 3807960365_3c0f71380b_o.jpg 519579959_471530a809_o.jpg 0.0 154 | 2228360255_a5f8fec802_o.jpg 373210474_d62250e4c0_o.jpg 0.8859476301312447 155 | 3292523267_3870c81e66_o.jpg 3180470984_4c22581f2c_o.jpg 0.0 156 | 3323445213_4e917d44ac_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 157 | 3007780778_b4003c7f5f_o.jpg 453223587_3f5bb0154d_o.jpg 0.001282287347316742 158 | 768149130_e41b346ddc_o.jpg 2347986891_865f87fa93_o.jpg 0.0 159 | 3420966709_28414527f2_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0 160 | 716665111_132d21abd2_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 161 | 2099875810_e57c1c4103_o.jpg 2580670249_f882806951_o.jpg 0.0 162 | 3528888375_3878a6c9e2_o.jpg 1257429089_2be4fc4020_o.jpg 0.0 163 | 3309979889_e77ce06693_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 164 | 3180470984_4c22581f2c_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 165 | 3403308203_9f6a08490d_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0 166 | 3801333240_6ddbdf6e81_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 167 | 3801333240_6ddbdf6e81_o.jpg 2278368684_56d2294672_o.jpg 0.0 168 | 716665111_132d21abd2_o.jpg 302068464_7069d2769f_o.jpg 0.0 169 | 3623320231_3386b5458b_o.jpg 2278368684_56d2294672_o.jpg 0.2862644623458385 170 | 3807960365_3c0f71380b_o.jpg 2764108983_c2dedc42ed_o.jpg 0.018306656807661057 171 | 285107588_1f76167079_o.jpg 2158032873_3547d6763e_o.jpg 0.0 172 | 1338975641_c11151605f_o.jpg 3292523267_3870c81e66_o.jpg 0.0 173 | 295420273_8404ccb2a8_o.jpg 453223587_3f5bb0154d_o.jpg 0.0 174 | 716665111_132d21abd2_o.jpg 312464707_de3b29b309_o.jpg 0.0 175 | 2972304330_688c362199_o.jpg 3180470984_4c22581f2c_o.jpg 0.0 176 | 295420273_8404ccb2a8_o.jpg 349388910_4c7785016f_o.jpg 0.0 177 | 3801333240_6ddbdf6e81_o.jpg 3180470984_4c22581f2c_o.jpg 0.0 178 | 3386900381_13784078f8_o.jpg 2061831653_df26671ce4_o.jpg 0.0 179 | 2630908591_808f1d065b_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.006240905559062958 180 | 18372617_8da504a40e_o.jpg 3489719852_c81414f425_o.jpg 0.0 181 | 2951554821_ed6a73b1cd_o.jpg 2630908591_808f1d065b_o.jpg 0.0008811409592628478 182 | 2636009691_5aac8b1a15_o.jpg 2129800002_2a721cc8bc_o.jpg 0.0 183 | 3807960365_3c0f71380b_o.jpg 2647278875_0f97443590_o.jpg 0.0 184 | 531067385_617531f27f_o.jpg 2286669485_83c29403d7_o.jpg 0.4520085196316242 185 | 3800495669_a1dfbe1455_o.jpg 475819303_b9bfef9bfb_o.jpg 0.0 186 | 3528888375_3878a6c9e2_o.jpg 2993590526_58b68a78dc_o.jpg 0.0 187 | 385698393_baf7b40f70_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 188 | 3536482052_d59a9f7ea2_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 189 | 3440840638_cc41f14d43_o.jpg 531067385_617531f27f_o.jpg 0.0 190 | 3323445213_4e917d44ac_o.jpg 3900594627_f595d4cbc9_o.jpg 0.0 191 | 3618477197_afef2dcea9_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 192 | 2061831653_df26671ce4_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 193 | 3489719852_c81414f425_o.jpg 2099875810_e57c1c4103_o.jpg 0.0 194 | 768149130_e41b346ddc_o.jpg 18372617_8da504a40e_o.jpg 0.0 195 | 3440840638_cc41f14d43_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 196 | 2764108983_c2dedc42ed_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.005408281677961349 197 | 3900594627_f595d4cbc9_o.jpg 519579959_471530a809_o.jpg 0.0 198 | 1860570086_47ad17e15e_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 199 | 1338975641_c11151605f_o.jpg 2630908591_808f1d065b_o.jpg 0.0 200 | 2278368684_56d2294672_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 201 | 3618477197_afef2dcea9_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 202 | 512510727_8b8e856101_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0 203 | 375089040_0e23a22a30_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.0 204 | 2099875810_e57c1c4103_o.jpg 2347986891_865f87fa93_o.jpg 0.0 205 | 1404148060_a7b4168ba7_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 206 | 224270391_aa1fbf020e_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.0 207 | 318866989_d3ff85a4d9_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 208 | 531067385_617531f27f_o.jpg 345780792_08afde7e99_o.jpg 0.005282918232679367 209 | 312464707_de3b29b309_o.jpg 3107227785_6c0c05da0d_o.jpg 0.0 210 | 3784107745_51085d9217_o.jpg 1598798269_7b090fb565_o.jpg 0.0 211 | 2061831653_df26671ce4_o.jpg 2286669485_83c29403d7_o.jpg 0.0 212 | 3800495669_a1dfbe1455_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 213 | 1356845356_e1e060a853_o.jpg 342365448_b40e395c36_o.jpg 0.0 214 | 2966947703_1aeb9cc87b_o.jpg 285107588_1f76167079_o.jpg 0.0 215 | 3551513323_0e3a6a5d06_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 216 | 3784928602_cb81f6a511_o.jpg 342365448_b40e395c36_o.jpg 0.8490014448881149 217 | 3807960365_3c0f71380b_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 218 | 302068464_7069d2769f_o.jpg 2286669485_83c29403d7_o.jpg 0.2304685360610485 219 | 3420966709_28414527f2_o.jpg 373210474_d62250e4c0_o.jpg 0.8164365108191967 220 | 2918094295_382c50af39_o.jpg 2972269700_9f294537c4_o.jpg 0.0 221 | 318865108_b36f72679d_o.jpg 3623320231_3386b5458b_o.jpg 0.0 222 | 302068464_7069d2769f_o.jpg 3292523267_3870c81e66_o.jpg 0.0 223 | 3178037569_1801bdda20_o.jpg 2647278875_0f97443590_o.jpg 0.0 224 | 3403308203_9f6a08490d_o.jpg 498689813_74a9ffac6f_o.jpg 0.0 225 | 716665111_132d21abd2_o.jpg 3420966709_28414527f2_o.jpg 0.0 226 | 3535626117_3b8604fc61_o.jpg 3107227785_6c0c05da0d_o.jpg 0.0 227 | 2972269700_9f294537c4_o.jpg 295420273_8404ccb2a8_o.jpg 0.0 228 | 3293053485_8ae3eb6740_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 229 | 2636009691_5aac8b1a15_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.0 230 | 375089040_0e23a22a30_o.jpg 475819303_b9bfef9bfb_o.jpg 0.0 231 | 2764108983_c2dedc42ed_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 232 | 1356845356_e1e060a853_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 233 | 2129800002_2a721cc8bc_o.jpg 2228360255_a5f8fec802_o.jpg 0.41234635615348814 234 | 2959179552_7b79b2100f_o.jpg 373210474_d62250e4c0_o.jpg 0.007944332844018936 235 | 2712949061_462b394427_o.jpg 768149130_e41b346ddc_o.jpg 0.0007808051645755768 236 | 2959179552_7b79b2100f_o.jpg 3386900381_13784078f8_o.jpg 0.0 237 | 512510727_8b8e856101_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 238 | 3323445213_4e917d44ac_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0 239 | 2712949061_462b394427_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 240 | 2764108983_c2dedc42ed_o.jpg 166617667_bff1bba0b9_o.jpg 0.030574660897254944 241 | 2979310998_d8ca252e5d_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.0 242 | 512510727_8b8e856101_o.jpg 2959179552_7b79b2100f_o.jpg 0.0 243 | 349388910_4c7785016f_o.jpg 285107588_1f76167079_o.jpg 0.0 244 | 464558681_f3eac58f21_o.jpg 3618477197_afef2dcea9_o.jpg 0.040657686346769334 245 | 2862233520_a6835e9b83_o.jpg 2347986891_865f87fa93_o.jpg 0.0 246 | 2686020433_5237099cdb_o.jpg 3309979889_e77ce06693_o.jpg 0.0 247 | 1356845356_e1e060a853_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 248 | 2647278875_0f97443590_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0 249 | 2286671923_740c8e0328_o.jpg 3784928602_cb81f6a511_o.jpg 0.0 250 | 224270391_aa1fbf020e_o.jpg 2099875810_e57c1c4103_o.jpg 0.1561994428515434 251 | 2972304330_688c362199_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 252 | 285107588_1f76167079_o.jpg 2647278875_0f97443590_o.jpg 0.0 253 | 385698393_baf7b40f70_o.jpg 2286671923_740c8e0328_o.jpg 0.0 254 | 519579959_471530a809_o.jpg 3293053485_8ae3eb6740_o.jpg 0.00684533411860466 255 | 3292523267_3870c81e66_o.jpg 2577276677_e945f5b993_o.jpg 0.0 256 | 2972304330_688c362199_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0 257 | 295420273_8404ccb2a8_o.jpg 2979310998_d8ca252e5d_o.jpg 0.0 258 | 2972304330_688c362199_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 259 | 2972304330_688c362199_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 260 | 3180470984_4c22581f2c_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 261 | 2720268280_0052b37cae_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.1745019305586815 262 | 318866989_d3ff85a4d9_o.jpg 302068464_7069d2769f_o.jpg 0.0 263 | 3623320231_3386b5458b_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 264 | 3178037569_1801bdda20_o.jpg 498689813_74a9ffac6f_o.jpg 0.2591414264380932 265 | 475819303_b9bfef9bfb_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 266 | 166617667_bff1bba0b9_o.jpg 302068464_7069d2769f_o.jpg 0.0 267 | 3535626117_3b8604fc61_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.5086914979457855 268 | 2056631628_0ed19e7707_o.jpg 2972269700_9f294537c4_o.jpg 0.0 269 | 1091463641_4691abbe0f_o.jpg 318866989_d3ff85a4d9_o.jpg 0.0 270 | 1598798269_7b090fb565_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.0 271 | 2130191931_ca7060a558_o.jpg 2129800002_2a721cc8bc_o.jpg 0.0 272 | 2979310998_d8ca252e5d_o.jpg 3420966709_28414527f2_o.jpg 0.0 273 | 475819303_b9bfef9bfb_o.jpg 768149130_e41b346ddc_o.jpg 0.0037328985929489136 274 | 2647278875_0f97443590_o.jpg 531067385_617531f27f_o.jpg 0.0 275 | 519579959_471530a809_o.jpg 2686020433_5237099cdb_o.jpg 0.0 276 | 2580670249_f882806951_o.jpg 2278368684_56d2294672_o.jpg 0.0 277 | 342365448_b40e395c36_o.jpg 312464707_de3b29b309_o.jpg 0.31914645063877106 278 | 3801333240_6ddbdf6e81_o.jpg 2228360255_a5f8fec802_o.jpg 0.33729435105919836 279 | 453223587_3f5bb0154d_o.jpg 342365448_b40e395c36_o.jpg 0.002517150777578354 280 | 3454295605_ec7384d4d9_o.jpg 3784107745_51085d9217_o.jpg 0.0 281 | 3420966709_28414527f2_o.jpg 3630531747_635abe7af4_o.jpg 0.0 282 | 373210474_d62250e4c0_o.jpg 18372617_8da504a40e_o.jpg 0.06250462474226952 283 | 3630531747_635abe7af4_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 284 | 3801333240_6ddbdf6e81_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 285 | 2286669485_83c29403d7_o.jpg 3420966709_28414527f2_o.jpg 0.0038887041330337526 286 | 3440840638_cc41f14d43_o.jpg 3454295605_ec7384d4d9_o.jpg 0.6937735131621361 287 | 345764148_deca30defb_o.jpg 2647278875_0f97443590_o.jpg 0.06829817742109298 288 | 3203946708_949ef8c21e_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 289 | 1091463641_4691abbe0f_o.jpg 345780792_08afde7e99_o.jpg 0.0 290 | 373210474_d62250e4c0_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 291 | 342365448_b40e395c36_o.jpg 3900594627_f595d4cbc9_o.jpg 0.8617766308665276 292 | 3489719852_c81414f425_o.jpg 2580670249_f882806951_o.jpg 0.0008443430304527282 293 | 3178037569_1801bdda20_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 294 | 2979310998_d8ca252e5d_o.jpg 2278368684_56d2294672_o.jpg 0.0 295 | 224270391_aa1fbf020e_o.jpg 385698393_baf7b40f70_o.jpg 0.0 296 | 2286669485_83c29403d7_o.jpg 2485179814_14aec1e27c_o.jpg 0.005488821297883987 297 | 1356845356_e1e060a853_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 298 | 3391388615_9dfebe6e3d_o.jpg 1598798269_7b090fb565_o.jpg 0.0 299 | 3800495669_a1dfbe1455_o.jpg 519579959_471530a809_o.jpg 0.0 300 | 3007780778_b4003c7f5f_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.0037948274493217467 301 | 342365448_b40e395c36_o.jpg 2286669485_83c29403d7_o.jpg 0.0 302 | 302068464_7069d2769f_o.jpg 2979310998_d8ca252e5d_o.jpg 0.5521366333603859 303 | 1748268283_8eafa6ee14_o.jpg 3454295605_ec7384d4d9_o.jpg 0.3514952518284321 304 | 2278368684_56d2294672_o.jpg 2918094295_382c50af39_o.jpg 0.0 305 | 1598798269_7b090fb565_o.jpg 519579959_471530a809_o.jpg 0.0 306 | 3807960365_3c0f71380b_o.jpg 498689813_74a9ffac6f_o.jpg 0.001526012271642685 307 | 2630908591_808f1d065b_o.jpg 2686020433_5237099cdb_o.jpg 0.8432335986435413 308 | 3440840638_cc41f14d43_o.jpg 2636009691_5aac8b1a15_o.jpg 0.0 309 | 498689813_74a9ffac6f_o.jpg 2712949061_462b394427_o.jpg 0.0 310 | 2056631628_0ed19e7707_o.jpg 318866989_d3ff85a4d9_o.jpg 0.0 311 | 224270391_aa1fbf020e_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 312 | 3107227785_6c0c05da0d_o.jpg 716665111_132d21abd2_o.jpg 0.0 313 | 2228360255_a5f8fec802_o.jpg 342365448_b40e395c36_o.jpg 0.914201577025652 314 | 2862233520_a6835e9b83_o.jpg 3807960365_3c0f71380b_o.jpg 0.06973436483740807 315 | 3178037569_1801bdda20_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 316 | 3630531747_635abe7af4_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 317 | 3528888375_3878a6c9e2_o.jpg 512510727_8b8e856101_o.jpg 0.0 318 | 2951554821_ed6a73b1cd_o.jpg 385698393_baf7b40f70_o.jpg 0.0 319 | 345764148_deca30defb_o.jpg 3630531747_635abe7af4_o.jpg 0.0 320 | 3403308203_9f6a08490d_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 321 | 475819303_b9bfef9bfb_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.0 322 | 3403308203_9f6a08490d_o.jpg 2712949061_462b394427_o.jpg 0.0 323 | 1860570086_47ad17e15e_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 324 | 2712949061_462b394427_o.jpg 2129800002_2a721cc8bc_o.jpg 0.0 325 | 519579959_471530a809_o.jpg 345780792_08afde7e99_o.jpg 0.0 326 | 3805956430_d7625c8662_o.jpg 2129800002_2a721cc8bc_o.jpg 0.6280206957697868 327 | 498689813_74a9ffac6f_o.jpg 3784928602_cb81f6a511_o.jpg 0.0 328 | 3323445213_4e917d44ac_o.jpg 302068464_7069d2769f_o.jpg 0.003711585235595703 329 | 3391388615_9dfebe6e3d_o.jpg 3292523267_3870c81e66_o.jpg 0.0 330 | 2577276677_e945f5b993_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 331 | 318866989_d3ff85a4d9_o.jpg 1598798269_7b090fb565_o.jpg 0.0 332 | 2993590526_58b68a78dc_o.jpg 3630531747_635abe7af4_o.jpg 0.0 333 | 1860570086_47ad17e15e_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 334 | 453223587_3f5bb0154d_o.jpg 3900594627_f595d4cbc9_o.jpg 0.005684445708990097 335 | 453223587_3f5bb0154d_o.jpg 1338975641_c11151605f_o.jpg 0.04388181531429291 336 | 3489719852_c81414f425_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.5610332631409168 337 | 3900594627_f595d4cbc9_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 338 | 2712949061_462b394427_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0010928134858608247 339 | 2485179814_14aec1e27c_o.jpg 2278368684_56d2294672_o.jpg 0.0 340 | 512510727_8b8e856101_o.jpg 3784107745_51085d9217_o.jpg 0.0 341 | 519579959_471530a809_o.jpg 224270391_aa1fbf020e_o.jpg 0.16642390279769897 342 | 1748268283_8eafa6ee14_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 343 | 716665111_132d21abd2_o.jpg 475819303_b9bfef9bfb_o.jpg 0.0 344 | 3807960365_3c0f71380b_o.jpg 3309979889_e77ce06693_o.jpg 0.0 345 | 385698393_baf7b40f70_o.jpg 512510727_8b8e856101_o.jpg 0.0 346 | 295420273_8404ccb2a8_o.jpg 512510727_8b8e856101_o.jpg 0.0 347 | 2686020433_5237099cdb_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.6415262836575508 348 | 1598798269_7b090fb565_o.jpg 375089040_0e23a22a30_o.jpg 0.0 349 | 349388910_4c7785016f_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 350 | 3535626117_3b8604fc61_o.jpg 2286671923_740c8e0328_o.jpg 0.0 351 | 2286669485_83c29403d7_o.jpg 2972269700_9f294537c4_o.jpg 0.0 352 | 18372617_8da504a40e_o.jpg 2959179552_7b79b2100f_o.jpg 0.0 353 | 3292523267_3870c81e66_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 354 | 3535626117_3b8604fc61_o.jpg 519579959_471530a809_o.jpg 0.0 355 | 18372617_8da504a40e_o.jpg 2647278875_0f97443590_o.jpg 0.2719385242283344 356 | 498689813_74a9ffac6f_o.jpg 3323445213_4e917d44ac_o.jpg 0.0041030026197433475 357 | 166617667_bff1bba0b9_o.jpg 3900594627_f595d4cbc9_o.jpg 0.1451507729291916 358 | 2764108983_c2dedc42ed_o.jpg 166617667_bff1bba0b9_o.jpg 0.03052754955291748 359 | 716665111_132d21abd2_o.jpg 302068464_7069d2769f_o.jpg 0.0 360 | 3800495669_a1dfbe1455_o.jpg 3386900381_13784078f8_o.jpg 0.0 361 | 3293053485_8ae3eb6740_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.0 362 | 302068464_7069d2769f_o.jpg 464558681_f3eac58f21_o.jpg 0.0 363 | 2959179552_7b79b2100f_o.jpg 3489719852_c81414f425_o.jpg 0.0001906917095184326 364 | 3630531747_635abe7af4_o.jpg 1338975641_c11151605f_o.jpg 0.0 365 | 2286671923_740c8e0328_o.jpg 3178037569_1801bdda20_o.jpg 0.0006567967176437378 366 | 349388910_4c7785016f_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 367 | 3623320231_3386b5458b_o.jpg 3784928602_cb81f6a511_o.jpg 0.0 368 | 3292523267_3870c81e66_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 369 | 3528888375_3878a6c9e2_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0 370 | 2577276677_e945f5b993_o.jpg 1338975641_c11151605f_o.jpg 0.0 371 | 2636009691_5aac8b1a15_o.jpg 2099875810_e57c1c4103_o.jpg 0.0 372 | 2286669485_83c29403d7_o.jpg 3807960365_3c0f71380b_o.jpg 0.0010727742493152619 373 | 2485179814_14aec1e27c_o.jpg 2580670249_f882806951_o.jpg 0.01115037499666214 374 | 2862233520_a6835e9b83_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.0 375 | 1748268283_8eafa6ee14_o.jpg 318866989_d3ff85a4d9_o.jpg 0.0 376 | 349388910_4c7785016f_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 377 | 3487933880_3b2d286d74_o.jpg 3784928602_cb81f6a511_o.jpg 0.0 378 | 716626675_e573cb7804_o.jpg 3666591632_c65eefc18b_o.jpg 0.0 379 | 2485179814_14aec1e27c_o.jpg 18372617_8da504a40e_o.jpg 0.42605226586461065 380 | 2647278875_0f97443590_o.jpg 2158032873_3547d6763e_o.jpg 0.0 381 | 3801333240_6ddbdf6e81_o.jpg 2278368684_56d2294672_o.jpg 0.0 382 | 3805956430_d7625c8662_o.jpg 295420273_8404ccb2a8_o.jpg 0.0 383 | 2959179552_7b79b2100f_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 384 | 3784928602_cb81f6a511_o.jpg 2712949061_462b394427_o.jpg 0.0 385 | 2099875810_e57c1c4103_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 386 | 3536482052_d59a9f7ea2_o.jpg 2580670249_f882806951_o.jpg 0.0 387 | 18372617_8da504a40e_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 388 | 2993590526_58b68a78dc_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 389 | 349388910_4c7785016f_o.jpg 716626675_e573cb7804_o.jpg 0.0 390 | 285107588_1f76167079_o.jpg 1356845356_e1e060a853_o.jpg 0.0 391 | 3323445213_4e917d44ac_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.00012489839792251587 392 | 3805956430_d7625c8662_o.jpg 302068464_7069d2769f_o.jpg 0.0 393 | 3178037569_1801bdda20_o.jpg 3900594627_f595d4cbc9_o.jpg 0.0 394 | 318865108_b36f72679d_o.jpg 3489719852_c81414f425_o.jpg 0.0 395 | 2918094295_382c50af39_o.jpg 2158032873_3547d6763e_o.jpg 0.6311463782966137 396 | 2907341741_64cd58ba8c_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0 397 | 2712949061_462b394427_o.jpg 285107588_1f76167079_o.jpg 0.0 398 | 2959179552_7b79b2100f_o.jpg 3489719852_c81414f425_o.jpg 0.0 399 | 2712949061_462b394427_o.jpg 345764148_deca30defb_o.jpg 0.06397871891260147 400 | 498689813_74a9ffac6f_o.jpg 345764148_deca30defb_o.jpg 0.0018667352616786956 401 | 531067385_617531f27f_o.jpg 166617667_bff1bba0b9_o.jpg 0.0 402 | 2972304330_688c362199_o.jpg 3323445213_4e917d44ac_o.jpg 0.0 403 | 3420966709_28414527f2_o.jpg 2862233520_a6835e9b83_o.jpg 0.0 404 | 2712949061_462b394427_o.jpg 302068464_7069d2769f_o.jpg 0.0 405 | 18372617_8da504a40e_o.jpg 3420966709_28414527f2_o.jpg 0.0 406 | 2130191931_ca7060a558_o.jpg 373210474_d62250e4c0_o.jpg 0.0025851520419120787 407 | 498689813_74a9ffac6f_o.jpg 345764148_deca30defb_o.jpg 0.0002686334013938904 408 | 2580670249_f882806951_o.jpg 475819303_b9bfef9bfb_o.jpg 0.008913436460494995 409 | 18372617_8da504a40e_o.jpg 519579959_471530a809_o.jpg 0.0 410 | 1356845356_e1e060a853_o.jpg 2918094295_382c50af39_o.jpg 0.0007919005036354065 411 | 2129800002_2a721cc8bc_o.jpg 373210474_d62250e4c0_o.jpg 0.7771030449330807 412 | 3551513323_0e3a6a5d06_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 413 | 1404148060_a7b4168ba7_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 414 | 2712949061_462b394427_o.jpg 3784107745_51085d9217_o.jpg 0.0 415 | 498689813_74a9ffac6f_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.0 416 | 312464707_de3b29b309_o.jpg 3292523267_3870c81e66_o.jpg 0.039711709570884705 417 | 3801333240_6ddbdf6e81_o.jpg 2228360255_a5f8fec802_o.jpg 0.3251363627672195 418 | 768149130_e41b346ddc_o.jpg 2485179814_14aec1e27c_o.jpg 0.0 419 | 3178037569_1801bdda20_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 420 | 3403308203_9f6a08490d_o.jpg 3178037569_1801bdda20_o.jpg 0.0 421 | 3536482052_d59a9f7ea2_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 422 | 2099875810_e57c1c4103_o.jpg 2636009691_5aac8b1a15_o.jpg 0.0 423 | 295420273_8404ccb2a8_o.jpg 2580670249_f882806951_o.jpg 0.0 424 | 318865108_b36f72679d_o.jpg 342365448_b40e395c36_o.jpg 0.0 425 | 498689813_74a9ffac6f_o.jpg 318865108_b36f72679d_o.jpg 8.30379068851471e-05 426 | 2485179814_14aec1e27c_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 427 | 3900594627_f595d4cbc9_o.jpg 1860570086_47ad17e15e_o.jpg 0.0 428 | 498689813_74a9ffac6f_o.jpg 2972269700_9f294537c4_o.jpg 0.0 429 | 1356845356_e1e060a853_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 430 | 3107227785_6c0c05da0d_o.jpg 349388910_4c7785016f_o.jpg 0.004006957256793976 431 | 1404148060_a7b4168ba7_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 432 | 3323445213_4e917d44ac_o.jpg 2577276677_e945f5b993_o.jpg 0.00018931355476379394 433 | 345780792_08afde7e99_o.jpg 2686020433_5237099cdb_o.jpg 0.0 434 | 2099875810_e57c1c4103_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.3709024906218052 435 | 2485179814_14aec1e27c_o.jpg 2993590526_58b68a78dc_o.jpg 0.09561065515875816 436 | 2972269700_9f294537c4_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 437 | 512510727_8b8e856101_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 438 | 349388910_4c7785016f_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 439 | 2464337916_1c8a62e0cb_o.jpg 373210474_d62250e4c0_o.jpg 0.23840650346875192 440 | 3800495669_a1dfbe1455_o.jpg 3535626117_3b8604fc61_o.jpg 0.0 441 | 3420966709_28414527f2_o.jpg 1356845356_e1e060a853_o.jpg 0.0 442 | 3454295605_ec7384d4d9_o.jpg 531067385_617531f27f_o.jpg 0.19796198965311051 443 | 1748268283_8eafa6ee14_o.jpg 2061831653_df26671ce4_o.jpg 0.006893355119228363 444 | 3203946708_949ef8c21e_o.jpg 2580670249_f882806951_o.jpg 0.0 445 | 2099875810_e57c1c4103_o.jpg 3807960365_3c0f71380b_o.jpg 0.01300714566707611 446 | 2099875810_e57c1c4103_o.jpg 3784928602_cb81f6a511_o.jpg 0.0 447 | 716626675_e573cb7804_o.jpg 385698393_baf7b40f70_o.jpg 0.06018342761397362 448 | 1356845356_e1e060a853_o.jpg 342365448_b40e395c36_o.jpg 0.0 449 | 3900594627_f595d4cbc9_o.jpg 1860570086_47ad17e15e_o.jpg 0.0 450 | 345764148_deca30defb_o.jpg 3420966709_28414527f2_o.jpg 0.05520608845353127 451 | 512510727_8b8e856101_o.jpg 453223587_3f5bb0154d_o.jpg 0.0 452 | 373210474_d62250e4c0_o.jpg 519579959_471530a809_o.jpg 0.0008355585932731628 453 | 2966947703_1aeb9cc87b_o.jpg 464558681_f3eac58f21_o.jpg 0.23352707921266555 454 | 2959179552_7b79b2100f_o.jpg 2907341741_64cd58ba8c_o.jpg 0.16957761645317077 455 | 285107588_1f76167079_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.0 456 | 2228360255_a5f8fec802_o.jpg 3805956430_d7625c8662_o.jpg 0.7905950558662415 457 | 3501592474_cd87e1a6b8_o.jpg 2347986891_865f87fa93_o.jpg 0.0 458 | 512510727_8b8e856101_o.jpg 464558681_f3eac58f21_o.jpg 0.0 459 | 385698393_baf7b40f70_o.jpg 312464707_de3b29b309_o.jpg 0.0 460 | 3630531747_635abe7af4_o.jpg 2712949061_462b394427_o.jpg 0.0 461 | 1860570086_47ad17e15e_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0869931566298008 462 | 3900594627_f595d4cbc9_o.jpg 342365448_b40e395c36_o.jpg 0.32904318440556524 463 | 3630531747_635abe7af4_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 464 | 512510727_8b8e856101_o.jpg 2712949061_462b394427_o.jpg 0.0 465 | 716626675_e573cb7804_o.jpg 2130191931_ca7060a558_o.jpg 0.11959625448584557 466 | 2347986891_865f87fa93_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 467 | 2228360255_a5f8fec802_o.jpg 2712949061_462b394427_o.jpg 0.0 468 | 312464707_de3b29b309_o.jpg 2647278875_0f97443590_o.jpg 0.0024016589045524595 469 | 1257429089_2be4fc4020_o.jpg 453223587_3f5bb0154d_o.jpg 0.11782263954281808 470 | 3805956430_d7625c8662_o.jpg 2278368684_56d2294672_o.jpg 0.0 471 | 3800495669_a1dfbe1455_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.0 472 | 475819303_b9bfef9bfb_o.jpg 345780792_08afde7e99_o.jpg 0.0 473 | 3623320231_3386b5458b_o.jpg 2907341741_64cd58ba8c_o.jpg 0.14886252372264863 474 | 3418896579_a73ba6c13e_o.jpg 2099875810_e57c1c4103_o.jpg 0.0 475 | 3391388615_9dfebe6e3d_o.jpg 1598798269_7b090fb565_o.jpg 0.0 476 | 3551513323_0e3a6a5d06_o.jpg 18372617_8da504a40e_o.jpg 0.0 477 | 3528888375_3878a6c9e2_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 478 | 349388910_4c7785016f_o.jpg 2129800002_2a721cc8bc_o.jpg 0.0 479 | 3293053485_8ae3eb6740_o.jpg 2862233520_a6835e9b83_o.jpg 0.21433797534108162 480 | 224270391_aa1fbf020e_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 481 | 3536482052_d59a9f7ea2_o.jpg 1860570086_47ad17e15e_o.jpg 0.0 482 | 224270391_aa1fbf020e_o.jpg 345764148_deca30defb_o.jpg 0.0 483 | 531067385_617531f27f_o.jpg 18372617_8da504a40e_o.jpg 0.0 484 | 2130191931_ca7060a558_o.jpg 3528888375_3878a6c9e2_o.jpg 0.0007752146244049072 485 | 2286669485_83c29403d7_o.jpg 18372617_8da504a40e_o.jpg 0.0 486 | 3800495669_a1dfbe1455_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 487 | 1860570086_47ad17e15e_o.jpg 2918094295_382c50af39_o.jpg 0.0 488 | 295420273_8404ccb2a8_o.jpg 302068464_7069d2769f_o.jpg 0.0 489 | 318865108_b36f72679d_o.jpg 2099875810_e57c1c4103_o.jpg 0.0 490 | 345780792_08afde7e99_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0007356326580047608 491 | 2129800002_2a721cc8bc_o.jpg 345780792_08afde7e99_o.jpg 0.0 492 | 2580670249_f882806951_o.jpg 2129800002_2a721cc8bc_o.jpg 0.0 493 | 2966947703_1aeb9cc87b_o.jpg 2764108983_c2dedc42ed_o.jpg 0.0032363579750061037 494 | 3293053485_8ae3eb6740_o.jpg 342365448_b40e395c36_o.jpg 0.0 495 | 2286671923_740c8e0328_o.jpg 498689813_74a9ffac6f_o.jpg 0.0 496 | 2686020433_5237099cdb_o.jpg 2862233520_a6835e9b83_o.jpg 0.0 497 | 3489719852_c81414f425_o.jpg 3007780778_b4003c7f5f_o.jpg 0.23576879432201386 498 | 2636009691_5aac8b1a15_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 499 | 2464337916_1c8a62e0cb_o.jpg 3489719852_c81414f425_o.jpg 0.004603218632936478 500 | 3292523267_3870c81e66_o.jpg 3666591632_c65eefc18b_o.jpg 0.0 501 | 3630531747_635abe7af4_o.jpg 3489719852_c81414f425_o.jpg 0.0 502 | 3386900381_13784078f8_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 503 | 3440840638_cc41f14d43_o.jpg 2286669485_83c29403d7_o.jpg 0.4659408863663673 504 | 2966947703_1aeb9cc87b_o.jpg 2636009691_5aac8b1a15_o.jpg 0.11919308517575264 505 | 1748268283_8eafa6ee14_o.jpg 2972269700_9f294537c4_o.jpg 0.0 506 | 3487933880_3b2d286d74_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0320604882478714 507 | 2918094295_382c50af39_o.jpg 3386900381_13784078f8_o.jpg 0.0 508 | 3292523267_3870c81e66_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 509 | 375089040_0e23a22a30_o.jpg 2918094295_382c50af39_o.jpg 0.0 510 | 3501592474_cd87e1a6b8_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.010590382206439972 511 | 3900594627_f595d4cbc9_o.jpg 3107227785_6c0c05da0d_o.jpg 0.0 512 | 3489719852_c81414f425_o.jpg 2720268280_0052b37cae_o.jpg 0.004766811174154281 513 | 519579959_471530a809_o.jpg 2918094295_382c50af39_o.jpg 0.0 514 | 3391388615_9dfebe6e3d_o.jpg 302068464_7069d2769f_o.jpg 0.0 515 | 302068464_7069d2769f_o.jpg 3623320231_3386b5458b_o.jpg 0.0 516 | 2993590526_58b68a78dc_o.jpg 1860570086_47ad17e15e_o.jpg 0.0 517 | 385698393_baf7b40f70_o.jpg 768149130_e41b346ddc_o.jpg 0.0 518 | 3807960365_3c0f71380b_o.jpg 1404148060_a7b4168ba7_o.jpg 0.2381197080850601 519 | 3535626117_3b8604fc61_o.jpg 2630908591_808f1d065b_o.jpg 0.2502602506697178 520 | 2286669485_83c29403d7_o.jpg 342365448_b40e395c36_o.jpg 0.0 521 | 3551513323_0e3a6a5d06_o.jpg 3805956430_d7625c8662_o.jpg 0.0 522 | 3630531747_635abe7af4_o.jpg 3900594627_f595d4cbc9_o.jpg 0.0 523 | 3178037569_1801bdda20_o.jpg 453223587_3f5bb0154d_o.jpg 0.03092449100613594 524 | 2228360255_a5f8fec802_o.jpg 373210474_d62250e4c0_o.jpg 0.8902545113682747 525 | 2647278875_0f97443590_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 526 | 3440840638_cc41f14d43_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 527 | 3536482052_d59a9f7ea2_o.jpg 3420966709_28414527f2_o.jpg 0.0 528 | 3107227785_6c0c05da0d_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 529 | 2907341741_64cd58ba8c_o.jpg 2979310998_d8ca252e5d_o.jpg 0.0 530 | 385698393_baf7b40f70_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 531 | 2464337916_1c8a62e0cb_o.jpg 2580670249_f882806951_o.jpg 0.26898979998826983 532 | 2636009691_5aac8b1a15_o.jpg 2686020433_5237099cdb_o.jpg 0.053341514825820925 533 | 2099875810_e57c1c4103_o.jpg 3180470984_4c22581f2c_o.jpg 0.0 534 | 342365448_b40e395c36_o.jpg 3623320231_3386b5458b_o.jpg 0.0 535 | 1257429089_2be4fc4020_o.jpg 3178037569_1801bdda20_o.jpg 0.0057441042304039 536 | 2129800002_2a721cc8bc_o.jpg 1860570086_47ad17e15e_o.jpg 0.0 537 | 2485179814_14aec1e27c_o.jpg 2993590526_58b68a78dc_o.jpg 0.100592645829916 538 | 3386900381_13784078f8_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 539 | 3501592474_cd87e1a6b8_o.jpg 2636009691_5aac8b1a15_o.jpg 0.0 540 | 2286669485_83c29403d7_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 541 | 3418896579_a73ba6c13e_o.jpg 2286669485_83c29403d7_o.jpg 0.7585629002511501 542 | 2972304330_688c362199_o.jpg 318865108_b36f72679d_o.jpg 0.0 543 | 2918094295_382c50af39_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.0 544 | 2764108983_c2dedc42ed_o.jpg 3403308203_9f6a08490d_o.jpg 0.0 545 | 2061831653_df26671ce4_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 546 | 453223587_3f5bb0154d_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.1520483616888523 547 | 3454295605_ec7384d4d9_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 548 | 1748268283_8eafa6ee14_o.jpg 2286669485_83c29403d7_o.jpg 0.1709605584859848 549 | 302068464_7069d2769f_o.jpg 3487933880_3b2d286d74_o.jpg 0.6885183228135109 550 | 345780792_08afde7e99_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 551 | 2979310998_d8ca252e5d_o.jpg 318865108_b36f72679d_o.jpg 0.0 552 | 2972304330_688c362199_o.jpg 464558681_f3eac58f21_o.jpg 0.19258424635529517 553 | 3178037569_1801bdda20_o.jpg 318865108_b36f72679d_o.jpg 0.0 554 | 3007780778_b4003c7f5f_o.jpg 464558681_f3eac58f21_o.jpg 0.0 555 | 318866989_d3ff85a4d9_o.jpg 3180470984_4c22581f2c_o.jpg 0.0 556 | 2907341741_64cd58ba8c_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.0 557 | 318865108_b36f72679d_o.jpg 18372617_8da504a40e_o.jpg 0.0 558 | 2966947703_1aeb9cc87b_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 559 | 2862233520_a6835e9b83_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.0 560 | 318865108_b36f72679d_o.jpg 3292523267_3870c81e66_o.jpg 0.0 561 | 453223587_3f5bb0154d_o.jpg 3386900381_13784078f8_o.jpg 0.0002222997784614563 562 | 2228360255_a5f8fec802_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 563 | 3623320231_3386b5458b_o.jpg 2907341741_64cd58ba8c_o.jpg 0.1437194643497467 564 | 1598798269_7b090fb565_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.0004447765946388245 565 | 224270391_aa1fbf020e_o.jpg 475819303_b9bfef9bfb_o.jpg 0.0 566 | 3784107745_51085d9217_o.jpg 1257429089_2be4fc4020_o.jpg 0.6325996918916702 567 | 2278368684_56d2294672_o.jpg 716665111_132d21abd2_o.jpg 0.0 568 | 2636009691_5aac8b1a15_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 569 | 3293053485_8ae3eb6740_o.jpg 2636009691_5aac8b1a15_o.jpg 0.0 570 | 3784928602_cb81f6a511_o.jpg 349388910_4c7785016f_o.jpg 0.0 571 | 2959179552_7b79b2100f_o.jpg 531067385_617531f27f_o.jpg 0.0 572 | 3440840638_cc41f14d43_o.jpg 2972304330_688c362199_o.jpg 0.0 573 | 166617667_bff1bba0b9_o.jpg 2130191931_ca7060a558_o.jpg 0.0005043574392795563 574 | 385698393_baf7b40f70_o.jpg 2993590526_58b68a78dc_o.jpg 0.0 575 | 3420966709_28414527f2_o.jpg 2862233520_a6835e9b83_o.jpg 0.0 576 | 3528888375_3878a6c9e2_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 577 | 3420966709_28414527f2_o.jpg 2686020433_5237099cdb_o.jpg 0.07190853788852691 578 | 2061831653_df26671ce4_o.jpg 3623320231_3386b5458b_o.jpg 0.0 579 | 2862233520_a6835e9b83_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 580 | 224270391_aa1fbf020e_o.jpg 2636009691_5aac8b1a15_o.jpg 0.0 581 | 3801333240_6ddbdf6e81_o.jpg 349388910_4c7785016f_o.jpg 0.0 582 | 345780792_08afde7e99_o.jpg 2979310998_d8ca252e5d_o.jpg 0.9114517893731594 583 | 2485179814_14aec1e27c_o.jpg 3805956430_d7625c8662_o.jpg 0.24961323605179786 584 | 3440840638_cc41f14d43_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0 585 | 3630531747_635abe7af4_o.jpg 3420966709_28414527f2_o.jpg 0.0 586 | 2056631628_0ed19e7707_o.jpg 3900594627_f595d4cbc9_o.jpg 0.6751144629955291 587 | 3630531747_635abe7af4_o.jpg 3323445213_4e917d44ac_o.jpg 0.0 588 | 345764148_deca30defb_o.jpg 3323445213_4e917d44ac_o.jpg 0.004527903586626053 589 | 716665111_132d21abd2_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 590 | 3487933880_3b2d286d74_o.jpg 2061831653_df26671ce4_o.jpg 0.0 591 | 3900594627_f595d4cbc9_o.jpg 716665111_132d21abd2_o.jpg 0.0 592 | 2099875810_e57c1c4103_o.jpg 2959179552_7b79b2100f_o.jpg 0.0 593 | 18372617_8da504a40e_o.jpg 1598798269_7b090fb565_o.jpg 0.024396399044990538 594 | 349388910_4c7785016f_o.jpg 2993590526_58b68a78dc_o.jpg 0.0 595 | 3178037569_1801bdda20_o.jpg 385698393_baf7b40f70_o.jpg 0.0 596 | 453223587_3f5bb0154d_o.jpg 2630908591_808f1d065b_o.jpg 0.0037131393373012545 597 | 3805956430_d7625c8662_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 598 | 312464707_de3b29b309_o.jpg 512510727_8b8e856101_o.jpg 0.0 599 | 342365448_b40e395c36_o.jpg 3618477197_afef2dcea9_o.jpg 0.04750334067344666 600 | 1091463641_4691abbe0f_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 601 | 2636009691_5aac8b1a15_o.jpg 3178037569_1801bdda20_o.jpg 0.0 602 | 375089040_0e23a22a30_o.jpg 3420966709_28414527f2_o.jpg 0.0 603 | 1338975641_c11151605f_o.jpg 2099875810_e57c1c4103_o.jpg 0.0 604 | 2286671923_740c8e0328_o.jpg 1257429089_2be4fc4020_o.jpg 0.0 605 | 2720268280_0052b37cae_o.jpg 2972304330_688c362199_o.jpg 0.01948280750513077 606 | 2907341741_64cd58ba8c_o.jpg 285107588_1f76167079_o.jpg 0.0 607 | 2580670249_f882806951_o.jpg 1091463641_4691abbe0f_o.jpg 0.5665419142365455 608 | 345780792_08afde7e99_o.jpg 2278368684_56d2294672_o.jpg 0.0 609 | 312464707_de3b29b309_o.jpg 3107227785_6c0c05da0d_o.jpg 0.0 610 | 285107588_1f76167079_o.jpg 2712949061_462b394427_o.jpg 0.0 611 | 318866989_d3ff85a4d9_o.jpg 285107588_1f76167079_o.jpg 0.0 612 | 3807960365_3c0f71380b_o.jpg 3623320231_3386b5458b_o.jpg 0.0 613 | 2862233520_a6835e9b83_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 614 | 2286669485_83c29403d7_o.jpg 18372617_8da504a40e_o.jpg 0.0 615 | 3666591632_c65eefc18b_o.jpg 342365448_b40e395c36_o.jpg 0.0 616 | 2972269700_9f294537c4_o.jpg 2056631628_0ed19e7707_o.jpg 0.0 617 | 3323445213_4e917d44ac_o.jpg 2130191931_ca7060a558_o.jpg 0.0 618 | 1091463641_4691abbe0f_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 619 | 3386900381_13784078f8_o.jpg 3309979889_e77ce06693_o.jpg 0.0 620 | 3420966709_28414527f2_o.jpg 3784928602_cb81f6a511_o.jpg 0.0 621 | 2056631628_0ed19e7707_o.jpg 2712949061_462b394427_o.jpg 0.0 622 | 2056631628_0ed19e7707_o.jpg 453223587_3f5bb0154d_o.jpg 0.05030328004956246 623 | 3178037569_1801bdda20_o.jpg 2686020433_5237099cdb_o.jpg 0.0 624 | 3309979889_e77ce06693_o.jpg 519579959_471530a809_o.jpg 0.0 625 | 2228360255_a5f8fec802_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 626 | 2278368684_56d2294672_o.jpg 3800495669_a1dfbe1455_o.jpg 0.0 627 | 2907341741_64cd58ba8c_o.jpg 475819303_b9bfef9bfb_o.jpg 0.8460605690538883 628 | 3807960365_3c0f71380b_o.jpg 3784107745_51085d9217_o.jpg 0.0 629 | 2686020433_5237099cdb_o.jpg 302068464_7069d2769f_o.jpg 0.0 630 | 2278368684_56d2294672_o.jpg 3618477197_afef2dcea9_o.jpg 0.0 631 | 3551513323_0e3a6a5d06_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.07468986857533455 632 | 318865108_b36f72679d_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 633 | 512510727_8b8e856101_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.0 634 | 464558681_f3eac58f21_o.jpg 285107588_1f76167079_o.jpg 0.0 635 | 375089040_0e23a22a30_o.jpg 2630908591_808f1d065b_o.jpg 0.0 636 | 2966947703_1aeb9cc87b_o.jpg 2972304330_688c362199_o.jpg 0.06861300481557846 637 | 302068464_7069d2769f_o.jpg 716626675_e573cb7804_o.jpg 0.0 638 | 519579959_471530a809_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 639 | 3784107745_51085d9217_o.jpg 2712949061_462b394427_o.jpg 0.0 640 | 3784928602_cb81f6a511_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 641 | 2286671923_740c8e0328_o.jpg 18372617_8da504a40e_o.jpg 0.0 642 | 1748268283_8eafa6ee14_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.0 643 | 3007780778_b4003c7f5f_o.jpg 2158032873_3547d6763e_o.jpg 0.0 644 | 3420966709_28414527f2_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 645 | 2720268280_0052b37cae_o.jpg 2647278875_0f97443590_o.jpg 0.020057866072654723 646 | 2577276677_e945f5b993_o.jpg 2636009691_5aac8b1a15_o.jpg 0.0020587633430957796 647 | 2347986891_865f87fa93_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 648 | 2972304330_688c362199_o.jpg 3323445213_4e917d44ac_o.jpg 0.0 649 | 2464337916_1c8a62e0cb_o.jpg 3501592474_cd87e1a6b8_o.jpg 0.018757592153549194 650 | 2099875810_e57c1c4103_o.jpg 2907341741_64cd58ba8c_o.jpg 0.0 651 | 2286671923_740c8e0328_o.jpg 373210474_d62250e4c0_o.jpg 0.17822739949822425 652 | 2464337916_1c8a62e0cb_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 653 | 2158032873_3547d6763e_o.jpg 2347986891_865f87fa93_o.jpg 0.0 654 | 2972269700_9f294537c4_o.jpg 3178037569_1801bdda20_o.jpg 0.07581141533255577 655 | 345780792_08afde7e99_o.jpg 295420273_8404ccb2a8_o.jpg 0.0 656 | 2577276677_e945f5b993_o.jpg 3807960365_3c0f71380b_o.jpg 0.0 657 | 2347986891_865f87fa93_o.jpg 2712949061_462b394427_o.jpg 0.0 658 | 2993590526_58b68a78dc_o.jpg 3454295605_ec7384d4d9_o.jpg 0.0 659 | 345764148_deca30defb_o.jpg 2630908591_808f1d065b_o.jpg 0.2778707804262638 660 | 3309979889_e77ce06693_o.jpg 3293053485_8ae3eb6740_o.jpg 0.0 661 | 3180470984_4c22581f2c_o.jpg 3309979889_e77ce06693_o.jpg 0.0 662 | 3487933880_3b2d286d74_o.jpg 2577276677_e945f5b993_o.jpg 0.0 663 | 285107588_1f76167079_o.jpg 2686020433_5237099cdb_o.jpg 0.0 664 | 3536482052_d59a9f7ea2_o.jpg 1404148060_a7b4168ba7_o.jpg 0.0 665 | 2972304330_688c362199_o.jpg 3536482052_d59a9f7ea2_o.jpg 0.0 666 | 3178037569_1801bdda20_o.jpg 1598798269_7b090fb565_o.jpg 0.018875074017047883 667 | 3487933880_3b2d286d74_o.jpg 531067385_617531f27f_o.jpg 0.764331930321455 668 | 3900594627_f595d4cbc9_o.jpg 716665111_132d21abd2_o.jpg 0.0 669 | 3536482052_d59a9f7ea2_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.0 670 | 349388910_4c7785016f_o.jpg 2630908591_808f1d065b_o.jpg 0.0 671 | 2464337916_1c8a62e0cb_o.jpg 3293053485_8ae3eb6740_o.jpg 0.0 672 | 2061831653_df26671ce4_o.jpg 3487933880_3b2d286d74_o.jpg 0.0 673 | 2347986891_865f87fa93_o.jpg 18372617_8da504a40e_o.jpg 0.0 674 | 373210474_d62250e4c0_o.jpg 2720268280_0052b37cae_o.jpg 0.08664631948471069 675 | 3666591632_c65eefc18b_o.jpg 2286669485_83c29403d7_o.jpg 0.0 676 | 3323445213_4e917d44ac_o.jpg 2577276677_e945f5b993_o.jpg 0.0 677 | 498689813_74a9ffac6f_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.0 678 | 2061831653_df26671ce4_o.jpg 318865108_b36f72679d_o.jpg 0.0 679 | 3107227785_6c0c05da0d_o.jpg 342365448_b40e395c36_o.jpg 0.0 680 | 2951554821_ed6a73b1cd_o.jpg 2129800002_2a721cc8bc_o.jpg 0.001284149330854416 681 | 2972304330_688c362199_o.jpg 2712949061_462b394427_o.jpg 0.0 682 | 2972304330_688c362199_o.jpg 1356845356_e1e060a853_o.jpg 0.0 683 | 1404148060_a7b4168ba7_o.jpg 375089040_0e23a22a30_o.jpg 0.0 684 | 2278368684_56d2294672_o.jpg 349388910_4c7785016f_o.jpg 0.0 685 | 3487933880_3b2d286d74_o.jpg 373210474_d62250e4c0_o.jpg 0.5663379829227925 686 | 1338975641_c11151605f_o.jpg 318865108_b36f72679d_o.jpg 0.0 687 | 768149130_e41b346ddc_o.jpg 224270391_aa1fbf020e_o.jpg 0.0 688 | 2347986891_865f87fa93_o.jpg 3420966709_28414527f2_o.jpg 0.0 689 | 2979310998_d8ca252e5d_o.jpg 3323445213_4e917d44ac_o.jpg 0.005885237717628479 690 | 3623320231_3386b5458b_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 691 | 3487933880_3b2d286d74_o.jpg 375089040_0e23a22a30_o.jpg 0.0 692 | 3784107745_51085d9217_o.jpg 2630908591_808f1d065b_o.jpg 0.8634690045118332 693 | 3807960365_3c0f71380b_o.jpg 3178037569_1801bdda20_o.jpg 0.0 694 | 2918094295_382c50af39_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 695 | 2636009691_5aac8b1a15_o.jpg 2347986891_865f87fa93_o.jpg 0.0 696 | 1257429089_2be4fc4020_o.jpg 2979310998_d8ca252e5d_o.jpg 0.0 697 | 2636009691_5aac8b1a15_o.jpg 2228360255_a5f8fec802_o.jpg 0.0 698 | 2129800002_2a721cc8bc_o.jpg 345780792_08afde7e99_o.jpg 0.0 699 | 512510727_8b8e856101_o.jpg 318866989_d3ff85a4d9_o.jpg 0.0 700 | 2580670249_f882806951_o.jpg 3666591632_c65eefc18b_o.jpg 0.0 701 | 302068464_7069d2769f_o.jpg 3900594627_f595d4cbc9_o.jpg 0.0 702 | 2099875810_e57c1c4103_o.jpg 302068464_7069d2769f_o.jpg 0.0 703 | 3420966709_28414527f2_o.jpg 464558681_f3eac58f21_o.jpg 0.07679503600597382 704 | 2907341741_64cd58ba8c_o.jpg 2686020433_5237099cdb_o.jpg 0.0 705 | 2286671923_740c8e0328_o.jpg 3623320231_3386b5458b_o.jpg 0.08088920754790306 706 | 3178037569_1801bdda20_o.jpg 166617667_bff1bba0b9_o.jpg 0.021078568506240843 707 | 3666591632_c65eefc18b_o.jpg 2712949061_462b394427_o.jpg 0.0 708 | 3391388615_9dfebe6e3d_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.0 709 | 1598798269_7b090fb565_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 710 | 3551513323_0e3a6a5d06_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 711 | 3800495669_a1dfbe1455_o.jpg 2286669485_83c29403d7_o.jpg 0.0 712 | 373210474_d62250e4c0_o.jpg 345764148_deca30defb_o.jpg 0.1482716488480568 713 | 2278368684_56d2294672_o.jpg 2712949061_462b394427_o.jpg 0.6287940926969051 714 | 498689813_74a9ffac6f_o.jpg 3551513323_0e3a6a5d06_o.jpg 0.00234226536154747 715 | 2278368684_56d2294672_o.jpg 3309979889_e77ce06693_o.jpg 0.0 716 | 3536482052_d59a9f7ea2_o.jpg 2577276677_e945f5b993_o.jpg 0.8131904266536236 717 | 3535626117_3b8604fc61_o.jpg 3323445213_4e917d44ac_o.jpg 0.0 718 | 3309979889_e77ce06693_o.jpg 342365448_b40e395c36_o.jpg 0.0 719 | 3528888375_3878a6c9e2_o.jpg 2966947703_1aeb9cc87b_o.jpg 0.0 720 | 3180470984_4c22581f2c_o.jpg 295420273_8404ccb2a8_o.jpg 0.0 721 | 3784107745_51085d9217_o.jpg 166617667_bff1bba0b9_o.jpg 0.8008454531729221 722 | 3536482052_d59a9f7ea2_o.jpg 531067385_617531f27f_o.jpg 0.0 723 | 3801333240_6ddbdf6e81_o.jpg 2061831653_df26671ce4_o.jpg 0.0 724 | 3805956430_d7625c8662_o.jpg 345764148_deca30defb_o.jpg 0.8088798617660999 725 | 3800495669_a1dfbe1455_o.jpg 3666591632_c65eefc18b_o.jpg 0.0 726 | 2464337916_1c8a62e0cb_o.jpg 3418896579_a73ba6c13e_o.jpg 0.0 727 | 3487933880_3b2d286d74_o.jpg 2630908591_808f1d065b_o.jpg 0.0 728 | 3800495669_a1dfbe1455_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 729 | 3489719852_c81414f425_o.jpg 2918094295_382c50af39_o.jpg 0.0 730 | 2712949061_462b394427_o.jpg 373210474_d62250e4c0_o.jpg 0.007133502113819122 731 | 1257429089_2be4fc4020_o.jpg 716626675_e573cb7804_o.jpg 0.0 732 | 2918094295_382c50af39_o.jpg 3309979889_e77ce06693_o.jpg 0.906076944321394 733 | 3180470984_4c22581f2c_o.jpg 2647278875_0f97443590_o.jpg 0.0 734 | 3501592474_cd87e1a6b8_o.jpg 2862233520_a6835e9b83_o.jpg 0.0 735 | 2647278875_0f97443590_o.jpg 3805956430_d7625c8662_o.jpg 0.8607619480609894 736 | 312464707_de3b29b309_o.jpg 3386900381_13784078f8_o.jpg 0.0 737 | 2720268280_0052b37cae_o.jpg 2993590526_58b68a78dc_o.jpg 0.016168076914548874 738 | 285107588_1f76167079_o.jpg 3309979889_e77ce06693_o.jpg 0.0 739 | 312464707_de3b29b309_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.02876330960392952 740 | 1091463641_4691abbe0f_o.jpg 2347986891_865f87fa93_o.jpg 0.0 741 | 3489719852_c81414f425_o.jpg 2130191931_ca7060a558_o.jpg 0.005800557518005371 742 | 3528888375_3878a6c9e2_o.jpg 2918094295_382c50af39_o.jpg 0.0 743 | 1598798269_7b090fb565_o.jpg 2485179814_14aec1e27c_o.jpg 0.007288318139314651 744 | 2636009691_5aac8b1a15_o.jpg 2577276677_e945f5b993_o.jpg 0.2851301641881466 745 | 18372617_8da504a40e_o.jpg 3391388615_9dfebe6e3d_o.jpg 0.0 746 | 2278368684_56d2294672_o.jpg 512510727_8b8e856101_o.jpg 0.0 747 | 2577276677_e945f5b993_o.jpg 345780792_08afde7e99_o.jpg 0.0 748 | 1748268283_8eafa6ee14_o.jpg 1257429089_2be4fc4020_o.jpg 0.0 749 | 1091463641_4691abbe0f_o.jpg 3178037569_1801bdda20_o.jpg 0.232699606269598 750 | 295420273_8404ccb2a8_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.0 751 | 2464337916_1c8a62e0cb_o.jpg 224270391_aa1fbf020e_o.jpg 0.0 752 | 3784928602_cb81f6a511_o.jpg 3440840638_cc41f14d43_o.jpg 0.0 753 | 2951554821_ed6a73b1cd_o.jpg 385698393_baf7b40f70_o.jpg 0.0 754 | 345780792_08afde7e99_o.jpg 2918094295_382c50af39_o.jpg 0.0 755 | 512510727_8b8e856101_o.jpg 1091463641_4691abbe0f_o.jpg 0.0 756 | 2347986891_865f87fa93_o.jpg 716665111_132d21abd2_o.jpg 0.0 757 | 475819303_b9bfef9bfb_o.jpg 2959179552_7b79b2100f_o.jpg 0.7115162523210049 758 | 2647278875_0f97443590_o.jpg 3535626117_3b8604fc61_o.jpg 0.0 759 | 3900594627_f595d4cbc9_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 760 | 2485179814_14aec1e27c_o.jpg 3454295605_ec7384d4d9_o.jpg 0.0 761 | 498689813_74a9ffac6f_o.jpg 475819303_b9bfef9bfb_o.jpg 0.0 762 | 1356845356_e1e060a853_o.jpg 285107588_1f76167079_o.jpg 0.0 763 | 345780792_08afde7e99_o.jpg 3489719852_c81414f425_o.jpg 0.0 764 | 3551513323_0e3a6a5d06_o.jpg 3309979889_e77ce06693_o.jpg 0.0 765 | 3551513323_0e3a6a5d06_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 766 | 2347986891_865f87fa93_o.jpg 3293053485_8ae3eb6740_o.jpg 0.0 767 | 166617667_bff1bba0b9_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.20887924446463585 768 | 1860570086_47ad17e15e_o.jpg 345780792_08afde7e99_o.jpg 0.0 769 | 3487933880_3b2d286d74_o.jpg 3784107745_51085d9217_o.jpg 0.0 770 | 1404148060_a7b4168ba7_o.jpg 2286671923_740c8e0328_o.jpg 0.0 771 | 2979310998_d8ca252e5d_o.jpg 318866989_d3ff85a4d9_o.jpg 0.0 772 | 3107227785_6c0c05da0d_o.jpg 716626675_e573cb7804_o.jpg 0.0 773 | 3203946708_949ef8c21e_o.jpg 3420966709_28414527f2_o.jpg 0.0 774 | 2286669485_83c29403d7_o.jpg 768149130_e41b346ddc_o.jpg 0.0 775 | 3007780778_b4003c7f5f_o.jpg 1404148060_a7b4168ba7_o.jpg 0.04957163181900978 776 | 464558681_f3eac58f21_o.jpg 3293053485_8ae3eb6740_o.jpg 0.0 777 | 385698393_baf7b40f70_o.jpg 1338975641_c11151605f_o.jpg 0.0 778 | 3292523267_3870c81e66_o.jpg 716665111_132d21abd2_o.jpg 0.0 779 | 2720268280_0052b37cae_o.jpg 3801333240_6ddbdf6e81_o.jpg 0.10521749153733254 780 | 2286669485_83c29403d7_o.jpg 498689813_74a9ffac6f_o.jpg 0.017588781708478926 781 | 2099875810_e57c1c4103_o.jpg 2972304330_688c362199_o.jpg 0.0 782 | 375089040_0e23a22a30_o.jpg 2464337916_1c8a62e0cb_o.jpg 0.0 783 | 3418896579_a73ba6c13e_o.jpg 2951554821_ed6a73b1cd_o.jpg 0.0 784 | 531067385_617531f27f_o.jpg 2686020433_5237099cdb_o.jpg 0.0 785 | 342365448_b40e395c36_o.jpg 2577276677_e945f5b993_o.jpg 0.7609503328442574 786 | 2158032873_3547d6763e_o.jpg 3784107745_51085d9217_o.jpg 0.0 787 | 464558681_f3eac58f21_o.jpg 3784107745_51085d9217_o.jpg 0.45007042968273164 788 | 3418896579_a73ba6c13e_o.jpg 2647278875_0f97443590_o.jpg 0.0 789 | 2286671923_740c8e0328_o.jpg 342365448_b40e395c36_o.jpg 0.0 790 | 716626675_e573cb7804_o.jpg 295420273_8404ccb2a8_o.jpg 0.0 791 | 1091463641_4691abbe0f_o.jpg 1748268283_8eafa6ee14_o.jpg 0.0 792 | 3666591632_c65eefc18b_o.jpg 716626675_e573cb7804_o.jpg 0.0 793 | 1748268283_8eafa6ee14_o.jpg 3007780778_b4003c7f5f_o.jpg 0.0 794 | 519579959_471530a809_o.jpg 3203946708_949ef8c21e_o.jpg 0.0 795 | 2464337916_1c8a62e0cb_o.jpg 302068464_7069d2769f_o.jpg 0.0 796 | 3203946708_949ef8c21e_o.jpg 2577276677_e945f5b993_o.jpg 0.0 797 | 3203946708_949ef8c21e_o.jpg 2158032873_3547d6763e_o.jpg 0.0 798 | 2993590526_58b68a78dc_o.jpg 3178037569_1801bdda20_o.jpg 0.0 799 | 302068464_7069d2769f_o.jpg 166617667_bff1bba0b9_o.jpg 0.0 800 | 2764108983_c2dedc42ed_o.jpg 2286669485_83c29403d7_o.jpg 0.012843563479185104 801 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: boxes 2 | channels: 3 | - default 4 | - pytorch 5 | - conda-forge 6 | dependencies: 7 | - python=3.6.7 8 | - pytorch=1.3.1 9 | - torchvision=0.4.2 10 | - numpy=1.16.4 11 | - pillow=6.2.1 12 | - scipy=1.4.1 13 | - h5py 14 | - pip 15 | - pip: 16 | - pytorch-lightning==0.7.6 -------------------------------------------------------------------------------- /generate_dataset.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | dataset_output_path=data/overlap_data/megadepth/my_data 3 | dataset_json_path=data/dataset_jsons/megadepth/bigben.json 4 | python -m src.datasets.dataset_generator.compute_normals \ 5 | --dataset_json $dataset_json_path \ 6 | --output_folder $dataset_output_path 7 | python -m src.datasets.dataset_generator.compute_overlap \ 8 | --dataset_json $dataset_json_path \ 9 | --normals_folder $dataset_output_path \ 10 | --num_sampled_points 5000 \ 11 | --num_pairs 25 \ 12 | --threshold 0.1 -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nianticlabs/image-box-overlap/af1fcb4e806b7685f976054daa5d73ad071ffcb2/src/__init__.py -------------------------------------------------------------------------------- /src/datasets/__init__.py: -------------------------------------------------------------------------------- 1 | from .megadepth_loader import MegaDepthSurfacePairLoader, MegaDepthImageLoader 2 | -------------------------------------------------------------------------------- /src/datasets/dataset_generator/__init__.py: -------------------------------------------------------------------------------- 1 | from .utils import pil_loader, params2matrix, quat2mat 2 | -------------------------------------------------------------------------------- /src/datasets/dataset_generator/compute_normals.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Compute and store surface normals. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import os 14 | import numpy as np 15 | import torch 16 | import pickle 17 | from tqdm import tqdm 18 | from .options import NormalsComputeOptions 19 | from .utils import backproject_depthmap, get_normals, read_depth_megadepth 20 | from ..megadepth_loader import MegaDepthImageLoader 21 | 22 | 23 | def process_normals_batch(batch, batch_size=1): 24 | depth_images, k_mat, inv_k_mat, file_names_depth = [], [], [], [] 25 | for i in range(batch_size): 26 | inv_k_mat.append(torch.tensor(np.linalg.inv(batch['camera_calib'][i]))) 27 | depth_images.append(torch.tensor(read_depth_megadepth(batch['depth_path'][i]))) 28 | 29 | depth_images = torch.stack(depth_images) 30 | inv_k_mat = torch.stack(inv_k_mat).float() 31 | 32 | if torch.cuda.is_available(): 33 | inv_k_mat = inv_k_mat.cuda() 34 | depth_images = depth_images.cuda() 35 | 36 | with torch.no_grad(): 37 | points3d = backproject_depthmap(depth_images, inv_k_mat) 38 | normals, plane_fit_error = get_normals(points3d) 39 | 40 | normals = normals.cpu().detach().numpy().astype(np.float32) 41 | points3d = points3d.cpu().detach().numpy().astype(np.float32) 42 | plane_fit_error = plane_fit_error.cpu().detach().numpy().astype(np.float32) 43 | 44 | return normals, points3d, plane_fit_error 45 | 46 | 47 | def main(): 48 | opts = NormalsComputeOptions().parse() 49 | dataset = MegaDepthImageLoader(opts.dataset_json, mode='data_generation') 50 | data_loader = torch.utils.data.DataLoader(dataset, 51 | batch_size=opts.batch_size, 52 | shuffle=False, 53 | num_workers=opts.num_workers, 54 | pin_memory=True) 55 | 56 | if not os.path.exists(opts.output_folder): 57 | os.makedirs(opts.output_folder) 58 | 59 | print(f"Computing and saving normals of a total of {len(data_loader)} images...") 60 | for batch_idx, batch in enumerate(tqdm(data_loader)): 61 | normals, points3d, plane_fit_error = process_normals_batch(batch, 62 | opts.batch_size) 63 | for i in range(opts.batch_size): 64 | result_dict_i = { 65 | 'normals': normals[i], 66 | 'points3d': points3d[i], 67 | 'plane_fit_error': plane_fit_error[i] 68 | } 69 | result_path_i = os.path.join(opts.output_folder, 70 | f"{batch['image_id'][i]}.pickle") 71 | 72 | with open(result_path_i, 'wb') as f: 73 | pickle.dump(result_dict_i, f) 74 | 75 | 76 | if __name__ == '__main__': 77 | main() 78 | -------------------------------------------------------------------------------- /src/datasets/dataset_generator/compute_overlap.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Normalized surface overlap dataset generator. 5 | It requires precomputed normals with compute_normals.py. 6 | 7 | Copyright Niantic 2020. Patent Pending. All rights reserved. 8 | 9 | This software is licensed under the terms of the Image-box-overlap licence 10 | which allows for non-commercial use only, the full terms of which are made 11 | available in the LICENSE file. 12 | """ 13 | 14 | import os 15 | import torch 16 | from tqdm import tqdm 17 | from .options import OverlapComputeOptions 18 | from .utils import process_surface_overlap_batch 19 | from ..megadepth_loader import MegaDepthImageLoader 20 | 21 | 22 | def main(): 23 | opts = OverlapComputeOptions().parse() 24 | 25 | dataset = MegaDepthImageLoader(opts.dataset_json, mode='data_generation') 26 | data_loader = torch.utils.data.DataLoader(dataset, batch_size=2, shuffle=True, 27 | num_workers=opts.num_workers, pin_memory=True) 28 | 29 | output_file = os.path.join(opts.normals_folder, 'computed_overlaps.txt') 30 | writer = open(output_file, 'w') 31 | 32 | print(f"Computing the surface overlap of {opts.num_pairs} image pairs from previously computed normals...") 33 | for _ in tqdm(range(opts.num_pairs)): 34 | batch = next(iter(data_loader)) 35 | nso_batch = process_surface_overlap_batch(batch, 36 | opts.normals_folder, 37 | opts.threshold, 38 | opts.num_sampled_points) 39 | if nso_batch: 40 | writer.write(f"{batch['image_id'][0]} {batch['image_id'][1]} {str(nso_batch['x->y'])}\n") 41 | writer.write(f"{batch['image_id'][1]} {batch['image_id'][0]} {str(nso_batch['y->x'])}\n") 42 | 43 | writer.close() 44 | 45 | 46 | if __name__ == '__main__': 47 | main() -------------------------------------------------------------------------------- /src/datasets/dataset_generator/options.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings 3 | 4 | Datasets options parser. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import argparse 14 | 15 | 16 | class NormalsComputeOptions: 17 | def __init__(self): 18 | self.options = None 19 | self.parser = argparse.ArgumentParser(description='Compute Normals MegaDepth') 20 | self.parser.add_argument('--dataset_json', default='data/dataset_jsons/megadepth/bigben.json', 21 | help="Path to dataset json files.") 22 | self.parser.add_argument('--output_folder', 23 | help="Path to save normals.") 24 | self.parser.add_argument('--batch_size', type=int, default=1, 25 | help="Number of images to compute normals in parallel." 26 | "Important! For MegaDepth it only supports one image per batch.") 27 | self.parser.add_argument('--num_workers', type=int, default=8, 28 | help="Number of workers for data loading (default: 8).") 29 | 30 | def parse(self, *args, **kwargs): 31 | self.options = self.parser.parse_args(*args, **kwargs) 32 | return self.options 33 | 34 | 35 | class OverlapComputeOptions: 36 | def __init__(self): 37 | self.options = None 38 | self.parser = argparse.ArgumentParser(description='Compute Overlap MegaDepth (Requires Normals)') 39 | self.parser.add_argument('--normals_folder', help="Path to store normal data.") 40 | self.parser.add_argument('--dataset_json', default='data/dataset_jsons/megadepth/bigben.json', 41 | help="Path to dataset json files.") 42 | self.parser.add_argument('--num_pairs', type=int, default=10000, 43 | help="Number of image pairs to compute surface (default: 10000).") 44 | self.parser.add_argument('--num_sampled_points', type=int, default=5000, 45 | help='Number of points to be sampled for overlap computation (default: 5000).') 46 | self.parser.add_argument('--threshold', type=float, default=0.1, 47 | help='Maximum distance for two points to be considered as overlapping (default: 0.1).') 48 | self.parser.add_argument('--num_workers', type=int, default=8, 49 | help="Number of workers for data loading (default: 8).") 50 | 51 | def parse(self, *args, **kwargs): 52 | self.options = self.parser.parse_args(*args, **kwargs) 53 | return self.options 54 | -------------------------------------------------------------------------------- /src/datasets/dataset_generator/utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Datasets util functions. 5 | We thank Carl Toft for helping with normal computation code during his internship at Niantic. 6 | 7 | Copyright Niantic 2020. Patent Pending. All rights reserved. 8 | 9 | This software is licensed under the terms of the Image-box-overlap licence 10 | which allows for non-commercial use only, the full terms of which are made 11 | available in the LICENSE file. 12 | """ 13 | 14 | import os 15 | import numpy as np 16 | import torch 17 | import PIL 18 | import h5py 19 | import pickle 20 | from scipy.spatial.transform import Rotation 21 | 22 | 23 | def backproject_depthmap(depths, inv_k): 24 | """ Projects depth maps into 3D space 25 | :param depths: Input depths with shape [batch_size x height x width] 26 | :param inv_k: Inverse intrinsics with shape [batch_size x 3 x 3] 27 | :return: 3D points for each pixel in a depth map with shape [batch_size x height x width x 3] 28 | """ 29 | 30 | batch_size = depths.shape[0] 31 | 32 | yy, xx = torch.meshgrid([torch.arange(depths.shape[1], dtype=depths.dtype, device=depths.device), 33 | torch.arange(depths.shape[2], dtype=depths.dtype, device=depths.device)]) 34 | 35 | coords = torch.cat([ 36 | xx.reshape(-1, 1), 37 | yy.reshape(-1, 1), 38 | torch.ones([depths.shape[1] * depths.shape[2], 1], dtype=depths.dtype, device=depths.device)], 1) 39 | 40 | coords = coords.reshape(1, -1, 3, 1).repeat(batch_size, 1, 1, 1) 41 | inv_k = inv_k.reshape(-1, 1, 3, 3) 42 | point3d = torch.matmul(inv_k, coords) 43 | point3d = point3d * depths.reshape(batch_size, -1, 1, 1) 44 | point3d = point3d.reshape(batch_size, depths.shape[1], depths.shape[2], 3) 45 | return point3d 46 | 47 | 48 | def get_normals(points3d): 49 | """ Computes normal maps from 3D cloud 50 | :param points3d: Ordered 3D cloud with shape [batch_size x height x width x 3] 51 | :return: Normal map with shape [batch_size x height x width x 3] 52 | """ 53 | batch_size = points3d.shape[0] 54 | dtype = points3d.dtype 55 | device = points3d.device 56 | pi = torch.tensor([np.pi], dtype=dtype, device=device) 57 | nan = torch.tensor([np.nan], dtype=dtype, device=device) 58 | 59 | # Create a huge tensor to keep the points, as well as the points shifted one step in all directions 60 | hugeTensor = torch.zeros(batch_size, 61 | points3d.shape[1] + 2, points3d.shape[2] + 2, points3d.shape[3], 9, 62 | dtype=points3d.dtype, device=device) 63 | hugeTensor[:, 1:points3d.shape[1] + 1, 1:points3d.shape[2] + 1, 0:3, 0] = points3d # original points in center 64 | 65 | # Now add them in this order: top-left, top-center, top-right 66 | hugeTensor[:, 0:points3d.shape[1], 0:points3d.shape[2], 0:3, 1] = points3d 67 | hugeTensor[:, 0:points3d.shape[1], 1:points3d.shape[2] + 1, 0:3, 2] = points3d 68 | hugeTensor[:, 0:points3d.shape[1], 2:points3d.shape[2] + 2, 0:3, 3] = points3d 69 | 70 | # Now center-left, center-right 71 | hugeTensor[:, 1:points3d.shape[1] + 1, 0:points3d.shape[2], 0:3, 4] = points3d 72 | hugeTensor[:, 1:points3d.shape[1] + 1, 2:points3d.shape[2] + 2, 0:3, 5] = points3d 73 | 74 | # Now bottom-left, bottom-cente1, bottom-right 75 | hugeTensor[:, 2:points3d.shape[1] + 2, 0:points3d.shape[2], 0:3, 6] = points3d 76 | hugeTensor[:, 2:points3d.shape[1] + 2, 1:points3d.shape[2] + 1, 0:3, 7] = points3d 77 | hugeTensor[:, 2:points3d.shape[1] + 2, 2:points3d.shape[2] + 2, 0:3, 8] = points3d 78 | 79 | # Done! Now compute the mean vector for each pixel. 80 | meanPoints = hugeTensor.mean(4) 81 | h = hugeTensor.shape[1] 82 | w = hugeTensor.shape[2] 83 | 84 | S = torch.zeros(batch_size, h, w, 3, 3, dtype=dtype, device=device) 85 | for k in range(9): 86 | hugeTensor[:, :, :, :, k] = hugeTensor[:, :, :, :, k] - meanPoints 87 | S = S + hugeTensor[:, :, :, :, k].reshape(batch_size, h, w, 1, 3) * hugeTensor[:, :, :, :, k].reshape( 88 | batch_size, h, w, 3, 1) 89 | S = S / 8 90 | 91 | eye3 = torch.eye(3, dtype=dtype, device=device).unsqueeze(0) 92 | # Now, compute the smallest eigenvector of each covariance matrix 93 | mat = torch.tensor(np.array([[0, 1, 1], [0, 0, 1], [0, 0, 0]]), dtype=dtype, device=device) 94 | mat = mat.unsqueeze(0) 95 | p1 = ((S * mat) ** 2).sum(4).sum(3) 96 | q = (S * eye3).sum(4).sum(3) / 3 97 | p2 = ((((S - q.reshape(batch_size, q.shape[1], q.shape[2], 1, 1)) * eye3) * eye3) ** 2).sum(4).sum(3) 98 | p2 = p2 + 2 * p1 99 | val_mask = p2 > 0 100 | p2[~val_mask] = 1 101 | 102 | p2 = torch.sqrt(p2 / 6.0) 103 | 104 | # No more division by zero 105 | B = (S - q.reshape(batch_size, q.shape[1], q.shape[2], 1, 1) * eye3) / p2.reshape(batch_size, p2.shape[1], 106 | p2.shape[2], 1, 1) 107 | 108 | detB = B[:, :, :, 0, 0] * B[:, :, :, 1, 1] * B[:, :, :, 2, 2] + \ 109 | B[:, :, :, 0, 1] * B[:, :, :, 1, 2] * B[:, :, :, 2, 0] + \ 110 | B[:, :, :, 0, 2] * B[:, :, :, 1, 0] * B[:, :, :, 2, 1] - \ 111 | B[:, :, :, 0, 2] * B[:, :, :, 1, 1] * B[:, :, :, 2, 0] - \ 112 | B[:, :, :, 0, 1] * B[:, :, :, 1, 0] * B[:, :, :, 2, 2] - \ 113 | B[:, :, :, 0, 0] * B[:, :, :, 1, 2] * B[:, :, :, 2, 1] 114 | 115 | detB = detB / 2.0 116 | detB = detB.clamp(min=-1, max=1) 117 | lambda0 = 2.0 * p2 * torch.cos(torch.acos(detB) / 3.0 + 2 * pi / 3.0) + q 118 | 119 | detM = (S[:, :, :, 0, 0] - lambda0) * (S[:, :, :, 1, 1] - lambda0) - S[:, :, :, 0, 1] * S[:, :, :, 1, 0] 120 | normals = torch.ones(batch_size, lambda0.shape[1], lambda0.shape[2], 3, dtype=dtype, device=device) 121 | 122 | val_mask = val_mask & (detM != 0) 123 | detM[~val_mask] = 1 124 | normals[:, :, :, 0] = (S[:, :, :, 0, 2] * (lambda0 - S[:, :, :, 1, 1]) + S[:, :, :, 1, 2] * S[:, :, :, 0, 1]) / detM 125 | normals[:, :, :, 1] = (S[:, :, :, 1, 2] * (lambda0 - S[:, :, :, 0, 0]) + S[:, :, :, 0, 2] * S[:, :, :, 1, 0]) / detM 126 | 127 | normals_length = torch.sqrt((normals ** 2).sum(3)) 128 | normals = normals / normals_length.reshape(batch_size, normals.shape[1], normals.shape[2], 1) 129 | 130 | neg_offsets = ((normals * meanPoints).sum(3)).reshape(batch_size, normals.shape[1], normals.shape[2], 1) 131 | normals = normals * torch.sign(neg_offsets) 132 | 133 | normals[~val_mask] = nan 134 | lambda0[~val_mask] = nan 135 | 136 | normals = normals[:, 1:normals.shape[1] - 1, 1:normals.shape[2] - 1, :] 137 | return normals, lambda0 138 | 139 | 140 | def compute_nso(subset_1, subset_2, threshold, normals_1, normals_2): 141 | """ Computes normalized surface overlap from two input point clouds and their normals. 142 | :param subset_1: 3D cloud from image 1 (or 2) with shape [3 x num_points] 143 | :param threshold: Maximum distance for two points to be considered as overlapping. 144 | :param normals_1: Normals for image 1 (or 2) with shape [3 x num_points] 145 | :return: enclosure and concentration 146 | """ 147 | 148 | # Compute the distance between each pair of pixels and find smallest distance 149 | set_1 = subset_1.reshape((3, -1, 1)) 150 | set_2 = subset_2.reshape((3, 1, -1)) 151 | 152 | diff = set_1 - set_2 153 | dist = np.sqrt(np.sum(np.square(diff), 0)) 154 | 155 | s1_nns = np.argmin(dist, 1) 156 | s2_nns = np.argmin(dist, 0) 157 | 158 | s1_nn_dist = np.min(dist, 1) 159 | s2_nn_dist = np.min(dist, 0) 160 | 161 | # Compute cosine between normals of each point from cloud 1 and its nearest neighbor from cloud 2 162 | # and scale to interval [0,1]. Then vice-versa. 163 | v1 = normals_1 164 | v2 = normals_2[:, s1_nns] 165 | 166 | weights_1 = 0.5 * (np.sum(np.multiply(v1, v2), 0) + 1.0) 167 | weights_1[np.isnan(weights_1)] = 0. 168 | 169 | v1 = normals_2 170 | v2 = normals_1[:, s2_nns] 171 | 172 | weights_2 = 0.5 * (np.sum(np.multiply(v1, v2), 0) + 1.0) 173 | weights_2[np.isnan(weights_2)] = 0. 174 | 175 | # Compute weighted ratio of pixels with neighbor in distance smaller than threshold 176 | weighted_s1_has_nn = np.matmul((s1_nn_dist < threshold), weights_1) 177 | weighted_s2_has_nn = np.matmul((s2_nn_dist < threshold), weights_2) 178 | 179 | nso_x2y = weighted_s1_has_nn / set_1.shape[1] 180 | nso_y2x = weighted_s2_has_nn / set_2.shape[2] 181 | 182 | nso_dict = { 183 | 'x->y': nso_x2y, 184 | 'y->x': nso_y2x, 185 | } 186 | 187 | return nso_dict 188 | 189 | 190 | def process_surface_overlap_batch(batch, normals_folder, threshold, num_points): 191 | 192 | # Load precomputed normal maps and 3D clouds (output from compute_normals.py) 193 | normals_path1 = os.path.join(normals_folder, batch['image_id'][0] + '.pickle') 194 | normals_path2 = os.path.join(normals_folder, batch['image_id'][1] + '.pickle') 195 | 196 | with open(normals_path1, 'rb') as f: 197 | pick1 = pickle.load(f) 198 | with open(normals_path2, 'rb') as f: 199 | pick2 = pickle.load(f) 200 | 201 | normals_1 = pick1['normals'].transpose(2, 0, 1).reshape((3, -1)) 202 | normals_2 = pick2['normals'].transpose(2, 0, 1).reshape((3, -1)) 203 | 204 | coords_1 = pick1['points3d'].transpose(2, 0, 1).reshape((3, -1)) 205 | coords_2 = pick2['points3d'].transpose(2, 0, 1).reshape((3, -1)) 206 | 207 | coords_1 = np.concatenate([coords_1, np.ones((1, coords_1.shape[1]))], 0) 208 | coords_2 = np.concatenate([coords_2, np.ones((1, coords_2.shape[1]))], 0) 209 | 210 | # Delete invalid pixels with zero depth 211 | valid_coords_1 = coords_1[:, coords_1[2, :] > 0] 212 | valid_coords_2 = coords_2[:, coords_2[2, :] > 0] 213 | 214 | valid_normals_1 = normals_1[:, coords_1[2, :] > 0] 215 | valid_normals_2 = normals_2[:, coords_2[2, :] > 0] 216 | 217 | world_points_1 = cam2world(valid_coords_1, np.linalg.inv(batch['camera_pose'][0])) 218 | world_points_2 = cam2world(valid_coords_2, np.linalg.inv(batch['camera_pose'][1])) 219 | 220 | # Sample points for efficiency (if needed) 221 | if world_points_1.shape[1] > num_points: 222 | indices1 = np.random.choice(world_points_1.shape[1], size=num_points, replace=False) 223 | indices2 = np.random.choice(world_points_2.shape[1], size=num_points, replace=False) 224 | else: 225 | indices1 = np.random.choice(world_points_1.shape[1], size=world_points_1.shape[1], replace=False) 226 | indices2 = np.random.choice(world_points_2.shape[1], size=world_points_2.shape[1], replace=False) 227 | 228 | subset_1 = world_points_1[:3, indices1] 229 | subset_2 = world_points_2[:3, indices2] 230 | 231 | normals_1 = valid_normals_1[:, indices1] 232 | normals_2 = valid_normals_2[:, indices2] 233 | 234 | nso_dict = compute_nso(subset_1, subset_2, threshold, normals_1, normals_2) 235 | 236 | return nso_dict 237 | 238 | 239 | def pil_loader(path): 240 | """ 241 | Load image from path with PIL. PIL is used to avoid 242 | ResourceWarning (https://github.com/python-pillow/Pillow/issues/835) 243 | """ 244 | with open(path, 'rb') as file_handler: 245 | with PIL.Image.open(file_handler) as img: 246 | return img.convert('RGB') 247 | 248 | 249 | def cam2world(coords, pose): 250 | return np.matmul(pose, coords) 251 | 252 | 253 | def params2matrix(camera_params, resized_size, orig_size): 254 | """ From MegaDepth annotated camera parameter format to intrisincs matrix. 255 | Specific for MegaDepth: it also adjusts parameters taking into account discrepancy in image size between 256 | original color image (annotated) and aligned to depth images. More details in supplementary material. 257 | """ 258 | scale_x = resized_size[0] / orig_size[0] 259 | scale_y = resized_size[1] / orig_size[1] 260 | 261 | return np.array([[scale_x * camera_params[0], scale_x * camera_params[3], scale_x * camera_params[1]], 262 | [0., scale_y * camera_params[0], scale_y * camera_params[2]], 263 | [0., 0., 1.]]) 264 | 265 | 266 | def quat2mat(q, t): 267 | """ 268 | Quaternion to rotation and translation in matrix form 269 | """ 270 | p_mat = np.zeros((4, 4)) 271 | r_mat = Rotation.from_quat(q).as_matrix() 272 | p_mat[:3, :3] = r_mat 273 | p_mat[:3, -1] = t 274 | p_mat[-1, -1] = 1.0 275 | return p_mat 276 | 277 | 278 | def read_depth_megadepth(filepath): 279 | hdf5_file_read = h5py.File(filepath, 'r') 280 | depth = hdf5_file_read.get('/depth') 281 | depth = np.array(depth) 282 | hdf5_file_read.close() 283 | return depth 284 | -------------------------------------------------------------------------------- /src/datasets/megadepth_loader.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | MegaDepth dataset dataloaders. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import os 14 | import numpy as np 15 | import torch.utils.data 16 | import json 17 | import errno 18 | from PIL import Image 19 | from torchvision import transforms 20 | from .dataset_generator.utils import pil_loader, params2matrix, quat2mat 21 | 22 | 23 | class MegaDepthSurfacePairLoader(torch.utils.data.Dataset): 24 | """ 25 | Loader for pairs of images and their respective normalized surface overlap (NSO) 26 | """ 27 | 28 | def __init__(self, dataset_json_path, mode, image_hw=None, loader=pil_loader): 29 | super(MegaDepthSurfacePairLoader, self).__init__() 30 | if image_hw is None: 31 | image_hw = [256, 456] 32 | self.height, self.width = image_hw 33 | self.resizer = transforms.Resize((self.height, self.width), interpolation=Image.ANTIALIAS) 34 | self.to_tensor = transforms.ToTensor() 35 | self.loader = loader 36 | image_0, image_1, surface_overlaps = [], [], [] 37 | num_pairs = 0 38 | 39 | with open(dataset_json_path, 'r') as f: 40 | dataset_json = json.load(f) 41 | 42 | for entry in dataset_json: 43 | if mode == 'train': 44 | image_list = entry['train_file'] 45 | elif mode == 'val': 46 | image_list = entry['val_file'] 47 | elif mode == 'test': 48 | image_list = entry['test_file'] 49 | else: 50 | raise NotImplementedError("No valid split chosen.") 51 | 52 | scene_path = os.path.join(entry['path_sfm'], entry['scene'], 'images') 53 | 54 | with open(image_list, 'r') as f: 55 | for line in f.readlines(): 56 | image_0_path = os.path.join(scene_path, line.split()[0]) 57 | image_1_path = os.path.join(scene_path, line.split()[1]) 58 | 59 | if os.path.isfile(image_0_path): 60 | image_0.append(image_0_path) 61 | else: 62 | raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), image_0_path) 63 | 64 | if os.path.isfile(image_1_path): 65 | image_1.append(image_1_path) 66 | else: 67 | raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), image_1_path) 68 | 69 | surface_overlaps.append(np.array(line.split()[2]).astype(np.float)) 70 | num_pairs += 1 71 | 72 | self.image_0_paths = image_0 73 | self.image_1_paths = image_1 74 | self.surface_overlaps = surface_overlaps 75 | self.num_pairs = num_pairs 76 | 77 | def __getitem__(self, index): 78 | 79 | image_0_original = self.loader(self.image_0_paths[index]) 80 | image_1_original = self.loader(self.image_1_paths[index]) 81 | 82 | image_0 = self.to_tensor(self.resizer(image_0_original)) 83 | image_1 = self.to_tensor(self.resizer(image_1_original)) 84 | 85 | batch = { 86 | 'images': np.stack((image_0, image_1), 0), 87 | 'surface_overlap': self.surface_overlaps[index] 88 | } 89 | return batch 90 | 91 | def __len__(self): 92 | return self.num_pairs 93 | 94 | 95 | class MegaDepthImageLoader(torch.utils.data.Dataset): 96 | """ 97 | Loader for single MegaDepth images. Apart from color and depth images paths 98 | it also returns camera pose and camera calibration parameters. 99 | """ 100 | 101 | def __init__(self, dataset_json_path, mode, image_hw=None, 102 | loader=pil_loader): 103 | super(MegaDepthImageLoader, self).__init__() 104 | 105 | if image_hw is None: 106 | image_hw = [256, 456] 107 | 108 | self.height, self.width = image_hw 109 | self.resizer = transforms.Resize((self.height, self.width)) 110 | self.to_tensor = transforms.ToTensor() 111 | self.loader = loader 112 | self.mode = mode 113 | 114 | with open(dataset_json_path, 'r') as f: 115 | dataset_json = json.load(f) 116 | 117 | image_ids, image_paths, depth_paths, aligned_paths = [], [], [], [] 118 | camera_poses, camera_calibs = [], [] 119 | 120 | for entry in dataset_json: 121 | scene_path = os.path.join(entry['path_sfm'], entry['scene'], 'images') 122 | # if you wish to use this loader to load single images and input in the network, for example to perform 123 | # image retrieval, just add an additional mode with the appropriate json entry, everything else is ready. 124 | if self.mode == "data_generation": 125 | files_pointer = entry['list_images_with_depth'] 126 | else: 127 | raise NotImplementedError("No valid mode chosen.") 128 | 129 | image_ids.extend([line.split()[0] for line in open(files_pointer)]) 130 | 131 | image_paths.extend([os.path.join(scene_path, line.split()[0]) for line in open(files_pointer)]) 132 | for path_i in image_paths: 133 | if not os.path.isfile(path_i): 134 | raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path_i) 135 | 136 | depth_paths.extend( 137 | [os.path.join(entry['path_depth'], entry['scene'], 'dense0', 'depths', f"{line.split('.')[0]}.h5") for 138 | line in open(files_pointer)]) 139 | 140 | for path_d in depth_paths: 141 | if not os.path.isfile(path_d): 142 | raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path_d) 143 | 144 | aligned_paths.extend( 145 | [os.path.join(entry['path_depth'], entry['scene'], 'dense0', 'imgs', f"{line.split('.')[0]}.jpg") for 146 | line in open(files_pointer)]) 147 | 148 | for path_a in image_paths: 149 | if not os.path.isfile(path_a): 150 | raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path_a) 151 | 152 | camera_params, annotated_sizes = {}, {} 153 | with open(os.path.join(entry['path_sfm'], entry['scene'], 'sparse', 'manhattan', '0', 'cameras.txt'), 154 | 'r') as f: 155 | lines = f.readlines()[3:] 156 | for line in lines: 157 | tmp_str = line.split(' ') 158 | # CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[] 159 | camera_id = tmp_str[0] 160 | camera_params[camera_id] = [float(params) for params in tmp_str[4:]] 161 | annotated_sizes[camera_id] = tuple([int(tmp_str[2]), int(tmp_str[3])]) 162 | 163 | reader = open(os.path.join(entry['path_sfm'], entry['scene'], 'sparse', 'manhattan', '0', 'images.txt'), 164 | 'r') 165 | 166 | poses_dict, cameras_dict = {}, {} 167 | for i, line in enumerate(reader): 168 | # image list with two lines of data per image: 169 | # IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME 170 | # POINTS2D[] as (X, Y, POINT3D_ID) 171 | if i % 2 == 0 and i > 3: 172 | line = line.split() 173 | tmp_img_name = line[-1] 174 | tmp_camera_id = line[-2] 175 | tmp_pose = np.array(line[1:8]).astype(np.float) 176 | # rearrange quaternion from [qw qx qy qz] to [qx qy qz qw] 177 | tmp_quat = np.concatenate((tmp_pose[1:4], tmp_pose[0]), axis=None) 178 | tmp_t = tmp_pose[4:] 179 | absolute_path_to_image = os.path.join(entry['path_sfm'], entry['scene'], 'images', tmp_img_name) 180 | poses_dict[absolute_path_to_image] = quat2mat(tmp_quat, tmp_t) 181 | cameras_dict[absolute_path_to_image] = tmp_camera_id 182 | reader.close() 183 | 184 | for i in range(len(image_paths)): 185 | camera_poses.append(poses_dict[image_paths[i]]) 186 | # color image aligned to depth may have different size as original color image. See supplementary. 187 | tmp_camera = cameras_dict[image_paths[i]] 188 | tmp_params = camera_params[tmp_camera] 189 | tmp_anno_size = annotated_sizes[tmp_camera] 190 | image_aligned = Image.open(os.path.join(aligned_paths[i])) 191 | adjusted_calib = params2matrix(tmp_params, image_aligned.size, tmp_anno_size) 192 | camera_calibs.append(adjusted_calib) 193 | 194 | self.image_ids = image_ids 195 | self.image_paths = image_paths 196 | self.depth_paths = depth_paths 197 | self.camera_poses = camera_poses 198 | self.camera_calibs = camera_calibs 199 | 200 | def __getitem__(self, index): 201 | if self.mode == 'data_generation': 202 | dict_batch = { 203 | 'image_id': self.image_ids[index], 204 | 'image_path': self.image_paths[index], 205 | 'depth_path': self.depth_paths[index], 206 | 'camera_calib': self.camera_calibs[index], 207 | 'camera_pose': self.camera_poses[index], 208 | } 209 | else: 210 | dict_batch = { 211 | 'image': self.to_tensor(self.resizer(self.loader(self.image_paths[index]))), 212 | 'image_id': self.image_ids[index], 213 | 'image_path': self.image_paths[index], 214 | 'depth_path': self.depth_paths[index], 215 | 'camera_calib': self.camera_calibs[index], 216 | 'camera_pose': self.camera_poses[index], 217 | } 218 | return dict_batch 219 | 220 | def __len__(self): 221 | return len(self.image_paths) 222 | -------------------------------------------------------------------------------- /src/model.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Network model. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import numpy as np 14 | import torch 15 | import torch.nn as nn 16 | import torch.nn.functional as F 17 | import torchvision.models as models 18 | 19 | 20 | class ResnetEncoder(nn.Module): 21 | def __init__(self, num_layers, box_ndim): 22 | super(ResnetEncoder, self).__init__() 23 | self.num_ch_enc = np.array([64, 64, 128, 256, 512]) 24 | 25 | self.last_layer = 512 26 | if num_layers == 50: 27 | self.last_layer = 2048 28 | elif num_layers == 101: 29 | self.last_layer = 2048 30 | 31 | resnets = {18: models.resnet18, 32 | 34: models.resnet34, 33 | 50: models.resnet50, 34 | 101: models.resnet101, 35 | 152: models.resnet152} 36 | 37 | encoder = resnets[num_layers](True) 38 | self.encoder = encoder 39 | 40 | self.layer0 = nn.Sequential(encoder.conv1, encoder.bn1, encoder.relu) 41 | self.layer1 = nn.Sequential(encoder.maxpool, encoder.layer1) 42 | self.layer2 = encoder.layer2 43 | self.layer3 = encoder.layer3 44 | self.layer4 = encoder.layer4 45 | self.fc1 = nn.Linear(self.last_layer // 4, box_ndim) 46 | self.fc2 = nn.Linear(self.last_layer // 4, box_ndim) 47 | self.fc = nn.Linear(self.last_layer, self.last_layer // 4) 48 | del encoder 49 | 50 | if num_layers > 34: 51 | self.num_ch_enc[1:] *= 4 52 | 53 | def forward(self, input_image): 54 | # Normalize the input colorspace 55 | x = (input_image - 0.45) / 0.225 56 | 57 | x = self.layer0(x) 58 | x = self.layer1(x) 59 | x = self.layer2(x) 60 | x = self.layer3(x) 61 | x = self.layer4(x) 62 | x = x.view(x.shape[0], x.shape[1], -1) 63 | x = torch.sum(x, 2) / x.shape[2] 64 | x = self.fc(x) 65 | x = F.relu(x) 66 | b1 = self.fc1(x) 67 | b2 = self.fc2(x) 68 | b2 = F.softplus(b2) + 0.1 # we want to avoid small boxes 69 | 70 | return b1, b2 71 | -------------------------------------------------------------------------------- /src/options.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings 3 | 4 | Options parser. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import argparse 14 | 15 | 16 | class OptionsBoxesTrain: 17 | def __init__(self): 18 | self.options = None 19 | self.parser = argparse.ArgumentParser(description='Predicting Visual Overlap of Images: Training Loop.') 20 | self.parser.add_argument('--name', default='debug', type=str, 21 | help='Name of the experiment (default: debug).') 22 | self.parser.add_argument('--dataset', type=str, default='megadepth', 23 | choices=['megadepth'], help='Parent dataset for scene (default: megadepth).') 24 | self.parser.add_argument('--dataset_json', default='data/dataset_jsons/megadepth/bigben.json', 25 | help='Path to dataset json files.') 26 | self.parser.add_argument('--log_path', default=None, type=str, 27 | help='Path to model and log files. If not specified it saves in current directory.') 28 | self.parser.add_argument('--model', default='resnet50', type=str, 29 | choices=['resnet18', 'resnet50', 'resnet101'], 30 | help='Backbone to use. (default: resnet50).') 31 | self.parser.add_argument('--box_ndim', default=32, type=int, 32 | help='Box embedding dimension (default: 32).') 33 | self.parser.add_argument('--input_hw', type=int, nargs='+', default=(256, 456), 34 | help='Network input height and width (default: (256,456).') 35 | self.parser.add_argument('--batch_size', type=int, default=32, 36 | help='Input batch size for training (default: 32).') 37 | self.parser.add_argument('--learning_rate', type=float, default=0.0001, 38 | help='Learning rate (default: 0.0001)') 39 | self.parser.add_argument('--num_epochs', type=int, default=20, 40 | help='Number of epochs to train (default: 20).') 41 | self.parser.add_argument('--log_frequency', type=int, default=250, 42 | help='Number of batches to run validation and log (default: 250).') 43 | self.parser.add_argument('--save_frequency', default=250, type=int, 44 | help='Save the model every N steps (default: 250).') 45 | self.parser.add_argument('--num_workers', type=int, default=8, 46 | help='Number of workers for data loading (default: 8).') 47 | self.parser.add_argument('--seed', default=42, type=int, 48 | help='Random seed for reproducibility.') 49 | self.parser.add_argument('--num_gpus', default=1, type=int, 50 | help='Number of gpus used for training (default: 1)') 51 | self.parser.add_argument('--backend', default='dp', type=str, 52 | help='Lightning distributed backend (default: dp)') 53 | 54 | def parse(self, *args, **kwargs): 55 | self.options = self.parser.parse_args(*args, **kwargs) 56 | return self.options 57 | 58 | 59 | class OptionsBoxesTest: 60 | def __init__(self): 61 | self.options = None 62 | self.parser = argparse.ArgumentParser(description='Predicting Visual Overlap of Images: Test Loop') 63 | self.parser.add_argument('--dataset', type=str, default='megadepth', 64 | choices=['megadepth'], help='Parent dataset for scene.') 65 | self.parser.add_argument('--dataset_json', default='data/dataset_jsons/megadepth/bigben.json', 66 | help='Path to dataset json files.') 67 | self.parser.add_argument('--model_scene', default='bigben', type=str, 68 | choices=['bigben', 'notredame', 'florence', 'venice'], help='Choose the model to load') 69 | self.parser.add_argument('--model', default='resnet50', type=str, 70 | choices=['resnet18', 'resnet50', 'resnet101'], help='Backbone of saved model.') 71 | self.parser.add_argument('--box_ndim', default=32, type=int, 72 | help='Box embedding dimension (default: 32)') 73 | self.parser.add_argument('--input_hw', type=int, nargs='+', default=(256, 456), 74 | help='Network input height and width (default:(256,456)') 75 | self.parser.add_argument('--batch_size', type=int, default=8, 76 | help='Input batch size for training (default: 8)') 77 | self.parser.add_argument('--num_workers', type=int, default=8, 78 | help='Number of workers for data loading (default: 8)') 79 | 80 | def parse(self, *args, **kwargs): 81 | self.options = self.parser.parse_args(*args, **kwargs) 82 | return self.options -------------------------------------------------------------------------------- /src/test.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Example of evaluating a trained model for surface overlap prediction. 5 | If provided models are used it reproduces results on Table 1 of the paper. 6 | 7 | Copyright Niantic 2020. Patent Pending. All rights reserved. 8 | 9 | This software is licensed under the terms of the Image-box-overlap licence 10 | which allows for non-commercial use only, the full terms of which are made 11 | available in the LICENSE file. 12 | """ 13 | 14 | import torch 15 | import os 16 | from tqdm import tqdm 17 | from .options import OptionsBoxesTest 18 | from .model import ResnetEncoder 19 | from .datasets import MegaDepthSurfacePairLoader 20 | from .utils import box_overlap_soft, checkpoint_loader, download_model_if_doesnt_exist 21 | 22 | 23 | def main(): 24 | # Parse command line arguments 25 | opts = OptionsBoxesTest().parse() 26 | # Download the trained model if it doesn't exist to reproduce results. 27 | download_model_if_doesnt_exist(opts.model_scene) 28 | 29 | # If you train your own models using train.py, just change the path and use the .cpkt extension instead 30 | state_dict = checkpoint_loader(os.path.join('models', opts.model_scene, f'{opts.model_scene}.pth.tar')) 31 | test_loader = torch.utils.data.DataLoader(MegaDepthSurfacePairLoader(opts.dataset_json, mode='test'), 32 | batch_size=opts.batch_size, 33 | shuffle=False, 34 | num_workers=opts.num_workers, 35 | pin_memory=True) 36 | 37 | # Initializes the model. Gets number of Resnet layers from name 38 | model = ResnetEncoder(int(opts.model[-2:]), opts.box_ndim) 39 | model.load_state_dict(state_dict) 40 | 41 | if torch.cuda.is_available(): 42 | model.to(torch.device('cuda')) 43 | model.eval() 44 | 45 | overlap_preds, overlap_gts = [], [] 46 | 47 | print("Processing batches...") 48 | with torch.no_grad(): 49 | for batch_idx, batch in enumerate(tqdm(test_loader)): 50 | if torch.cuda.is_available(): 51 | for key, ipt in batch.items(): 52 | batch[key] = ipt.cuda() 53 | bx_c, bx_e = model(batch['images'][:, 0]) 54 | by_c, by_e = model(batch['images'][:, 1]) 55 | overlap_pred = box_overlap_soft(bx_c, bx_e, by_c, by_e) 56 | overlap_preds.append(overlap_pred) 57 | overlap_gts.append(batch['surface_overlap'].type_as(overlap_pred)) 58 | 59 | overlap_gts = torch.cat(overlap_gts) 60 | overlap_preds = torch.cat(overlap_preds) 61 | diff = overlap_preds - overlap_gts 62 | diff_abs_pair = torch.abs(diff).reshape((int(len(diff) / 2), 2)) 63 | 64 | print("Results:") 65 | print("RMSE: {:.3f}".format(torch.sqrt(torch.mean(torch.sum(diff_abs_pair ** 2, 1))).cpu().numpy())) 66 | print("L1 Norm: {:.3f}".format(torch.mean(torch.sum(diff_abs_pair, 1)).cpu().numpy())) 67 | print("Acc. < 0.1: {:.1f}%".format(100*torch.mean((torch.abs(diff) < 0.1).double()).cpu().numpy())) 68 | 69 | 70 | if __name__ == '__main__': 71 | main() 72 | -------------------------------------------------------------------------------- /src/train.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Training loop. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import os 14 | import torch 15 | import pytorch_lightning as pl 16 | from .options import OptionsBoxesTrain 17 | from .datasets import MegaDepthSurfacePairLoader 18 | from .trainer import BoxSurfaceOverlap 19 | 20 | 21 | def main(): 22 | # Parse command line arguments 23 | opts = OptionsBoxesTrain().parse() 24 | # Random seeds 25 | pl.seed_everything(opts.seed) 26 | # Setup logging 27 | path_logs = os.path.join(opts.log_path, opts.name) \ 28 | if opts.log_path is not None else os.path.join(os.getcwd(), opts.name) 29 | 30 | if not os.path.exists(path_logs): 31 | os.makedirs(path_logs) 32 | 33 | logger = pl.loggers.TensorBoardLogger(path_logs, name=opts.name) 34 | 35 | # Dataloader initialization 36 | if opts.dataset.lower() == 'megadepth': 37 | train_dataloader = torch.utils.data.DataLoader( 38 | MegaDepthSurfacePairLoader(opts.dataset_json, mode='train'), 39 | batch_size=opts.batch_size, 40 | shuffle=True, num_workers=opts.num_workers, 41 | pin_memory=True) 42 | val_dataloader = torch.utils.data.DataLoader( 43 | MegaDepthSurfacePairLoader(opts.dataset_json, mode='val'), 44 | batch_size=opts.batch_size, 45 | shuffle=False, num_workers=opts.num_workers, 46 | pin_memory=True) 47 | else: 48 | raise NotImplemented(f"Dataset {opts.dataset} not implemented!") 49 | 50 | # Initialize network 51 | model = BoxSurfaceOverlap(opts) 52 | 53 | # Initialize training loop 54 | trainer = pl.Trainer(default_save_path=path_logs, 55 | logger=logger, 56 | gpus=opts.num_gpus, 57 | val_check_interval=opts.log_frequency, 58 | distributed_backend=opts.backend, 59 | deterministic=True, 60 | fast_dev_run=False, 61 | max_epochs=opts.num_epochs) 62 | 63 | # Train 64 | trainer.fit(model, train_dataloader=train_dataloader, val_dataloaders=val_dataloader) 65 | 66 | 67 | if __name__ == '__main__': 68 | main() 69 | -------------------------------------------------------------------------------- /src/trainer.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Trainer definition within PyTorch Lightning's framework. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | import torch 14 | import pytorch_lightning as pl 15 | from .utils import box_overlap_soft 16 | from .model import ResnetEncoder 17 | 18 | 19 | class BoxSurfaceOverlap(pl.LightningModule): 20 | 21 | def __init__(self, hparams): 22 | super(BoxSurfaceOverlap, self).__init__() 23 | self.hparams = hparams 24 | self.box_ndim = hparams.box_ndim 25 | # Get number of Resnet layers from name 26 | self.model = ResnetEncoder(int(self.hparams.model[-2:]), self.box_ndim) 27 | 28 | def forward(self, x): 29 | return self.model.forward(x) 30 | 31 | def _shared_eval(self, batch): 32 | bx_center, bx_extent = self.forward((batch['images'][:, 0])) 33 | by_center, by_extent = self.forward((batch['images'][:, 1])) 34 | 35 | overlap_pred = box_overlap_soft(bx_center, bx_extent, by_center, by_extent) 36 | # also moves tensor to overlap_pred's device 37 | overlap_gt = batch['surface_overlap'].type_as(overlap_pred) 38 | 39 | loss = torch.nn.MSELoss(reduction='mean') 40 | loss = loss(overlap_pred, overlap_gt) 41 | 42 | accuracy = (torch.abs((overlap_pred - overlap_gt)) < 0.1).sum().double() / len(overlap_gt) 43 | 44 | return loss, accuracy 45 | 46 | def training_step(self, batch, batch_idx): 47 | loss, accuracy = self._shared_eval(batch) 48 | return {'loss': loss, 49 | 'progress_bar': {'accuracy': accuracy}, 50 | 'log': {'train_loss': loss, 'train_accuracy': accuracy}} 51 | 52 | def validation_step(self, batch, batch_idx): 53 | loss, accuracy = self._shared_eval(batch) 54 | return {'val_loss': loss, 'val_accuracy': accuracy} 55 | 56 | def validation_epoch_end(self, outputs): 57 | avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() 58 | avg_acc = torch.stack([x['val_accuracy'] for x in outputs]).mean() 59 | return {'val_loss': avg_loss, 'log': {'val_loss': avg_loss, 'val_accuracy': avg_acc}} 60 | 61 | def configure_optimizers(self): 62 | optimizer = torch.optim.Adam(self.parameters(), lr=self.hparams.learning_rate) 63 | scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95) 64 | return [optimizer], [scheduler] -------------------------------------------------------------------------------- /src/utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | Predicting Visual Overlap of Images Through Interpretable Non-Metric Box Embeddings. 3 | 4 | Util functions. It includes important functions as box overlap computation. 5 | 6 | Copyright Niantic 2020. Patent Pending. All rights reserved. 7 | 8 | This software is licensed under the terms of the Image-box-overlap licence 9 | which allows for non-commercial use only, the full terms of which are made 10 | available in the LICENSE file. 11 | """ 12 | 13 | from __future__ import absolute_import, division, print_function 14 | import os 15 | import numpy as np 16 | import torch 17 | import hashlib 18 | import zipfile 19 | from six.moves import urllib 20 | from torch.nn import functional 21 | 22 | 23 | def box_overlap_soft(bx_center, bx_extent, by_center, by_extent, box_rho=5): 24 | """ 25 | Computes soft box overlap of two boxes in D-dimensional space 26 | :param bx_center: D-dimensional vector with box x center coordinates 27 | :param bx_extent: D-dimensional vector with box x size 28 | :param by_center: D-dimensional vector with box y center coordinates 29 | :param by_extent: D-dimensional vector with box y size 30 | :param box_rho: temperature parameter, $\rho$ in the paper 31 | :return: box overlap of bx and by 32 | """ 33 | bx_min, by_min = bx_center - 0.5 * bx_extent, by_center - 0.5 * by_extent 34 | bx_max, by_max = bx_min + bx_extent, by_min + by_extent 35 | 36 | lower_upper_bound = torch.min(torch.stack([bx_max, by_max], dim=-1), dim=-1)[0] 37 | upper_lower_bound = torch.max(torch.stack([bx_min, by_min], dim=-1), dim=-1)[0] 38 | 39 | flat_overlap = lower_upper_bound - upper_lower_bound 40 | 41 | area_x_exp = torch.exp( 42 | torch.sum(torch.log(functional.softplus((bx_max - bx_min) * box_rho) / box_rho + 1e-10), 1)) 43 | intersect_exp = torch.exp( 44 | torch.sum(torch.log(functional.softplus(flat_overlap * box_rho) / box_rho + 1e-10), 1)) 45 | 46 | return intersect_exp / area_x_exp 47 | 48 | 49 | def box_overlap(bx_center, bx_extent, by_center, by_extent): 50 | """ 51 | Computes box overlap of two boxes in D-dimensional space 52 | :param bx_center: D-dimensional vector with box x center coordinates 53 | :param bx_extent: D-dimensional vector with box x size 54 | :param by_center: D-dimensional vector with box y center coordinates 55 | :param by_extent: D-dimensional vector with box y size 56 | :return: box overlap of bx and by 57 | """ 58 | bx_min, by_min = bx_center - 0.5 * bx_extent, by_center - 0.5 * by_extent 59 | bx_max, by_max = bx_min + bx_extent, by_min + by_extent 60 | 61 | lower_upper_bound = torch.min(torch.stack([bx_max, by_max], dim=-1), dim=-1)[0] 62 | upper_lower_bound = torch.max(torch.stack([bx_min, by_min], dim=-1), dim=-1)[0] 63 | 64 | intersection = torch.prod(lower_upper_bound - upper_lower_bound, dim=-1) 65 | area_x = torch.prod(bx_max - bx_min, dim=-1) 66 | 67 | zeros_tensor = torch.zeros(intersection.shape).type_as(intersection) 68 | 69 | return torch.max(torch.stack([zeros_tensor, intersection / (area_x + 1e-10)]), dim=0)[0] 70 | 71 | 72 | def compute_relative_scale(enclosure, concentration, im_x_size, im_y_size): 73 | """ 74 | Computes relative scale between two images using predicted enclosure and concentration 75 | """ 76 | x_width, x_height = im_x_size 77 | y_width, y_height = im_y_size 78 | 79 | x_area = x_width * x_height 80 | y_area = y_width * y_height 81 | 82 | x_scale, y_scale = 1., 1. 83 | 84 | ratio = enclosure / concentration 85 | 86 | y_scale = np.sqrt(ratio * x_area / y_area) 87 | 88 | if y_scale > 1.: # we want to downsample, not upsample 89 | x_scale = 1. / y_scale 90 | y_scale = 1. 91 | 92 | return x_scale, y_scale 93 | 94 | 95 | def download_model_if_doesnt_exist(model_name): 96 | """ 97 | If pretrained MegaDepth model doesn't exist, download and unzip it 98 | """ 99 | # values are tuples of (, ) 100 | download_paths = { 101 | 'bigben': 102 | ('https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/bigben.zip', 103 | 'df43091df376c70e9701ee4db4f903ef'), 104 | 'notredame': 105 | ('https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/notredame' 106 | '.zip', 107 | '2c228d48cac1f911b53b44de190633b6'), 108 | 'venice': 109 | ('https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/venice.zip', 110 | '2996a6e846cb94333ccd83a77445b913'), 111 | 'florence': 112 | ('https://storage.googleapis.com/niantic-lon-static/research/image-box-overlap/models/megadepth/florence' 113 | '.zip', 114 | '084194eb90a7b3e49b542e7b8e11451e'), 115 | } 116 | 117 | if not os.path.exists('models'): 118 | os.makedirs('models') 119 | 120 | model_path = os.path.join('models', model_name) 121 | 122 | def check_file_matches_md5(checksum, fpath): 123 | if not os.path.exists(fpath): 124 | return False 125 | with open(fpath, 'rb') as f: 126 | current_md5checksum = hashlib.md5(f.read()).hexdigest() 127 | return current_md5checksum == checksum 128 | 129 | # See if we have the model already downloaded... 130 | if not os.path.exists(os.path.join(model_path, f'{model_name}.pth.tar')): 131 | 132 | model_url, required_md5checksum = download_paths[model_name] 133 | 134 | if not check_file_matches_md5(required_md5checksum, f'{model_path}.zip'): 135 | print(f"-> Downloading pretrained model to {model_path}.zip") 136 | urllib.request.urlretrieve(model_url, f'{model_path}.zip') 137 | 138 | if not check_file_matches_md5(required_md5checksum, f'{model_path}.zip'): 139 | print(" Failed to download a file which matches the checksum - quitting") 140 | quit() 141 | 142 | print(" Unzipping model...") 143 | with zipfile.ZipFile(f'{model_path}.zip', 'r') as f: 144 | f.extractall(model_path) 145 | 146 | print(f" Model unzipped to {model_path}") 147 | 148 | 149 | def checkpoint_loader(ckpt_path): 150 | """ 151 | Returns saved weights providing compatibility with saved models to reproduce paper results. 152 | """ 153 | checkpoint = torch.load(ckpt_path) 154 | # trained models for ECCV paper using PyTorch (.pth.tar extension) 155 | if 'model_state_dict' in checkpoint: 156 | state_dict = checkpoint['model_state_dict'] 157 | # trained models using new implementation with Lightning (.cpkt extension) 158 | elif 'state_dict' in checkpoint: 159 | state_dict = checkpoint['state_dict'] 160 | state_dict_new = {} 161 | for key, value in state_dict.items(): 162 | # lightning adds the prefix "model" to the module name layers, removing that 163 | new_key = key[6:] 164 | state_dict_new[new_key] = value 165 | state_dict = state_dict_new 166 | else: 167 | raise ModelVersionException 168 | return state_dict 169 | 170 | 171 | class ModelVersionException(Exception): 172 | def __init__(self, msg="Incompatible model version. Use provided ones or the ones trained with the provided code", 173 | *args, **kwargs): 174 | super().__init__(msg, *args, **kwargs) 175 | -------------------------------------------------------------------------------- /test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | python -m src.test \ 3 | --model_scene venice \ 4 | --model resnet50 \ 5 | --dataset_json data/dataset_jsons/megadepth/venice.json -------------------------------------------------------------------------------- /train.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | python -m src.train \ 3 | --name my_model \ 4 | --dataset_json data/dataset_jsons/megadepth/bigben.json \ 5 | --box_ndim 32 \ 6 | --batch_size 32 \ 7 | --model resnet50 \ 8 | --num_gpus 1 \ 9 | --backend dp --------------------------------------------------------------------------------