├── .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 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
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 |
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 |
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 |
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 |
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 |
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
--------------------------------------------------------------------------------