├── resources ├── coarse_to_fine.pkl ├── middle_to_fine.pkl ├── coarse_to_middle.pkl ├── semantic_cagtegories.mat └── im2gps_places365.csv ├── LICENSE ├── config └── base_config.yml ├── README.md └── experiment_codes ├── ViT_RGB_train.py └── dataset.py /resources/coarse_to_fine.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShramanPramanick/Transformer_Based_Geo-localization/HEAD/resources/coarse_to_fine.pkl -------------------------------------------------------------------------------- /resources/middle_to_fine.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShramanPramanick/Transformer_Based_Geo-localization/HEAD/resources/middle_to_fine.pkl -------------------------------------------------------------------------------- /resources/coarse_to_middle.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShramanPramanick/Transformer_Based_Geo-localization/HEAD/resources/coarse_to_middle.pkl -------------------------------------------------------------------------------- /resources/semantic_cagtegories.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShramanPramanick/Transformer_Based_Geo-localization/HEAD/resources/semantic_cagtegories.mat -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Shraman Pramanick 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config/base_config.yml: -------------------------------------------------------------------------------- 1 | optim: AdamW 2 | lr: 0.1 3 | momentum: 0.9 4 | weight_decay: 0.0001 5 | scheduler: Cosine 6 | momentum: 0.9 7 | 8 | 9 | model_params: 10 | batch_size: 2 11 | msgpack_train_dir: /export/io76a/data/enowara/mp16 12 | msgpack_train_seg_dir: /export/io76a/data/enowara/mp16/mp16_seg_images_PNG/ 13 | msgpack_val_dir: /export/io76a/data/enowara/yfcc25600 14 | msgpack_val_seg_dir: /export/io76a/data/enowara/yfcc25600/yfcc25600_seg_images_PNG/ 15 | # meta information i.e. coordinates for each image 16 | train_meta_path: ./../resources/mp16_places365.csv 17 | val_meta_path: ./../resources/yfcc25600_places365.csv 18 | # mapping from image ids in msgpack dataset to target value(s) 19 | # orient: index -> {"img_id": [t1, t2], ...} 20 | train_label_mapping: ./../resources/mp16_places365_mapping_h3.json 21 | val_label_mapping: ./../resources/yfcc_25600_places365_mapping_h3.json 22 | segment_file_path: ./../resources/semantic_cagtegories.mat 23 | key_img_id: id # image id name for msgpack dataset 24 | key_img_encoded: image # image data name for msgpack dataset 25 | num_workers_per_loader: 8 26 | percent_seg_pixels: 1 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Transformer_Based_Geo-Localization 2 | This is the repository for ECCV 2022 paper titled: "Where in the World is this Image? Transformer-based Geo-localization in the Wild". More details and links to the training dataset and corresponding semantic segmentation maps will be available soon. 3 | 4 | ## Download Training Datasets and Annotations 5 | Download the RGB images, corresponding Segmentation maps and the annotations of mp16 training set and keep them in the resources folder. 6 | ``` 7 | cd resources/ 8 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/mp16_rgb_images.tgz 9 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/mp16_seg_images_PNG.tgz 10 | 11 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Annotations.zip 12 | ``` 13 | 14 | ## Download Evaluation Datasets 15 | Download the RGB images of the three evaluation datasets and their corresponding semantic maps, and untar them into resources folder. 16 | 17 | **Im2GPS dataset** 18 | ``` 19 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/im2gps_rgb_images.tar.gz 20 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/im2gps_seg_images_PNG.tar.gz 21 | ``` 22 | **Im2GPS3k dataset** 23 | ``` 24 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/im2gps3k_rgb_images.tar.gz 25 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/im2gps3k_seg_images_PNG.tar.gz 26 | ``` 27 | **YFCC4k dataset** 28 | ``` 29 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/yfcc4k_rgb_images.tar.gz 30 | wget http://www.cis.jhu.edu/~shraman/TransLocator/Datasets/yfcc4k_seg_images_PNG.tar.gz 31 | ``` 32 | 33 | 34 | -------------------------------------------------------------------------------- /experiment_codes/ViT_RGB_train.py: -------------------------------------------------------------------------------- 1 | from dataset import MultiPartitioningClassifier, cuda_base, device_ids, scenes, num_epochs 2 | import yaml 3 | from argparse import Namespace 4 | import torch 5 | import argparse 6 | 7 | with open('../config/base_config.yml') as f: 8 | config = yaml.load(f, Loader=yaml.FullLoader) 9 | 10 | model_params = config["model_params"] 11 | tmp_model = MultiPartitioningClassifier(hparams=Namespace(**model_params)) 12 | 13 | train_data_loader = tmp_model.train_dataloader() 14 | val_data_loader = tmp_model.val_dataloader() 15 | # Choose the first n_steps batches with 64 samples in each batch 16 | # n_steps = 10 17 | 18 | import os 19 | import pandas as pd 20 | import numpy as np 21 | import torch 22 | import torchvision 23 | from PIL import Image 24 | from torch.utils.data import Dataset, DataLoader 25 | from torchvision import transforms,models 26 | import torch.nn as nn 27 | from torch.nn import functional as F 28 | from torch.optim import lr_scheduler 29 | from sklearn.metrics import accuracy_score, confusion_matrix 30 | from torchsummary import summary 31 | import random 32 | from sklearn.metrics import f1_score, confusion_matrix, precision_score, recall_score 33 | from torchsummary import summary 34 | from transformers import ViTModel 35 | import warnings 36 | import math 37 | warnings.filterwarnings("ignore", message="numerical errors at iteration 0") 38 | 39 | def topk_accuracy(target, output, k): 40 | topn = np.argsort(output, axis = 1)[:,-k:] 41 | return np.mean(np.array([1 if target[k] in topn[k] else 0 for k in range(len(topn))])) 42 | 43 | 44 | def adjust_learning_rate(num_epochs, optimizer, loader, step): 45 | max_steps = num_epochs * len(loader) 46 | warmup_steps = 2 * len(loader) ### In originalBT repo, this constant is 10 47 | base_lr = 0.1 48 | if step < warmup_steps: 49 | lr = base_lr * step / warmup_steps 50 | else: 51 | step -= warmup_steps 52 | max_steps -= warmup_steps 53 | q = 0.5 * (1 + math.cos(math.pi * step / max_steps)) 54 | end_lr = base_lr * 0.001 55 | lr = base_lr * q + end_lr * (1 - q) 56 | optimizer.param_groups[0]['lr'] = lr * 0.2 57 | optimizer.param_groups[1]['lr'] = lr * 0.0048 58 | 59 | 60 | num_classes_coarse = 3298 61 | num_classes_middle = 7202 62 | num_classes_fine = 12893 63 | learning_rate = config["lr"] 64 | num_scene = int(scenes) 65 | 66 | class GeoClassification(nn.Module): 67 | 68 | def __init__(self): 69 | super(GeoClassification, self).__init__() 70 | 71 | self.vit = ViTModel.from_pretrained('google/vit-large-patch16-224-in21k') 72 | self.classifier_1 = nn.Linear(self.vit.config.hidden_size, num_classes_coarse) 73 | self.classifier_2 = nn.Linear(self.vit.config.hidden_size, num_classes_middle) 74 | self.classifier_3 = nn.Linear(self.vit.config.hidden_size, num_classes_fine) 75 | self.classifier_4 = nn.Linear(self.vit.config.hidden_size, num_scene) 76 | 77 | def forward(self, rgb_image): 78 | 79 | outputs = self.vit(rgb_image).last_hidden_state 80 | outputs = outputs[:,0,:] 81 | logits_geocell_coarse = self.classifier_1(outputs) 82 | logits_geocell_middle = self.classifier_2(outputs) 83 | logits_geocell_fine = self.classifier_3(outputs) 84 | logits_scene = self.classifier_2(outputs) 85 | return logits_geocell_coarse, logits_geocell_middle, logits_geocell_fine, logits_scene 86 | 87 | device = torch.device(cuda_base if torch.cuda.is_available() else 'cpu') 88 | model = GeoClassification() 89 | model = model.to(device) 90 | 91 | param_weights = [] 92 | param_biases = [] 93 | for param in model.parameters(): 94 | if param.ndim == 1: 95 | param_biases.append(param) 96 | else: 97 | param_weights.append(param) 98 | parameters = [{'params': param_weights}, {'params': param_biases}] 99 | 100 | 101 | model = nn.DataParallel(model, device_ids=device_ids) 102 | criterion = nn.CrossEntropyLoss() 103 | optimizer = torch.optim.SGD(parameters, lr=learning_rate, momentum = config['momentum'], weight_decay = config["weight_decay"]) 104 | step_lr_scheduler = lr_scheduler.MultiStepLR(optimizer, milestones = config["milestones"], gamma= config["gamma"]) 105 | 106 | #print(summary(model, (3, 224, 224))) 107 | 108 | target_total_test = [] 109 | predicted_total_test = [] 110 | model_outputs_total_test = [] 111 | 112 | import warnings 113 | warnings.filterwarnings("ignore") 114 | 115 | n_total_steps = len(train_data_loader) 116 | 117 | batch_wise_loss = [] 118 | batch_wise_micro_f1 = [] 119 | batch_wise_macro_f1 = [] 120 | epoch_wise_top_1_accuracy = [] 121 | epoch_wise_top_10_accuracy = [] 122 | epoch_wise_top_50_accuracy = [] 123 | epoch_wise_top_100_accuracy = [] 124 | epoch_wise_top_200_accuracy = [] 125 | epoch_wise_top_300_accuracy = [] 126 | epoch_wise_top_500_accuracy = [] 127 | 128 | 129 | scaler = torch.cuda.amp.GradScaler() 130 | for epoch in range(num_epochs): 131 | steps = len(train_data_loader) * epoch 132 | for i, (rgb_image, _, label, _, _, scene) in enumerate(train_data_loader): 133 | 134 | rgb_image = rgb_image.type(torch.float32).to(device) 135 | label_coarse = label[0].to(device) 136 | label_middle = label[1].to(device) 137 | label_fine = label[2].to(device) 138 | scene = scene.type(torch.long).to(device) 139 | 140 | adjust_learning_rate(num_epochs, optimizer, train_data_loader, steps) 141 | optimizer.zero_grad() 142 | steps += 1 143 | 144 | # Forward pass 145 | model.train() 146 | batch_size, n_crops, c, h, w = rgb_image.size() 147 | 148 | with torch.cuda.amp.autocast(): 149 | outputs_geocell_coarse, outputs_geocell_middle, outputs_geocell_fine, outputs_scene = model(rgb_image.view(-1, c, h, w)) 150 | outputs_geocell_coarse = outputs_geocell_coarse.view(batch_size, n_crops, -1).mean(1) 151 | outputs_geocell_middle = outputs_geocell_middle.view(batch_size, n_crops, -1).mean(1) 152 | outputs_geocell_fine = outputs_geocell_fine.view(batch_size, n_crops, -1).mean(1) 153 | outputs_scene = outputs_scene.view(batch_size, n_crops, -1).mean(1) 154 | loss_geocell_coarse = criterion(outputs_geocell_coarse, label_coarse) 155 | loss_geocell_middle = criterion(outputs_geocell_middle, label_middle) 156 | loss_geocell_fine = criterion(outputs_geocell_fine, label_fine) 157 | loss_scene = criterion(outputs_scene, scene) 158 | 159 | loss = 0.5*loss_geocell_coarse + 0.3*loss_geocell_middle + 0.2*loss_geocell_fine + loss_scene 160 | 161 | # Backward and optimize 162 | 163 | scaler.scale(loss).backward() 164 | scaler.step(optimizer) 165 | scaler.update() 166 | 167 | if (i+1) % 4000 == 0: 168 | print (f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{n_total_steps}], Loss: {loss.item():.4f}') 169 | #if (i+1) == n_steps: 170 | #break 171 | 172 | target_total_test = [] 173 | predicted_total_test = [] 174 | model_outputs_total_test = [] 175 | 176 | with torch.no_grad(): 177 | 178 | n_correct = 0 179 | n_samples = 0 180 | 181 | for i, (rgb_image, _, label, _, _, scene) in enumerate(val_data_loader): 182 | 183 | rgb_image = rgb_image.type(torch.float32).to(device) 184 | 185 | label_fine = label[2].to(device) 186 | scene = scene.type(torch.long).to(device) 187 | 188 | # Forward pass 189 | model.eval() 190 | batch_size, n_crops, c, h, w = rgb_image.size() 191 | outputs_geocell_coarse, outputs_geocell_middle, outputs_geocell_fine, outputs_scene = model(rgb_image.view(-1, c, h, w)) 192 | outputs_geocell_coarse = outputs_geocell_coarse.view(batch_size, n_crops, -1).mean(1) 193 | outputs_geocell_middle = outputs_geocell_middle.view(batch_size, n_crops, -1).mean(1) 194 | outputs_geocell_fine = outputs_geocell_fine.view(batch_size, n_crops, -1).mean(1) 195 | outputs_scene = outputs_scene.view(batch_size, n_crops, -1).mean(1) 196 | #print(outputs) 197 | # max returns (value ,index) 198 | _, predicted = torch.max(outputs_geocell_fine.data, 1) 199 | #print(label) 200 | #print(predicted) 201 | n_samples += label_fine.size(0) 202 | n_correct += (predicted == label_fine).sum().item() 203 | 204 | target_total_test.append(label_fine) 205 | predicted_total_test.append(predicted) 206 | model_outputs_total_test.append(outputs_geocell_fine) 207 | 208 | target_inter = [t.cpu().numpy() for t in target_total_test] 209 | predicted_inter = [t.cpu().numpy() for t in predicted_total_test] 210 | outputs_inter = [t.cpu().numpy() for t in model_outputs_total_test] 211 | target_inter = np.stack(target_inter, axis=0).ravel() 212 | predicted_inter = np.stack(predicted_inter, axis=0).ravel() 213 | outputs_inter = np.concatenate(outputs_inter, axis=0) 214 | 215 | current_top_1_accuracy = topk_accuracy(target_inter, outputs_inter, k=1) 216 | epoch_wise_top_1_accuracy.append(current_top_1_accuracy) 217 | current_top_10_accuracy = topk_accuracy(target_inter, outputs_inter, k=10) 218 | epoch_wise_top_10_accuracy.append(current_top_10_accuracy) 219 | current_top_50_accuracy = topk_accuracy(target_inter, outputs_inter, k=50) 220 | epoch_wise_top_50_accuracy.append(current_top_50_accuracy) 221 | current_top_100_accuracy = topk_accuracy(target_inter, outputs_inter, k=100) 222 | epoch_wise_top_100_accuracy.append(current_top_100_accuracy) 223 | current_top_200_accuracy = topk_accuracy(target_inter, outputs_inter, k=200) 224 | epoch_wise_top_200_accuracy.append(current_top_200_accuracy) 225 | current_top_300_accuracy = topk_accuracy(target_inter, outputs_inter, k=300) 226 | epoch_wise_top_300_accuracy.append(current_top_300_accuracy) 227 | current_top_500_accuracy = topk_accuracy(target_inter, outputs_inter, k=500) 228 | epoch_wise_top_500_accuracy.append(current_top_500_accuracy) 229 | 230 | print(f' Accuracy of the network on the test set after Epoch {epoch+1} is: {accuracy_score(target_inter, predicted_inter)}') 231 | print(f' Top 2 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=2)}') 232 | print(f' Top 5 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=5)}') 233 | print(f' Top 10 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=10)}') 234 | print(f' Top 50 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=50)}') 235 | print(f' Top 100 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=100)}') 236 | print(f' Top 200 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=200)}') 237 | print(f' Top 300 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=300)}') 238 | print(f' Top 500 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=500)}') 239 | 240 | print(f' Best Top_1_accuracy on test set till this epoch: {max(epoch_wise_top_1_accuracy)} Found in Epoch No: {epoch_wise_top_1_accuracy.index(max(epoch_wise_top_1_accuracy))+1}') 241 | print(f' Best Top_10_accuracy on test set till this epoch: {max(epoch_wise_top_10_accuracy)} Found in Epoch No: {epoch_wise_top_10_accuracy.index(max(epoch_wise_top_10_accuracy))+1}') 242 | print(f' Best Top_50_accuracy on test set till this epoch: {max(epoch_wise_top_50_accuracy)} Found in Epoch No: {epoch_wise_top_50_accuracy.index(max(epoch_wise_top_50_accuracy))+1}') 243 | print(f' Best Top_100_accuracy on test set till this epoch: {max(epoch_wise_top_100_accuracy)} Found in Epoch No: {epoch_wise_top_100_accuracy.index(max(epoch_wise_top_100_accuracy))+1}') 244 | print(f' Best Top_200_accuracy on test set till this epoch: {max(epoch_wise_top_200_accuracy)} Found in Epoch No: {epoch_wise_top_200_accuracy.index(max(epoch_wise_top_200_accuracy))+1}') 245 | print(f' Best Top_300_accuracy on test set till this epoch: {max(epoch_wise_top_300_accuracy)} Found in Epoch No: {epoch_wise_top_300_accuracy.index(max(epoch_wise_top_300_accuracy))+1}') 246 | print(f' Best Top_500_accuracy on test set till this epoch: {max(epoch_wise_top_500_accuracy)} Found in Epoch No: {epoch_wise_top_500_accuracy.index(max(epoch_wise_top_500_accuracy))+1}') 247 | print(f' Top_1_accuracy: {epoch_wise_top_1_accuracy}') 248 | #print(f' Top_500_accuracy: {epoch_wise_top_500_accuracy}') 249 | 250 | if not os.path.exists('../saved_models'): 251 | os.makedirs('../saved_models') 252 | 253 | if(current_top_1_accuracy == max(epoch_wise_top_1_accuracy)): 254 | torch.save({'Model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict()}, '../saved_models/ViT_RGB_FourTask.tar') 255 | 256 | 257 | print("======================================") 258 | print("Training Completed, Evaluating the test set using the best model") 259 | print("======================================") 260 | 261 | 262 | #optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) 263 | saved_model = torch.load('../saved_models/ViT_RGB_FourTask.tar') 264 | model.load_state_dict(saved_model['Model_state_dict']) 265 | optimizer.load_state_dict(saved_model['optimizer_state_dict']) 266 | 267 | model.to(device) 268 | 269 | target_total_test = [] 270 | predicted_total_test = [] 271 | model_outputs_total_test = [] 272 | 273 | 274 | with torch.no_grad(): 275 | 276 | n_correct = 0 277 | n_samples = 0 278 | 279 | for i, (rgb_image, _, label, _, _, _) in enumerate(val_data_loader): 280 | 281 | rgb_image = rgb_image.type(torch.float32).to(device) 282 | 283 | label_fine = label[2].to(device) 284 | scene = scene.type(torch.long).to(device) 285 | 286 | # Forward pass 287 | model.eval() 288 | batch_size, n_crops, c, h, w = rgb_image.size() 289 | outputs_geocell_coarse, outputs_geocell_middle, outputs_geocell_fine, outputs_scene = model(rgb_image.view(-1, c, h, w)) 290 | outputs_geocell_coarse = outputs_geocell_coarse.view(batch_size, n_crops, -1).mean(1) 291 | outputs_geocell_middle = outputs_geocell_middle.view(batch_size, n_crops, -1).mean(1) 292 | outputs_geocell_fine = outputs_geocell_fine.view(batch_size, n_crops, -1).mean(1) 293 | outputs_scene = outputs_scene.view(batch_size, n_crops, -1).mean(1) 294 | #print(outputs) 295 | # max returns (value ,index) 296 | _, predicted = torch.max(outputs_geocell_fine.data, 1) 297 | #print(label) 298 | #print(predicted) 299 | n_samples += label_fine.size(0) 300 | n_correct += (predicted == label_fine).sum().item() 301 | 302 | target_total_test.append(label_fine) 303 | predicted_total_test.append(predicted) 304 | model_outputs_total_test.append(outputs_geocell_fine) 305 | 306 | target_inter = [t.cpu().numpy() for t in target_total_test] 307 | predicted_inter = [t.cpu().numpy() for t in predicted_total_test] 308 | outputs_inter = [t.cpu().numpy() for t in model_outputs_total_test] 309 | #print(target_inter[-1].shape) 310 | #print(predicted_inter[-1].shape) 311 | #print(outputs_inter[-1].shape) 312 | target_inter = np.stack(target_inter, axis=0).ravel() 313 | predicted_inter = np.stack(predicted_inter, axis=0).ravel() 314 | outputs_inter = np.concatenate(outputs_inter, axis=0) 315 | 316 | print(f' Accuracy of the network on the test set with the saved model is: {accuracy_score(target_inter, predicted_inter)}') 317 | print(f' Top 2 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=2)}') 318 | print(f' Top 5 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=5)}') 319 | print(f' Top 10 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=10)}') 320 | print(f' Top 50 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=50)}') 321 | print(f' Top 100 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=100)}') 322 | print(f' Top 200 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=200)}') 323 | print(f' Top 300 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=300)}') 324 | print(f' Top 500 accuracy on the testing: {topk_accuracy(target_inter, outputs_inter, k=500)}') 325 | -------------------------------------------------------------------------------- /experiment_codes/dataset.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | from typing import Dict, Union 4 | from io import BytesIO 5 | import random 6 | from pathlib import Path 7 | import pandas as pd 8 | from PIL import Image 9 | import torchvision 10 | import torch 11 | import msgpack 12 | from argparse import Namespace 13 | import json 14 | import yaml 15 | import numpy as np 16 | import scipy.io 17 | import argparse 18 | 19 | parser = argparse.ArgumentParser() 20 | parser.add_argument('--seg_channels', help="Number of Segmentation Channels", type=int) 21 | parser.add_argument('--scene_of_interest', help="indoor - 0, natural - 1, urban - 2, all - 3", type=int) 22 | parser.add_argument('--cuda_base', help="in form cuda:x") 23 | parser.add_argument('--device_ids', help='delimited list input', 24 | type=lambda s: [int(item) for item in s.split(',')]) 25 | parser.add_argument('--no_of_scenes', help="specify the number of scenes used (3/16/365") 26 | parser.add_argument('--epochs', help="number of epochs", type=int) 27 | 28 | args = parser.parse_args() 29 | 30 | seg_channels = args.seg_channels 31 | scene_of_interest = args.scene_of_interest 32 | cuda_base = args.cuda_base 33 | device_ids = args.device_ids 34 | num_epochs = args.epochs 35 | scenes = args.no_of_scenes 36 | 37 | 38 | class MsgPackIterableDatasetMultiTargetWithDynLabels(torch.utils.data.IterableDataset): 39 | """ 40 | Data source: bunch of msgpack files 41 | Target values are generated on the fly given a mapping (id->[target1, target, ...]) 42 | """ 43 | 44 | def __init__( 45 | self, 46 | path: str, 47 | seg_path: str, 48 | segment_file_path:str, 49 | scene_of_interest: int, 50 | seg_channels:int, 51 | percent_seg_pixels:int, 52 | target_mapping: Dict[str, int], 53 | key_img_id: str = "id", 54 | key_img_encoded: str = "image", 55 | transformation=None, 56 | transformation_seg=None, 57 | shuffle=True, 58 | meta_path=None, 59 | cache_size=6 * 4096, 60 | lat_key="LAT", 61 | lon_key="LON", 62 | scene_key ="S3_Label", 63 | scene_key_2 = "S" + scenes + "_Label" 64 | ): 65 | 66 | super(MsgPackIterableDatasetMultiTargetWithDynLabels, self).__init__() 67 | self.path = path 68 | self.seg_path = seg_path 69 | self.segment_file_path = segment_file_path 70 | self.scene_of_interest = scene_of_interest # indoor - 0, natural - 1, urban - 2 71 | self.seg_channels = seg_channels 72 | self.percent_seg_pixels = percent_seg_pixels 73 | self.cache_size = cache_size 74 | self.transformation = transformation 75 | self.transformation_seg = transformation_seg 76 | self.shuffle = shuffle 77 | self.seed = random.randint(1, 100) 78 | self.key_img_id = key_img_id.encode("utf-8") 79 | self.key_img_encoded = key_img_encoded.encode("utf-8") 80 | self.target_mapping = target_mapping 81 | 82 | for k, v in self.target_mapping.items(): 83 | if not isinstance(v, list): 84 | self.target_mapping[k] = [v] 85 | if len(self.target_mapping) == 0: 86 | raise ValueError("No samples found.") 87 | 88 | if not isinstance(self.path, (list, set)): 89 | self.path = [self.path] 90 | 91 | self.meta_path = meta_path 92 | if meta_path is not None: 93 | self.meta = pd.read_csv(meta_path, index_col=0) 94 | self.meta = self.meta.astype({lat_key: "float32", lon_key: "float32", scene_key: "float32", scene_key_2: "float32"}) 95 | self.lat_key = lat_key 96 | self.lon_key = lon_key 97 | self.scene_key = scene_key 98 | self.scene_key_2 = scene_key_2 99 | 100 | # filter the file names based on the scene kind 101 | if self.scene_of_interest == 0 or self.scene_of_interest == 1 or self.scene_of_interest == 2: 102 | 103 | self.meta = self.meta.loc[self.meta[self.scene_key] == self.scene_of_interest] 104 | self.meta = self.meta.astype({lat_key: "float32", lon_key: "float32", scene_key: "float32", scene_key_2: "float32"}) 105 | # otherwise keep all scene kinds 106 | 107 | self.shards = self.__init_shards(self.path) 108 | self.length = len(self.target_mapping) 109 | 110 | @staticmethod 111 | def __init_shards(path: Union[str, Path]) -> list: 112 | shards = [] 113 | for i, p in enumerate(path): 114 | shards_re = r"shard_(\d+).msg" 115 | shards_index = [ 116 | int(re.match(shards_re, x).group(1)) 117 | for x in os.listdir(p) 118 | if re.match(shards_re, x) 119 | ] 120 | shards.extend( 121 | [ 122 | { 123 | "path_index": i, 124 | "path": p, 125 | "shard_index": s, 126 | "shard_path": os.path.join(p, f"shard_{s}.msg"), 127 | } 128 | for s in shards_index 129 | ] 130 | ) 131 | if len(shards) == 0: 132 | raise ValueError("No shards found") 133 | return shards 134 | 135 | def _process_sample(self, x): 136 | # prepare image and target value 137 | # decode and initial resize if necessary 138 | img = Image.open(BytesIO(x[self.key_img_encoded])) 139 | 140 | if img.mode != "RGB": 141 | img = img.convert("RGB") 142 | 143 | if img.width > 320 and img.height > 320: 144 | img = torchvision.transforms.Resize(320)(img) 145 | 146 | # apply all user specified image transformations 147 | img = self.transformation(img) 148 | 149 | if self.meta_path is None: 150 | return img, x["target"] 151 | else: 152 | _id = x[self.key_img_id].decode("utf-8") # image name 153 | meta = self.meta.loc[_id] 154 | 155 | img_file = self.seg_path + _id 156 | seg_file = os.path.join(img_file.replace('.jpg', '.png')) 157 | 158 | if os.path.exists(seg_file): 159 | 160 | img = Image.open(BytesIO(x[self.key_img_encoded])) 161 | 162 | if img.mode != "RGB": 163 | img = img.convert("RGB") 164 | 165 | if img.width > 320 and img.height > 320: 166 | img = torchvision.transforms.Resize(320)(img) 167 | 168 | # apply all user specified image transformations 169 | img = self.transformation(img) 170 | if self.meta_path is None: 171 | return img, x["target"] 172 | else: 173 | _id = x[self.key_img_id].decode("utf-8") # image name 174 | meta = self.meta.loc[_id] 175 | 176 | img_file = self.seg_path + _id 177 | seg_file = os.path.join(img_file.replace('.jpg', '.png')) 178 | 179 | with Image.open(seg_file) as img_seg: 180 | # img_seg = np.array(im) 181 | 182 | if img_seg.mode != "RGB": 183 | img_seg = img_seg.convert("RGB") 184 | 185 | if img_seg.width > 320 and img_seg.height > 320: 186 | img_seg = torchvision.transforms.Resize(320)(img_seg) 187 | 188 | img_seg = self.transformation_seg(img_seg) 189 | 190 | # if want 150-D binary channels 191 | if self.seg_channels == 150: 192 | csv_file = os.path.join(img_file.replace('.jpg', '.csv')) 193 | 194 | df = pd.read_csv(csv_file) #os.path.join(root, csv_file)) 195 | class_idx = df['Class Index'] 196 | 197 | segment_file = scipy.io.loadmat(self.segment_file_path) 198 | #'../../segmentation/CSAIL_semantic_segmentation/semantic_cagtegories.mat') 199 | color_categories = segment_file['color_categories'] 200 | 201 | seg_channels = np.zeros((np.array(img_seg).shape[0], np.array(img_seg).shape[1], 150), dtype=bool) 202 | for c in range(class_idx.shape[0]): 203 | RGB_idx = color_categories[class_idx[c]-1,:] 204 | mask = (np.array(img_seg) == RGB_idx).all(-1) 205 | # print('%') 206 | # print((100*np.sum(mask)) / (np.array(img_seg).shape[0] * np.array(img_seg).shape[1])) 207 | if (100*np.sum(mask)) / (np.array(img_seg).shape[0] * np.array(img_seg).shape[1]) > self.percent_seg_pixels: # only use the channel if the segmented object takes up more than the threshold of all pixels 208 | seg_channels[:,:, class_idx[c]-1] = mask 209 | 210 | 211 | img_seg = seg_channels 212 | 213 | scipy.io.savemat('img_seg2.mat', {'img_seg':img_seg}) 214 | img_seg = torch.from_numpy(np.array(img_seg)) 215 | 216 | return img, img_seg, x["target"], meta[self.lat_key], meta[self.lon_key], meta[self.scene_key_2] 217 | 218 | 219 | def __iter__(self): 220 | 221 | shard_indices = list(range(len(self.shards))) 222 | 223 | if self.shuffle: 224 | random.seed(self.seed) 225 | random.shuffle(shard_indices) 226 | 227 | worker_info = torch.utils.data.get_worker_info() 228 | 229 | if worker_info is not None: 230 | 231 | def split_list(alist, splits=1): 232 | length = len(alist) 233 | return [ 234 | alist[i * length // splits : (i + 1) * length // splits] 235 | for i in range(splits) 236 | ] 237 | 238 | shard_indices_split = split_list(shard_indices, worker_info.num_workers)[ 239 | worker_info.id 240 | ] 241 | 242 | else: 243 | shard_indices_split = shard_indices 244 | 245 | cache = [] 246 | 247 | for shard_index in shard_indices_split: 248 | shard = self.shards[shard_index] 249 | 250 | with open( 251 | os.path.join(shard["path"], f"shard_{shard['shard_index']}.msg"), "rb" 252 | ) as f: 253 | unpacker = msgpack.Unpacker( 254 | f, max_buffer_size=1024 * 1024 * 1024, raw=True 255 | ) 256 | for x in unpacker: 257 | if x is None: 258 | continue 259 | 260 | _id = x[self.key_img_id].decode("utf-8") 261 | try: 262 | # set target value dynamically 263 | if len(self.target_mapping[_id]) == 1: 264 | x["target"] = self.target_mapping[_id][0] 265 | else: 266 | x["target"] = self.target_mapping[_id] 267 | except KeyError: 268 | continue 269 | 270 | if len(cache) < self.cache_size: 271 | cache.append(x) 272 | 273 | if len(cache) == self.cache_size: 274 | 275 | if self.shuffle: 276 | random.shuffle(cache) 277 | while cache: 278 | yield self._process_sample(cache.pop()) 279 | if self.shuffle: 280 | random.shuffle(cache) 281 | 282 | while cache: 283 | yield self._process_sample(cache.pop()) 284 | 285 | def __len__(self): 286 | return self.length 287 | 288 | class MultiPartitioningClassifier(): 289 | def __init__(self, hparams: Namespace): 290 | super().__init__() 291 | self.hparams = hparams 292 | 293 | def train_dataloader(self): 294 | 295 | with open(self.hparams.train_label_mapping, "r") as f: 296 | # target_mapping = json.load(f) # dictionary - name of the image and 297 | # three labels: S2 class_label for 298 | # 50_5000, 50_2000, 50_1000 - set based on latitude and longitude 299 | 300 | target_mapping_tmp = json.load(f) # lenght: 25600 301 | 302 | # filter the target_mapping by images with specific scene kind 303 | if scene_of_interest == 0 or scene_of_interest == 1 or scene_of_interest == 2: 304 | 305 | # TODO: read the csv file again - can we make this more efficient to not read the file again for each batch? 306 | meta_path=self.hparams.train_meta_path 307 | meta = pd.read_csv(meta_path, index_col=False) 308 | scene_key="S3_Label" 309 | 310 | meta = meta.loc[meta[scene_key] == scene_of_interest] 311 | # meta.iloc[:, 0] is the first column of the file containing the image file names 312 | target_mapping = {k: target_mapping_tmp[k] for k in meta.iloc[:, 0] if k in target_mapping_tmp} 313 | else: 314 | target_mapping = target_mapping_tmp 315 | 316 | # TODO: remove random transforms for now to make sure that RGB and segmented images match up 317 | tfm = torchvision.transforms.Compose( 318 | [ 319 | torchvision.transforms.RandomAffine(degrees=(0,15)), 320 | torchvision.transforms.ColorJitter(), 321 | torchvision.transforms.RandomHorizontalFlip(), 322 | torchvision.transforms.ToTensor(), 323 | torchvision.transforms.Resize((256, 256)), 324 | torchvision.transforms.TenCrop((224, 224)), 325 | torchvision.transforms.Lambda( 326 | lambda crops: torch.stack([crop for crop in crops]) 327 | ), 328 | torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 329 | ] 330 | ) 331 | 332 | 333 | # TODO: not using this now, figure out what transformations make sense for segmented images 334 | tfm_seg = torchvision.transforms.Compose( 335 | [ 336 | #torchvision.transforms.RandomAffine(degrees=(0,15)), 337 | #torchvision.transforms.ColorJitter(), 338 | #torchvision.transforms.RandomHorizontalFlip(), 339 | torchvision.transforms.ToTensor(), 340 | torchvision.transforms.Resize((256, 256)), 341 | torchvision.transforms.TenCrop((224, 224)), 342 | torchvision.transforms.Lambda( 343 | lambda crops: torch.stack([crop for crop in crops]) 344 | ), 345 | torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 346 | ] 347 | ) 348 | 349 | 350 | dataset = MsgPackIterableDatasetMultiTargetWithDynLabels( 351 | path=self.hparams.msgpack_train_dir, 352 | seg_path=self.hparams.msgpack_train_seg_dir, 353 | segment_file_path=self.hparams.segment_file_path, 354 | target_mapping=target_mapping, 355 | key_img_id=self.hparams.key_img_id, 356 | key_img_encoded=self.hparams.key_img_encoded, 357 | shuffle=True, 358 | transformation=tfm, 359 | transformation_seg = tfm_seg, 360 | meta_path=self.hparams.train_meta_path, 361 | scene_of_interest=scene_of_interest, 362 | seg_channels=seg_channels, 363 | percent_seg_pixels=self.hparams.percent_seg_pixels, 364 | cache_size=1024, 365 | ) 366 | 367 | dataloader = torch.utils.data.DataLoader( 368 | dataset, 369 | batch_size=self.hparams.batch_size, 370 | num_workers=self.hparams.num_workers_per_loader, 371 | pin_memory=True, 372 | drop_last = True, 373 | ) 374 | return dataloader 375 | 376 | def val_dataloader(self): 377 | 378 | with open(self.hparams.val_label_mapping, "r") as f: 379 | target_mapping_tmp = json.load(f) # lenght: 25600 380 | 381 | # filter the target_mapping by images with specific scene kind 382 | if scene_of_interest == 0 or scene_of_interest == 1 or scene_of_interest == 2: 383 | 384 | # TODO: read the csv file again - can we make this more efficient to not read the file again for each batch? 385 | meta_path=self.hparams.val_meta_path 386 | meta = pd.read_csv(meta_path, index_col=False) 387 | scene_key="S3_Label" 388 | 389 | meta = meta.loc[meta[scene_key] == scene_of_interest] 390 | # meta.iloc[:, 0] is the first column of the file containing the image file names 391 | target_mapping = {k: target_mapping_tmp[k] for k in meta.iloc[:, 0] if k in target_mapping_tmp} 392 | else: 393 | target_mapping = target_mapping_tmp 394 | 395 | tfm = torchvision.transforms.Compose( 396 | [ 397 | #torchvision.transforms.RandomAffine(degrees=(0,15)), 398 | #torchvision.transforms.ColorJitter(), 399 | #torchvision.transforms.RandomHorizontalFlip(), 400 | torchvision.transforms.ToTensor(), 401 | torchvision.transforms.Resize((256, 256)), 402 | torchvision.transforms.TenCrop((224, 224)), 403 | torchvision.transforms.Lambda( 404 | lambda crops: torch.stack([crop for crop in crops]) 405 | ), 406 | torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 407 | ] 408 | ) 409 | 410 | # TODO: not using this now, figure out what transformations make sense for segmented images 411 | tfm_seg = torchvision.transforms.Compose( 412 | [ 413 | #torchvision.transforms.RandomAffine(degrees=(0,15)), 414 | #torchvision.transforms.ColorJitter(), 415 | #torchvision.transforms.RandomHorizontalFlip(), 416 | torchvision.transforms.ToTensor(), 417 | torchvision.transforms.Resize((256, 256)), 418 | torchvision.transforms.TenCrop((224, 224)), 419 | torchvision.transforms.Lambda( 420 | lambda crops: torch.stack([crop for crop in crops]) 421 | ), 422 | torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 423 | ] 424 | ) 425 | 426 | 427 | dataset = MsgPackIterableDatasetMultiTargetWithDynLabels( 428 | path=self.hparams.msgpack_val_dir, 429 | seg_path=self.hparams.msgpack_val_seg_dir, 430 | segment_file_path=self.hparams.segment_file_path, 431 | target_mapping=target_mapping, 432 | key_img_id=self.hparams.key_img_id, 433 | key_img_encoded=self.hparams.key_img_encoded, 434 | shuffle=True, 435 | transformation=tfm, 436 | transformation_seg = tfm_seg, 437 | meta_path=self.hparams.val_meta_path, 438 | scene_of_interest=scene_of_interest, 439 | seg_channels=seg_channels, 440 | percent_seg_pixels=self.hparams.percent_seg_pixels, 441 | cache_size=1024, 442 | ) 443 | 444 | dataloader = torch.utils.data.DataLoader( 445 | dataset, 446 | batch_size=self.hparams.batch_size, 447 | num_workers=self.hparams.num_workers_per_loader, 448 | pin_memory=True, 449 | drop_last=True, 450 | ) 451 | 452 | return dataloader 453 | 454 | def main(): 455 | with open('../config/base_config.yml') as f: 456 | config = yaml.load(f, Loader=yaml.FullLoader) 457 | 458 | model_params = config["model_params"] 459 | 460 | tmp_model = MultiPartitioningClassifier(hparams=Namespace(**model_params)) 461 | 462 | train_data_loader = tmp_model.train_dataloader() 463 | 464 | val_data_loader = tmp_model.val_dataloader() 465 | 466 | 467 | # ############### save and visualize image for debugging ################ 468 | # iterate through the dataset 469 | 470 | it = iter(train_data_loader) 471 | first_batch = next(it) 472 | 473 | image_it = first_batch[0] # RGB image 474 | seg_image_it = first_batch[1] # segmented image 475 | 476 | S2_labels_it = first_batch[2] 477 | 478 | print(image_it.shape) 479 | print(seg_image_it.shape) 480 | lat_it = first_batch[3] 481 | lon_it = first_batch[4] 482 | scene_it = first_batch[5] 483 | 484 | 485 | if __name__ == "__main__": 486 | main() 487 | -------------------------------------------------------------------------------- /resources/im2gps_places365.csv: -------------------------------------------------------------------------------- 1 | IMG_ID,AUTHOR,LAT,LON,S3_Label,S16_Label,S365_Label,Prob_indoor,Prob_natural,Prob_urban 2 | 104123223_7410c654ba_19_19355699@N00.jpg,19355699@N00,-16.663606,145.563537,1,8,150,0.002959289950443811,0.7778147804293098,0.21922582997457596 3 | 1095548455_f636d22cbb_1277_8576809@N08.jpg,8576809@N08,31.893581,-85.141124,2,15,231,0.003976253882285619,0.016127773052346583,0.9798960119713342 4 | 1185597181_0158ab4213_1311_43616936@N00.jpg,43616936@N00,42.346571,-71.097228,2,12,312,4.680233274316492e-06,4.357539228665164e-06,0.9999909642251608 5 | 1199004207_0ce4e7a456_1285_16418049@N00.jpg,16418049@N00,37.090924,25.370521,2,15,227,0.0560021347187849,0.0075626038407463625,0.9364352449553586 6 | 1257001714_3453f5fc4b_1405_11490799@N08.jpg,11490799@N08,55.485759,28.791046,1,6,205,8.340898350311932e-05,0.9914413061872835,0.008475328191225984 7 | 195179890_dfc29db44a_70_73935513@N00.jpg,73935513@N00,-25.499066,-54.621276,1,6,113,5.9797807677286485e-05,0.5437024599131419,0.45623778678772964 8 | 212568980_fb3a00288d_71_21844368@N00.jpg,21844368@N00,12.974449,77.562789,2,12,276,0.004497663208031799,0.001077610077114599,0.9944249079218501 9 | 222911552_50f2a18fde_66_56186870@N00.jpg,56186870@N00,60.773746,-148.812046,1,6,190,0.0018134412071439954,0.9965174344743204,0.0016691925270571062 10 | 243683202_38f0178ce4_88_11807142@N00.jpg,11807142@N00,37.970117,23.720426,2,11,292,0.00010631504737186603,0.49450002181237007,0.5053936041720424 11 | 247766999_1de867ab93_96_94409333@N00.jpg,94409333@N00,36.403107,-93.736736,2,12,351,0.07185022739602553,0.0059201231521042175,0.9222296243997139 12 | 251058170_ba714bfb50_87_67484939@N00.jpg,67484939@N00,34.841334,-92.486429,1,7,233,0.00014903052701242814,0.7253617425106995,0.2744891759183403 13 | 254755691_b3bbae344e_95_79267922@N00.jpg,79267922@N00,39.94133,116.383666,2,15,286,0.02320356016058156,0.0011004594665067202,0.975696026755088 14 | 254762082_1a1b6d27d1_121_79267922@N00.jpg,79267922@N00,39.94133,116.383666,2,11,330,0.0006021852733830713,0.00016496227653473028,0.9992328610453978 15 | 257034510_2b7d64e610_118_26519935@N00.jpg,26519935@N00,13.74989,100.494861,2,11,252,0.0006673771799796668,0.000431854485739791,0.9989007764413032 16 | 257176697_a302df7bec_86_41336221@N00.jpg,41336221@N00,40.366689,49.835443,2,15,132,0.0021818905446764347,0.001698271703219234,0.9961199984323343 17 | 263896481_2f807d19ee_80_74806935@N00.jpg,74806935@N00,37.318012,-121.950309,0,2,134,0.9257580899298716,0.0007793246771115037,0.07346256627861081 18 | 264192767_4809b75a21_117_35468147630@N01.jpg,35468147630@N01,42.36246,-71.084353,2,11,108,0.001469365309525017,0.0003117746852172587,0.9982187744700131 19 | 314328828_2b52ae145e_120_55852171@N00.jpg,55852171@N00,39.996996,116.267988,2,11,251,6.231605857331957e-06,6.992480432588266e-05,0.9999237150973068 20 | 315923188_366ee7e6cd_101_14491548@N00.jpg,14491548@N00,51.054991,3.732089,2,15,181,0.0010841305230897547,0.006903542895884129,0.9920123287671458 21 | 317019036_3b57b5b2e9_104_56249023@N00.jpg,56249023@N00,-47.031934,-67.259674,1,7,234,0.005529287778383463,0.9203702610980145,0.07410055314932151 22 | 317024157_467511cd94_107_56249023@N00.jpg,56249023@N00,-50.358604,-72.285575,1,6,204,0.0001472727744946667,0.9960978520646577,0.0037547921727636435 23 | 317369069_16c7477d63_134_78221228@N00.jpg,78221228@N00,-50.462312,-73.005523,1,6,187,7.625329943472536e-05,0.9995855403671712,0.00033826734725206364 24 | 336999316_7fda2b00b1_142_65367662@N00.jpg,65367662@N00,39.44017,-120.23025,1,8,141,0.00156115333544804,0.99404621946411,0.004392611413599923 25 | 338553788_a32e785773_163_21535758@N00.jpg,21535758@N00,34.987253,68.466796,1,11,292,0.003673270586089572,0.5095122345029495,0.4868144605037088 26 | 338603422_520f0ce2ff_138_21535758@N00.jpg,21535758@N00,36.884014,68.57666,1,8,173,0.00016015458865581422,0.5015057383244823,0.4983341454801504 27 | 339483173_e48ee06639_139_63163416@N00.jpg,63163416@N00,31.213021,29.946069,2,15,270,0.021134022100454786,0.009288716253195162,0.9695772579289041 28 | 340942713_d485388d6d_152_21341800@N00.jpg,21341800@N00,36.765291,68.812866,1,7,116,0.003756984637782068,0.9232677532273215,0.07297519330057156 29 | 348532716_5a2b306c86_136_98767940@N00.jpg,98767940@N00,17.129307,-89.065818,0,0,222,0.772985024569401,0.0008643822946154955,0.22615066367849135 30 | 363322243_42e6b4babe_100_26234358@N00.jpg,26234358@N00,52.525047,13.366949,0,1,228,0.9987199332811372,6.694041096189096e-05,0.00121315674641842 31 | 379263811_e4d22a1ba5_136_59615371@N00.jpg,59615371@N00,34.051166,-84.285993,2,10,175,0.0010447709564633811,0.4138992672192092,0.5850558438050175 32 | 391838246_31758bc752_139_94949650@N00.jpg,94949650@N00,49.341342,-123.01546,1,8,150,0.00048069630500080507,0.9643065881026587,0.03521270532210963 33 | 392982444_442d787db5_143_65412829@N00.jpg,65412829@N00,39.935276,32.852725,2,15,4,0.0026461646271795924,8.336560595623155e-05,0.9972704688461049 34 | 421350511_ee899b609d_129_85417391@N00.jpg,85417391@N00,32.242796,-111.167714,1,7,117,1.8573644193581318e-05,0.9847704970652398,0.015210893135438885 35 | 425432303_c817c468e3_166_14882112@N00.jpg,14882112@N00,41.371961,2.166323,2,15,227,0.005788723875145507,0.00019460875127919053,0.9940167186925386 36 | 427188519_bcf177e48b_146_84752760@N00.jpg,84752760@N00,41.401149,2.163276,0,5,90,0.8244932289784757,0.00047731802098383014,0.17502945247525759 37 | 429777514_e0ba93984e_169_89418754@N00.jpg,89418754@N00,41.403491,2.174423,2,11,334,0.0037746534819476096,0.004604493557593514,0.9916207602828102 38 | 429881745_35a951f032_187_37718182@N00.jpg,37718182@N00,41.387627,2.188044,2,14,333,2.728032446943371e-07,0.4998725177216564,0.5001272707137813 39 | 432236572_f2da926f89_166_75452460@N00.jpg,75452460@N00,47.298266,13.686389,1,7,233,0.000425921861934242,0.7973147524439241,0.20225934311921812 40 | 436360592_ef20eb1e98_178_99746029@N00.jpg,99746029@N00,39.937908,116.398086,2,15,4,0.4216404189812124,0.003099760656979811,0.5752599033935581 41 | 437613430_d1466ffcdb_178_71613077@N00.jpg,71613077@N00,39.988497,116.184368,1,8,150,0.014708073980583936,0.9065860160864503,0.0787058515719199 42 | 453214262_2252fbefff_212_55126705@N00.jpg,55126705@N00,35.521425,-111.372699,1,7,116,0.000125178735515874,0.9428802056119601,0.0569945993002845 43 | 453384102_723b8a8182_207_55126705@N00.jpg,55126705@N00,34.611453,-111.841936,2,11,13,0.03210346296754629,0.19355020094496922,0.7743463278839045 44 | 466882217_a9c6760cc4_220_64825499@N00.jpg,64825499@N00,12.607003,-70.055952,1,6,48,0.00010253043414998331,0.9856672701369238,0.014230202564722738 45 | 482314949_dbc149bb10_224_50435419@N00.jpg,50435419@N00,-34.609758,-58.411216,2,15,181,0.002356831429349171,0.0031424792779866095,0.9945006616187868 46 | 502172768_3a7a22811b_213_69641014@N00.jpg,69641014@N00,42.34351,-71.033585,2,10,266,0.0003704998442870533,0.05798930330190899,0.9416401664326273 47 | 504921450_6f20499550_194_24311489@N00.jpg,24311489@N00,33.747894,-84.371148,2,11,86,2.0711453295733885e-08,3.398364369083295e-07,0.999999659769709 48 | 508033358_5d1f3bc07a_221_8393530@N05.jpg,8393530@N05,25.073471,-77.327785,0,5,9,0.9034823482215757,0.09651759951376417,4.352493212825509e-08 49 | 510183020_3dec046e80_192_77392231@N00.jpg,77392231@N00,13.724085,100.392208,0,0,139,0.9994369574795483,2.1577676904277476e-07,0.0005628017849251543 50 | 522546192_0030ad0eb1_237_61819159@N00.jpg,61819159@N00,-14.666716,145.448513,1,7,306,0.003370849546953991,0.9912685495409335,0.005360608280128076 51 | 530405817_0673660c96_1209_7885919@N07.jpg,7885919@N07,-34.603691,-58.381637,2,15,125,0.023615738097532812,0.03250703780611275,0.9438771965947126 52 | 534657711_dc2aa849a8_1333_72154266@N00.jpg,72154266@N00,-22.995414,-43.238539,2,15,308,0.2528617139909102,0.002156104466266129,0.7449822117939249 53 | 580496518_4214d97599_1280_7369430@N02.jpg,7369430@N02,30.245165,-87.733662,2,10,266,2.285158802817211e-05,0.02522010773230754,0.9747571079281142 54 | 779600060_a5f8e28de5_1184_52057668@N00.jpg,52057668@N00,-34.940336,138.585577,2,14,153,0.010972629453931404,0.39026791939727445,0.5987594798106102 55 | 780091415_c803d82672_1332_88971695@N00.jpg,88971695@N00,-25.354342,131.046295,1,7,73,0.002341752880495651,0.9897163121998602,0.007941936289209472 56 | 864479182_d60c47e2ce_1045_25304693@N00.jpg,25304693@N00,50.997714,5.40199,2,14,220,0.0013237436615298748,0.023488766416420503,0.9751874996287029 57 | 872841181_2ef32acf29_1371_66281185@N00.jpg,66281185@N00,36.057694,-112.136614,1,6,234,0.008063674348409933,0.9119113327768105,0.08002492611842627 58 | 952602201_87da454e31_1323_19953481@N00.jpg,19953481@N00,46.702202,12.991333,1,6,234,0.0003443312415924993,0.8053390793891708,0.19431655633531975 59 | 970273104_48060e4acd_1207_10815666@N04.jpg,10815666@N04,-34.602578,-58.383686,2,15,125,0.0003146876396766807,0.0007041853163975986,0.9989811088565865 60 | 97344248_30a4521091_32_77325609@N00.jpg,77325609@N00,41.395354,2.169113,2,15,32,0.009535810302901737,0.00040217556107435826,0.9900619531417734 61 | 980263629_f3373fa294_1253_9729483@N02.jpg,9729483@N02,52.504914,13.36284,0,2,363,1.0000000842644672,1.9215129269217453e-09,1.0099560957224532e-08 62 | Ankara_00003_601190107_9f05b2251e_1292_8504005@N07.jpg,9f05b2251e_1292_8504005@N07,39.936592,32.8553,2,15,332,0.20987461481141167,0.005756031027743802,0.784369413006516 63 | Antigua_00003_483035669_21c8bdeb2d_185_61417564@N00.jpg,21c8bdeb2d_185_61417564@N00,16.998628,-61.755861,1,6,194,0.0003308211908432668,0.989825441792874,0.009843771732260365 64 | Arizona_00044_527647931_821085049a_1048_7412395@N07.jpg,821085049a_1048_7412395@N07,36.065673,-112.11713,1,7,81,0.0003105800540272874,0.9852983831900914,0.014390991196398417 65 | Aruba_00001_99110142_a573655582_34_50517642@N00.jpg,a573655582_34_50517642@N00,12.532151,-70.051435,2,10,257,0.11405001978558715,0.0028217015328522166,0.8831282048304132 66 | Athens_00016_516320955_2f7c0642b4_212_36764971@N00.jpg,2f7c0642b4_212_36764971@N00,37.971102,23.726767,2,15,348,1.5289300596244004e-05,0.0008982843648590588,0.9990864480539199 67 | Azerbaijan_00003_1293945458_c58bd8d7c4_1048_97522422@N00.jpg,c58bd8d7c4_1048_97522422@N00,40.094882,49.387664,1,7,116,0.03374510650976603,0.5166404859320153,0.4496144237515658 68 | Bahamas_00006_343059190_9c31e29446_134_39595541@N00.jpg,9c31e29446_134_39595541@N00,25.114046,-77.126255,1,6,243,0.0005267667201849235,0.987064648814794,0.012408563807305484 69 | Bangkok_00011_215914338_705d7ea038_92_20194767@N00.jpg,705d7ea038_92_20194767@N00,9.376241,99.94091,1,6,204,0.00041275800770534943,0.9896109204449886,0.009976424413917329 70 | Bangkok_00012_219604934_4e3ca563fc_83_82927779@N00.jpg,4e3ca563fc_83_82927779@N00,13.740614,100.489861,2,10,79,0.0013340909663952516,0.05981135666354476,0.938854581946174 71 | Barcelona_00014_144658910_7517982a97_46_49503208420@N01.jpg,7517982a97_46_49503208420@N01,41.385245,2.169284,2,15,178,0.0012583185914305517,0.002039718299036153,0.9967018892732149 72 | Belgium_00017_276044730_dceb8cccbc_112_12814307@N00.jpg,dceb8cccbc_112_12814307@N00,50.657949,5.474624,2,10,278,0.038384118749490825,0.0003404513693145983,0.9612753228762405 73 | Bolivia_00014_1347017613_651a38b69d_1376_11786349@N08.jpg,651a38b69d_1376_11786349@N08,-20.457333,-66.913604,1,7,116,0.015350711782424753,0.7412395764846593,0.2434096939406203 74 | Bosnia_00004_1138531814_e3579a53d8_1067_11515930@N06.jpg,e3579a53d8_1067_11515930@N06,43.065376,17.71202,2,15,296,0.000714817920737687,0.01391342835421483,0.9853716989871373 75 | Botswana_00001_108331635_4dccd99e9d_52_73091266@N00.jpg,4dccd99e9d_52_73091266@N00,-19.116137,23.827285,1,6,356,1.0246443998303614e-05,0.9959908085914555,0.0039988952044995585 76 | California_00119_356125022_0a5c48aa89_139_64855637@N00.jpg,0a5c48aa89_139_64855637@N00,36.618184,-121.901893,2,14,49,0.0015498462562391069,0.315008179458232,0.6834419704445054 77 | California_00122_361328855_6ace238cbf_134_41894169878@N01.jpg,6ace238cbf_134_41894169878@N01,33.441321,-118.492891,2,12,265,0.006366216699177585,0.26847764581702904,0.7251560941181197 78 | California_00147_439592027_f8ffa59be8_188_66347119@N00.jpg,f8ffa59be8_188_66347119@N00,33.89441,-115.829662,2,10,118,2.772053889599224e-06,0.02963661880366264,0.9703606200693765 79 | California_00197_718693402_4ba930995d_1150_7980350@N08.jpg,4ba930995d_1150_7980350@N08,37.752614,-119.526979,1,7,234,0.0001505017622722704,0.9074145745334192,0.092434839046863 80 | Cambodia_00020_401343054_b6c0b85d50_133_33463080@N00.jpg,b6c0b85d50_133_33463080@N00,13.372585,103.856849,2,11,13,0.1309427533741303,0.010994316550778649,0.8580630140864969 81 | Canada_00106_513453328_03108e034b_227_7665941@N08.jpg,03108e034b_227_7665941@N08,49.291349,-123.127512,2,10,171,0.00021916303803948267,0.04536682157565508,0.9544139440741155 82 | Canada_00113_568886932_37f47747b8_1250_48264126@N00.jpg,37f47747b8_1250_48264126@N00,52.202557,-117.239742,1,6,234,1.4512096312646605e-05,0.9788197193306778,0.021165687409969047 83 | Chicago_00046_286428804_4fd17dde48_106_51306116@N00.jpg,4fd17dde48_106_51306116@N00,41.885921,-87.622833,2,15,125,0.0005800748043292003,0.01244266666596161,0.9869772631236913 84 | Chicago_00080_496345089_f5d47dea91_196_69212252@N00.jpg,f5d47dea91_196_69212252@N00,41.939545,-87.639586,0,5,212,0.9730743932276056,0.0006168363567695678,0.02630867059224329 85 | China_00073_487137127_79fefd5305_196_8159033@N04.jpg,79fefd5305_196_8159033@N04,34.272254,108.896656,2,11,330,0.0005728290637208033,0.0007863772336378361,0.9986407952959162 86 | China_00092_1004463976_03bb680078_1105_91728102@N00.jpg,03bb680078_1105_91728102@N00,28.362854,121.068735,2,11,334,0.001669863730529908,0.036042159757016634,0.9622881532346153 87 | Colombia_00009_487789777_0003ed5872_212_16836474@N00.jpg,0003ed5872_212_16836474@N00,-4.219137,-69.938964,1,6,271,0.0007021310744477205,0.8249938303010822,0.1743040899286541 88 | Colorado_00057_1199140107_b35790beec_1001_59341685@N00.jpg,b35790beec_1001_59341685@N00,39.450311,-106.470608,1,6,234,0.000525947762270107,0.9780408300705403,0.021433134274161603 89 | Connecticut_00004_364162616_48c230f9e2_116_15376845@N00.jpg,48c230f9e2_116_15376845@N00,41.387237,-72.984205,2,14,299,0.0021673462558409184,0.1763074752698941,0.8215251473005365 90 | CostaRica_00017_500118634_993d0110b5_199_78225438@N00.jpg,993d0110b5_199_78225438@N00,9.976965,-84.842176,1,6,194,0.00040339834382052686,0.9352962995488383,0.06430028564872714 91 | Croatia_00021_473963193_d9ce489f23_222_18744817@N00.jpg,d9ce489f23_222_18744817@N00,44.881174,15.616722,1,6,342,0.01189593176265985,0.9810811464767513,0.00702299325454267 92 | Croatia_00029_965780821_723a75feee_1096_78247883@N00.jpg,723a75feee_1096_78247883@N00,42.640107,18.110811,2,15,123,0.19145540354475088,0.012548968467200439,0.7959956799910017 93 | Cuba_00025_699768122_15733c7a1a_1425_8078991@N04.jpg,15733c7a1a_1425_8078991@N04,23.121653,-81.347064,1,6,48,5.697860714359848e-05,0.9971548366928698,0.0027880509270605813 94 | Cyprus_00009_504391595_088287d4f6_189_8255645@N03.jpg,088287d4f6_189_8255645@N03,34.937874,32.86663,2,10,152,8.518308472420244e-06,0.4941270753726912,0.5058644038649283 95 | Denmark_00009_258337247_96db5706ff_95_70402049@N00.jpg,96db5706ff_95_70402049@N00,55.684655,12.589323,2,13,292,0.01424215046762356,0.16641467049066705,0.8193432048456089 96 | Dominica_00002_479941913_0bf2cf5743_169_7687052@N07.jpg,0bf2cf5743_169_7687052@N07,15.574013,-61.455373,1,8,173,0.00018031150216213376,0.6946125652936388,0.3052071962749334 97 | DominicanRepublic_00008_528391253_78e9959702_1170_37476307@N00.jpg,78e9959702_1170_37476307@N00,18.365027,-69.020611,2,8,36,0.023283209642301017,0.46245057889058216,0.5142662155487621 98 | Ecuador_00016_1042198302_3e83aea565_1079_7132415@N03.jpg,3e83aea565_1079_7132415@N03,-0.967437,-77.763977,1,6,145,0.007156319253364352,0.7633245696542517,0.22951900159556704 99 | Egypt_00018_389284696_a6c0fa7e22_160_36948083@N00.jpg,a6c0fa7e22_160_36948083@N00,24.032668,32.825775,2,11,229,0.0009451329571987799,0.25425975160044345,0.7447950807058987 100 | Finland_00036_636777751_bedf67eb53_1348_86122102@N00.jpg,bedf67eb53_1348_86122102@N00,60.375722,21.391754,2,14,40,0.004218628064222685,0.36902450160793876,0.6267569335778944 101 | Florida_00015_180339543_001a933e62_70_43935788@N00.jpg,001a933e62_70_43935788@N00,24.938747,-80.650634,2,11,214,0.0009086477718653896,0.029505524843926878,0.9695858771755468 102 | France_00057_257413141_469dcde004_96_26519935@N00.jpg,469dcde004_96_26519935@N00,47.882045,7.226428,2,11,242,0.00020636314187960636,0.0004675649196919096,0.9993260332823724 103 | France_00143_633617121_9d719c65ba_1223_7591003@N03.jpg,9d719c65ba_1223_7591003@N03,48.575755,7.744073,2,10,257,0.03888744175139891,0.022155114443648927,0.938957345676954 104 | Germany_00063_254492987_7c8d55a3b5_99_32367657@N00.jpg,7c8d55a3b5_99_32367657@N00,47.79858,13.0461,2,15,47,0.16441040850668287,0.004966310263228024,0.83062324915349 105 | Ghana_00006_933699293_d03cb9ab9b_1129_72526577@N00.jpg,d03cb9ab9b_1129_72526577@N00,10.849491,-1.514739,2,11,200,0.0006246778823051358,0.005654550881185827,0.9937207316655345 106 | Greenland_00001_384853046_34ad6e1163_159_82952591@N00.jpg,34ad6e1163_159_82952591@N00,60.185232,-44.217224,1,6,163,0.00037463282483685134,0.9961755749921508,0.0034498244802634304 107 | Guangzhou_00003_986276060_2769109737_1375_70618949@N00.jpg,2769109737_1375_70618949@N00,23.117311,113.353328,2,15,307,0.00044228997554451865,0.00040682366500277567,0.9991509043292979 108 | Hawaii_00072_532408762_9c4ecc305a_1200_79756109@N00.jpg,9c4ecc305a_1200_79756109@N00,20.881077,-156.545133,1,8,150,0.01646483603703075,0.7553340758361173,0.2282010774417813 109 | HongKong_00022_295401126_95d3f505b4_116_30554981@N00.jpg,95d3f505b4_116_30554981@N00,31.23893,121.485099,2,13,354,0.00015075887596616155,0.0009617598376534531,0.9988874424989582 110 | HongKong_00034_393185078_8a349f2072_169_56776080@N00.jpg,8a349f2072_169_56776080@N00,22.286713,114.152584,2,10,175,0.0004537169967431254,0.23764080257561915,0.7619054836334591 111 | HongKong_00041_504492617_7af38e0004_208_7224156@N03.jpg,7af38e0004_208_7224156@N03,22.282425,114.146447,2,15,307,0.0003413467112167723,0.003717394660043283,0.9959412260203422 112 | Hyderabad_00003_359871435_f5abb5524b_155_36887937@N00.jpg,f5abb5524b_155_36887937@N00,17.361741,78.474558,2,11,330,0.002060713860473129,0.0029778947322540716,0.9949614769035833 113 | Iceland_00003_108349138_41786e87da_40_56945335@N00.jpg,41786e87da_40_56945335@N00,63.794617,-17.720947,1,6,190,0.0006514367899868034,0.9981992516857758,0.001149313812781827 114 | Illinois_00010_372417850_1818b0405b_166_41315423@N00.jpg,1818b0405b_166_41315423@N00,41.215716,-88.501578,2,15,296,0.0002717573917052629,0.003849960238174188,0.9958784598676358 115 | India_00024_229287479_474ac2fb6f_79_48637819@N00.jpg,474ac2fb6f_79_48637819@N00,34.147612,77.571716,2,11,200,0.017080771947476592,0.16116163969388708,0.8217576523097705 116 | India_00032_291479604_013cb872ba_122_59555137@N00.jpg,013cb872ba_122_59555137@N00,27.179676,78.044042,2,11,230,0.0001958402440633833,5.44324488491732e-05,0.999749606035675 117 | Ireland_00007_91942412_95795b8eb9_41_11398209@N00.jpg,95795b8eb9_41_11398209@N00,53.360182,-6.188049,1,6,48,0.0007056706182702044,0.7773395436325927,0.2219548391754529 118 | Ireland_00028_249916505_59bfd4d0d3_81_92123108@N00.jpg,59bfd4d0d3_81_92123108@N00,52.141284,-10.279426,2,10,171,0.0021465418705162165,0.02941747244062043,0.9684360452860119 119 | Israel_00028_511241861_3efa314a4b_219_62126383@N00.jpg,3efa314a4b_219_62126383@N00,31.776938,35.23545,2,11,200,0.0006359177244537051,0.006579460938386461,0.9927845847441681 120 | Istanbul_00021_475022521_99f3da9240_170_69445076@N00.jpg,99f3da9240_170_69445076@N00,41.071069,28.948974,0,5,85,0.9710996295419381,0.007270444801017462,0.021629886951314514 121 | Italy_00021_160108325_a88a1ef93b_53_80333007@N00.jpg,a88a1ef93b_53_80333007@N00,42.001664,12.62947,2,10,142,0.00017431986409732758,0.20165156972061027,0.7981741547808952 122 | Italy_00100_453717251_4f9e5ec1b7_186_79039156@N00.jpg,4f9e5ec1b7_186_79039156@N00,44.30226,9.212894,1,6,49,0.0021307474326590636,0.5785890928343633,0.4192801216268549 123 | Italy_00134_844603727_96b5c1d9bc_1229_76306992@N00.jpg,96b5c1d9bc_1229_76306992@N00,43.348151,11.510925,1,8,104,4.991786523292005e-07,0.9762338970661354,0.023765543443549995 124 | Japan_00056_261461022_a16eeca101_114_60558526@N00.jpg,a16eeca101_114_60558526@N00,34.967491,137.168941,2,11,251,3.3478949712062445e-05,0.0001143594935809622,0.9998521789190193 125 | Japan_00108_482880218_7f3a0383bc_175_8047699@N05.jpg,7f3a0383bc_175_8047699@N05,35.339774,139.526367,2,11,330,0.22961275050846108,0.06381068951787938,0.7065765684816201 126 | Kenya_00017_1061753413_0861543f7e_1267_17351226@N00.jpg,0861543f7e_1267_17351226@N00,-1.293015,36.815357,1,8,141,0.008546530107828687,0.6201527055468432,0.3713008215440823 127 | Lahore_00001_321085080_28863df64f_130_82503882@N00.jpg,28863df64f_130_82503882@N00,31.58895,74.311378,2,11,230,3.106394773744192e-05,6.559519813253978e-05,0.9999033155041808 128 | Libya_00002_579471142_2e1919f8df_1017_9076790@N05.jpg,2e1919f8df_1017_9076790@N05,29.536424,21.033325,2,12,268,0.028688246416630037,0.34145917962755234,0.6298525394062331 129 | London_00020_82418356_e130a8793a_42_69567805@N00.jpg,e130a8793a_42_69567805@N00,51.522629,-0.099563,2,10,171,0.006685889880543527,0.12297561440067284,0.8703385140922251 130 | London_00044_152057337_45584126c5_48_90672364@N00.jpg,45584126c5_48_90672364@N00,51.47879,-0.291255,1,8,209,0.022181935057233204,0.624005356181442,0.3538127832121063 131 | London_00124_307812265_70c28bf023_112_30571787@N00.jpg,70c28bf023_112_30571787@N00,51.51604,-0.129046,2,10,257,0.018523370485670654,0.008972508476617236,0.9725041729974748 132 | London_00163_383132699_73d5a3db68_139_96387799@N00.jpg,73d5a3db68_139_96387799@N00,51.508648,-0.094285,2,11,230,0.0015200850564411894,0.012735798441113388,0.9857440597094822 133 | London_00173_399097890_cca3d6eb5c_47_89904893@N00.jpg,cca3d6eb5c_47_89904893@N00,51.510204,-0.085991,2,15,307,0.0033546192915103745,0.004528293992649424,0.992117063438883 134 | LosAngeles_00017_271405228_1258990cf2_100_27274415@N00.jpg,1258990cf2_100_27274415@N00,34.101575,-118.340043,2,15,319,0.0010284517510346092,0.0008896439519361365,0.9980818267700009 135 | LosAngeles_00023_349121428_aaa440bcc6_132_97332629@N00.jpg,aaa440bcc6_132_97332629@N00,33.988206,-118.47536,2,10,175,0.0035225190800343142,0.45684781044993983,0.5396296204299951 136 | Mali_00003_389132534_c1f2631a86_186_59398218@N00.jpg,c1f2631a86_186_59398218@N00,12.653068,-7.987232,2,15,227,0.00033390362622409686,0.00016044537590576002,0.9995055682808096 137 | Maryland_00035_1409295892_d1f7b16b3f_1421_88483799@N00.jpg,d1f7b16b3f_1421_88483799@N00,39.397543,-76.601765,2,14,87,0.000583608377915823,0.022906970900102408,0.9765093635567155 138 | Massachusetts_00011_379112224_fbcf942ebd_169_57253263@N00.jpg,fbcf942ebd_169_57253263@N00,42.633738,-70.780902,2,15,119,0.2628934598613384,0.0018316688567381334,0.7352748245799035 139 | Melbourne_00004_129975593_87d37e1218_53_28026984@N00.jpg,87d37e1218_53_28026984@N00,-37.829175,144.971466,1,8,62,0.3013340750620772,0.3784712384907749,0.3201947433760912 140 | Mexico2_00027_373475154_2cddb4fa40_137_23812473@N00.jpg,2cddb4fa40_137_23812473@N00,20.749853,-99.94606,2,11,108,0.00032891702008797097,0.00032121688281661065,0.9993498438101751 141 | Mississippi_00011_537212117_97f048d808_1357_22941966@N00.jpg,97f048d808_1357_22941966@N00,44.923333,-93.117333,2,13,113,0.001805711852028935,0.30649968008413,0.691694595641934 142 | Mongolia_00002_207032483_20095af4a6_60_14542551@N00.jpg,20095af4a6_60_14542551@N00,48.973343,89.959659,1,7,341,0.00018749665230899382,0.985754985497806,0.014057532342377499 143 | Montana_00013_452159720_caae190cec_196_93487964@N00.jpg,caae190cec_196_93487964@N00,42.907186,-5.561764,1,7,350,0.011674693210824693,0.9846787326610054,0.0036466796099941055 144 | Montenegro_00002_279525048_069d71861c_85_36093984@N00.jpg,069d71861c_85_36093984@N00,42.453987,18.536338,2,11,109,0.0024421242722212355,0.0017779822493366737,0.9957798402203366 145 | Morocco2_00003_369458188_1dcee11573_178_13527886@N00.jpg,1dcee11573_178_13527886@N00,31.39819,-7.635498,1,10,233,0.0002305341120063531,0.5985463479061366,0.40122314425595107 146 | Morocco2_00016_872564984_73ef641d65_1104_83039477@N00.jpg,73ef641d65_1104_83039477@N00,34.059485,-5.005645,2,11,103,0.004082513510610397,0.03923865465465326,0.9566789055222529 147 | Moscow_00007_275816584_98e230bb1e_88_87484925@N00.jpg,98e230bb1e_88_87484925@N00,46.734397,-117.005081,2,10,278,0.10962741320006253,0.00011937923884453028,0.8902530269399578 148 | Nepal_00013_543874653_f64e9976da_1104_7729101@N03.jpg,f64e9976da_1104_7729101@N03,27.712102,85.280685,2,12,351,0.0008400845266198775,0.007289183161605095,0.9918709559967551 149 | Netherlands_00069_1354802467_1e48ea9c4c_1252_44067110@N00.jpg,1e48ea9c4c_1252_44067110@N00,52.34158,4.792327,2,11,361,0.0010650216758847364,0.009205803441432181,0.9897291342476251 150 | NorthCarolina_00008_253749264_f0a5e6ab18_88_23601949@N00.jpg,f0a5e6ab18_88_23601949@N00,35.962376,-75.635547,1,7,116,2.50092763898202e-05,0.9409333840520642,0.059041621758252116 151 | Norway_00012_216550665_58216eae8f_76_90833046@N00.jpg,58216eae8f_76_90833046@N00,60.377302,6.720371,2,14,87,0.0011770343943595662,0.07761560919254862,0.9212073565039134 152 | Norway_00029_447570830_5d155dd0b1_209_74196805@N00.jpg,5d155dd0b1_209_74196805@N00,69.635592,18.998966,1,6,187,0.00020752225983144967,0.9915687666126516,0.008223749887037668 153 | Norway_00040_990922720_327b7613ae_1157_96928198@N00.jpg,327b7613ae_1157_96928198@N00,62.147918,6.059207,2,14,49,0.005205332105646221,0.2749158636861466,0.7198788246306549 154 | Norway_00048_1457219700_4744851a83_1196_99437479@N00.jpg,4744851a83_1196_99437479@N00,78.052895,14.238967,2,14,49,0.003927518435560273,0.09960123409757671,0.8964712748672525 155 | Oklahoma_00005_262685303_e360a17203_90_96332550@N00.jpg,e360a17203_90_96332550@N00,35.611045,-95.987763,1,8,140,0.0003175863736601947,0.6463652198428633,0.3533171846488621 156 | Oman_00001_159023565_dc1b205e99_70_67879480@N00.jpg,dc1b205e99_70_67879480@N00,23.606306,58.537731,0,3,130,0.8411953096415772,0.00028934677243341866,0.15851538276729915 157 | Pakistan_00003_408755072_963acdb313_132_14262239@N00.jpg,963acdb313_132_14262239@N00,36.300531,74.649868,1,7,344,0.02014193159195088,0.6826385286776713,0.2972195235543609 158 | Paris_00005_44406254_0054d193dc_27_98908999@N00.jpg,0054d193dc_27_98908999@N00,48.853717,2.347738,2,11,334,0.009456020974084822,0.03689863264798987,0.9536453907862779 159 | Paris_00011_71800567_f579201d15_35_18684820@N00.jpg,f579201d15_35_18684820@N00,48.866521,2.329101,0,0,115,0.8762015452366541,0.0019405673226629006,0.1218579208834285 160 | Paris_00025_129504349_cdd20e3144_1_42485416@N00.jpg,cdd20e3144_1_42485416@N00,48.861326,2.346954,2,11,334,0.00013746692524208015,0.001989757523233493,0.9978726949087822 161 | Paris_00127_433927029_bb089eecff_188_7218593@N05.jpg,bb089eecff_188_7218593@N05,48.859364,2.291142,1,6,78,1.4243148096337865e-05,0.9626706377787073,0.037315016989461824 162 | Paris_00131_445353063_8c58bd82b1_179_88895879@N00.jpg,8c58bd82b1_179_88895879@N00,48.863133,2.336654,2,15,319,0.19359788411277634,0.028363753841944117,0.7780382608888345 163 | Paris_00159_523650404_92319fd22a_254_51035632501@N01.jpg,92319fd22a_254_51035632501@N01,48.855298,2.312461,2,11,213,0.00019613665123241475,0.003825120001078375,0.9959788033830002 164 | Paris_00160_524943416_6cc4913ba0_249_80246871@N00.jpg,6cc4913ba0_249_80246871@N00,48.805012,2.121015,0,5,331,0.9063400460806808,0.00043196707331194517,0.09322806430605501 165 | Paris_00213_1392923096_21dcd946e9_1007_13640599@N07.jpg,21dcd946e9_1007_13640599@N07,48.886899,2.343177,2,11,230,0.0002684858373820376,0.00010419029713082395,0.999627228460966 166 | Peru_00016_325016580_4febe27d8f_143_32649801@N00.jpg,4febe27d8f_143_32649801@N00,-13.53653,-71.998901,2,11,108,0.0008268202833789928,0.003088897915539235,0.9960841845984945 167 | Philippines_00021_1354823159_b54e258230_1056_83794921@N00.jpg,b54e258230_1056_83794921@N00,13.521759,120.9696,1,6,48,0.000871589419844554,0.8590659334945485,0.14006249214857291 168 | Poland_00024_419395727_db46f2f484_183_93455345@N00.jpg,db46f2f484_183_93455345@N00,50.067717,19.923706,2,11,200,0.0007531028610117119,0.0009422430735952503,0.998304630143565 169 | Poland_00039_939060542_595e7aa0f0_1297_15632944@N00.jpg,595e7aa0f0_1297_15632944@N00,49.597095,19.93467,2,10,278,0.15172218167502402,1.3062514042733175e-05,0.8482647478873436 170 | Portugal_00001_37087644_e25c1c4be1_31_41894197861@N01.jpg,e25c1c4be1_31_41894197861@N01,38.709039,-9.136247,2,15,47,0.033681169711128334,0.0014678146632007838,0.9648511432229299 171 | Portugal_00028_288609860_5f01b18ba2_108_82981539@N00.jpg,5f01b18ba2_108_82981539@N00,38.693519,-9.205673,2,11,200,0.0022027792751764252,0.081010317722928,0.9167869763891687 172 | Portugal_00031_315254130_e99b1f16b2_116_49777280@N00.jpg,e99b1f16b2_116_49777280@N00,41.149383,-8.610105,2,10,66,0.0008431516289135743,0.1698184887400771,0.8293383479514773 173 | PuertoRico_00013_1356370638_0426ac7dcb_1264_23437487@N00.jpg,0426ac7dcb_1264_23437487@N00,18.469468,-66.119842,2,11,10,0.0001147206199438866,0.23304682571634316,0.7668385053321267 174 | Romania_00003_147566544_11f95abd00_45_96155869@N00.jpg,11f95abd00_45_96155869@N00,45.793262,24.150695,2,11,84,0.0010038972396841928,0.008303123529060485,0.990693059328521 175 | Romania_00010_407620380_c9862a7d9a_181_48313794@N00.jpg,c9862a7d9a_181_48313794@N00,47.550579,25.843963,2,15,348,0.00969598001245231,0.38819820586650167,0.6021058105374095 176 | Rome_00002_43887898_6646f63596_30_42126397@N00.jpg,6646f63596_30_42126397@N00,41.929357,12.472229,2,11,5,0.030973656028633556,0.006631704128992055,0.9623946104069216 177 | Rome_00021_217560377_c0097f0084_83_84498284@N00.jpg,c0097f0084_83_84498284@N00,41.901765,12.481584,2,11,84,0.0008718522812909413,0.010896032198616012,0.9882321549200412 178 | Rome_00024_231521295_1a0e1b7fb5_91_55085284@N00.jpg,1a0e1b7fb5_91_55085284@N00,41.890393,12.49197,2,11,200,0.000486656067700153,0.02015645109720765,0.9793569845591321 179 | Russia_00019_985802242_5ad0b7dbeb_1190_23707253@N00.jpg,5ad0b7dbeb_1190_23707253@N00,59.94046,30.312223,2,15,319,0.001608623899699957,0.006727380278686468,0.991663969782369 180 | SanFrancisco_00096_442372330_8e060f4138_176_7571568@N05.jpg,8e060f4138_176_7571568@N05,37.782383,-122.42031,1,6,194,0.00038559360967838074,0.9902673134389488,0.009346946514284582 181 | Seoul_00010_367998508_f0e90c701b_107_87409164@N00.jpg,f0e90c701b_107_87409164@N00,37.583085,126.992683,2,12,260,0.0015173025866630496,0.021803783009431754,0.9766789000485403 182 | Shenzhen_00003_954656461_a90fe556dc_1111_32377115@N00.jpg,a90fe556dc_1111_32377115@N00,22.565354,114.073448,2,11,330,5.725186804559496e-06,5.513316898825282e-06,0.9999887909208527 183 | SouthDakota_00001_103581976_d9b87d0c35_36_96388182@N00.jpg,d9b87d0c35_36_96388182@N00,43.542412,-96.699922,2,11,86,2.3995104567603454e-06,0.000625678062123533,0.9993719380350887 184 | Spain_00063_379578856_a608d0b600_146_75653366@N00.jpg,a608d0b600_146_75653366@N00,43.323538,-1.98522,2,15,319,0.11621721412552688,0.010088315208804488,0.8736945522218775 185 | Spain_00083_486577745_b0256c3b07_221_51162504@N00.jpg,b0256c3b07_221_51162504@N00,37.389024,-5.994071,2,11,273,0.0013657992805065078,0.003034254369639555,0.9955999407053113 186 | SriLanka_00008_841500207_6eabfd01c6_1147_9900419@N06.jpg,6eabfd01c6_1147_9900419@N06,6.590774,79.979095,2,11,242,0.00036458458142751837,0.04020386804821019,0.9594316778373102 187 | Sweden_00010_187208678_92004a5c41_72_46054052@N00.jpg,92004a5c41_72_46054052@N00,58.474311,11.311798,1,7,117,0.001294303086673665,0.900112551855841,0.09859314119219675 188 | Switzerland_00008_103429200_c4904154d8_38_73293249@N00.jpg,c4904154d8_38_73293249@N00,46.167286,7.099698,1,9,233,0.00026482708067065985,0.5554932562455477,0.4442420460000358 189 | Switzerland_00014_170747608_cf4538d97b_50_97458173@N00.jpg,cf4538d97b_50_97458173@N00,46.496974,7.675924,1,8,258,0.0007020519808325076,0.8972880009215771,0.10200988486661267 190 | Switzerland_00082_1222153363_9eaceb19eb_1370_47311799@N00.jpg,9eaceb19eb_1370_47311799@N00,46.204977,6.149843,2,10,66,0.004620700999225846,0.3058576139215461,0.6895216887655238 191 | Switzerland_00086_1367058455_d58f03d50f_1136_9407621@N05.jpg,d58f03d50f_1136_9407621@N05,46.604579,7.935862,1,8,150,0.0015039630534707804,0.9834574011394253,0.015038572549112672 192 | Sydney_00073_1226915900_eea86783cd_1128_65768710@N00.jpg,eea86783cd_1128_65768710@N00,-33.870344,151.225433,2,10,171,0.0009949712288062074,0.16266472797536835,0.8363402280284618 193 | Syria_00001_91276050_f4598af84a_27_80528961@N00.jpg,f4598af84a_27_80528961@N00,33.522792,36.309814,0,2,51,0.9995956045384728,1.616813909599557e-05,0.0003882899031717457 194 | Taiwan_00044_406785882_413e3bba60_158_81421684@N00.jpg,413e3bba60_158_81421684@N00,24.514718,121.60818,1,6,271,0.0016842306812066,0.9835137639884124,0.014802052030361779 195 | Tanzania_00019_1292210091_693ea74b7a_1088_15274769@N00.jpg,693ea74b7a_1088_15274769@N00,-3.169805,35.528561,1,6,356,0.009178424405668295,0.8115045884803749,0.17931694960699218 196 | Thailand_00034_327008969_eda8c71554_140_17362713@N00.jpg,eda8c71554_140_17362713@N00,12.925599,100.891571,0,0,31,0.8266016990130538,0.0021956605333457446,0.1712026141732963 197 | Tokyo_00070_439717934_3d0fd200f1_180_97324495@N00.jpg,3d0fd200f1_180_97324495@N00,35.690428,139.704803,0,0,185,0.9900316124861288,0.0008063088963492504,0.00916201373496306 198 | Tonga_00002_479647466_2e7ea24455_169_36709487@N00.jpg,2e7ea24455_169_36709487@N00,-40.884642,173.048229,1,6,194,0.00045982514353681836,0.992411783572237,0.007128468371860208 199 | Tunisia_00008_903924177_8eeea96057_1429_9416923@N08.jpg,8eeea96057_1429_9416923@N08,33.553412,9.966487,2,11,10,0.0018928967122774365,0.4488768387000803,0.5492302704567678 200 | Turkey_00007_199529249_b54fd55a6e_70_85971448@N00.jpg,b54fd55a6e_70_85971448@N00,38.671304,34.839363,1,7,116,0.0004864224316989407,0.9337290049149942,0.06578451508745076 201 | Turkey_00037_1105905643_007e7c4da0_1384_82622473@N00.jpg,007e7c4da0_1384_82622473@N00,41.100957,28.999614,2,11,226,0.00580346418324524,0.0006650567208510427,0.9935314496764444 202 | Ukraine_00015_1337848415_599183dcd9_1178_28325468@N00.jpg,599183dcd9_1178_28325468@N00,46.475736,30.765677,1,6,48,0.0001138707627639235,0.9306873279009658,0.06919886815376053 203 | UnitedKingdom_00019_964966881_426cf82f57_1071_98545448@N00.jpg,426cf82f57_1071_98545448@N00,51.682337,-1.78659,1,7,306,8.219672780562792e-05,0.9984598393801996,0.0014581654314405057 204 | Utah_00013_273721069_5a2ffa6fe3_94_79954435@N00.jpg,5a2ffa6fe3_94_79954435@N00,38.689278,-109.576805,2,11,200,0.003224354630806836,0.42173956681099156,0.5750360913016301 205 | Utah_00017_311640007_f48e92f2d4_116_19269532@N00.jpg,f48e92f2d4_116_19269532@N00,37.218846,-112.920913,1,8,141,0.0032127018593683943,0.871930160537886,0.12485717048373601 206 | Utah_00026_474986001_181d71a40d_218_53364390@N00.jpg,181d71a40d_218_53364390@N00,38.773023,-109.324779,1,7,232,0.00033689420763494127,0.9528347566979392,0.046828342189684236 207 | Uzbekistan_00001_280399379_3193cf1f0d_94_40084555@N00.jpg,3193cf1f0d_94_40084555@N00,39.667027,66.942787,2,11,226,0.34718425443706913,0.000664013848080458,0.6521517320282213 208 | Vermont_00002_113886360_6cb9ab47bd_41_87434398@N00.jpg,6cb9ab47bd_41_87434398@N00,43.043237,-72.909822,2,15,296,0.00048000671725212385,0.005478731558666183,0.9940412201343056 209 | Vermont_00016_746636213_f837f3bf39_1209_19212858@N00.jpg,f837f3bf39_1209_19212858@N00,44.385208,-73.24356,2,8,173,0.00417503709633138,0.4056285877702521,0.5901964735032834 210 | Vietnam_00013_309555658_1206a876e1_109_40279823@N00.jpg,1206a876e1_109_40279823@N00,15.878047,108.337898,2,11,292,0.002506754386558896,0.3597063424083444,0.6377869594315939 211 | Virginia_00012_710310620_0900169ce4_1266_94125865@N00.jpg,0900169ce4_1266_94125865@N00,36.746982,-81.537995,2,14,105,0.05658533367540031,0.3281272690320094,0.6152874982627452 212 | Virginia_00055_1440634934_ac4db3526d_1135_91062007@N00.jpg,ac4db3526d_1135_91062007@N00,36.859948,-75.978484,1,7,289,0.008261066302308606,0.6341290967377233,0.35760989320928616 213 | Washington_00077_933052351_c52eb39df8_1294_54699140@N00.jpg,c52eb39df8_1294_54699140@N00,38.8985,-77.0275,2,10,207,0.3800024215817004,0.00035274051939815365,0.6196448628887872 214 | Washington_00092_1444342752_743c6981e6_1161_39405636@N00.jpg,743c6981e6_1161_39405636@N00,46.783282,-121.763534,1,6,234,1.3177212212500677e-05,0.9956753925307211,0.004311304206428446 215 | Wisconsin_00036_1174326080_46cb7b0c2b_1168_10976003@N07.jpg,46cb7b0c2b_1168_10976003@N07,43.654692,-89.821643,2,14,201,0.009709341409651628,0.37528678803092674,0.615003856395548 216 | Wyoming_00005_264085120_70bc6791b2_97_48947971@N00.jpg,70bc6791b2_97_48947971@N00,43.838489,-110.725708,1,7,234,5.901457982071534e-05,0.9928094484699201,0.007131521208657787 217 | america_00003_225732316_f761e65a4e_70_70484005@N00.jpg,f761e65a4e_70_70484005@N00,41.746157,-73.932248,0,0,114,0.9999402797871163,1.3673890409932055e-05,4.6187100816386106e-05 218 | capri_00004_483725210_cb68b00ed5_174_40425693@N00.jpg,cb68b00ed5_174_40425693@N00,40.557373,14.266262,1,7,350,2.9986898197748024e-06,0.9998254408445981,0.0001714987929201245 219 | england_00041_251424233_428738c274_111_11114422@N00.jpg,428738c274_111_11114422@N00,51.243139,-0.359823,1,8,359,0.0003477953360757624,0.7992703916611532,0.20038179006281354 220 | england_00047_273334374_b9447e5806_94_57749403@N00.jpg,b9447e5806_94_57749403@N00,53.229056,-0.547943,2,12,209,0.009130247581538242,0.1459271642115425,0.8449425687518897 221 | england_00090_496632589_c83b7bb9e9_226_91548597@N00.jpg,c83b7bb9e9_226_91548597@N00,53.190613,-2.894822,2,15,143,0.16819071596739832,0.05450080213608999,0.7773085433930191 222 | florence_00012_313147389_c46824aa79_106_90168643@N00.jpg,c46824aa79_106_90168643@N00,43.76725,11.272659,2,11,334,1.446629565471369e-05,2.560860094252826e-05,0.9999598779186092 223 | florence_00014_353015358_1e186608c3_153_37507546@N00.jpg,1e186608c3_153_37507546@N00,43.765639,11.270256,2,10,10,0.003176742438057545,0.28785151185627456,0.7089716284554015 224 | galapagos_00007_1030772840_1430e92543_1026_7132415@N03.jpg,1430e92543_1026_7132415@N03,-0.393444,-90.281352,1,7,116,0.012315412530881531,0.8398675501580328,0.14781699641207524 225 | nikko_00002_313984117_ffde0f168d_117_25159586@N00.jpg,ffde0f168d_117_25159586@N00,36.753576,139.604473,1,6,78,0.0016300031537070936,0.6723555680632671,0.3260144706743233 226 | nyc_00037_195999660_2dba8fdba9_60_40829484@N00.jpg,2dba8fdba9_60_40829484@N00,40.455307,-75.300292,0,4,16,0.9988935417458705,2.2523091328346782e-07,0.0011062788211817773 227 | nyc_00042_220554146_bf077ea42f_66_20871343@N00.jpg,bf077ea42f_66_20871343@N00,40.763874,-73.973243,0,0,115,0.9963763258001066,0.00018488822836459917,0.0034388155236904083 228 | nyc_00138_1022905709_ffa667da68_1040_70323761@N00.jpg,ffa667da68_1040_70323761@N00,40.807304,-73.961393,2,15,123,0.005319114194277219,7.259949982030278e-05,0.9946082611111899 229 | orlando_00010_295896083_bb881f9d62_110_29251780@N00.jpg,bb881f9d62_110_29251780@N00,29.188135,-81.226387,1,8,164,9.75357606645133e-05,0.5073086213894271,0.492593910866964 230 | pompei_00003_876663807_361e72721c_1145_78841376@N00.jpg,361e72721c_1145_78841376@N00,40.747586,14.484207,2,11,84,0.0014566764734542659,0.09694145200262483,0.9016020022262552 231 | scotland_00043_270016034_22faac0537_95_50994135@N00.jpg,22faac0537_95_50994135@N00,56.034122,-4.983844,2,10,142,0.0009211998069673655,0.4810125921341637,0.5180662478182043 232 | scotland_00053_331995269_96230f644d_165_77235581@N00.jpg,96230f644d_165_77235581@N00,58.202872,-6.379451,2,15,273,0.040373483248117736,0.06562508850657878,0.89400147999703 233 | seattle_00064_443151803_90c945e87c_191_74223826@N00.jpg,90c945e87c_191_74223826@N00,47.645127,-122.336257,1,6,48,0.000751267202140582,0.7423452845387999,0.2569034009814004 234 | venice_00002_69431815_c01190b915_35_39303693@N00.jpg,c01190b915_35_39303693@N00,45.433515,12.346229,0,1,317,0.8578689139615534,0.009659835410531059,0.13247134254666548 235 | venice_00016_265350847_0252df858c_118_44972214@N00.jpg,0252df858c_118_44972214@N00,32.845269,-117.273988,1,6,48,6.437537987658004e-05,0.9795942504087307,0.020341372655583 236 | venice_00026_383980273_f31c681f5d_165_35271748@N00.jpg,f31c681f5d_165_35271748@N00,45.433703,12.339298,2,11,230,0.03390910438861283,0.08830093459255295,0.8777900097302336 237 | wales_00004_130253713_3ded2d4456_56_66516604@N00.jpg,3ded2d4456_56_66516604@N00,53.121229,-3.999366,1,7,233,0.0010747104122899032,0.8445847775857942,0.15434045496749604 238 | wales_00019_442821205_59d2f2ee89_168_96019796@N00.jpg,59d2f2ee89_168_96019796@N00,51.644335,-2.677059,2,11,84,0.0031381575395244,0.04633668580891026,0.9505251780384469 239 | --------------------------------------------------------------------------------