diff --git a/.DS_Store b/.DS_Store index 1746666..7cc41a7 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/predicting-poverty-education-replication/.DS_Store b/predicting-poverty-education-replication/.DS_Store new file mode 100644 index 0000000..e3223d1 Binary files /dev/null and b/predicting-poverty-education-replication/.DS_Store differ diff --git a/predicting-poverty-education-replication/LICENSE b/predicting-poverty-education-replication/LICENSE new file mode 100644 index 0000000..fbad6f9 --- /dev/null +++ b/predicting-poverty-education-replication/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jatin Mathur + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/predicting-poverty-education-replication/activation_maps/guided_backprop.py b/predicting-poverty-education-replication/activation_maps/guided_backprop.py new file mode 100644 index 0000000..dd808f3 --- /dev/null +++ b/predicting-poverty-education-replication/activation_maps/guided_backprop.py @@ -0,0 +1,73 @@ +""" +Taken directly from https://github.com/utkuozbulak/pytorch-cnn-visualizations +""" + +import torch +from torch.nn import ReLU + +class GuidedBackprop(): + """ + Produces gradients generated with guided back propagation from the given image + """ + def __init__(self, model): + self.model = model + self.gradients = None + self.forward_relu_outputs = [] + # Put model in evaluation mode + self.model.eval() + self.update_relus() + self.hook_layers() + + def hook_layers(self): + def hook_function(module, grad_in, grad_out): + self.gradients = grad_in[0] + # Register hook to the first layer + first_layer = list(self.model.features._modules.items())[0][1] + first_layer.register_backward_hook(hook_function) + + def update_relus(self): + """ + Updates relu activation functions so that + 1- stores output in forward pass + 2- imputes zero for gradient values that are less than zero + """ + def relu_backward_hook_function(module, grad_in, grad_out): + """ + If there is a negative gradient, change it to zero + """ + # Get last forward output + corresponding_forward_output = self.forward_relu_outputs[-1] + corresponding_forward_output[corresponding_forward_output > 0] = 1 + modified_grad_out = corresponding_forward_output * torch.clamp(grad_in[0], min=0.0) + del self.forward_relu_outputs[-1] # Remove last forward output + return (modified_grad_out,) + + def relu_forward_hook_function(module, ten_in, ten_out): + """ + Store results of forward pass + """ + self.forward_relu_outputs.append(ten_out) + + # Loop through layers, hook up ReLUs + for pos, module in self.model.features._modules.items(): + if isinstance(module, ReLU): + module.register_backward_hook(relu_backward_hook_function) + module.register_forward_hook(relu_forward_hook_function) + + def generate_gradients(self, input_image, target_class): + self.model.zero_grad() + + # Forward pass + model_output = self.model(input_image) + # Zero gradients + self.model.zero_grad() + # Target for backprop + one_hot_output = torch.FloatTensor(1, model_output.size()[-1]).zero_() + one_hot_output[0][target_class] = 1 + # Backward pass + model_output.backward(gradient=one_hot_output) + # Convert Pytorch variable to numpy array + # [0] to get rid of the first channel (1,3,224,224) + gradients_as_arr = self.gradients.data.numpy()[0] + return gradients_as_arr + \ No newline at end of file diff --git a/predicting-poverty-education-replication/activation_maps/images/bad_image.png b/predicting-poverty-education-replication/activation_maps/images/bad_image.png new file mode 100644 index 0000000..ab96ee7 Binary files /dev/null and b/predicting-poverty-education-replication/activation_maps/images/bad_image.png differ diff --git a/predicting-poverty-education-replication/activation_maps/images/roads.png b/predicting-poverty-education-replication/activation_maps/images/roads.png new file mode 100644 index 0000000..2baa43d Binary files /dev/null and b/predicting-poverty-education-replication/activation_maps/images/roads.png differ diff --git a/predicting-poverty-education-replication/activation_maps/images/water.png b/predicting-poverty-education-replication/activation_maps/images/water.png new file mode 100644 index 0000000..0d4bdb4 Binary files /dev/null and b/predicting-poverty-education-replication/activation_maps/images/water.png differ diff --git a/predicting-poverty-education-replication/activation_maps/visualization_utils.py b/predicting-poverty-education-replication/activation_maps/visualization_utils.py new file mode 100644 index 0000000..72c49e0 --- /dev/null +++ b/predicting-poverty-education-replication/activation_maps/visualization_utils.py @@ -0,0 +1,66 @@ +""" +Taken directly from https://github.com/utkuozbulak/pytorch-cnn-visualizations +""" + +import os +import copy +import numpy as np +from PIL import Image +import matplotlib.cm as mpl_color_map + +import torch +from torch.autograd import Variable +from torchvision import models + + +def preprocess_image(pil_im, resize_im=True): + """ + Processes image for CNNs + + Args: + PIL_img (PIL_img): Image to process + resize_im (bool): Resize to 224 or not + returns: + im_as_var (torch variable): Variable that contains processed float tensor + """ + # mean and std list for channels (Imagenet) + mean = [0.485, 0.456, 0.406] + std = [0.229, 0.224, 0.225] + # Resize image + if resize_im: + pil_im.thumbnail((224, 224)) + im_as_arr = np.float32(pil_im) + im_as_arr = im_as_arr.transpose(2, 0, 1) # Convert array to D,W,H + # Normalize the channels + for channel, _ in enumerate(im_as_arr): + im_as_arr[channel] /= 255 + im_as_arr[channel] -= mean[channel] + im_as_arr[channel] /= std[channel] + # Convert to float tensor + im_as_ten = torch.from_numpy(im_as_arr).float() + # Add one more channel to the beginning. Tensor shape = 1,3,224,224 + im_as_ten.unsqueeze_(0) + # Convert to Pytorch variable + im_as_var = Variable(im_as_ten, requires_grad=True) + return im_as_var + + +def convert_to_grayscale(im_as_arr): + """ + Converts 3d image to grayscale + + Args: + im_as_arr (numpy arr): RGB image with shape (D,W,H) + + returns: + grayscale_im (numpy_arr): Grayscale image with shape (1,W,D) + """ + grayscale_im = np.sum(np.abs(im_as_arr), axis=0) + im_max = np.percentile(grayscale_im, 99) + im_min = np.min(grayscale_im) + grayscale_im = (np.clip((grayscale_im - im_min) / (im_max - im_min), 0, 1)) + grayscale_im = np.expand_dims(grayscale_im, axis=0) + return grayscale_im + + + diff --git a/predicting-poverty-education-replication/activation_maps/visualize_cnn.ipynb b/predicting-poverty-education-replication/activation_maps/visualize_cnn.ipynb new file mode 100644 index 0000000..65e56f7 --- /dev/null +++ b/predicting-poverty-education-replication/activation_maps/visualize_cnn.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you would like to investigate the CNN in different ways, use https://github.com/utkuozbulak/pytorch-cnn-visualizations as a reference." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from PIL import Image\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import os\n", + "\n", + "from visualization_utils import preprocess_image, convert_to_grayscale\n", + "from guided_backprop import GuidedBackprop" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "COUNTRY = 'malawi_2016'\n", + "CNN_SAVE_DIR = os.path.join(BASE_DIR, 'models', 'trained_model.pt')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "model = torch.load(CNN_SAVE_DIR, map_location=torch.device('cpu'))\n", + "model = model.eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['water.png',\n", + " 'bad_image.png',\n", + " '2',\n", + " '1',\n", + " '.ipynb_checkpoints',\n", + " 'roads.png',\n", + " '3']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir('images/')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nFz9yZIkSZYlhp47MLOIqpm5R2RmVddr9NsBn4a/wArfByx6j7dpQmVVZka426Aqwsx3wILVLBLPKcnJKMjcUk2Eh3vPdOl//9/+14gAsP5mUg8Mn8PMkYVFicMcIGIBMG1GBBKJLFpIKCmFmYmQSI/1c5Jyq+1SayFWJmZKyulzRpqj9xGRpRRmicg5LdyFpBbdtirMBLSiLGyZh80Efv/xOzL3UnepTQqQfQ4bs4hyUVI5fM50JSogAoT5sl0ul93N39/ePCYrRSIBkUIsCTb3c5zmFpmZVLempd2P83a7uc/McHciqrXWWkspIhIZfQz3cPcxekSqSimViUbvTFRqzUwARJSZyFQRVW2tRUTv5xhThMEcCSI6z5OIiGjOicxfrvu1aKmtbNs5xu08x7RhZmYMqGqtjYkiA6AIP0afGZ5JKUok4Rq+F/6XX355vlyExaeBUkWLqkqZMYm5tQ0EERbROScROGkcffp8/vYtCW8fHxZeW339uL2+3SzC3c/RA5kAADACgYCQZGJ6OBGXQkTIdPeIYGZVjYiISEICmcnMIhIR6/nMPoSZmR/LjxmAiDCzu6+vMzMiMnOaJREReQQRiEEEIIkgECFdPzkziSgi5pyWwarhAZCIZmKM2ftgpn1rTYuuH6GqmTynZaaZzTk9IwnJkpkiHAnz9d59/RrbtqnqnIMimYgTBAJLMkcmIRtrIxECR0SkI6bPHuFBFh6RFEKRY0yPYDBRuId7MFFrrZbSxzjGebqZW2YWkct+aaySYCIRMS2ttmHzsDFsBkGEIzMjwDLnOO5goqKqIOK0CBCzqAXGnNPMQSkS7jP8vN/BfU6bbumBfLxCLQVEHhGZawPMOQGYu4hoKcSExNZqRBZdLyyJCAAySxFhJmSGzzncTLi2Woe5mTEzP94oAQiPsklRTreMmHOMMcHSWi2iyCTknFNVtchxDHdj4UhKIEHMfN3at70+79telImdOTNFtJTSatt5s7D7cWdRcjn6x8fH7fnl5am0MBdiBbHIX759JyZW3mvbW0vg7P3jdvNwj3D3GXFO39u+1W0OO8aYQALIxw4hImZ+/FIRIAKTmanq+o9fm2R9GzOvhYvPP1//Nj4fDjLNPR8/nAiETNAf329ma19lprub2XSHe9EiIiJi5gBUNdzW0aYKznRKgDhB02xOA8DEYMoIyxSSz18IDoS7iu77hRMIC3emEBYkZeb6bOkebpMJwgGMOc0tCRmIiELKhTOzzzHm5KKgBLy2etlrLSoiIOpmt/vdwjPiWrbn63WrzeeMiMjQom1vkZkxWQU+106WyAARkZuPHEVERVUrOGd4gqZFH8PMAwSmSHKQeYxpHgGAiMvjaIAIgxCZZjMzM9KnpQcAShTRqgWAz1lazcgwZ6LC7O5MREJARKQNn2NSZK2Vi1pmAsSkIgDSwz2KahNtWoqU0xyRAkZSEWURMKWHTcuMbduI6eidQPCsLMQkyKvqv3x/+bZvFZAkTxAX1mKJc9iH9f2y3W793//j7zMSxGPOMc7/ktT+tGnbzjn/x28/k3Ddt0srl1bnmOd57pcLgMu+q6pHlFJGzJ9vr03qVtpkQ2S/30OYC0d6RKoUJNwjMj1DiNd6zQgWZWbPdfIKM69LIwE3Ww+dCKqca/NEAgxkZoYHixYVj5nupVZhjkwhZoKZMct6g0yU68ZPyoSqRiSQIpwREDab9/PQwsoFFumR5hjmHi6qhEQiwgmkChAjEeuyc89A76OSKJNlRAQziDUdSBDIzJzSEA1FWCzhQcIsREmxlarMfQwnnkwWBuFWtG1SawpHJobHMfr9PIvqt+vz03YpIv3sfQ5WBnIcJ4gCmB7JJMKIR9FCTCKqIuuSJAKLBIKZpvnZx5xmEWByx4gwszHt685tralIhnt4Aut4DiABAlSkqq7DqZSizMzsACWYWYgoQUQZRoRAZOamVUkCHhAP9D5TnIkyQojDTIjAsml5eX5+eb5EUp83BhUpyi4kEflYCh5M7OZSZL/sRTTNI5M5L7U8b+2isotUkUy63Y6fx82ljMiP+63PfrnsY4z3+zE8LQIIQcTvvxeWb/v1b6+v/3h/98ynrX1r+m+//jLdj7P3aX/7+99V9fsvv5hZ4iibPF2vlUSDWttU1NxvNtynFiYIE2fAIjzd09OjoBRRflTLuTbDjNha01KYec5pmeukBTLhERmxzvg0c4BqaVqKKgACnAnIJBADRCFCqkIkSDgx80gPBrnHGHNVRyIiypyIiD6Htm1znzGmj2kRQeQEZCAhzMJCICFOYLhPM3dzj0TcPm5Z67ZJ0WLTw6MUELOZ99Gn9VorewxYLeyRCYDF3c19kKWIr0+TYm4qsm3bqvZklYkAMWspL8/Pl9r62XvG2uIiYjbv9zuYtFYA6ZkRhExHshCQmcTMxO6OCH4sd78f53H2JBCzRXab3Wxdx+vRq+qqRHMdOZm8tlRGuDOoaCmlEJHZNLNwR4KIRASZjwYAqKWKSLc+fULBLCxCQLiNOSVFtADERJ7IyFVreaZlzjmPcc4ICwcTC8E9bDKotdpaZRWuhVTkRZFkcwjT09Y0fb7fxrD2vB19HO63MV6Pt+7hGeZzpDnyzOgZQQmkIH8cN/qP+a/ffv04O2Wm2cdbR5Hvl/1yffrlRYfNWhoX7e738xxz2KvXUl7a5denl8JcyP/tz7/ebbze3mYEEmZzelgGGGA2M3hqKY/Vv8oYImJW1fU8v14BEYEyMjwiE0Rs5sNmLbVoYWYhaGnEERHuuW78yEhQgtydwB4OIi0VTBFhZqudWMfc+n9xD2WRadMizj6muwMWQURKXIgJWK9/+DrmWaARk4AIH2OWQrWqU0RAWKUIs0U4UJgZIHMP7xnhZnMaiUTGdAukhydSRK61tFq2rcUcawGJiANMXLSIimeYGwPMzMJnH2c/MlG17NsGwnEe4a4iRbWVxswZAaL1D5OKEAHoc/ZprBJEFnH0fu9nAqtAXE9/FaOeASAfNWgyBwFVdauViUWYiJgw+nA4KQEJfhxswqwsKqIiICdLSni4p4tqEe5uSBQRFclMmzMQogWM+3lHzgS6zTGnZzIzKOBjF/7l27dff/21lvq33377+8/fu3ttF4K42/fnZyTutyPH7Cz99fXWx+F5t/kxxnAnIVB6OoiAiIxkFlVKnzbf7kfF669/+tNfLpePj4+Y48/fn79/+xaJJGn7PiN6ePc5KDvDDONu5ONf/3TZRfzDkvKl1b3+ejv7b68ffc4RAXlU9qUUTf7n5zzndPcqqwfm1RyvDsHdkgBajQ0AWASISDgjwl2qFCkQdg93AxGI3N0j07z3Icwe6QEpss7er874q6kgInfXj/vdw90DREkMICOIeStFiSnBwkk0fAAgJiHJDMR6MShSWi3hmQxhVpGi0qqOadN9HaERqaXMMYHUwkAmY7i5P47zWmpRERatTZUBTLMx/OzncR6J2Gvbaw13AGPOY3RCllq3baulRLgySdXWWi1brTszm9l5nn30zFSpQRhjnsPAlMAwP8c4x3QPYlpvZT2jzy4qMlevERnJALO0UrdVHSHdnZmKMjGVwgyEOzKLqoqoqBCFOyc2VbD2Oe7nqbUlkYoygHAWZpVOAEGEEhGJ6Z4AM6kKI0HEFJdL+8vL859++fVyuQKc6Zb213/8/Xa/jZk2RphdSiFiUp0Zt9s5WYz49Thu/czPV3Pd9ybyQWdaT9KqFRnn9MhwwtPz0/P1sgnC5q/fvpnHbz9+jkgp5T7Ou00UMWDEKg0xAj1SJUU106aN5+v1enk+u38cvZQSTOYTq+5PQmTAI0JE0mPdBg+YKHPVJ6s5IkKEZ6ymLBDBIGWBOSOrsIqQsM3TpoPEwyMzIhORSI/0SBBnYnXDC2j66rMjczXPOqatfyilchohIbqVeqkbPECA8q2f3QbAZpaERyWPBWwknATCQhRJC58KjwiLzEgCVDQTYGn7lkzkOd0jPDIVyZnKoqIe0ZSZOczHPG7nHGOY2+1uiHj65SLM53nezyOAbWvClJmj90S0orXotm+l7BFynMc0O3v3cGI5xjjGXNWbeQy329mneSSkFGFaJ9MqhGz1Yev0yVzdZdVStWylCkiZAPI5Yk4mMIEBYVamjGAmZlJhBiGiihBTEPdJWiuEz/MMjyrMQbP3UkotagRR8XAtpdY6xwBBq4Jg7qWUPz0/fb/snDF7Z9FaW61bJg2Lbp4e5/1E0reX74Toxx3mxIWJk8XW5YQU5W/Xy0vdG9/H8Xu3II7IIAdAl+fn6/VSmbgqFd1qHWYz8ufHbUbMdENAdbgRqyqPOc85//r3vz3v27WpIKXUUtvwZJEkCqy+JTgRbpakqgSmBIO0lFqKZ2TmGOML6lk7gSLgEdMzIaJELKoKAhNFChMDGeHmSIrEcXYtuq5T9xTGKoFFlZjWm11/P8BWYo9IQKc5MyUoPDyiFv3T068FXEAOG+HD7fBpgBAhQfw4KTMyAqOPvVYGI3N1dZ4+Rh+elhweGT6Ji4iUkiDzR+EMoiT0OYLkeb80LQGLCEeO3vvwMZyZS21jnOaupWjlj9stgevTVUXDbZoJY9/q02UrRZlBRN189DFsTrcEwiYItPrITIs4+jj7gEiptRZBPh7KKhAfrbAKiJioqBSRqrWJElG6zzRm9jnDrawLHRACsyQTAIpABDGrCokQ0fBYl8K0MPeMaFt72rYxBwjK7I/2JVRESSzTp7VWhahVeX5+et43SsxhmVK4RCIhLA1hnh4ec9pxvytShca06XnvfUR4gFky081tUrq7Tw9LSs8IsyQEEbNC2X2ax6ZaVY/7/f1+3Pr587yPOYMgpSDCwoklzKYZkn/c3vo87en6cr20ohZxnP3sfaGT6SGJxlK11La9vDy7++vrmwiramb6GOuBf+GYaydsdaP0n0ePyMt2ySDVMuekzFqksoTbMbpbfnI7SsRAZIKZIxEJBMw8wr6A1z9wWkoiFiEdczKTR3SLTFLiSpzDklYHOW52jnQQhQcxscicczXxqiUz+5hArNLFbE5bv9JaC/CIRKpIhJ8fJxhBSSoQDnOPKMzhnsi2bXDL1VCvPkQkGZElgftx30pl4eeX5/16sTEtg1hbkctl21rNMJ9GzO54XKmAuQclE1OuazHGtAV3ltJECwunG5AL2v86hCICDMLCfsn6kJJCzEq5iMDFvwhnJpDMDESEUyKJ3CeSCSRgYlmcmkVMc2LCAsSYWq2sYu7HeZyngegeSJkqtJV63Xcm1KKXfZNVDROfZ3+7n8eM9/MI4gXgUiYR9T59DBUiJo88zvOcLiL7tg/rhAiz19v7/bi9H+OIOYgSnokgJMWPt9cn5T/vGwEoxQPbvu+ROI85x5wmD3iZmHOOtVyaIZ3pY/R7P/fa9qoJQLjtm4PGcW5afnl6qq39y7/9l//5f/5f/vM///O///f/PufMRZWs854ZCTOzOUF0vVyalibN99nPsWsDODNrawhvTaTIiGnTEhKRSai1eVgmR9jCML64BKJH07YorAePRxzr3j7Nk9JtFtJv+4VBr6/vGbHVqqUkM4PZ3Tw8iIXdAklroZBSMN+tN9GNdJMSrBkEcnNHpjBRUTc/+gkgMippFRFRMKFKEMtiNO930KWpBJilqLrn9GkUsZfCRMftI2q57G2/7KJijAHPxNaqsnqQO0UwEZ193I7DkesGIJFhZnNmsrmvjVNLK1pW4f/VGxERgZgoASFiQhFtIljoAiKJQByB8JyRtvCeTEp6YEaeSVilp5knsknhhIdnBNKZQICHn8ftucm3l2dW/fn+MW1AZN8vTAICCQNRannadxbw41bJ6f7769vvb7eeNIm6h1tQpojWbXeiogVCZz+P0cMs3CJBTEhbJO4/3g8AkUhiEgKxRzqpY9yPj+NssbVplh7SWqtahxBARMosC7YRIcAziVBEVjmRrPfzeL+de9F924qWZ61aNK7XJvLry0sSzvvtr//+P46jM5GbRyQRW3gKlBGeyBDiVuomxccYzLVtxKVsG4Hn6MJUAhetRjBCaZdzziQjdmYCC8eq+B1gkYUmggQL4Vyd3YJYVAhIpGswe1iY/+nl6dfr0/v9dndjkY60cGZupWXgbtbdeQHhzMIgUCBJFtnDc9gmdd+uw/J+3GYECYkICxPTmAthShG+lFprJeZWa2T28zyO4xzdPazVVlvbLshjji5wEIRY+PFxmTJ9uENAhdKRTJSgORfbXWxEdx8R033R795Hn9NmALIOhVLLAhwiwqetsvPzzEgmTgQRivDeSmWFBamwCpgz0j3POVYVp8TEnIkIMDMxFlm+QL7IZMrKgJAo76SeGL17WGS2xr/88nI/x3G/mVtVraVUVk73DCEqpdRWVUiYcs50J6G6N9wPs5iZFgkQgxNx2rz/4x9CeLpctq0lMysrKN1JRIItgrVEkHkgvChxpoenZZJAuDZmVQe3thMAYQuLDERSpLIULfzJ1ArR17FwHqdNM5tmHpH3Y4hwqTWUVfUY51/78XS9gug//v2v0x3IUktEhgcxAj7NJVlZhPhaNwH36Z3cEp44hjHTaoVbZgWV0j7ut/s5Zzo4P4UKyPUWaHXV69wOEpBQzABW40tKUgjMISKKORB2be3Xby8XbUc/WaSU4hHWO4uEe0aKMHmEOQNcuSy5hhBEALiFnVOIuKhH9DmDU1iTHvBTEZGE2YMKba0RUWstM8O9947MyDjPnhGtlmkTQFGFJzJZpKgoMzGZ2eo3IoOYI9Pcz3NMcxLp027nec65oMwZvmqwBBi5an0RXiADMxNJhgP0JeABEZGIUi2iInttZZfVQI85+xgROWwm0LZGxERID3NXYhAlKDKmWQIsvJXStkbmw5xUyJOJheXp+vTy/I2SfAwl/uX6vF0umYgxqurlsrdSttpmH0a5t+YWEUmqpW1aatrpsQ60nBmMvPeeZkLQqk12T7q7WYQnwvxRsKiorKrUGUgkQPKJaD1dv+/XbzP55/2McGmFqp7uLCwqi+hYnRIz18w5bYFmn4U1MXMSW7ghEWnTCsjdptmtT2YSFgKY+LpvKqqqt/P2fn+LdXdn7q2pau+nhxOva49670wQIREqtVyfroPZ3l6HWTIJsZl7mPuCZx5U21cVpMwE7vN0cxGpWmqpIpmeQqLf9226Xfe9lYLwyEzktActCqIlgCHiwuyZGY4MocVhE4g80sxEqO07qUgtbWu3ea5amjyFeW8bN7Ixay1LVfbVbhLRtm0eAQIl5rQMF+Z9393NxyRILXWRg7xowoyiNbFoQp7mfc7j7B55ht/7WL9FAhar9U3yZOFFuACIWJqQSmBPxzocEpnBxLWWtlVhVJZaqhIxce/9PA/3XHwwHu8+keBH1clAsgApPs3MtGg+eE0nJmA1CFRrfX5+ebo8J7KV9q9/+tPtfpg5iNpehOjb9WlrFUhztzHPeNxNiPy43T+Owxc/ynDPIACIdC3CzE44Rj/muI2x9ntkMhe3mN2IgtKq0t4KEmCulu/3np5mOLrdp/X7bfrkquWyEUsSyWpYM0SUiYioZFntpiwpRyYRzWnrohewJREozEEMUUuEZfhBmZzps/3rv/zl3/7lX85+vL7ut9v9fj/PPvSiSTlsUmYGQMQLj8vMSC6ltVaK3sfoc7p7BKMIkh4iL5HML+pGRESYFZwZAk6gim61AEmRQlK16vO+r1InM6bH0c+zj0V9MvEShC1hT2EpTBFUeGl6QMQMEZFOk5ipyNIXSNGcmGZCVEhaqY2VgE2LFl2M7NefVZNFprsvUgSUtVYVPnvWQkSrXDF3X9pKwtIpUSAickwbHjNiTDvMxieyBhDx55UtUoqK8Bfq/NAbhhPAvGA3J4IWVWFKCLGKInNxBQvdr1UiMcNtlToLJ120YoS5mQcxgUhKIWab1s8+zQBkxgNfcowx3z4+Wq3hwcBeioP3fbvsez8PJRBWMynQGp6GYNYEzUiLCCCXPDGTi67XoaWoSGR+3G+pEsQRkMTC05kZiYzYW/n28nTd2zTr09FtlGkW9/uw8VMIQB5jxhzqttX2RTOtbU5Ekbnw+VLKgs5KKWsbLGYFjOG+RKbMFBEksuR6wpThkX7cbx8fbzGtkezff+37+Pn+TsRjWgBFdV0kIuKREZHmXtjdb+e9W5j72WcQNdRatLBkpqqaLT0yZeZi/pZCTlja5Xq97EjvZz+OYyvll3/5Vz3HsIiIGBbh8X4cFrHkAJGJzEgHUyEtokCGU62lCEeEsqhqEg/Q0ft//vYPjyBhrCvIA8RciBKJpCQQ2RKGfEoP1kI0MwsXlk8+HKtWabWCbNqDmGLmUoqqIiOShs0+5xhmEZHwzPW/6eFmS1UqJAAV1a0WIXoIOnM9owQSEUWYQMLEJMyytZaJ3k+flGrStqoFiVabqHpimMUcnunh4U5awBKRnhlJxLwOZzMDReXHllsKLaJcXN7b+8deytN1yXZNQKrSRC6t1SKZuYjEpbAlFUK+H/12HO/HEYBHzoi1ozIDEQRkorVmo/djUEiaI9dBhgVbiYhwfX6+fP/2wpTTrJ/9OMfS4Fjk7F2IpMjIYOZh7n5sWnhRcsBwEwgAD/9nWcGnnplUxYcjk+jB5Eakh8vjJEpRhSOAH69vHvG0beQOGkl8vV6HxdH7l6KTRbUU7wMACARilYWeJ6jWNiLNktJFaelkI5biWnNhDw5EMHNrerlsrdXjuAWCmJ+/fb9en/XW+3Qf0/N2RuaYY3X6Qo+9vjC+Qirr0ictzLWUjEBEmlt6Akm497OPkchSqwoXplZKkbKY90R6ApHAQ6q6ysoHPcG0Vr+s5jhijFGqahb3+fX7r6OIkEnSp33cD48F2CpryWmPo9GcQCqqrExUtShzxNJoQIRL0U+cDAv5qa2V9UsBYwwbQ0phhRALsYcvasvGXAVvhJvZkiLOOSgpmQES1bP3cwxzL6q0tv9ihXmxJUxExxjvx5FMSgSbu5Yqsrfamir47P3+cfRp++UKinkOS/z++vrz/T2Jgijp0c9wZFpkuBCR5lZbd5/EFNiEI4HwZIaQuwfAxEcfP17fEN7H6MMCRKJhPn0CaYCQgz7x3zHPCFVNLHw90x1LIJj4eomrg2KmWjQzhalWWcRjIquICJtbIL7uwaT47e2DQC/XfYzp4R5g0dZa9AybqwwZY8w5VVhFW2v7vlfhvJ+ZSSJMcPM+XCO3rWY8bv4ly5rTMigTnBE9PGxGo4x2aS8vL/t2PedUIxqeIwHmACBFOEWE12+Vj2o6EcxSS6VM90kJJrKM8JzTgay1wi2YVuvNwK6tkCw7yJzTw5lYPvuTVT4S0WIBmWTOKcx1aQmEES4suhcWJQDQdJ9jECHDT4uPo/c5mYWJET4WAeHh5hkQYWVtWpdaExlEVIoCxEyimhFzThAIyUxFZd/qGNPNmGmVTA+kyAxYimhbqt2lj1oClvBwM5VSazW35cNw9/UMFwHJxGaGWMLNbLVG+Md5knATudbCwsz89HTVWo7b+/08jtEtMs6jjznNA3w7ukeSMrEISbJbJNkUItaiwspscwrzZdu2Woho2Dz6MCQpEksmQEfvZz+EiIkCC9ck0AQvBSGBsqhmBDKIMiJ670sm+MVVMQiEB2v+aWQBwIRWBECGMyUJZWYRYo50Z86ibIZhthSaertJYQJFZp9z3o9a675t40hiOCg/VRLrNswMYgXBw/uYng8vgfCDNQK6mWViqVgyGMJaivk873dLu1xaJtjs958/zjH0sm02TZyYJUBBRMgArRKCiUFJCSEooVUh5n6uyi4LVyYuyNNGDxfWVoV4C4/4JMsiYjkTMkJqEREkVkG5uuHM7L27uwjXWplhbiILZyIRmRRzDGFgtZwZ08Y4h7KUyx5gizzHPIZNh82MGfAU4SLlITiLiAjlRzu1AHDzsAglYiEtKipMXIsm817r2huJtLAIjwxbdiQRNzt7z8yixaYRSEttpe6ldeZhkwiliIikmyRf2+aEY47ucc5pwy5tL1Vm72TUav329Aw3cnMzUYLZOMecHiw27X4ebat/enrei77dbofZiCCwkGa6QIJzHSUBfNxvTaQV+X7dKuEw+Qm/DUsQESUwMzKNMotQYQURAkgISS2yPA9Ey+AUZh6ZWkh4EXEpIshAprKE56KWtKiHL20YiIU4MyOckEIkonvbLk1tnABrqbd7/zjHwuqP0cfYmrbwtMju5od/u173p8sxh08H0QN0zxSgbk1rm4lj2Jge6VVZhYsokjOCiDPdPi1gXEsmIdM8puWYXh192D0cifePD1XGEunGJGJBYr3wIiIMYahwUa1CutTtkRD2RHrspW3SzN2OmA4IZTiDmNkohkdgivs69VWlihKWHexRaXxJoESwtdq2+sBWErHEHtMjcpqNMEJsbaGhSkyRMnzpzX1Oi4AHIhKRwtJqbbXwqkQZ7MS5KjqiZLdYpgDnRMoSJyqzLPNL5kIJIzyXYCvXJ6KIPPt5nmcptVYlsHtM8ypJEbzgVHpUwES5b+26X29zQOQ8zz7mJuWpbco8PAtIInPaZatbuTAjRpclnonsNllVi6igKj3/8v2yb//+2+/H7R6UAFOwinqGZyJBAKVTRivclFqmNLVotzEX+4/kgEOIMj2dAglevRVW97X2SeQYq+wUwsJiOMLd/eFxIhBSl2fVbHldHl8Tu2M1oA/CNADP57Zz0QSp1l3bZbffPt47EzwYLMlzGpK5FGV+vlzc+qBsRc1GERZmhY/j/vqmEPn5cR+eIoWRRRLRrVt4mns/h0eI8irblujMw4AULkR6HMMjmMUjZ0I/7vcAkmjYJPKFrHMiMiSZiCPC4Vzq1qplftwPIkKSgklkCkbkmX6fHU7rHFIWLdUihhmRF5ValERnxMKo1vEPoPcOoLW2Vd5b0VrWJ0uQR44xmCaDRWT6nDZVudaitbLHOcLHMaabh5m7LR0IEVGtpbUKehh6ViEekQsjXp4En+ZuxCCVjLA5XQQkDxsf0Vf18hCKMkdkt2HmtBxHRKUUIp+Z5+jhFozu5njoSIuwgX7/uPWwGREZItia1kIcsV33olyEVeiyta1q+ERmKeX5ekEpH30c/URGzHx9fX1+/g5Vp7R0C894QPOtlHPMhcNTCjGSCGAt4rmodqy1mB7MJEu8xMzgBCWreWb4iEdBj09l1AIk8mHk5XCzaSysWojkoTaT5cCix/cDZqvprIzMiNn7SXOC9u0Snp6QUq+tvZ93LoKQAM7R32/nkR4CF5p+jTEq8Hy9VNaz96JyaTun25y3j5vNqYvjRYokuWc8oO0HzO0+ly404XNRb6oq7j6Gmdl6XOGux7QEBVNQAiGPnv5x60WsJkKEZdsuVOT9fpxjFK0ebh+3md7Dz97PfhKwt62WEh4kChGftvwzosWCCLGA/GUzXx93jEFEVbUIGEGkEJ6Rt7OfvVMOCieAHrCriJTIPM55Hz48PZakKCNjATkoqsuY6yZMEQ6kijJxLvyOUIuWImYmhEurrTVVYWJayCNAZuOY9/tZSqm1RiRlmlkfIwmq6h5zzm3bicLd3+83Jtquu1MaMsKVeaHEH2N0n+vYFE7mqJWuZd9rA1yZq2qEjeGrRmPh63Vv18uTx/vt43a7TZ8z4vV+P2x+9HNmJDHp0iaiSVnbPyKQOTL47Lda9+enyExikcKequw2GGisrYguOWPCITb7lyB5gYkLnACgqkuxv3rXWisTmGnJjNe6Xw3PgvXCfRlTa62taO9jzHGO+dv77bLtiFBhIQ6Em02fpbYZgRm387i7pVJUPcZ4KRVhT6XsojeG2awE1ZIqPXDZMWl2CyIUpWQqKsTl7Evkm7ZIW1GAl/U0AY/0mI+rzL2WwgSdS0P9gMxp4VZL94FPuZK7R+Ttdp/p051ELHKc3YZNip7LQv6wbTIxMj0zwAFEwjxux7m3xgTlrKpfSoQv/T0RwqaZSyGIzunvHx/nmFUED529bFslLRY4j+Pn++30RJJHTPeln2MGE0stAMwnRaSyMAnLan/NJlHWUmptRDBzodxK2S+7anF3XzByhGdYPooQfPayHrFWv7C6L0TEV48YEVxLMsVDtPZ5iBCdc/Z5lqrKRMmZHvDr0/ayX0bvbmY2woFWhdncW1Mpmh6NOPYNwDT78Xb7uN0+ej/O7sCj56QkJCEICPcEZQYzPHEO6+YGgHQtWCFmIQU20UttyBhjTDNHLu3GWsTrVPqKPqAHdpxLPcbMTFhqwC+w8p+/EFnyABJhEmEVUu39/te//SOJJPOXl5fv316IyDzmdC5I4brXOuw4D6MYEW+32y+//nptjSJHPzfhEYRwJyBkQYaVyZCi2qpSFiKa5ovSFhH3ZbcnXz2fchK6jYfshalKqaUUFSXW9CBAWdwdBFVddUKYaTBlcKlzztn7RJqHZZqFmydyhAeBiShRRZjI3GptInqcPSOKijCHm9sAU4CFOTMXmLDqn6Xb5qWgJfQx7vczzOBmGWtfEguRzOlzWD9HQCJjSYw8crVrRCSyLvGIiEREZC1VRR6Lgai19sCZhPfaqspXSsHa6mOMRTAB3LZLqTVBkVh0w4pXEFZV9N7HGBEJoNRaWlk0ZCKVWEGFGeFhI20mQgmiWtfhyiitTp+z2+OCKjWBo4+R0273jKjbBlBru2effjuHjWmeKaqiSgkVbSo+jRa8uGAHZhAP93P6fYyPMcyCmIlZmGmZmegBxpm7EyVBhJj4kzEsY4z19Vd5k49YhsSnzOCLF/vaMEszt2gWD7fuY0xPQGSG+5Ir3m6spZRyzrAk8qA5kxmqzuzIIDIskZm4GyJznSmiZd8h6h/Hcb8DvFdNon6cq3Kzh7CARagUPJRKAZakzxtMHo7hVObCpMKa8ZA0MVGRksQkAsLs3W2GUxGptW7briyT8vzx4372JZmgxPLrC3FVrrqcsgaiAsBNEFVLVQEYGcIsxGMMd19c2yqjW60sy9yMSIR7hm9VVKiP6RG1ViklEmMaIqfltDinzekrdMEjRGRrjYUXR1OKUjLTeovLW0dEUJVaiorQEm5GsjATrSoSy6UL4mApuoQeWCboRGQKKDyQX7d/ZKKUAoKKBBIeRflp39NMAuxzFzzVy7qCRIWIkfH+cRfwcRz3211LuV40pBzH+Y/XjwRl2Fb1QsJSSOvP959HnxEpLEVLIJfwVZFKtCo6T/JhLAzi6TE5PdkS0z2QmatQfvwppWgRi6BpEbmSOyjja7nPOR/I0pKBEa1TbmGOCCQoMtdLtAfPnQ9tCCLCz97NvY+ZoCAGc1HmhLn/fP9g1m5IKT7dsqPw8LAIZ1hmNzumPe+Xbdu0lmFDsB3uH7fj+vTy7fsvFvl+uyG8j3k7TlbdtobPuBQmYVH38EhlWq24uxGEhYFVPzKlE1LDQplYmEHCPCM8Psl85tU9MdEXHz7MPMIfNyAID/fwpqWqTvcUROZx3OB+vezXy76SeSI8PeacK1dHVfd9f7ihM48+sSIlljqolkyNCGEygIktzCJXuoaZH30ec7X2DCJVrbWUop8CIdRalDncIlyYl13oQU26mVuYI6HCKJWYExmrkMgH2mo2e+8JkFEu4WSm4KH9WhlJn0ZWHaPPOcBEmT4mbZuAClFhuj5fLvulaDWPj/t9SZWU5gfdz7P3YTn9nH6fYXO+H2OYFQGLqjkFvb3df34ckYQk1ULMw0yYlCjdu83IFC5b00iK1X4js3EQJUhEKdMjCJSZIuwZ9/Mug4/eHRHEKexzZsQD5ndnIn5A/q6q6/D/ktmvs0RF16NYWPbnBsCCHOYc5uERoBXjRMxJgSSa5haeLO6wcRbBJBvTR4YLbBjO/n/PFMhffv2m2+6TP263//j95/vZr++3b9en56dnEf243ye7CE+z88RnBsi6hOkheWHOZbFHJnK6AamQoMTS8zIthlxW7Z4eiVwZS5mS7kxCkNePWzebbuc0JCiTiRfku3SaohqJR4oB0Ridw4tctlqYWUWIyhwjMmjQmBOJbCmi4X6/3yMWWhoqJKKlVpB4poPEptnKO5GR7r4SMiDC5h4ZwmAmEnjag2oFlLiwzulMurddhC0sVy87x+LF6joI0477ScS11jGtu0UCSJuTkKXUabZIlQR8mqKIkoUl8uEpCE9kEi12XIWqEBNdtrbtrRQlkEeY2XG/9z6uT09b3dzjnPN0M488z9pH1ZJJ99tZirYN49615m2OEebh6S4kysKFWqnCtIx3nukZSamVbYZFIHEf4z9+/j5sSilYGVLLvwEcNseHM7N7zBV/lhQBAByhhE1L2zYQxrCP84zF30WoSmGhdUmSOBDmWHdsuJsTIFCBWuQM84Rl2uhEzIKIdM/wZX1mj1xpUUXolqeZQ4WEw3K6nfcf9+kf4U/X7e399cfPn8eYltl//rB+/H/+y7/9+ZdfVMTdDyAzl8mNGcsZzKLxiWKF+TrO4hHeQ8k0c2mkSIkClIEAaBVQi7j6LCq2XUvMeDvuR9hDOb/M45lCrCoqDCCQkZG0cKisqoVUmW1arWXViPEZh7G2jJn3s39RAYxEZtVSSkmSGXTvYwyHL/6VAtGnLY4jiJhImUS4KGc60jJIVjULcCzLTVGRS9tByPOhDF3RRSzEhVPS3VMyzI4z7n3MTC4FNgplqY2LrFy6lRrGQGu7aAETi5RawnzMYRarn2TgaW+bStHyy/cXgD9uN3cvWtyMgKbytG1KMA8WGef9NM/EBDzBycxinr+/fUx3qSWQ3efiZdNRiJREiYsWJhk+EwFzRFZEOpJABMswcxAiDJ9hg497TGhmrrQGpPh0M08QhJrqU6vXUva2MWiW6MPOTAqAoKAErdC7QE63h8Zu5ehgHT2ClFVwe/oYNseotaqqP1S5OaZ50phh7sy03F4ehBEiBIglwPmjn+Nvf1OV2U93YyIVLkWl6JiDSVqpz9fn+5in3W0J4DyRENVYi40oIoD4vLKNVYSVE46IDKTrCtBKxDojmJiZwiIzhZmI7ueZ5gaPXJKqxFf43YO0yodyjiiBxcZvrT3t2/PTk5mdZ/+CllfFvEj1JfgRkVprqZoxlbS1kgmP7GMe54lMkMxwM0vQcI98mFwZq8MGI1VKLUIEJkaShzODObmoqkIem9bdibDtGxEWOc1aSElZfXrvU4TXJmXVIiujhh/FL4KQT9en5+fnIMAm5uhnzwghqnvrJ877UMa1btft0orAwt05yB3mMyOb1tRspapyqyqur7f3McawSIzLnq3ULOLuvZ+WEeOMCBJWFillkRIA+hiPNjSTAVkigYCCtNRaiqefvRORgCMjLZwCsQqBRCI8IhKgZRVlFgm6tv3luhfCpTUkRfS1KCJX5UPm8ZlIGMsZuBq5BC+hdAQcEUI24n6/25zKooEcyw1HEbk6ATMLgEnN/hDGf/5NYAbLOUYcDoR+OtG17KVdPo5xP8ym33vPZJUaK31xBdTGCpN4fLxF/0tr7rLIPixNWiZHqrAsHAMPQXyGP8qno/fjOAszRcYy8+EzjDE//8mn1xj/lK6DBzG5YHuohEeMMRf/5RQejsczBfgRHxAeWnRMH6Mf3Y7hMwGkh/c+5zRiWflSLIJ0wYMD34o+7ZeiaitKM0xFACJJKZQU93FfVdKCxlR1tQIAMhAJilwZREuqR8LMstUKovPs7r4gOBVurTLTmL330yLm6AK6Pj9ftv0U/QjfavnTt29wt3Po1lqpQvo+P0bvbdtabUvdRaCgOI5ThF9eXt6P8XH09z5PD6SLCheBLRVhwsNBsu42YiIK82nGRBFORApiEFhqETATi4fpLmsRLMwtEyQchKAkEgBjzDlNRFQLArTcbh51a8/Pz2ExPVpr55iE5X7mADERC1PGMtgPs8hHXhNAEe6OJJxnvx8HBS5728tGlGvVsUamD+vIYKIVfvW1+j/ZN3LHpCQuACLSEyrskR/3ExAEmPi4Hx/3O6lcnp52lTH6GCORkVEXfsVUWzW3OScxC9OctqjtJrWotFq0iM40LPyFsMqUB0yJpITUKkzJlLHOUWRkAvqwDBBiCX48M5+fn0sp7+/vPqdNG30sbSrzClpcov6V+PW4PaebRUyjZRxnZEaau0UkeK5vhYARmZQpKrVoYd2VVXSr7bJtnDjvdz87MlotZWu+bFmUFjZskqFyfXCny+mQOuc4z05gZWZQ1RIZSNJWzd2T3HyaR6S7qWrhx3k3bSyNahGuolvRTZhVXv7y58tlL8LH/UaZDBLwdFeS/dt3Fhk2+7R771sjZu/T1yIVlnW+egbSNEVYEEmfYmMRIWYQTZsEECgseDlFAUqSpFqKaj3nuB3HDKu1fMUs11KXYtnSHYsGFdlUxVbaU3ikGSJH72j1crnc7+fZuwoXQmRQkpslc+bj0wDBItBiHmfvdnoEAtzN/IEHU2Uh0PIqROac/ZG1wRI1I1fIKv55A6w/Tpie0ZMymVC2tuI6h8Xrx7n0xXNOKaVtGxGn21bFLWzaZdtW5ERkMCeIMtlmZKSyujsFqeheWy1Fay3CsgLolq7OkfYeZ++L9JnuMxNMjhRiZvbwBQVHBsUj2yg/M0VEhABWXYl2qvRJlKw4skiCqERQRLjNdZUHM/MKFnIRKbWd3t2WI3KZ7RKIIloYVfhlry97DU9hYcrzOKbNutUAYkW3QTyyz+HhYQFLF38sAjfOhxG+d0vH8+UqRZnpItttHO4jguIheY/IWP1GUS3KpaoOVTfQqsiZIij95bpv+7ayYbbWzn6e/ZzT1+Fb25bM99vtt7dXZtJ63Vn31q5aD4uP+8+cM0AkrEIUCLcHwLJAd5EEPGIF3BBQRJl0ufA5Q1mu26W0Nt58Be/1OdhYhH3VLest8APPXKizMAOUSysnHG59jnPO9+M+3VOoVX2m6GOsKLylCsx1hhCBOUGZxKw+4+yDRBeYKqWqxCZFWM2cVLBaT6Kk1CIMnmbDg1i+KMUvONVBQC4vbtGipa7qhUXHjD66uYvwVioYkW7j3Pfy7fm66ClVJWDMYes1qTDx6B6RTCsLAT59ROpWW88RkSKFiFXVVsIP0vHwJS0QgelzHa73kenmWHMBPkmT+/1+u91E5GnbRGRRWBFp5nNaAqREhGWznGaZwby8QlBw91GEqxab3se8nSMBESoqpYqQqIgwXZs+b/VShCpPi9v9IxKylRWT6pH9GJ+Yd2aQQiEgosXxmRmQZnOMkUFKFfnp5xUqKjb6dBAzVjWZubVaVYUpwhLZWgk4gJjWRK/btlVVoQw3QFXmaSTCoPs5zHKaZdG2byOjh7e6Sd32fXPzcDzVehF9Cyeia9sWcuCIAJgoiQLwzAhfOaTCLMxgNveZLiLssVTfvff3j/fhXra6YixSGAT3ICw0Eo9FH6uGXS8oxrR0S58hdOvHv//tP0rbULVwbKX5VhevdO/jODqv6hGZoOkxPM4+p0UkCaiISlFRnb2bRTCSaIwxEJFBke6L7yLKoMQCsuMBs+HRVzAlVpw9PLOPsRpZkFjmSDcYg4XYcjbWrSlnbGVrz09jjHjIzi/33rstl9rK1FqTFdgyDu+JVDMbY5g581xBpZ6xyKyV8bcaJv7SLODxBZbV49ELfzZDywKvqqL8KRRZBZWZgaBaA2Fm+Wgm6NEuEEUkJerezOPHz5/3o3syMYSkFS0qlEEZW5GnrW1FCi3dQUQGlxKg+3E6OCGrKrMx0qOoCuty0KoqEY7jXGLTWgulCnR9bOKFhFEi3MPnaqtIRFqrVRWIMcar/2QV+iRNL6U1LUjrYy6+UlSGGYCn52ep+4/X958/frze7+26O5JKSebuMWYUllIE4KdSf7lcnPGXP/05PX+8/ryPnkBGsrAjxxzraVdRecAJycyr8ScQs4453m63Y3RuhWQ5EAAmEBxB+cjUXxZ+JInoV2O3YiBUihYOwmnzcE/iRnmtsm0XEgXL2efb+y2BMU53A0mtlZNux5zm5jFtCLOYg2dmcOCEKfju48OG8LoyYiXIM0iFDX8Qyf9cDgFEJOsAHcOKcgKeHkTSNAOZ7unEWQqRQ5mLaislzO7nae4vLy8Vcc6xckojyCwyiYmSwhGyNC0W6cAwizS2qSJISJJAwtIjWZhA6b4cTySPwFFaWXH0YApVhImLai2V0hfySswgjDk9o2jBUiIKER5OAUQSsQLKUlvV0l5vH7djDk8R1qJShFgAooQyrfQlIfbA/Tg8U1jcwiMFlJGZnpnW++hTmNeMD67i8JXJsW6eFU5GoAwT0eURs/Rhcc7s0216LVqEuVQixjp0bdqwjbZLa5e2ba2Z+/v7u42x1SpFIgJupOzDhJn3ev54/TCzMWROVZlzpNmr+6HHtlUV2Wu5PLWXp3+5btv1+nT0UTj++uPHYR6r/XRfoZTLNUpE4eGUuaJDQVJKkPw87rd+ctGFAz5OJhCAJQQkkBBRpD6GqyQIkZHpxE4Ai7DKWBOA0hcH6IZnz2utT/vl5Xp92S7vx/HzdVjSqgrmtJVL7pnuAUqzmUhCKknCi8jMlX4Gz4dJ4HGUkmSkxWoL8+FBDxfVUiuQsaJNEhkhyqwaq0dIUIJXtZIZkUgeY26t7vu2eOjfP+7T/DxjzodCmwAiiGB5FxKxWlnOhJMPM9jYa9tKIc+ImLHaXsqEEONhhiL5alnwaVbMpIAqt1KRmH0wPUo6gAJBjOScvvAqZBhlCEFElHWTct12iLwd/efb/ZguorU2KRKIaZGcklFYaykMGtPDMR0AZ4QK760uUnm4jz78BFUtpYpoApZxjM5jiHAmmFYZkCxZGldVi2kWbx+308OIlmB2gTDbZdci3bqF2ZzPl12I53FK27fafry93s4jpsOJpqdQMdtqaVo48u28/bi9j0xLiENUlIsgCWSgn8cx5nnZ6p8ul1+fv/3l6UlUNt1mvvzt/c3dIbKuISbCyqmPXMsuM9edZTMcM6Kf55kRpVYCUQQt2U4mi+RnpgCSyqN3TmbOZXYgR/oC9AZiiTXy0wXRKQXyfbs0sCQscp4nZe6tWsAzwqYwtVY8MwgkYnMukIcVLEQMDlYqi0QDkOAZ4W6eHqBPJAgZGWHE7EEcLsyZmOFCBGIEwmyYZ7oSlFiCfHh/5An2zNy2dr3unnkMO+Zwz7Dl8spWdd/LnCPDm0hhGeHqNuFGkfpI5WVxL6Vu1+sY45w21ggqelQ7+UeG1MNBR4TE8oJEuNsYmeFuvIYhMAflgmMBZHg6pg/huOztsu+tbumZFp55u99/3m7Tp1QtWmRdFSBkxMqMIMrI3vscJqwiCmAplpfBAETT7QPoY9CKEimcmccxzjmqKgsDKKJFmAAGsSiY57Djft6Pw4mk1dZKuFOE0DI3C5wZVLdNS7t/3G6vb2OaA/fj9Mhaq4h2Gy/P3759e5nnEXPebrffX9/7ceoakrRgWCmCFClzWp+nxbybfW87a7GAW0zGWvcsvLID+PNprzWaDwMuL3bJ+lgWi8y0hXX/k7Z5cTV/4BOf9gZ3jwz6tPN+Kn/WVAYmYregjCTyjPt59suVrjrcT7Mkrm1/etqPPl4/btOcmAXcatVVSnxuWmZab01oBdbmV2HsbmYW4HxsZhBoCTaYAIT5JFIw3HIp4Z0evwhlQITWDybxiBkxbPLJ/P7R55wzxjlHH8mSQFElsCiJwjwivIh8e7pMNxVkE1EEgbhIZoTZtbWXl2+R+MfP19/eXnvYA/P/fA30aSDix3CONTelrNYdmaXoSm9+jC3IBIGJiTkyKHHZ92/fnosqkxr8Ps7b/X6M4QStJVdCAy/w04twkVaYlHmOsXKXpOr1el0oYX4adtfbZSJR9oiRPmZM93N2YqrbJqCMUBFZwbetBsHc+5ye0baWy0tHNMklqRI15Wutz3tzj9uc78fxcfQZ+fN2357PaW6e18u27/v4+XOFpM8xmmrZpN3PKjwiAXKgj8GEIlQrF9FpkhQM1LpJaT3BICP68fbex4w1bChCP1U4a/WvpbwiSeacc84vwy59GlNAnyUQ0ZcD6aF3X80DEJ+pwMBSTKeqEvEXsfMow1kzczxMvlpLxZg/fvtx773UylJYZkwLZG3FI8O97JvbTHcBKVFRXWOQzIxoWQ7j4a9e4ioCgx4pHrn4sCT6nP9FALNj3Q/55dlgZtYSCffs5pZxG90/8vXjrqKttnBI0UQuT2Jh0sXfIa9b+fXbNYn15boz2D2YeN/20Ucf5/Vy+fbtWbQG8u32NjxoUUuPmKcHorKOdABC/LB9PU7rWGM+IsI9IJ/3BqGqiCpStkvdqvY++3mPIF8fc001yswAwhgoRWQNm2AWIDPcopWirZRS6Z9iPddqyJUTtWJCIhJ5Tptu5r5KuAVaicjemtuc07rZtJmZYNblPM4gSi5cwJX12trL9Vpafb/d/v76djtOKkVAw/2YnolzmNzvWnTYHL//DveqXLatSPn+Pc6I399vp8U07zZBuRXd2vbt+VlqOc57LaVtTxM8zJBxzvh5P7r59Ef04dJd5afyPiLWjbfc91/rvpTCzJ9R42Chr5ko68VFhCwzANE0syUUfSCkQbRGMmKhNOsWWedLuB1zvp3nNP84++9v7x/34zi7qLKWJIpM4pWQ/xDAO5DMylRUShEN5uQptLILHpjPWupI+nTTb9vFbdqcFv4I3XPPeHQ7DgixFhYiZDJLJp3dlhTcFgc2LaYrz5fr85//9FyYrZ+jn5l+1VJrPR098LzvtQiL6p9fXhZMScT7fjlFimApvICImCzQIqS65tutDfB1D2QuGRgjE7nKx2Qm+bQWrkxW5odSb2/1osVjipCAfNp5niKVZAFQOcMoU4GtlJfrU60a6XMMSoiwTy+lfvv2XUQX+/Z1hvmalbNSXwGkz9GTGW4UIYlVItTrBcIkbBmeYTOOMcxdVIiSMpWJCXutENpLu9Rtqxux3I7x+n67n8PBRGTEI+aPj4+9bRCdiY/j7hmSUOLK6tNabX/+9ddg/rifw5OYluBkgl5vHxFea61ty4i//fj58/2DmbqN9+P+cT/6dGJlfgwDFWGAv5byMjE/hi6yfCK+j9JoGTIZfwwYjYhPE4QsZOJTJvApjvp8jIsgxxe6BwYILMF8uL/fPt7v5zEtiJNkWKYPMOe65SMWFONmIlK2yoR0T7cijauuWZm9py8/5eP0BzMJARmELCJVxcxKKUn0bvcV+d82YSJl2QpHuFvO4c5rRK8SJ4WDJFAMmMMjPxL45XLdtWmAgefLtZbSwLckm/P17Y1Z9KJqEUakpfy3/+//ZGb/v//r/3K3CLt9nO+396CQ+gAIP/U8+cceSBdVFS4iSzGbTHXlZ7hnprBAaJqthNv77YOLblttpdVaRi02g7gsezsBQlRquTw9bSxP206cw0eorP7bVVtt+7b758G/XuSjojQXfrixlGhTLW2ziOl+niMTmxYlDhZWHW5BOdwBZiELx/KscN1K2fZW2qasbv7z7eP9fnSz7jYDAbhngILk4zjndJiPSRFlL6UArdbLtrmbm2kplWVZcuBYVvnpvkYwXTK1lvtxzrf3hWZ2H2NOgItW1bLWJK9fih4BnV87/+tC+Hoj9PmOCPz1WL4mk/5RR7l/nr60fsAqspbp7fGK8w/UG0A3o37exrj1M0hY66c4DExUSnH3OQazqAhFMNNWKyGdoCrC5X6cNnusxDimJF5wCDOESYgekTkZ7kEZHE6im5RJc0xzNtHChYvqGGvD01K4E8LNkOGZRuFJrOV0w/2DCTTDzWrR8X5TJiCplvs0H0cV1bSZmSp6uez/03/7r1rK77/9/X4cYJz9IEbdKiHdQcFIjDn9cxrritF9froW1aJqYzJxuFdVEskx3I2YwSwcHjHNCKS11qLCFGZrsFckma2eyIRx2bc/f/+GOWX5s3K22kqtlDAWZlnW7GUxiUw3y8VGquq6vDL2baul1m1fdYQ/5f3sfY55Dgimz2FjzCHQJpUA9xAhLdJaedr26/XJAr///vt5DIv8OE9jGotHYQ6kRaQwJab5PDtzZJbr9sufv/9SHzG+Zdqk0RlJSDdb4ihDxIpbxAykzDnmTKJMWDgxU3l0ZPFAQVc1t5xVoqrLgbmW9Rpu+VWa4rNm/jL143MEOi0oif+ooxIIys9vW40PmCHCbisQ9pPFJ5xznLP3PrtZUhauSLCsuS2PpMTMDDfLYICSfc41HpuJlCGUyhQitYADBqIAcRamUhbnxK0WJnKbnCmZSSKbUNLrx93OmZWalpXUJiKrOPJpmYDNTHeiFZKvKkx0uv08j/ToZ1+F2epFVAU5902+v/yiSkKAaGXQf/71r7VVLbphB/NLplTZ+3nvfZrbcCTYE1VXf19rFcpWmzAXEdIMcyES0LbVUuX9PSyi9+42hbll/un56S/ffwmKERYILcucjTEjOQgpIrVoEgXxfZz38xxuLNa2GeGjdwYurf368nLZNlK9D3s7e3gosbKKCigoA6xk5unTLDO1tLZVC+tzzG4WnoBFVIkBSyQlNi2VuZBULX2MH+8fx3kG0MMG/OjWbWZmEQWzR4CYRGbEzJTIc1gCz9++RT9jqWuJ0m0r/Jfvz6L8eh/v55iJIJ5JzjQyMWeu6s49PIqUNen2Eby/ikl+RPors5vNOdfBu+RxK50ul6+S19BVTspphkgRXrSoELNKJoJyDSaiz7TQNRMTCOZHp6dKZvNxM/BKWyZbwaesYKxhNs+t7kWGz7c+u1sGi0qtSo9hmEOYkQjvKCHAVpQ5SHhGxnSHM0FFtyK1qDC3qq2oGwtBQAE+hrFIgN7vJxO5x+1+MnMSB8wj3BdORpkcn2KiSJCQJY40FUnREUkRIlgi0Kp45lJJlKXo8jCD/uPf/+oZK/gggXDbS6miv+wXKXo/jvv9uN3wyy+/qtbX1zdm7eM8bjdh4X0XkNlkYkKqintY2Jjm5vB8vuwvl/37vl+2y+kzsgSjlXTziCDGCp8KUGa8328R+X7c+/BhETDpPcIovAon4dpPRaLmb2/v//d//r1q3UsVj6drq5u01rQu0iTAFO60hgjnytH2pXuloCRAsBC1TUsr5XLZA/Tj7e31foAZTMZwhqcDWZSbqrmHuygLc08DkZZaCp1n/8dvf7/UUssap8JmUxh//v787dvLb28f//733z/OcU4zYAW2LFQSCWXhhCZjzadMaOFSNDPmGEJctaTHGCMj1uzxujQDcDfLh85vzazftcrb/WOMsRR1jzrmMbLwUb7yY+FgAa3u8fmNWYqq8nmegQcGTyjubg5QqkgGFPhla8+bDpT5Oo9hzCuIiVTFkOEhWoTZzcyckSqcTOHpZiAHOyWtG7KqbFWVqQgsCeG0RGWCUuXl5cmB+9HPASBWRnRSeE4LW4irg8KD6NOkD1lT2wVCgjktP4d/BlFRdo95dnVmqJj7vPcV5997J6bj7Lf7zSP2y/7rr7++PF/5l19u9+Pt/f1yfS61IeN2v6suwJpbU6YFcqYWTspASi2VdWtciJ/39nLZW2mplVnS528/f9zPQ0WKFmTY7CtidpoTr1zB9Ijeu4VLIUI04UUBnucZbk3EIs7ewVxQhs1qQiOFpJTCTCqlsCaWUcg4TRBShEgCK9mPailFtZZy2Vopkkzvt9utD0/4NBJNYpCwVpVExkxfIURCUGaUWqU8LwuJzZ+//b7/61+YymHDPOGTEdvlSlr269NTN+e73c9pY9n2F7wWK4XhkcERQDJT5upKIxMsn32O+5o+teQkRdTNxhjgFQsU1kea77zjE/H8Qkj/GcBYwPH6+QuiYJaF1X2CIvSgfB7jMs09AKxwYco1750ysT9dnzPfzh9uGZFmCwVRphXNwNo2FXKfPi3M11TP531biqemdYWoMksiI8EifU54JMtyY0+zFXToM0Ap4gCt+c7rt1kRPiur9I9Jz5lLySsiKvLl9Ceibv77x8jp+vf3d9albLPFsTPh+fl5mBPzI4FfNczT7Xnfnva9m92Oj9vtZwLbpvvWailFyxzTnZIw5ri/jsN9TCNIYS6tAnCLKTiH3Ue/jfPHx72PXrUQZhEIJUDmMc1BoQkSYc5aG4WBXIi3VjeRIgIiKZpEHh7I2/2ekVXFkDUyPFLWRfj4hVPi6boVYY8g1qWtsFjRukuikrfjw+9GTO42IsYwD2hJy4xgrPmwlEtCuTjQOSYTF9FN61+eL0pJacf9+Ljdh8dwL0xKmCRB85h+9BFAadUINo6IIFER9kh35xXD774a1IiYc4rwvm+LXF/A5TKs6sovBjFLKSVpdbehzBl5HMcMw2cG6z8DOws8WMDRV9vwcPl9kgDua9ylZAQTT4+v3I0l/M8Mt7lyOO7nuJ/D3cNTlICcc9RaW6tALkI6gJm5IosLQMyl1JXlRsRFNbEy16DM64EAy2iZCZ5zjjEeGuQVAhIPmdmKwlgHP3+Zlz45q8x8DCtZIYG5bAnpHil8C+iP263bdDNlqap7rc9PT/vlyqqiJZlAmNMnwGGllMtlF7f7cRNGrXXbW6sFwJx9zOEezGLuPaPPOaYTJRU9+wikjyl9npHv93v36UjWCpH0iMyF0E17oMSexCxLObG4zKJy2baXbWsiKii1rNBaYb4dZxKkPttj5qMsbzNJujmDoEmC1uoqEHuf09wzpoUHRASEt4/XRGxbW7Gv4VlLDdAcw9acGSwFOxUtQpKBOSZAIdEP5KVdvz1VlbeP19e3t+FpxJfWWPg+434etz4+jnPG2tgLJE5ah94K4QGW4XCBuWvt1loyo48eGWvwspaS8YgYo09KOB60x2OGSGTQH4XPJ7DzyWAuEu1rS6gqPq1v7r5CddzTzYRIiZ0ywolZWDkjfbi5c7rZyXjt5733NdH+MRucICuNxyPCzc0zHcnMushbFmESVcty9rHmhpg9QCgVIQYTe/gaFv7IqXnolNnMAfuq7NY99gUQf8mqM9PCw+cw+4ruQgYTA5zMk0mP6bfzzMinvZij1O3b91/2y+Xy9HyZ48fPH7/9/mOM/u16+eXlSTzHxz0RzPzrL98BMCGX+R/ErBEjAdbakMc5ltPYI97PUzIKk7ZmkGN0pxRVAmwaRYLTbS7PR2S6Z599RUyBeAFuBDD4uu2NhSkcYb0XkkvdzCISRz9jjmiNS920hHm/dyG6bLuqGoaZMSuI3m+v59kD6GOqlkeuCYt7ujkzFeKn5+v16fm3nz8++liI4fLb5apIiKC8GM0Rfh/nvR9PeWVKS7zd7iOpXa6pNVWG2X36vc8RMW0lmObjh31SK0zM4JVVzUxrSg2QY4w5h/ljsCyIi5a1FAjwhAiT8HTLDH5EHAUpMfOytuL/7bfKz9nUX/CRiCws/4FsryDpCPcsyo/MU8DdFEIZCq5NmXiY3c/jffbBLKrIUKWklbD6aFeWjs3WEDVZZju57Ns61OzsHr5YUk8kyDMz4NOJnJmThEQq8SVpDluEfTySuR6RbwSKsK+L7ksDoqqqYpRmhs/r7mF5pRUkPTXB57Aium2XXUotW2tbqRVEltHHvN1ufY5pHizfWJEZYQgnCDJ5ZUeCtTThvN3mefZWW9taIbWYUtXMj96VcqsaYZ6WWJaaMLOcxqsdFVoDJMkjI6aNTJS6jqUIN2cgYqutJNw60iXpqW3j+mTmt3H2MYKJQdo7aUFEH+Oybdqapw0LQBx8nOft6AFoKRy5vCZppspVqptVlnbda2kivKvuRaZHMo85mUhEY3oSQQDmVHhmR7yPs9ze29Sf729v97u0Czveb8epYh7HmN18TLeIJXdRkUXW6sNgBSEKcBMtRZnJfI7R16ggFvEI8GOuqDLrmk00bYHxqyQQVWYhxCK56DPr86v4WV+v/mGdl+u/ZyRoja/P8MzPgdJrrvUKDPZMchfKrdb9uouqOvoY09MQK2KkFA2KOadZqoiyMJFbcpKwFl6J37ySmc7Tp81wJ3AgzdwiFnS2PqrIipxYND0vM3I+7L6L8V90NSEfio8/MN/P/P38jIV67I5FmGRmRpDpGGNOWwlZxziF8vefP/iNwbSCJbbLfr6Ot+M+iQZQVcijCcu6ywBfg5a5SIJJ3eagLCWblt6nmw/3GQ5lY8iq1SJtRSGOWVe82aPGoD+qOmYhWVXpo1pNzDFW2Z2RQnyp1SFHt60e0805Rdgpb/2wcPL0OSOTRQJxnwexuOfr+9t59m2/iNZNNMIoSUQL02XbOLMVrbV9fNzP83jaml8vH8fBopLRWq21vn18zCXBZSJmNx8Zr+fNfvr3b8+hom0b5tE7Eu6WiSSyCItc/A0Trcg6AoQYxMIsoisMxmyaT3cDstRCwDJIr62yAmvX22RmgMzX7I8H6F5bs/AM/yR313ykjAgVIeaVRbAoMwBzTrBk+mqX1wnKzCqqzEWk28CqTCL2bbtuGyhXmJwDSYt24yqsKpZZijLoMaJLJFXCQriwrIrPz36IkC0lfmaEL6/zNE+QRaxABhuTyFYE28IAmEnACxhYv5q7l1JYOD5Tx7/oi6XKNp/0UIVjBUBZeAMJBVdWDwfjGOd//P1vjYXk+8+//nsfvdSiIkX1srWY+8+32+x2/zhOgc/xcrm8XC++JosjIzDGXUsl5uk+ovcYgA8KIifO1oowImL0wSwWPt0yU4mfL0/X2obN9/PORPzwmA5Z82MycjEyrEn8dvb/8dtv123/tm2NJQwzbMyZoFIrpT/w5THGNGRS4nS7za5FLawPm7aQA+nTPG+XVqtQYakinPlUa2GOaXAvKq21NXQIZm3brBbdmjGOefqYsaYpRCI9wo+RHp20urklW3o/TyZCxkOdz1KE1mx2BUlOyVAtqhKR7tHnmI5hi1JdYh5epuhlPCciYloDpxIBxgLaKbIIkzABRKGFY3rOICJamX8sAJLWJAEQcZESwL2fyUQiAKYNUa61RPiq0ICFElNhUqwBavSyteetDevCFKBkJpamqkIFQLgy120DVhgbhJlFoYlIYppmoESmW4R5Zcli4b66YRUZ08OSJYlyzunLr7mGNYAiI5EspFrCY8zJj2Lw0eTg/yWNWWrlpVhOIuLP+LqgYEJh1f3a7n6eRzfiTcpAfox+9gP9TkAT/fX5uWq51DYdPufH7ZizzzlWPvHKf+1j2DxLnb4Qd+TpHuTJsbCyQpwrqT1phrMKs5qZfHaTj8LUvbXGl8voYw14BFJVlo/RkiLwj4/7z3PYU/7S9iA/bX4ctz7PIIiIkCzkyj/ld+F22CxDmHlaOATCa1GaTRR6erp+e34WcL/dhbDVyqUYkW5bmKf7JsKt1lK41Wjlt+MjKYgTkRREEZKRgWSZjp/vxyqxiVkfDzvX9LxlnAwVApQScEIg3QxjmkV4wIM9AJY1GE4K+ydeufzBESuBByuGnojC8zHgLJecJkCxdMhEFO7y6ahfqUPr4rjWprWFx0fveFxAvO4cYiARGSAmpsxoRSNLhO+tXJpWIYYGqM8RhFqrqDBCKAhgKeuDrXDlotXMKFM4tSo4PEKY052Sy96qax/WZ8CpioYjmeBBnMj0iGQmkLLUIu4+fSzanpkTGvxY+v9/xd5X1cCrQsLiW1bSIwzhwhnQytSEQ7kwahUmomSCejoRZuTbcT7vl3rZaLjT+kB0zvl+vxdmVdnatgzvy3Raa+02BRDmDKoiGTH7rKr70zUT59ktg5m4MKuOZT+0OeeMhJoRyxryBIBZIlfyMz92doT3fpfbE695LQNhnAFC0aK1AnSe5xIJL/DvS4onqhnkD2lBECcTb6X9t//6395eX21OAhshMj/e34dNG7OoXi/XX7+/LIy5E/DuOX2v7SLSp9MYzEiCskTk7INWpOQjPdLpUzm7BiSvqxwIJC0mE5yRZEGJZOEVqJCPaj+Xcw2Za25buFk4MyhTHoHeEGZ3X1gKiCIxIxxZRB/bABmZTOQIIJ1pZmytXJ+u3W3Genp/TEBa66nWwknuISpba2N0ZBIClCw83G/nGeGs6jZoxSgtrPGBYuZawojMcAirygo2pQfSytvWdsb9GHJOS56OFavobiq1lPIwFoYjIcTEVLhkTjNjZmFZMT70x+OSL67jnyDRzyvi89sgAFMS6bVV970KC0lTWaBGOoHYIriqgd/7uWktVc7jHpQgccKtnz6nEv/6/ZfCWuvKrEEVPodlRiElZiW2CCG67Pu3l28ZGNu49/MY3eectmaHPQJiwubH7UbEY86HWosew4u/5imtN5QZLGBBCdpaIYFnLOtafDI+q9VbaUVY7mQCkcbK+aHUUlttL8/f/su//dcx/fjPv4Ng5xER47grwcPIc9vr9Xq5fdyI6P12o8i91LZdSmtHH0J0jhGLdaRE8srkwIN4fQSJLYRxcTFLyeWRvohZhoiCyMxFQpUX1KGyzmVd82qXDZ0WiC5cVBDpaYvZfSjOmZdsOJmSyRBA8iPflTwzkEFJgtN6vL1OcwIeErFMYeZSFiv3GMg5jeUzW5oqZXi4+ZyO+7DjPCOhRAjX0kTYpsFnsq/+eqmDlvSUCEvxFY/MNbCwEKsyNiBhQTRsMKoiFpUJzPjMuAKtKQilllKKmX/q4XLRc/hKvvjEfP9ASIGVhsGPWScPdghCKoTrti3LzGXf56TjNM9YQRki6pFzTG1Ulc1nZFiGitqauxT2cb+/XJ+VeK6OkwkrIrN8jg8BmHmucVelJdBas/CP2w20Bu5QK8oqc9o0DyynseSKuvu83VbHY2bLYBVIYUiRJ7lsEdNtTDttdv8nqfbnv6qqLDIsHmRqhBTdWiulvX/c/4//4/98fX//8faahLliIcP+9Py8tybMEL73s88JpJs3LcubdxvD1zhh5kcPj6xFa61rrTOR1jLGYObW2hqJ8Ji0RzwjH0ltHvxp2F8AvwoNj5VZTA/kAstqs6BnXgK0DHpYDLOUuiAUYknwGvmwIi2SSL+QUMpAMBCZZz8yocJJlMhMT8993xNljsFMgiRlpSVqXrYkZSILP2YcC5tlCNF+2WopkUFM6WtMKhWVzFyjpb6mbCym78EsqjCSM5owWjnHPOYpsEuTpJJQn5MeTgYQaD2vRdUtlndl3mKZex6QwB9Ud2biAVnTkqACyAghYZak5QBhgXn4CkqJSCqqELJ0YnKb4zwvW21FfYymxUb4tAUCiRaf03y16WBmYUrG3uqYcwlsFgjjyPs4R1gpbc6pIsuMsab3rGQ4YSbhzEfk6tK3KJEwL070a08ncM55zFH2TSAZQZk5x/RFR9AXxreADnd3Iq2VHh61IFAizf2cw2wef//HObojp9s6JjW86vmnX/9Uan0/ej9PmxMJT/Tezz7avjNxn3Ou6FICMxPz0qNOt/U+VgXy5dicc2YmiMx9ejAtnQJaEVXJIA8H1lp3gmT4CnZeb249pU/V8EIqASSLalWYe8AjP1X+WGIGXrMW10WEoDAhVlYiCuDzp0QmfTYYa5wm3E2ISBgJfoxjB4S0Fngcs0/3a22tyGVrSRjTVcQjWquttYc2ARBZHJ9bBPEjUmQpW4UhmbXUIhpuW2Vh6TODxKHnnAk82uCHhYYjfImXHlb4wKfK46EC+kKB1g54EGSEZajlz/xCAhhYkxxiWr/3/uP9vtdtuaaqMjMCUqp+2/YmMtwvtZp7qCNA4KKNkof52cfzvqswEUV6LeruKzsyCZFw5Ewf02HTPCQhIHk4hlf8UJJoU43I+H+4+rceOY5sWxecNzNzj8gkKalq7X0aOP3/f1YDDezGWlUlMS8R7mbz1g/Tk1U4gsAHiaLICDe3eRnjGznV3TMJ+ZpefXU2144DYCp8zsVLi86HiOea5pZIlaz5i9OYXyjfskAhVtitGbKZTTMlepieqoDoGQkgIpn4MTXfPlprEGmqjLSNARAB6Rnq3sYQgHlYEhJhYX1LHlMvHVU917qqVebee3wRxNQmZPbOt20jqnAd9zBGQOIJwQxNqnKLjPwKsEghbq3odpwRiJVo1Kw+HECPjMxwj+vhYwLIuqEi+mABvPXt++v3tfTj+dSMIMwomxAz1VrAI6IKttzG3nvfttBlriSIzMv1nEbEzLRvfYxWO3tCxG0wETNnkhSyPEu8EGVJExGutwUSpBPCYF5gexP5/uKRx5xvnz7X9Z9EBABBfsXu4a9yjyChHOeA/zHr/1KAf03+67YASGC8rFqcKESUKCy9BT7Pvx7nQsLWQhAjbBtDmMY2GtxvrQsTvL4810qEZm2ZY5b+Suaa7x+fXfjb/YYAS20bQz2mOWQkgrott0BIAHWrM01UKUkJEVXiJn9xvBGqYS2MIfyH++wafwNYwtvjOM3rn5UhAwCo1WT9eu7hl937EoRQlGYg09TmnJGJIha5zCNj2/aa1AfAqa6fj9u+M/F5TkxwpN6FWmsJ6uaKFoFMRSntIix0bVrdAWDNuZa6e+UhVBVUPkbIEITRuDfG8EwHCGmUACucCbm33iri08vGSgh0kewJMptI2xthEiQQ6zHDQz0twBMwQr70oZjAxI0lzH68vAwhVcWIMCUoUK5HWF6gfKo6HxFHb5GZF/k5I7NVGILqUoMKvs9sTSAcACp5BMK/3HmXv6xKkarAf62i3Y0AIF2YTBdAbr1RmEUg9p8fH8ehc2nFn11P+GUehl9fbhVgF+DrPxxC/94GQNL1VOVX9QCX74o4AaQTj1v/frsz8cfxOOfZmxCEzUN627Z+33dMEOLeGzBKk1P143kcczmmZQTk6evteFDjRpSRvfXR47k+XS0hp6q6/zqhiBiYlokEwFhfKwCYO9RP+zX6wJpfkc71H25AjMzTPE1P1b230WUIgXBEUhfP2u5pbbwbkZmZGjITQbplcd4RI4tIniLSR3e1+76Hx3keeu1ayDIywDMy0jLIHICBs17tZeBmpLA64TnNzPM4zmufmsmIXUS4WIvxpf5mRujcEAAg5RcmnMgiCDGS1CIDyhbjYcnISBGZkQTQuf3+7XuGz3WoR4XwpJt7IDFl1JqSkVpvTCQszjTatm/9cf7r/e1NzYC4AuADeEVSAAswdWGMtATANIpoAA0QkGRsyfLz8TjVWIgxE/NcZ2MqugYQWthVkyQQ0LlWIhBUejaYWnVx5WghhBUeZrWYY24JBkJtjCAHJszELBAGllWeEAF+2fYLOHIRTTIhEeI/rgIiauU0K1QCE1elXkQQADken4T8++vr6+sr/QnPeUa6EELYkL4PkcZrmer0NFfDyJ3ZW/NwyzQKEoqAj/PUjN9eXm+tRyQieaSueak1kOouq5UkESGz1Ugns39VHb+mV9fKOyGSElDdAWC0lgAeNVhBal0EW5O9SS/rEVMiWVhEQKUdIjEyYJ65dK56G5V/maVJH1WeEsIQcQBfi4k4wRFRCBBVFYr8LYQAcy5mAWIDeOpqrRGgEAoyAnmCBUzzs8K6i18t2RszodtSj6XmBoIijOGRTCJtCFEEZ2Ijz1iLpkakhhfYhb6QdeAR6ikAqmudM8ISISMQcrRGLKyVigQIyUS3214msmUrIj7PQ8M/p85wIGImSkDABLTMNAU/99F6awCirpnREAbL3seQbih/HfPnh07zTEcGlI5CRIyBGBnuasrEBMj1mXgAi2cyUu8buzNZGZRVzdJNUDDsXAB42/cInEsDKBjDEBGJuOq7IrBl+emutyEAwFoKF+8xiAseDtWRt8Zb4wIzV0tW08VKxCIikSYZAETzPBBRmBhz7+3b/fVl2zj5/Dg9YNmclI2ksmS+7XdC/uv9LZYlMgCa++NxNGK5Y0P2TBFRs5rZMVxIePgS6FZ7mgWHZ5brDKR7hZdUBgynp6phRfcxmZm7ISIxb71vjbbG99tOgGrhkSXPqpCfarKvIjJhzlnxnaWFHGNUfFidt4hALHYIAkzCKqbNkCCSKjBUBKoFKSGKe4qIyOg9PD6Oc5oW86Mh3u57I3bXsq1mZlEKM9I9gAGATFdgMA8EvI2tIUb6iZMTMCqypKZgKCTC5QO0dAORGf7PzzeI6K0Rs7SeQOBuajXErDqhsk4uCzXAqevQucKIOQkjwpYVV1QwLCzMgOC2bcT48ZiaSX1gE2icDh+fz3/9/Di07BAp1ccisTRBhkBNo0oO8siS00cmeG3CNTwyAlHdjzmXrgJ/INhcKzOfU8NjrnUmE0KljSJ8bXoza470a8pZYbvuTiyR8XV5Qs0SfiGQEJG/QA1VgyFTBcNI37YESCT9eHczgvx23//rj99exjg/n7Z0HXZ7+QYAx/xoQyihWtiXNvj1u5zz7ZgaBoAJ8Pl4UsK3+z0ienXMRbb4pToEIPxaUmYKMxO1qh0Bfk084WtsdwU7CzMTRDBW0hmTSGFXACUA3WOpWeRpS1UJKyEw5PK5UmsNjkO+ElprLpmZay0iJMRwH73/8ccfx/OY52nqVX71JhWGVdV3giw1Uw8PAkTP5XOdUx3U010JYe/tdd/uY2tMjwOXe2JkkQmZpaW7JYBjijAwRQRE3Pr4cX+Z61Q1HwlomjjVErJ2TITYmDtzhPTRLGy6pcdzrt5qxaZrLls6Wu/bqPlvRWlUQYxEAVlYUM9IA4hYunhsjBlpED6Iv+/7by93d0sdSlt2OSIe7+/mcSyvVCUEaMLb6Exo7oyeiGuphRJlG+xm5zqldSYOBJRmEfM8y2lQr+3MYGJbBlAeBz41ElITAalLO+H0DAjsIoRcqjD8UvjlV5hf8WDMIWr5AFF680sBceEMS0kYxeUlIiAgRNHwAFg6LXzbNmbYN2EAQXq93U2TczGwkIzea6PepdXKcvTO2/30P/W41jEQudwtc6lpeGbWqisRy0BdLK/aCuUX0/jSYH1xDWoF4xdUgrLSZ6qDISxFbSKEF1+Jzjl12VIP4PK8FR275hjCXGbZbdsqk09KJstc7WmpiOtj+vz8PI/DzKC2QojC0nsnIjNTs0Q8dalqRoBHln7eXYEDGYFG42/3+723hsnozMjIgFyDe89ifHPklWgSkY6+Vnx8fOwst3389u0VkOGcH8dakHU+r9mRZ/EEGNERLbyYOubJHhCgagi4b9t229X9OJ5lr6jbvxZpV36oe3pKJUIXkYGxv9zuY/vx8irMx3FEwna7P8Pf3n7O44mIbezFz2XCvcm+daIMt+M8mwxVXzoJ/da30QdE/U7o7eOz0oyvuKLqrpgS6EvqyrXlrGuKBTNJCBpRZa9u2ybcjuNcpjVCzS9KEgC01iIjzREKUARVZGQkhIYnAktr9It1DhX6CoQkPz/ejzmpLIju6zxjnR2xI/14/Q4dM+jj83Dyl/u9cAiQULq7gih9UU0zETzyeZ66NMIBkUWIyIs7gEhE1ThVTSJ8oV4J6VcXf7kWvux88GV4Q8ja+QBiZhTwMdLnXBAwl57TkoQYiOrdzwmgqmuufdsAsff+ay4EXwuyXwO1JlI6hUrA7q1SPUFqrplZGG3NeM5ZR3e0zsynOVxfJwrxy+12650gWmOEAEgmRsZIN3c3V4sMzMz0SEKLAE0SdpFlOkKEaXTZA46pQ5iZK+iSWDiAPAVISlLtmYkMQkBhGRHEDJCe7uFL11IFBJbr8VKzhKjpckMq/woWTCpRCP/47beX/QUS/np//9fPn5YBy566zvNZtIg0I+aNG6QxQbgRkbQGiWb58XhC6t5ptL73LdRvt9u3H78d5/9nRRQ5vQzQkYHECJBfvNlfM+6rDwQAd0oYwvRlWcRwIYovXTd9gTBqrJ1xTdQRMdwIpbWGnl1w9C6tmaq5N6HIhDBKZERJws/jaeoX2NCdhgSwBwJiUloaSm69EaIIJ+Y85/vjqZlt3wyFWX5tXdw93A8/9210EaJLpJpfJgwkCnMzY2Ehjoz0uFaYNaBlrvuBfvHWq7/FLyFkZh0IyIgMR7DK8QU0C3RvLUsb4+amCplrUbvyCi7VXeHav/ZlKMyZuZbWedu27TY2RphrMQs3jmvvEsc6p2p6IMvLfq++hcMNcVowQCvEDZK0Psv+Tl+snv8YxzFiegAhMyVYZHLvIHSsWWssIuwiTAyQz8dM4UDiQEbckBswQd6oATZ3qNsJMFkEMJerHflv4iwkZDBxIhzHAUQbt5b4+/dv315ePx+Pt/e3SMsAt1zu7x+ff75/PFQNIT6fZkZMUvHixERi6q6WSIFUUqcIUktAbNy2IYjwfDxMVef6/Pi0pQ7pEQSlcEvBLzJXgpr9uuLrN3lFVgJsvQHgWrrmKdy4KlvI+HIRwRcIzM0Kvlplc4mmgrARCvO2jd774ksHjojzeBDALl2+SkNDoq0PSBDhtfyBZ/yp99uNJH1aqmUQt4FIDrnCH2tRGvdbGfmAML5KndZ7vd3/XX0C1jF1JAJoIlX2UGJAqKpDUl4XAnw53K6GAcvgVyrarOVOVThY21aWgCCvmu86bPh1ftqXRbr2bu5uesH0CHGMUd/qPM/zPDKiXXHfisRVBZmauv37nmO+dhWZXRrscOpyXZRfOHWEJkLMFgnENXRjYhZBEcKY0yhBWFiYBDPQbH0ez96klcvFLSK7CCBBBDQ1TE9gor331z5YmBSCBaivzIAAgqT6dDAyPYxJSOBavUVUvjysBZngQUj3vt3a4Dva0s/nZ0Z8Po/T/M/3j8+1ZsbMJMtRVuy9A4Sru2ladGHI0uaAaTXedfBjjK1MyUwCCT//+gsRGbCC66hmfQmISYTShBDM7BJgZ8WxXQrm0TsR10ddRX0CWtivfhIuaEBWic9MFza0t6qmmhBfsxOvhHas97hba/ztvgkjNpE1bVmonQAoTY5UxH0ft8iwMIBY5gTN0DMcALdtnxGfx5nLNdDTIBAhK3Ppvt9cl66VZpHALBBhbl7K9sjWWm8dICHBw91M1TyuYL1SEIuwsEAAEAVAQFFvQQiJgSMx4eV2//5yv+372+fjf/58MwCLKtz55fYiwh8fn0TUWzMPRCkbGmZABGbZWTLcwa/AY2aSzglwLlW3bWwoss7nUguEGWEBwg1RGhGzjN5uPI7zYMKDsBFH5DmXK5lFOHRmTQ8PYmaS0Tuk6VrpUStdRHAAJDmez2eT131Lq5xFJEozJcTbbSBiRgzkXRozImNaXj4tAu6UEBYRHpcsjDi+JiZV9VVt10fHTE4QZCL02hi7OUAineauz4/jWBFW5PpGnbg1KS09C5UEY7/fI22dp3mUiZuRRpd9660PC1gBlGHH8/3jk5oUyFXNLLx2WZAZHh5Wbi9CzPSMqOcYEBfGMnVuRITEEd57QwAzrOGe+ZdZALCRNAJmYiYAYCaRjohuRsQsYlE4P4AMSgpEZPJMibWGNG0+NWq8kUd0sPS5j9b7ACQSachErGrVtYi02/2ukJ9raQAyIJayiNz9eR4Q1+wNAOhaXzIxZVxw40rgwsu546qelNyYfqlYCRNLfQuRGACZWbrF2zZex47qv73cf9xvwnxjRNcz81Q758LE8zhut1sTKfVoRDAGIXciEKFqiTKTwMPDnRBqlDbXCcKe/pxrum1jiwQUWarPpeYlG/M++KoKIBvkvTVCXEuXaWdOS7Oof3+c51IlFmldek9IpAzMuRYR7NvY+sYEtk7MFGASofQZoWEWE4Fu+7axtEwhCosVmuCn2yxyLNTiK4mQgK/GBq/0zij12Jd5nBBZGNU945izfjx0AjMST7OpS91L1Lg12UbHhIR/E3YRybOAh4Msdanbuu/3275XAXmeZmZJkoTvn4/l1phSLdynqUPlrZTcGzwCgZo0YQrPgBCR3gWAtPNaa5kDdSQyV09KrHdpZF0piTU+IsBxSb+BmJpIVvBHVbwelh4YmNmFRxcAD6TnOSU9GlFjDkBAvML+IJ/T/uev96U5endPcGchLzoCizMGgmacSz3zP7U3NXu5qI2VnSryq/7ODG5SITz1lbi7hgX+27hNVErEDA8EvFLaExGAE1ri69j/+PGbHkdv7ZpgjnG/3/X53LfNPd19zlkggILIEnNiMgMB7L01pt5aFwGm0io0Fnc/dZ2mp64sNkmmFYFZxMzMDZEjooJJ3E3XJJGt911aV/tr/RVq2FopuiuQZ1pYABNCBbMtXZ4RCea0sDHfX+6dKWphQkzIFhi+qj0Pi7VUJHtvHqGmJC0yl9lyy2RprbgB10Chgm7NAxKJrIg6Ir88IpgtzM+5Mi5YSABwa8v9eZ5qamZAJCy99daa1VodoMbHVWE+Pj97a7qUEO8vL/sYqjbPEwF6b8QMX56sq6kL9y+FQt0hTNiIhgxIqoeUIJnovu/7vi2z5Xmo66nqFnnNtVGkHLPE3EooUFo4rGEJZgYCtSZzlc6rmOLFrB6uSoCjd2Fyd8yU29iOpYwAbhlOhGUW0IR/vT0+H/N22xvLLtKlSR+Z8HEe75/Pw+2MACZKqLblanMLSI81Z6V6+mtkG+7IiKMHpKn+akkdkoQBKQEYi7uTbpaQRBIlAgQSwAbw0seP/YUBD7WVaXx5nwHy+Xxw2/CLFf6fswVkzATzvPXx+7ff0B3c99G5dY1wtZfbPcINUjP+evv518f7XCpMRKSmWdeIJ6Q3YhEGiDWnEjZMAmjYN5KXsVuGiACRMJr7Mee0MvuJBepa6lFhfgGuHsc5v93u2zZ6H2uetpw6e6J7uichJUOGq4ExC3Pfd2njWKuipC/KjanqQiQRvqZpCJhAiE3E3a9Z+FfGoUgLi+nGSW10yFxmx1pTVwIgU2u9j54Z5/OI8F/S2quUiljn1LlE5P7y0ls/zvPj/T0zb9vGzPu+L9VznvVSzMsWmkTk4baUqYLkKjIMet9UlxAgwj62xvI4TjWT1lriOhWJGnWEXKpAKCKZcEVVIjJxZ+pSL18DyIQhQoiNSjwC4Z6I2Ztwwuht63dC9AgZvc+5XrfdTM+1hAWJIXOaQim9LNSUEB/n7K211o81f35+zgzsHZkaScn0a7B4vewxAank9Vn8fo/0KLFxjTJr33XhsSvtA7LUizWwdQ9zDaBMYMbObWfet5ERP//8MyIGb5kgwtha7z0iXRWQ4gscXWMlIkqMwhqM3u63Hd0/f/6cT9vvZZN2cmfE0VowYobqTFdhJCZdtCIQ0bxU7K2LQEaUOcQQCMKMgF9utyQ81jzm5NEQGZSY2QPUAqkiHzABAxKIyil/zPm679vtBh6Pc7qGQVxL5Qwh7K01JGAOwPBsg4G4IICRGVY1DyWAR9aavPr4SwAjLTLCPSOZWYgBAITUA4gbc5g9zmOZORRNpLXemNnMIpzp35uZX+unisrdtm3b98+Pz8fjc5oCQHdz98fjEZlmXh43gEJ2cwDYOgFAiAkQInXNzoM7JmIT7qN5xOfbz+UuTTqJIR8aSBwBYabu3BoyuWqJZRi5CzUmgCTC+qjcTcqOVeSIC7cQjZkB5nGg2W3bOFNG7505mV5f7st1BVCkefXVBERj3NzWsZa5NmsvRI6IxBAYCY25qH2/JrLVBrgHMUQAAaS7iIzWHPG0VejFUoNWii18iQXwEvpRhhMgIh5LgxgrzA/dGeda75+x5rnvOzO3q3WV2nM954qsIXLlkXwh3WuBUN7zpUPYE5YuwCciCnFcFXM4Jnh0ph+vL0wCyOGp56Rrk0f71kcTcOOkfRujAjEBUZoAzEqrNwUmC8+I6vs9SyFFhJRXch0HomUca32ch5mG6nEuSzSMJACq1V+lDNFSMzUEApLnWlO1OHN4fXTIzB7pbrfbbRvtPMIv7xvWnxEZRRoRn2st82XG4cmMAMusilICrMjy6+aEK3mk9n1f2gJHwJf7y75tn4/Hx+PTzJKwSWNpmWlmpdRJyN46EK65air7tc+WhjCkEVM6rHN6eoBrmJpaWMnWwryc5OGx5gSIrGE3Bl264WTMztgam6qZVhBRppftjACFyNIBsfXRmcmDMkc5oN1ka9337bT1sg2HV/U4pz1PRQAzDy+3KB9rHcvhPE93Im6tu7sDVMxZfpHp8UKLeX7t2zwyPBrLt9dXBHx7fDzXUaAizCyRVwIlgLl/2WIZE27bhgCRjxUASB5x6tI1V8PThDK33Mzs8XyatvYFQornqR6/dgj0JZjyjPBcYZ/Pc/QtxnCWBNDMBiDCY7R6TBMRCZhwax2Ql3pr0tynGhLVLlWYAaIhjd623oRQDdS9dr0JkBHrPJdZRcz3xkW8g69UNSf0hEiIzMea8JGNuTMlUCRaXi5GqgaKMBMcQD0I4ZjzWHOZJ36tXyKJML2CYdjczzNMrdwtRDxGZxZ3h0SPWGrTri1gnXvPyKugKKH+taojIf5KJChHWxncbrd937Y5p7lLbw4J7nVoK0M6v8Qs5sYogFiZ1VTI0czRt2+3G5H8+efbckXELk3dli3pgsRVdKrVBVebn8yL6JqjSRMRxHRPVxACKBImFUUBCa4DwIIOy7RGq5Axer9J40hFlIzYxwAEZRipLVKuYAUvRc08nhB6ps0M8Fzme9+IeO9NI851evq/XTaXgKdA1QC1rXKfc2bk/X7zdBYqBkLtqy3Tr/ziq0NSj9sYv/34MVrjt/avtw+NrIgNIAwhIxCHCD/P0870bRuET1WARKJQq0VJ6d6wjN4GuqappoPZv1oTIdq2IfSFHkdQt8d5JGMgFLzJvdI9r8YGicC9IgDRIxndLBi5bUu1YFutNxFhN0AcDZNp30fftuM4n+dpHplGAAGUcbFHHNEqhxYCIykxACGToCJPGSraFZhby8jHcZyqHkEskenmSFiVRkSEe2Q6JEZs21avgCaNiML9PE+LNFNPTyLuTcNtLotIAmT6MlslXGu0f3usqsrtvd9uNwI8z7Ni9q4VPlz+RGbK5F/1kuuFPCy4okgjRMpCTIenoxCjWPp0rRDdREwEj7Ca+ETktUAr5DZleDki9t5srXQLN8CawksV1K1JZMQyTyBCZnZTRNxEmCkjGgtAytPmrY9GABkYKcity4kzhByDBdyXzhmMdHXZea7Z+xARQuqtu2t5oACw8SUdqACijEgEFLbMn4+Ple7hnomEUBKfqBgsuj49gnBHiCbtdZNv+9bk98Ps4/FoDFRAkwz3FMBwQx4iHds4lv/r58fb5xGI1MTdgan+rqchEB1xRaQp8uVfjwhoDMRBOMMPXY/jlNa2fd/G3SBOXcvBHTKSE/aSUAWf0zIsGuNc6mYebr53oVJPbG1vJQPhCANMIKZtWM2FSiKCmOHFBQXEaaFlC07fiAdzF9pHB/DibWAmUXKXZXE8Pk/zIEZgguAyEkGhAoUIRSTCzax0J+aREMy8dJ1rAkoC/rJvrjXNlQn7V6xVXT7SBBErnr5SOG0pE21jY6KKbmdmZIrprnMQ/7i/3FkkUtU0otAXmRGFBkvotdjKnMf5HseTzhrLkvA6dS0lpj5aFCLcwDVcHS8RKCALVDQwQQSGp2uAA0KJ1CoMLyhpiDSRuaZDJKIQM6Ag3bcNM3NZoqA0C5fneZZJID0aNmKBhL31LrJ0EXMi9F6pigQAx1znWseaDaBCNukKCsZrw58AmViVeI2fEQDxcLXzWW5WIgLCzLSveB+sLzMcMZhyNLwJjvR7k2+3mx1HNti3MXqro8IAvbe2bR5gwMfSj3NOi+IloHBmHmsutyqHgiAYZGuNuVTDnFzgGodQCAo/C+xNspZ/rjXDzfw4Z+HaOwv4IhKmZuEWdiyLDMjWuTWi0QjqMwEygwSQRgFNdS1TiKLvcwISiwhBxJyWkO5YfsIO1DC5w330e+ubyDyPYy1s9LJvjUU9I3TfNrQ4lrmFCEmZ3QGKO4SYTdrnecw1n8eRmVUCFbqeWgNssIKQGDDdzdUzBsvrtkU1TvUdIdezi4gMcN822e/hrmvZnLXeKdAahrPHb/eX37ftLp2RIvE8Tie0gi6W/idAzSPmmstVfSATYfoNRxJogCVjAGggRBiYwzInIKHUSGaOerIiKMEjjNIRyhEpFcQXCWZMOEo2i4iNWHhjGcCDeBubqq5YmfQ49VCTjrye5/3lvvXusT/P6R77/cbMz/OoRCBEFObRN3PTv37CXEuXR3JrkClfdXbZXKoHKNxB6TR+qbfdS2N8TeryK8AQaiecF+q5M3fuiOQBnPDHduPbGRF/+/23274hgptP08/jeHs8APBO/KxnvTFJJbHlr/0XXgaIDI9eCxdTzfBUJBitxmdp7seaS/1hdqVoZC7V45ieKa1l5XQRogAHFLln7/113163XYQvgwbC8zwdkJg0wswSQM2PqWpGzI0EiBgpviSNUX7dzMyU0dXsxMWAZlYqmoa0tdFZTA8w36UzhZB4pto6bL68vAgxIHJvXPwVLbdosX4DiSxCzQDEw/UrhpGJMIEAeu/77WXNpfasr8v/zdjE0TsCrrUubX1rBVYq8ycBfr+/fNtuOXXfX1gafj6XLiUqZCKheAYQBEIFgCVTEiYRAlR9uyITydQ+n0+CaK0ncoUrUYBEYKR7hnl6lrSmCe37Fm66pq81uA2RCNhbf+1bZEgkAjagjStOI87zDMjlFqbh9U5EeZ5PvN1bbz7y83mYGzNHBglDIAComZlCFSuXz/KyZkZERCUwIyMQUtRG+8KaX/qvcnbUnu6qMCPqbLQmtbJGSCYZIrfem4y5HBhY+iayibjprSDOGaMJCv88zo/zRCQlmqor3CExA4nr4P06e5kZkUxERJdAICLdceE+mbJFgnpowhk+1dQNIhnJPICQEsxdWmOSpcvUmLH3Nhr//v37ax+jdJW9J8BSDVxATNKWrmMps3igJ3gkMjBTSceFubVWyKoaj7i7uR9uoUZIe+/JhCnm/tfbG1fnkMDCLVB698g/P87pyjobcUWIV5r8XKvWAQmOzJ5paqbuGeq5zIrCSkhNBBAz8ePjGREe1ybeK+QJcEgbfaw5dSkT3W631tq5lp5HRJgaJbxs+8aNzCmvLOviHV2AukgPDMiLASVMiFEXF/FMWJHT08LdND26kAEg16Qf0KBAO5Q5sEzQtZzWZSchIoEgDMQNmRt+u9+3Pj4+33Hpvo0hvQHVKjUhgcgyPEyoEaNQZmEhXIgAEEDNPKOYyVr1rXmEQ8C23/oYbc4Ay681E5XzH/Gyg1+NyiX0/7URBICMxEtcnL9WVBHJJYAAaMxC3GUg9Z8fz4zY9t0z3s+n6pLHEEIEeHl5+Vz2XLoAMvx4PgARhdIsI6i1Uj7XPfD1f3EpQnwhpmqwQJhICTTnes5lCUEYCIGEFNIaeBTVAjyAyM3cnQQjKSMQYqrd2nBAnapzRcRSNXcSXqpzrmWRupAIkAGwgIwBNSBGZsbM8CvkDwDmnJoRvY9whjDT+ljUVW3t+y2APH2F6XI1W37uWxdGVcWi5F7r80RCc/eITdpXV+BrFW4z+QuhU66uDFznzEuCfr01AKAJvb68MPH0qIXm5+OTueII4srxZh6tb61HzM/3D943r6DiK7orwyMgzd3dCbGx1NMSJSOCjGSNONciyH1so5GlR3pCElJn7sTOgQCNJNSnqbp6mNnaWhfGvfeNZGfZt/bbyzcmiLPRtvd9A0BXYyIzX24pTMIibWv9qVMYaRubm8FE2frL/b7Cp2p9Ckt1rolMW+tIVBiFbWyJy6IwMfmlR1XEaynLzOheZGBC8q/3MVaA4/X5QvXAqlaSpor8PlUFVwQcx3GcR/ltTZWJ8Hj21pjQdJ3LzEEdPENdmWj0jhFqV35olWT0xcsuenhgtCYI5G6X1xpRWrdIsygpKxN5aCYUUIBFbK1pCm5mnumCfBlZwv7n59vbzw9OSABqzCye4e6B4OFrFddJLkkVi8U1HguPSHB3LGFjQAIwc1hYArj/+fH+9qA0E4DbtkkT6A16M7PncXjE1JWZnakzM9G2tUhY6gtMPcxdkBMRWSpdHgDyAgHlr3mdmbUmkOlrgQcTUUbpF1pr276/3vZ9G8dx0Nd1rhrTViZgZRWrtjGImXtLMzcN1XK51rwsICAqIBYIsUsjpHWeFpkFfBdGAjM1XVvvpclnTIiADCYBJGFJBlNjAGLkNqbTnAek740H9SG89/6y77u0wcSEtzHClIHMI82lC7Ig0wpH5tu+d5H1aaLhCGiqCcBNRh9j39VdzQCRhBhaVRPqSy8BHl1b1muKnx4eWeSMICRpAsyUV6Q94PXpXVXJF8aodl7xhQe8eBbmbgH4tIxlmpbE1IQ7y0N9eiKCIWOyB3iARgAyizRmGdtcS1Ujoi6fOo1l4DJVIhqjJRIYAlISapZTpwCycgWTuc6lh3nvoygYWWeUEIIAMAI8MYkOi8OcARhhI+yCQFyN3mWD8ERwz0XCdTFmmTaIrg1uJjHV6zCiVp6x3DUsI4Rol5aITUSEG/LS08+TmQcAEG0sr/c7S5/u74/DvravyIDM8nUJl//B3BMvqQkg1t6CEQAbRtxH2/e9RP8AwCL7vgvx8/m8KP5cHBxOKyM1lABMuqz0j/MJYY2w5EAcaaoBSZjgVgnhlEABRFlbzkpbQ6404qgoVQIngFRvgBFBgsxUO+CSnZYoMjFYiCA70e8vL5CBBAQwyjFHKELMxISRNProrZlZenKiW9Sqf9kUKwZlvfmW0tZv+66qx3lWwVQvhaULPEtMMtcJSA7gkWXpKF/Ir10YE0fYfxiZr489i3CHBKXgw+oaEQAcyolVxyKZJZKWGQEyMIIQNgQqDNjbzw9bgcCAQFSOK4TI0VpE2LrIqb8ugYxwjhrJXn6UJh5uEcc53/LBRMKtJl0Jmdyx50qfuigEEVk4EhAL2IgRGICRFBFEXAkNLF1an2stdU/0UgMiuafORVq9SQ18Lqo2UW2LS2KaVZAAoIcjU4lE+hjMDS12bve2ffvev7cBkEg4xqCE0btG/vn5OJ/HaW5IwF+Z05n11JxFtiOEXwzbwo0DFJh8CH2/b6+vL6UjNDNfYecDgBIQiFprFl5f0FqLi75AVIywz/N4Zg7il9YFctt2UrNDL0hJuFsQMQunRwYOltt+U1uP+VjgbivDm5AQMOS3+10CwHMu7fsuY3w+n3Z4dRSZaRhI0BpvxHtr9z48bLnOeZ4EjkQE4d57T2ZMv9wpmeBx20YQLl9qa6mKEyCAh5slGDBk7/Iy+tl5miETBCSROXpal0EIphaegBAemEgXfCmxkqFYIkxVCYgFfvWgXmgq5oQrEusCx9YPCAAUGQUVZ2nuBoiloaiNZtEhC+8Z7uUXBXcAAhYgNEhL8KyWqfDUgQTCDAIFKEgLYmoyns/H0lO27SPP0TohuTsjMHHrPRzC1lIlgK0PJvIqOdW/FswIiA4IGVghr+4F25prIXMSeUXwQiSkAWE6eslggJCCvq7EuqkukA70Jg2uqooAI2G5pXtH/Pb68u31xx/fvrmqme7bJkzE/M+3jwgAlID0yAyjykeKIAQRwkyEJAAksHRJ2FoHd3UThK3J768vmH4cnwEwVQsxXEuAQg8C4TFnQCCSmTkEc5KwmjuhRTZiauIsjXjfxmv62/FY7pCXYYe5t94QkzNft/7379/0ON8b/bWOz3MFcwJauBAz04+XmyQey2akFtBPuDSu5WxCzDTlzPvWu6AHjW3XOdWXFfIHk0Qs0xEgHBHGGH3bgvGh83A7XS1RltmqEJEkAICHvtD9ZdvmbffPdySqKqUCuqwWfhW/kyBUUUsZblV1IEDG5RM3N3ISvoS4kaVQqAY0S3tTwz8ihmuVQ0JcSQEAuW/bvo0hYqYAaW4ZjpAsSMThjkSDuChhlhGe6hEBVVY1Jg+HiC5CQMUiR8DGjYkwiYCJBUWW+1oHI+1jG0watswyod5zwgwRGIlEQVmbxbIgAaOZN4jReWsCBF3YnDUiEwsCUmZOBy+twGi9IXuEmpl7KXmvkpKQoKwwXJPjAjU7wBg9G023x3wOYiYs1zJChOcx59v75zE1iasQxUSPDAsmKLn71piFEmDOSZF/3G776G9vPwOyLvA1p0EmsUECMpRpprOqZQYEJoJ5AngC1giEDNzDDAB8cSRJmivzfXQWRgiISCzHtbTRmTBjCcaPffzexY3Q21P14esSRhL13qMSsRIez+fH0lmPDmNrvZDaTMgQGbj3tm8dKSD95eV+MJzniYjqlgmMcJoxN2ZpxMI8w582P+08QleERkokREYCVM4lRNIp93Z7ud+X2zEtI9y0piam6zrRCL8W5zXN4a+/MpMQG1OkMQJTTUUVIpqM1mSaFc2iatOvVQADXNJoN1PTQGijF89HdRFCF3F3Qthvt4w4nkcCsEgAeHiYR4ZqmBUb08viVSsIJIRAIApIdVuakQmElX0bGe6ODFe34G7l9vuyN/wShxETkVxhHu5CfNv66J0QiBMxttGIYKl5pBe/H/Fc080AMBFsKTdQczMtH0WNyyKirM+EOL44FF6KIMSiwy9V1ZVulHnf962PYiQj0f3l/vOc5Z4zr6FaEFETYiEh/PZ6L3Mg3u/rONOdEL99+y6jn6YfHx/uZgmaKxGZhICcUKAWCAqIkWHhSOSYjICA7l7o/Zo0zDmTYGW+rbkylllAStmJSRgwzdBsdP6x3+6t4e3+NtXckRAsELELSyJZ+jIHOOc0z0QqYQiGM6BQKaxx7PsfP34Q1d5j/fn+VuxhkWY190NwTBKwDNNlTzMIJThtaRhzM3fxzLnUMJfpXEuYk4mGbNt4ud3nfLM5j+cBSMQcCJGBCBU+hrWVhjKNSU0WIsLMGEAIeudtbMTV6XprDVjyef6SK1eLFvmFrlUDltKOByEaHhHzOJhpG71q+spwE5GxbQUMzkyzqMylalYRq8vCJlKyQRIESdWlqmsqIjhUKBm4e5kTsL5ju/z7Adm+6Cn/lsIX5LH4kkS3bWzb6E0qtA8yCHAIDu5MItJA5Ln07f2tfkkhZgQRVrMoTGppGsPLmF/gg9Faa23OqeV5dYfMCuslSLOVXxTrPjYkZkrp1kc71heENnLN1bpwa7V0IYBBnL4QsRMjACK9vL5oxvHx+TwnMZ9qpxky985CoOpoFukeTsyRaRmMFJCE0FgA4D+Z7+ZGQNKbZjzmqeFYRVx6QU4hnCE26Y2IAJBpv++3MCNeHw9C7MQwlRKp9+k21QAZIbu0fR/hWpRrj2Cml9uttzbX4kxH/Hx8uscYg5giScNb740yIJaa+fJwaoKNiIhm6ddAltvKSMKnrmU6mN6fT3P93//1t/t+n8eax6oY7yKAl/WuNohpLkjAV8pnTQYgEutCgMuQv20bAKy15lrneVYiN36Z9PAipgYhsPA+RkastTRc11TAcC+fRxlkEfE8p0jlZlzcX3U/5xIR4U6MRY/7pdBGJLsQQNlaqbCidHqtSR2bOorC0uvJi8vYUO/+X3PVTFNzAmhMTCCMmJYWBMGNwkNYhCQjEQiRD9Nw7cLZm3tceEoEpgvy0gui/6WULNMzEyKkECaThkP4Ul3uiCBMmMkshvC5VkNi7j8/Pv7x51+rkrQTLys9JGIiFYvO9DzvIrdS+btxb8j0OI63j4/neSJKAGUJc4kDUD3Tk6n8C5hfkpZEIBFMiohfH1H8wjQwrcxzzWUmrQmzIHH5fQkIY3TZ9j5tfkAIo2HSV5YjEY029g6v29aGPB6WACyNibq0l21zRVNFJLWsLuA8jvV8Uib2drpFps3TEcYYmLnCM9NsCXF/uZVG0yCHM8DUFe4h0z0JLdMigHlFerof9vr5+Psfv//+/VtGSmsO8DxOh2zCX2P8S5MNcI3DSoJPV/4hMYK0FnXDmFZskSWoZ1EKSwVQL9f0ZObRWifWpc6UCJYR+e93DLdW56TQ/n7p6ymiDIZBXMRijAizzJKCqpkecy1AHKOP1q9wNeIElMvi5EXC+rX9pwq+/YpY/DXgQrRIz0zCugA7umVCa9xYlq8qV7SqqLUec2kkATZkKVTNaAk4eqoNM+ut4X/kmtTaa4hExnUGECOvGNOEDKTeZYxOBFP18XhO/Xh/fz/nicijSSA7kLszI2Ae84CIgWlzZu8d6TaG9m6ExzzfPh/mQcTI4hlNBJjti0RbgA6muuyzFDHVtBBwWlSAe34VchHhkV6pSJGt8WhNEjGCOHsXRhgsY3QDf0ZmxOeyOeecKzPd43keY9+oSQCqh7Tx/bffIlPX6XOma4Psws5k7oL4/du3B8D5eKgZNRmt9iRnJADAuZaHA0STBkAsqO7ljs+84CPyj7/+6qMTc8kT1rLeGwM8j/M8jm2M375/A6LpnpDHnBVhFhFdpDG7p1docxanJ2qmXhTSqb7sJCIr0jFw5d7xZVmyX09b5fB0kYq+asIMTOHmgUBF2S5rPUIKUwKBg0eoVSAMIV2WKLhcxeDhpjjnXHNm+L7t97GLiIIyopsjIgGoVwOAIlIZ8UXyiv8IXPg6A4xEkUmQqsZCXZgyhPHldhfp7/ahy+d6RAJLmxHLLCIby/f7SxNZuhwhEJho9FbecCYqMZKI7E320bfezAwjqhMnbizd6neF6ACHKhEsXe+f53EqQez7to2NW5+ez1mcoLS0klhBwj76rXf2qAP2oevz8XgeByAjcq8xYToRNaTMxITICFNBJiTPL8sBJBIxkcG13KwPx8xUFYla67UzI4CGRBFba7+/3G6dCVGQhHna9PTHPN8+juMwBJQmZvFxnOkLMRHxcRzEHYliLYiwqUPw1oe7i3ATIqbbbX+93+fz/OfbX09bt/2mqu/v75VndY1VRDL4OCxSNcw9ABKpTGokh67pSlhDefKIc5kIqern+wd/g23bXxPwOJaqhYdqRhF1eiNZS8GLR52MBBXHGZEi5QOEhATzoilElgYLv+A/8vWWLdkKIggJJVg4IXYuy3s0kcosYaIqwMwTEMx8qZJUfGJlHRJ4EFFmzHMqrXBrTbpst7HVGwLMemvlTPFSpHyJ4FtrkEARozwSZhW211qroU1mSmuNEAz20fYxMJ0gCGlNPZ6nepymibTd7nVqu+DLtv/9t9/v++1//vnPf739DEKAbCII6R5u6hHhTk26tMZckkEmBCYCRqRlZpmX7xtRTc1t6TrUkrn3bWvcRZD5eR46V16200gIRqyXwj42cYPMYAKFokWUY7a3nQj8OMKNWCIio/YsSIBNpOQ3cLFua7F+FYceXtoW/nqNhicCCBJ6cMS3bf/fr9/vCAVkJqaD6UzbxnbMOBZg4zUXJIgMYJrpGBAJbvrnX3+5rr3J68v9f//tN8p4e3ujJjN8rvnPf/2rgHMZqdNMnUka9+mzSRNpGXnBqAhNVwSEV7IrJWRESJfWpJmbRQAj1CZyhvb8+TwWwm9CvdMt2nkSjTF6O9eqsk/BZ9hyjxXbGAUDKP+1QxpEELi7q1cGU0m+ahZKhKMLUYVehy5DQEZ28MyS0EYd0oxgpi7EiF2ogOYZmcCdW1h4iVuQKo6mNh5Ftx0k27YJozAnoYarq4WHQ+nmTb2GFUw4VYFImL36GAAglN7M3MIRERJZcDA2IiR5fblv+z1dzfRcejznc04k9jJAHicQdYKXzv+vP3573W7ugeaQ4JGOpOnTIiIAwipSKXzGQvPAoGKbqZXjcoVrQjGTwNEs1lIvsYDwNtrWGkQex3kcTzUHIBHeejdXYZTM5zkPi43IfRIISa8gmCJmCxEmbNQGERA9jyMjeutRgbMRl7KdKMy+Oi8IyMT0KGFbQJTFrBDfDEiQ0QB2RsGrJeEAJvi23V4EcXTzPPR/whzBMx1R3PN5TAbIACCENGEgcKFkyJdt39u+Mv77r5/PuZ76OY+jNwaiADzn2sYgEY7g1lkk49rCfgWxV2MIRAwIEEsEuXMjZnBfYV+7XUbuZ+rj8bkw/nZ/vY0O3799PB7HnJ1YExNwuZ2myz08JFsjEZLGjICHrwQ3N1uKAIUdzwhhanK10FVwq2l4ZIbwMLtwJhUMGn4h3hmBEbpQEyyLFuN1FDL8XNMLHO3u6fXmrLwIZhmjZRoQTnOKJGLgEmAFJHp6gRXOtTJiufXW4MtOiYjSu8W5vhr3vnVK9LXIYh3rL/tJwolgawrTt+/fWdrn83gcZ16BWslhg1EwdWl4tDbONT/muczNlYmaMNJlk0jCIJi2MEEAAaH6Fj3Oc1lk+FJDKwRaQX/Hvv14eRWUdc6fb5+6VhsdURozUSbBbXQwPz+ej8eB9xGZJSw1z4jsve17x0gG2freWkPhtDjnmZmBqBlLtVLVEFHV6FJ0YEB+6amhamCotxAR4OVrG43unQFiARKmQ7InG46x9T6+vdzbv5A999FVn+Au0sh972NsQ93UV2PeRJrQmnOhLMu3Y74/1nN6UgIRN6m8Io+sCFHz8HOKOBIyk4MvW8TUWLJLiVURqbcmAGjhyJzoZu6IgMhNEkg9NO3n2yet+F9/+9t93839eZyZOXoHxKlKRLFWgWMZcEhLQDNda5FQJwY0BOzM1eczYe9dhJdqTZeRiJKZr8bgl4C5/mKshA9sIn00Qgj36s/MVNUAsvcWRX79Mu8RUmsCkb2P1jiuiNHs0kT4OL0k2xZqekFI11o1jcUv+PD/43cCX3kFhEgkkev58dDWHLL1tt82aczM6hE1LwJEQkDSDM2o0C/Zhr6dxzqX+VJFACIQRGIhgI2kJaJnXoefeh8yOrLAxIt9SZTpTNS4I0AXHn1sraenm7sqE91vty4DIsMWI/3t5RtHfjrfUdgiERh5rScA7Lf9dr+PLnPq0ogIg6CUZKQmnqnuXgamK9nArdJcuI5XhfJFgc+gUUJaIVigqlLYxui9YQTEld0XhEvj+Wkj41AzR0Det6GWaf7ttt9Evt9fM/LUlZQW1oVl2wzhr+OxHN6P8+N8GoAQi7BUqrSDreVqVHjkzMJqcGP6Aon6FyKghMljDHEIXVa+QQCAvJI6zXwtCwYDeJzr8TheXm8vt3sEvD8f5slNuLU48ZgLgeZSzMIuePFwO0mmA7Ew72M0FgQ45sGQVLbxuap8r0VCfCF/8d9emcLDBUQGQTon0ZV5V8mYEIggxImAhAnJTOUuJmKoaipSRGxqZ7mNkZmGhFfmSmZS+gUS1S9UUT3rRPSfA75LW1qmTotbH2NvffSPx0Na3+/35/GYx2HqVgN7pgxLTCR+O85jxefn81i2wpZq8QCFqAs34oY0mEdrxGBpEU4sxAzMz7mIfS7VOUV49I5ITbgVNRqRkXOZma85CXEf+8t+49bXOUMT3Djit/vLN+q23N361nrv8fFZvY25rcdpFu6YABik57OkkF4W/0uDkgApLMVmrYwjdA8Inx4UVdsiEkYUWqBu0d47JmDGFfZLDMIz7K+3t/Xzr+lhAcyd2ti3OD8/GfM2GoPPczUmbv3QJObTLTPVXD2fNhU8AZYaQkvmLs1d1TxCmwgBBgAkdGnULoPyL7jdr4VSREhtKUo+nu7uLtwbUQGqPAwIM+F4Hsy43W73242Ef75/zjk983ieCNT7cHOtxoAFETMczskAex+3bXSRrTdGBNdSRUP4lYyHZGaQ0Ih/HdBrip+1bOrVY+nSFCHiy3CRpSojvGzUefm/KmApMzzmnMxtjI0HoeM6JyLWPeDhmb5tDczc49fO+JeNoZa98DUOvPYVZmB537a///G3+36Lgpp8fj7mUQB0IqrdX1keIlMDP84ZdpznLIV7a7LOFZHETEBlVx3SttaRAQO9oiwBPx5Pz9i2MdcyVUbsTSCjiB2E2KQTkqupWUKOfV9mx/MZss55+nmwrpfR/v7jhyBP/UyERuRm8zzdnSJcw8MSaZVDw8Hcrx6RkIkYCWrXHlHEiIxMTsBkRk7CJpczAL52kBlMRIBMJMSQgMWDIHQEgzwjPpd+nod5Agoi+NIi4Ga4u3okugHQfCgKR8Lj8dCIQEwg6iLp53FAwoKMcNpvvbcSeixV+ApHLLFZXABdrOG7mSFckHABxCREQKlTrWsX/n7ft97pme/nI8xAKCI+3t/dY7vd9rHHK/758+fj4+M8TpDarWUmWCRQQqYtHQ3Gbd+Kkw4BYZHJ4ExShki4ws0oEzMS+RqMwhdfCBGb8PfXOyGd5zznUjVpklDgl2TC1lsiVIo1/cqgJYYMzzQz5p2ITHWdep4nMY3R8gxEYGHgBhft8+L4VXZGyYd/LQFqGVz2BmK43V+k92X28Xw85pzhuRwRKnoDmZpQpWGcpz+eM/Ni4zGz9H7b9mWxnueKQPa2jZqeFTt4LovMUi+XCsYduggBcGkJIzIDA4kJI0TEwaeu55oW+TxORDDC6dohd8zWBRsvV+OkK887ARCJvObhBOYlNAMkQiYogRJkel5kIbiS1i8dtbtmFACTvgyumUnXVZlUW9HKb683C5NCzvSp/n4cjsQy6jg/1Ry8Mpcnauzb7X4748HSONyJDrXnXMsd6CvpNLMR9j5635aZur9+e335Ju/v75+Ph5tRE2BSU4f4NaSq+k2Ka+aGkIJMlFeaJGPbG9+Eb4K3Lkg3ErClO8k2+lrzeD4jYdz2JvJyv6+13j6fnpZx1cqImBVViVcUckKaa684GsYmFAAk3FiItIDRiBRpaheAsh64a8AcyYXiIdpG/3gc81zXBFcYEJCAiNDqMNXeSr7WC5jhABke55qRkHyx3RGhiSShmh7nusw6V3xnzSS9KoRfeQURkcyZYBFvn5/HOSPjXHNlQGsAWdIg6Z0QEIIIayzrHqqGdNkOMBPcKK5HxNwsmkF8rpN1GsQyyww3F+bXl9dCyUPUIxe/Uk4YocguRPL283Gs5QSBiI0hM8wk8tbkt238/cdvW5Pn56PGIOFODUdrwuyQnuAZpo5AxFIJBllDa0hBFrlGJxG1yWZmUtOMYCQh3PqQ0U9dz/OMzDrHnlnRgl2k1Sa/kaqdbs4y3SMJkW9NKIvlunRpAk2Lj2O97n5/vf/++x+fj8fb8/n5cYZnAnqt4Rs35rGNbbtRH/6cc50fx2Mb23QzCBSO8ikKX/rLrxdQ711E1jwhYxtDiCiyRqLBBJT2uo3XvYdrZ/z926ubwbLbNkTonOs8D49o237bdv8WH8952AUfriKwdI5hdmQi5MttSG9YFSIhETFxHUkoKghd+VBUa5IvHz1R6edB58qsUFUUZqs0AqKyVRVavvqHwi4CoLtnALM4xPN5rHWspWbJTK21rDsGMwDMK9Wu4qb516N/PWTM5WyubXT9su5+nCeW6kg4hQMBkTArwtECgUot0+R+uwE0c1PViAJ7p6sRQD2CmWEZ0zTCCZGb8NYRYCQUWQM9iGrXRx6BGQhfmbeR7q7qn8/H0xRaC0LuDRK6597a//1ff/vjdvsxbnEse55YhOFIBBAW/GLWWmh49tZLbxdXLQNDWmPB+No/cEJWKDgGGTA1pAYkTKVWIkZblp7hQVziaxRpwoKYDvl5Pt/nhD4s0jwoiSIEfBMyGEFkiRAxLd6fz+yi//PfAMjE+7Yf7jonODDhfdsF8zgeppoB7mbhP9/fkT4qQLI1cciEIPg3ubk+M6jMel1MtG9dGkm4BSBhCsNG8rLfrkjnjM/zCPe6+d0TiNXW8/mxu/3x/cff7zf98e0fH5+AALXMYlkW6Lkw1fw8z0EJgn3bRTgjWx+e6Gpz6eWEhNRwjISk2iRfGwoiBmiAZU861Z9rWWYiZMbUVV6P0uUD4ugDIGeYLQcAJpYmTFlqIJEG6EQowoVXUjUixMROkpRUA5byNF8KuwhmIEKk1vuaa54rkQvsg+mIAAiRqRGU2QkJyPXaKjQRRBHGGm0GYhJVbPhh66mmnswkhJLURUbj3mTsGwpCQKiBRyfchO/7AIRpuvBa/2VgMk21qZ8sAszFsUAkSsYoTZ5sYwuk6REeWeU45ArnzOUWtShFZpSAYJEsh1rdn5UwG2FWyGRgYSTKjMvaERCYzjDdKwtd3ZZlcfC31gaCIGjEI7JBEsLjmJ9rEbAnhHul6XSk75t8b+Pp+dfn4+3xeE5lcBNuxK+3l21v3/dd11zHQwGkIF9RrpAlHQcREJfkhIUjvyILGKTJVmqrCBE2VV+HJQjkJtIAZJBEVMXtzLCPrbdRaL459fHxULfXlxdgUYeZ8TSNiHg+Xsf4bbv91+urhZ/HExm2bbT99vF5/lSfEVBLdoQhIkReCRkk1fcAEFYnkuEZYY7cEjHcawkqhALACZQobXvqsTyTMCE8DAJaoU89ayi3teHu082WuvsYvUglAMnceiOEOM7DdOGVk9e+JgNUm8IomAUAE2N43VFwzZIAAQXZquJNZwIm9AhEjqSwhVI5NF+J0BbegBPO84iMcvE+dXrG6TohDEEq9Q+REBlpcHvZdsCc53nqaoid6Ntt+/aye8TjjFS0TATScLP1PE7I2G77yqx3avHL0f2+jZfb9pynRZsR6zwzsrMsNcukpc+1ApKQkISQnCMxM6L0jnDZGaIsdAFoYRnJxJGhaRCQgdDEgdTDPdRcv2YmO+G3fbw2bojHnKf5a+OdOYGAmyW6O2YwZSPamIgECG8iDW6mc+kJ2DORpREzQqZrw/xx2x7uwXSuM9yRuLEwIhVfGSRLBi5tmepaRi4IsvVwjwQhRKmZeO59H0zMJOFKX1DF1rhv23Q/Hg97f/98PE6dAIC9TYen2uc8nvNgIUf++fHgoLHv/9cff5/zXPPwjN76bJ5XQYU1B2m9t97dInQu0+dUAmytZfkerrAQp9YBMaDy36pYIpbSadX8y79UC2VPvcaUiNiwfc3saycD5s7h2xgR/jyPDLmNTgGENHqPzIYEAJZWGZFZAn9VFunMxASNtDxIRJCBEITQKmwLgBG30Unac2m60RgIWVyTa9noATgxYZ0Lmc3943FYBveWwMjMGARYJsy1lmW66rKVmOs8h8jLyx0j5zxPpiZt4+49TlVi0Tzn0qeuCJ+Ijlc8GCOg+dbpjx/fKrGcgAjg8XggIjItM+59mU1dHsHCTSQjLCIRy0NNDJlZcx2E/xDuXiLIREBkAiL39DRAVIulZUVEcNu38Tr6TkmZqTNcNdvYN2RyXREUGVStHcLehEk0oDHT/bZsMcHr7S5XS43Hmqeuw5X37ZZ4TD2eT0K6/CFERck2NyIuVGNr19ut+vVruNc6S8456z2XREAiTcjWxAQGEeKp+vH5AEDPmHMGZCLA8wg7zPHQtcw5Ehsfy/7K5zegl/t956Z9nDo1002JYIzORAKRAGvpbWxtbMfy5/F5zIVZzzd26mZaGZHhXoMGLpNBhLR2f3m5beOvz8fH46GRJNyImQUz3f2XFBEAKgijvp8+BhLMtQChrm8E3FuXG9bPv0QsJYap5uFLrz+kdxKiBOTUZeaUyZjunroYqSPc77f9trXWuPefH59/vr17ZgBEAkT+WrvMpXWjuMYx13JIIgROBEivXbRjLQQgAU5dz3VUOsj32z56i6VNxCPJ7H67ETHOE6S00BOFIAhYEhASzCzSbkTfX+/fbrtEbUBt3G7fvn9/PJ9TVwBm5M+Pj8/nk1rjcrO4uesV5I0ZmdUb1NVUhXP9xApdzXAHgnKFOBBjJtbjygCMfh/yuvXm1ggjM4EIAgj76KwLCdNrvRMCsEsjYkkIJlPdGfG231/2RqJLE0DVDFEJNYNQKCEtHCJZ4JdUkRChXuLtXJOYb7c9ATYhISw8mXkA4lRzdzNdysIi3152/eukslEHaMbnuQpUZu7lUrNz2soIqqw4d8dY9+1G2/bX2/vz8/nbb9/HGMi4Ho85Dya4tY0IKZ0JkTiA5rE+n8c519Vze17hGeFM1C6MfGEyiCIqziAhn2t9PJ9LDVsnkrrlCCHwWuL23scYdjFYa7JKxKi6zvOUxogUEedx1KNpqjXbiWvxjeGlakQAEeYaYNsVX4Xhxq1voyfz677t23Z7edlut8/P5+M8z+PEiBp/R5qptYuqGe6+NNTTzJAJuXJ7sP6g5bTkKyYsr9ELkjD/9u3lbz++C8J0v99fkFiPY53T3IU5am4BIK0JEVGrUDrX1SDHy+1vv33/7fYtVvz8+TPCzZSZEyEyW99O98/j6Vl2HzJfbsZEVvoeyPhK3fvSRBMRQVIBvfGi/hkyNmlqburM0hg9XAR7UoPsBPc2BCAySaRYGL3Jbd+ne6zkhIY4WAY3ZEbIYBbXRgiCAskIjlCxYssjmR0JzTrLvm219RvbdonqERuTu4bhkBpdZGaCp1/YETIPYtHIpb5vfTp8HIfc922eo/WBxAH4nCuApLV99OM8n8dRI5NKnicgTGTE3ps0oSYr4vPxTo1/yCu3RkT7GCR+LMtkSDD3pfY45uM4n6c6oocTYAG7z6U1S2ZCZuQmtchqwhsLAh7HscKPubh1lEs6X9Pxy4OGWPddzW3qEncI9wQmd9c5W2uyj+J8ZSYSEnPhOOvVX1ZljwyzhQgAncTUwhwhGfE++h/fv9/6aESI+Fz2j3/99efbh0Ucay7VZE5ii4wI8GitLdPzPAH5XAqA2+gR4R4cWdLfiGtRSgjlrDZV9/CAbdtak1wnAby/v4/95bbdXM8EWLr++vPz5+NzZSBLZ8mIpUrh0hqqYuRovfX+fnw+dQGAhlvJMEWoyZpzqgGRh8+VBADpQ1ol2mZFGBEBFrk4v2Zi+GuuWMI3DwdPBswMcGCkIp52aY3FptJOCEAJDMRMKDQzOaMhSWsM+NLG1vcAQuLlOtecXnSywh9oFZWYEOFL/anagfb9ZUhL9y6CdTUhMkDrXc0gkwAzEyrNwD2pEkqTmMLWOW2pATFA6jLZtvb799cEAG7L8v1xAJBwb21TC2JDrNhNRSy7BnZmufjKnsLR2vt5Hv88v73e99v2X719PI/158/lJozh8dfbO8IHcbcAYPQMj9wAIqJyk9I9IxDoSgjMaCyjd8z0SI3AK+UFI7NkWBlJ7XIhi8haq86ACGfCXDPCuXDqlmpWvW01o4KShBFhlbNetIgMd/NwykjXXJceFBNGb99e7ltvWxNhdqSPt8//73//4zHVEsqqLw0Sr1yJSDMPVfVIFqwKrb4qISonDVyxZzWlgsBEQij2hMfn5+O3vXdCbOLAQOSIz3l6wgpPSGHW5e5KAIJo4RpBgKpmy9f0f66ff72/L1/Csh6fZc8gpEh4nMsBRTgywnwfo8m477uZH8cZkJWEa1/Y1nJYYoQIl3thG713ttAaLodIsQiIuAAO99vLbRtMSJlZVMbp2310xEHCCW1r24AdWbidkW7+UD1tBaQhXjB3s0qWIO6nus8Zaihtk4Z9YCnLmKOWHoDfthsJe7h7LDd3R4AA/NpsJCAec34+DyRBi3JbyJrny30/jukJ53HqMkhcS9VMzZgqo9vKuVqif0aAsPN4mM7D/HSbxwRfHvo7/dbHdt9h3w57PDOykvsikoV9Wo3PI+M4T8KrFq/9YnjoWtCliVzeMkDPLAtDQKqamzUmYEoI+gqg/rXmyEyi/8iZ/HIaRMQyHW2j3sBJ3UIXMZU8hZHSregkgGgZaoEJg4mRAmAfW5dmazmihX2c6+3xmAFHwHKPcEGChKIjZKa7MTMAMgtkMtWQB3pv6QEIGUUWjAg8zxO/iDJ1hotI9cfvv0nYX3/+1OVRuyrIudbY9//1+jrVHs9DzV+31jBPz/dzHqdOkvu+m+VzPt/OByJ2QlvaWXrriHCc5/M8r60hYm+tiVAGI7bW0WO51TBBmJEwgCKu6Ony6LQx7vt+v3fEmLMyz+hc9vHx0HUGwMp4HvOGVIStKr4HQQNyxEGEkR1pZ9kAM+BD9bB1pgYjIkYAEgiihzPRtt0C+VT7PBYP+Xa7NZaEpPLKNiljbG9t6y0zv/QXDVpzdwPHRuqJkciMxIAMSIG0Ct0v0Bh767zO+TzP5RpI6BGaVSQU0rFEHpCpaozUeltLzzmDmmVOXUMIuD2OmUC9yR8/vo/WTFeYA+Byn6YrrDON1p0dAC0ShDiBi5MSjglbb3JB2MDcDtXDI7EWEbpMMzmxNSaN0qJHdT9znswkjTlSGPxroemXaaPCWYAAoNCtIGt5sTiSOeKyCZmFu4+NqEmXTsS9badmhivZnz/f/ufPt9PCgMwdIJswEzAiJH8dAL/AtBlI2RkzICEA0aGGXlhSpvAMD4AibCMTCjJGmsVxqqSTtMGYYOl5HxtGvt5u9/vLXOvG4hG7YPp8Zfnj++tz6lqaHrbOAqdBBEF04dHavo/jPB/P49eArVaQ04plfLyOfey3mGcghnsTToTlEeCY3gga4Rh77z0ZpiuDr3kySBcJBmReqshCSG+PIz0fe19rQubet7/vAxKvbKLw8q4C0Ix4qH6cxwpr+wgAdcW1vt9unFyg70gbvXXhIPp+f7V5qmoT1nBmapX6hKiWeTHooRFLa0uX65mBJa03m4hABFNPYICEiJD7uD0fJ/Wu5udaEeGQLAiE6ZWIAe4pjJjoAYjE0pBFfWaAuZonEYl0C9DHseYavY9tlJ9Ylz4eT/VnQmIpdCwr20nDCIUAhQmh6QoRYRKIvN1u3+73cNe3tzzPzFqYOmQsS5YG0g6dZipEwrgsEJOYIiwimLLA9HAxdtA83QIZMUt+zICc6bVE08xpngCNhIlSoybLEXA8z59vR1ICZdva28fjXBEJkUaQwti48DBkhHXhiPCXuCiwDPWXtRwS0upVJFenhgARzsidpTMhULjruf788+1lk7KAQpov3Xv/drtt0jicTCV8cOUJtEg4dW6YIpDMbr6WNkxE6ABN+L5vbfTn44PRXzYSoIRAwAwv+osZHDm3G0nr3DrMc6pWwHNmguvL6D/uOyA6gobOQztTejQmsPj4+bYioMk0i6SGHK1/Av7j+bC1XmWIv96bACFnesTYxuhbqGu6EVBjtIgEi4t529le+lg6zT+RkFC20T6P6bb2JqYTIIWRCfgiEMJ0I4DSmNTBWLpUDYIKjh2I0lrrpJ7hBongIYVXp4whsgkvXYlMAJGJpTG2dLc6aY0aIYgIMZemCpEgXZgB8jzPKnDd/PF83u/379++v+y3xpwZLbwYQ+CemNVDpHsCEiAyZx9jdCLWNYm4j+08Tosoz2lEMiGyIKJ8aa+u40oiIlVBRHgBHZmyKAmFpytfGiAxZImUHKl42RVbQwiIxAgsJMGNKRHmPN8eh3l6uoNzI/MkFIjkKzcEKxkqEQHQIH8ZZDNrWOV5TaYCiusdl/oaCFrvW+9h2iplvghwRC/bdh9jCJ/H8zjPfd/v++2+b0WwKjjSNpqIQHqmC/EgjnOuYyILi1DmRtSYNmn3/fb6+hqZ+P37376DRRzHYaXrQFy6znOaKZqj0ehjmoauNEeiBiAZ++h/vNxvvUeGASjAdHQzLrcyD0kgtX3bzFdktp0a88fx0LWw2Jt0oR+YmAXVDHIS0HL9PB4ByU3qnZxmFDHnZABML8IIcd7GtpY/3j/6670JCRMKe2X9Mli4h2Nl5XimATh3ot7aGeUaR2k9mUQak5o5EQOAPD7fCBASX+733398W26WBEhaCx0EdytpUwIQopkuAOZR+QAs1IExc83pRPd9RxEhWmt9fj4Y6PcfP368vG7S3h4fPz/fE6CNPt3UHaLcpCjM0neSDpAlpv/59qHL6ikXofAsxFrvUp2Dr0VMvfcyUjEzXCv6zIJJERFiljoVMAE8Az0BE4pYRuCl2SNsiQRUOJFd+raN7daB4FRdoQ6YiEASkEQsxL1TEyZIvBrZ1ISIiv8oNQF4RqW+CmPlQNVortwMHp6YZkvBOxEBZRpSbtLu3L9tW0cUAAEUJMy6JCNcv5BFbqqmk5kjswl32bIT3Ckyucn9PrpQQ+KAJrJt27lmf33h1gKwpmHqRkQefp7z8/l8Pk8LZzDP2JibSAJi2N7lv75/+3G/FStyRQoSkjzDXH3pHPfx99/+kPf3022WbdhUz0PPQxBbl/u+jS4I6G4lvH8ex6c+Rt8O9BWKiJ07AGzjhp/hZkJ0nCcjCEEF57oaJTDB/Taay3JF4WnqNQ4ijIxGWIJyIcTwIbzBeH9/c8AiOOr0WYGfcOX0irlCgjATwn3bfv/x4/N5zqUVRVk0GGQqAOh5nle6I11z7ibchXUuABBmqAB7wERa8/z58ye4f7vf77ettW+Nwcxbb9PscZ7POTWUmfexU9+OZed5COE2tsac7sTcRVyX68JITMQkgoTCZV7mGawXfLgRwsUqowTErQ8mLsWpW4HcxMOrqrjyCTyIafRWIxGI6JR7oyEUmAiZmFZeNqZqK4Tot++vgwlsZSYAreWhCuFMVN0tZDJCQg3TUZjKSk6AFbxgGVjchWVBjL0F5LZt3273F2pbY0awOcN964NYEtAzG/PlR2lN3Z+Px/3btz42SoLIRpytT10RvvexC/vS4/OxkNpvKJDu/tfn8/3Qc83ytEtvANBHf339/scffxzH+XgeZk8Mqy316237++v9dfSNCbAfkUKggOdUCiIUStQ5Bfm312+WefOl6Wyepg1BbmO09nrbukjJqj38NPcIDbfzOMEgo/cBGRlBzJ05kZBlzklCIkOkqfnb+/tcjnsr/lxxX+Y60+N+22+NzXRrQxLP5xkZDMAsYTbNgUg93E5zz8Dem2eex8wIodYa9+12exznz493aePby8v7xyeYIdOxFiJI+7emFAHCXVUxU0R6a0SAIXiJe51FzOM851onbfs5J6Y3wW3r4/cfamYWPCdkCvPklZ6DOTJsHRi2jxsjjCajyZpTn0cTltYQKQGjNF1EeuZ0M3NhYvz3wr6GTnUCa6wT5Z3JDKM2BmXNuMkBG3EWjfAacblg7oyDQNxDSLAQYOiRAEEFiIroTK9bG9j2fQdsx2n/589/rWcpUrO3BhchTwsglxWidtnKqZwMkLE3Gcjo9n3bsFElJENYgWbONW/3l9cfP1g6UppqxbC6mapOtcdcx19vkW+57N4HI851AvP2clu6KAXs4jnPY/WtI/Jfn+f/eXvMtTwCmfqIpQsAbkJ/+37/7bfffvx+2++v//zHv97e315fXv94fd0EfS1n7iK3/UYB6zhtGgYwNWYyd/MlrY3WQmBj2IGHyBHLMBhg77K3XlTk0Cshro0BgHGuJnzbNiKCa36QCUGZr7d7b7z1hoTnOoBpe93+9//6+7e9//c//6EZpkbSAh2Ieh+cKXhBr5NQAR9z/uvj47kWsaiqe5TCWGtqe+WDbLc1FdQ/nsdfPz9any8vL99e7p/H8XlOyGxNLCM8VC+C6RXpw0RItYrMsh1ahOda5h7T3SCXm0O00VRnxLy/3Nu2ZUBvLR+fZr611vfOyI/z+LaP0b+t88DMvVETHDRuo5PIFTBKuDyW2QoLyHKpRkSEI1zIIEIhpEQ081PVzUt2j5FoubGMPrB4+YEpJYYDJgSkBP52G3///mOrpDOm425/Pc4Zll5+p6LgJWVsTDehjrhMv93vn2u+zyMiiCuKiQDAhTNqqJaqdonMoIRZxJCv2/Z97Lm0M1dmFkGoqVq+vmx/u/+tb/tU/3x8fnx+zHnSlWBrqjrGsMi//vGvtXQn+e3//n//1x+/n+fxOY/T1uNxvuy3rfVAhoTP42Qzy/zz4/Ntrshcphj0sm/R+1pLp65/vf/5cXx/ef3x7eWP334Mptu2ha7P0xoAjx4e2HogTw1CESZpYhHP80wIRK4mlgBb48aYxEYEHoN5670FEEaeR99GEBzH3Lb9hV8CorMgo7k/j/n2/rbt+/eX7xRQsZXTtMbzIvTb3//+f/3t978ej3k+l1pEIKAlIlDnxsiJCByWcJr/97/+9anTEWJNSERiJCbiRmxuCUmI8s+/3mzqflPidnt5Xef5+f7etn307ojJpO65lkOaec0zKgq3xCHnOQlhrcXSENkszByJsTHLUPdpahE/396Z8f5yG03cgnkDZkT8+PjEzNu+ja2TMAL81PPldv/777814XpjzuV//nw7dB2mmaGmDuDgCNBbY6ZG9e4vNQjnr4Bb9wJ1AQJ5dOYuMliI8HMpBAgyMlZ7lu7M9LLfvt3vtyZrzqf6y77ft+2pD4Mi/gqVDxBha3wfzZeD53oe4RcFusCprQkT15OaGa03In48DwRQtQT49rrfe3tp/bf9fvsurcnh86/Pd0S8v9z++PH92+vLWvMff/7z43GuyHppjW3ocjMfY2vb7fz4UM8fv/3xx8vr/XbHKzwu3X2ZP6YCMngSgAhH4jJf4YGOhZaBCHRAAE5PMuqHw/zz519//XVv/LcfP7693MrJsI7n4zwRkHqspPfHs1EfxCIN05PAM1cYpEcGA0NGukVYUGJEuqe7ej51LtXIiDJOIVRekUclo5o02V/vUtPARCZKiud0z3BMD/s///gfm/Mx1/vnMxDMClXl6+Pzx7bd7y8J5Eh/vr//dRx/fn5Q4z4aE0eEqQtQZkASk/SBYSH/vz//tfduB+z7rbWuaup2HmceU1q7tW6kLfwEnhERRkx9DHM750qALtSZADkA0n2uGR777XbbhtlSM0Zac66pt30f47bf7j9/vr9/vifh9x/f922DSPB8ngoI9/vL9l//1ZlHEwhnYiSOTn2098enuzIiZ1xocgwiGo2ZqN6KkVGmFgtPotaIGiO1CERXbAiNz3QwPDzmsmMuQvzt+zfCBITOzJnnccYS1bXUGvKP2+1xzDCtUyVM9yFdeD6OV5HLH2MWZq02MIhN+L7fRq/ooeM8Dqf2mfHMhSShkxlvrf+4baim5zP33dHTF6W/7Pe//f777X5/ezz+8eefy/Rc61yzcRNi05URo7WX2z0JPWIb7e8/vv14eQ2z087lutZy89aHIz3N/v9M/dmWJEeWnQmfSURU1czcIwAkMovVbJJ9999x9fs/RvfqtXo1ySJZUyYQ4eFupqoynOG/EHMUcQUEYrBwl+mcs/e3KTwDSAggNnCDAHci3HLxCDIHgIwUBEgzYmwooJvl/UTHXFJe1nXbRquPx8POQ81zRBEeGqP3IBRJYbONGVkEIvZ2NpaYue1IoFG7QUDTWNbb3trbx/twL01Jx5frFkIabuCOwYkD4uxNdFJYRtMhyAvJ8PjXf/3Xv/7Lv6r7Xk9KLJLcY2+j1bb38ZXTMP/b97eP43RmLmtOgvGUuBt4uCGFuxMlAAoMGW5kI0Fy19G0jt4iHNB9CmvlZS1flqWO+PFx6oCceCF24dG1DrWhSjBx3okJM5vCVviaWYMb8c+vr7fLGva1t/btt7e6tbO2x753s5+It2VLTFp7a6NXvfsOrh1hVJ6ekhFwDj/q2bUDQElC65JLXkuZiDiRxETmdp5nRIR6RHTrR69NdQ5HMMh81NG7v7jHcdbHfTePCFxyZuJMgOiFkJFUbT+q9oGEedm+bJeP+25DFUnDwuNatl9eXqn3MHCLoeYBMUZyeLldMVyYXpY1C7trzgSXckb+p7f9DaoBlJQSQQbIAJIkAURY6x0Ffv768vXlC4P89tu39+N41OboDp6XJEgJqUjCmGau+Hg8ACMxgQ1meH/sqsrECtM6CC0UKTJEYglXcGymGsHIQoKABJFRppKqtQZgDu4IA4KQDw3uzuPs740Er7fr8uV1nBXPuhVGkUc9jnoAAidOwoFBTFnYdJxjdNMsKbOsnNFiPyuKOKB27d3C0AwiEwFl5LSub+djDDWC2R+vo+GwxImQ1mVbiZnagOhq9/OsY5yjE6TpuF0zB/EP9+Nxr60/jh2In/1tpMyzSIS1FDX1MBER4WHQtcsqKTP9dLt9uX35619/+9ZqZwqgCY5t2o/m+Xr5upVXZohVmK+3G+XyX//HP759PLq2hLgScUAiWG63adm2ehRJrz9//en1upRSz/PjbX87jsK5lHK9XlFSogJGRHkpy7ax93ocR9hYi7AIIg+Pbk5JNrlIyYAgKQcGIKaUpu2HhZnYdUgEEUnI6+WWshzn/TyPj/vj2GtrtkeEetsPSZkjGIAA123NubibhheElBIRtT76UABISMy8pvxyvRqgAhytZ9cVmdQvZSWM1hUQITwLXpbL68t133dmXpY8xrg/9tuSbrerOoXf0Y3CS+JLkS0xAwgRI3oEC6/XdbtetOu//O2fz65BHOZmIycuLGvKifh6uTLxcZyPWs/aFACJfr8/3mub8ElTMzeR5IEWwQKpZAcw90+EVNJAAPRndqDPRAkzpTnCQ1DT00bUwxAyopm2vf3+cd8u221br1++XJYVgJUF36P3BuCCMwaDE3MgzDzNhemS5JKS93E/z9FBRM6zesBash/HQvj1elsERZgBRu8hIiVPVeJF0poXZgHiOsac72zXNVjGx7tIAsRwTynRVNS6f9zvQ+0PjAcADFUi1DGYaV2X0ECf5lJ78hsL0pft+vd/+rWk5cfvbxwgCLNtkihdl/VSEoVDO27Ml2293W5ff/7FKa25/Ovvb4/9IwnerhcmZKaSko6WUyLCOe2brcotJ3KL+OlaLu7BuTT3e21vHx8QiEFH78EAgdvl5bIt25Ld9OPH28exy1LMvY9hbjBjG02H6nHW1jsT5ZzngImIvfltfXm9rdetXNftdb1ERD3a98fH+3kHc2ZIgZuIsFyvV4PQMQIjreV2u9Za7499WCTm5VbKsgTxklIRLsyXZSnuL3lZSMB9WpxVtfVxWctPL1cREVzNQxI3Hd2suazAZ229VUHjsC9L/nJbhQg8bAwpednW28uVhI9a7x/3o7W0rDlvaajrKELoupAQEFpARMolB+jH/bQRgBXB23jymQPUAKwzMoBnYs4JfKZj2Yxhm5bC6QuZlpGnODxCEEUkCBX1cNV+LiSFGVLR0I/a9tYSP16u1zWXbV1eX//+SefT0Vsz1Zhtj3VFgCRSRAoT5KRhbiPQgUGIk8i52/nxvsZarkuWbUY8sKRw6qrJoSwZAMwdAD72x4/9oRBl2QAIAERkDvJSSoRoZsN0jDH95TPSKOXkHl31PM+cpaxl2jUhotYaTkwkt7L88vp6LctxNu1tlXQtZZiPYSnwyvKaCoGl7EvmlBnFz753g7MfJPD6cnvdlp++viKAmwqTqU7Fo7m5dinF1Hrvt9vL5XKFwN++ff94f/txnH/99nbUPgM3InxZy89fv/70y6+mbT9rybJs1wFQR9v3XWco60R2udWhw2MSvTSQiIYOCBgKH/3H7/e3L1v55fX25bYtOQfaZVsvL9fWejsri1yXpeRcSqljdCHQsS45p3ye1QEDsPXR+uDW9rM+7h/WOjK/fvnymvKVefJrAX2aCsJ9LTkzuZswne3QPZp5XpdgftS27zu4/un1VpJc17wkDndEykvZLhdJctb68faj9U5M5XJZ1osZkvqybIXQRwUDC+ttmPcRceiglHT0IArmOpQDiP8N1S9TXjVcAVDEu7Xa3x4ftTbKGT+RziLyBNpMDmcETDczUxu9hhJykUSEYD3cDbz33n/8QLUEuJb8+nL7+vqlpLRI4mda4TNPZAbvTGdpfrlsphrRxogAIV5ysT62TOuahMh1ZKYIdAdV4wkeDXczYAZEYoLnfcVEJHPjmfXRKfCPidCnNhJUh+QMRO6GTAFQz0r0VLeqGqIQofz89cvrdgkdCL5tq+R8vd1a130/EDEDrsQvl+v6skLCY3981Bat5/X69vH+T3/9LQGct0s9d2FKSdZS7h/vRLRuywQ/LGZ9mFkAIEpJZfntfv/xuA/E04ZCkDAiWVczyzndXm4/vve3t7dtKdu2vt5uN7xty7qfx1krIEjOZmZOjjH5EoAMQKbdPAbQzGCu2tUVmZ3wx34/arteX0ou27II4dRgEzhjXNbFB27bmnLatmtTGBajt66axgD3y7Jct+2s1Y6jJb1cLg5PG1RellfAZdiSSwChkNV2tDZq7cOACMw4ABBva7lctiKcmZecSk7IDERVx4/vH499N3Mishn2Me61jsQSpXBOIqn11lXJ1B2ApakCkeQcxH3o2VrE7EQrAFwv127aWxWhbkZ5QcOw3lr3iNF6RJtr9A8t7RTRTi4TCkOEe0xcRWbJqQgl0+FdM8uaUpBRwFA/jtrb38KdZm+FiAGyyFKKsJhZbc3DQ7ipKoAztT6EZJWy3m5bpqWw5Hy73OxxKKIT9Rl+YSrENmWMCMJCgrV2NZ2UcAFkogm5mIJzZvY5aZpCSA8LHWNMy7UNTTkxiYPZDOJ2lOvlggjneQDL9eV6tg6EQJiW7GqBYeDLZf3Lv//f3/bjt7f7/X1PzD8vL9fL9WU7EUJy2WtTHV+/vL58WfXjXZACUN0BqXY1h9a1dR3By2oekHMJ060kWqWk4ur7I1JO+/3+//zf/xdjHPvDRyPwdSlIdNsu122rrdXWho42TJCbWxgAoHZzV3cInyESloVftsuaMjkw8LZdNHCYjeNYcvpyu66XbX98vH9/a2br9bqWjAC11mliJE4pQ9hQtSRyvWyllMf9vu87I+2ja3VJZDbcwCx61w/1vOTr7YYZHcVDURgJCSMjClGrjbS/vPxUUraZcumm0wZZax2DkZNkILgf1XyoRlcLRGIqQoPgBBekVDJLitNrrbV1EtExI4Yntm0uhlD3c4yF5Wz9pLQBE0spS1frZjNKeZpCnzQnADMdfRBiDkBCQYoINTtaBcYkHOGJaGX5en1Jkmsbx7FzSmoKiMiiGLV3CrixWO0phaR0uh/1dIec8ula3Y7ewwHUF5TC8cvX21/+/He//vqXZXu8749Hb+xqEKcFKTGgUEKALZf1cunqzWxvda+nz3wpQgp0NwsXEXrO/mcoqOtQ9BAmCkhEWy4lJYgY7fsAIERJJdvo+743sx5w6OhmQx2JmWhN8vD+VvfX7veH9k46ELr3eyvOP623Y7S9tt77uhSQ1MyDZUTUMSCChdQCSLqN2m34kR41B5fl8u397UtZr9uFEUPtzlzN3cb7276t5bqtWZjAw2z/uJPwsqxbXtay9DEOPuxsezswkIXNjBGJcNgoxML4dVm/ljUb2tHGCHHelsvAeH97u9+Hjv7T6+3ldhOm3759761mRh3cej/O3kb8+pdfiOLt97+NMZqpaQ9VDNuW4gHdrNfTjyFCmfNStsuapKwDsQdgWm5ffvLQPjoSZIiVCCO+j+ajhWp3+Pi4M8br66VcLqebuqoZCiHiZJPU3ttw80BhVlIgYLY0E/Rgqn7nOBI8CKIk+eNVg4jg3ntXN3V6e3/PXcvL1ye1Tu0P+uo8I+NTwAeEz2ArpEBkIXZS0wAbo4JzRrytKw0tAYvkj/djjpKISV0hJSQEQAbM66UeJwSypA54RgjQul7C9aznMQ4P4MB1W3X07/cd6HcGvN2ur9er3XUoNfAO7r0LUDYPB/cYZzMAjSd8YFqIJvcQp7IWgXgm0gERsgghg9s0/iXml8t1zTncH/sugCwsf/u4130fY/ShQOSEQWjgppZSQsPHUbt5i//a2sAIzqWdR1ddUr6UDOhaR065lEWH/v7772YqwvEpVg0gU5/AAhu9pLyIaHhGKuvCImFOzHlZauuP9330Kok3WvJSXl5u3ocNz6U89of5kUomkcvlVtbLkvP9fjczd/7y+qqq39/elpy2tWwpCyEyN/UOent97b3+ePv9OM9LLuBRj8oOL68vkss//ss/f/vx41g2jxjDuwUIff3TL2+P+/H2A936GE01F2HC3kw9Us4IKSC6IzlySscYTrxdFhS6CBJ4Ow4K3yYXUpV++uLmM5d6WSTnBEyPc9/PSaIFd++jg6oQA0IwOMXeKzKaS8l5SYv21voeERpBEmioahDwB7fhU4Ydpi6cGbkN+4D6chm3nF6XUnsdZoaBxEAck5tNEOauc/CCxujuU8jEU1swRSXqisYaj+M8Ne7nzkQbrUvKw4aHuVlOCQJO1RbWLY5DTx+0pDWvLqLDgcTiaWNywpyzt/PtxzsR9TAi+un1y9cvX75/fLzvezWf0qlgGj4+Pn5UHQroyAEMwPMzA82ezpQ2AgCj+iRIiRARuxsC5Jw5SRJp+7ERB7ECyD/+7Xd3zzkRJyISJmT0VruOqV5UtcfRavtnIrpcr4Z+WC/jXNa8boUyU5YxlIXdTVVnUjAwApA7IIWNEW6MThRMIVnO4zhqVSKtFYGWXE6P7/vxsR+ZsUYo4vb6+ue///u//dO/jPuxpsSS7/ePse8p59v1ZSnyl9frz2vpo+sYt5dbKeXvvry4DnzautGYWnhr1Vt+tHp/7KF2eb1klnY0cvjp608lw9evX2vrx9nUoQfUMf7f//Zfbj++9VovZRn7rm4uOkZkIgs/2mBzAKi1DdWcDxFxs69fv1xftlxEOJObIuLMfQBjEbndxhitNTdDQgfvDnX01vs8s+ZbdrQWbtPsBhbdR+sijgvDmlKDoQi1NwcQFiYcYeE4ozEBCQCGjqnGS5IYSVggSQ+XRD9dVnXd39+adclrYgGzMYYFFOFVsiM4gRM6YMQTw2hmhkSSc86SMidsrY9jBwZztdE4LDM5YTcPjdrHAafqOPuZSi5rsYiP+iCozaAOzakEQDv3x/EgSa/L5hBHP1nHaK239r/93d+9/Prv/uc//9NdY7leHKmZGcGSGDU9avNhiAQTQSfADCkn9endcghMRMIMgQbRTT2cCM9e74+PfLm9Xi/XLEetPUAmx6b3sa3rhKt5+OQqRISqEhExD3OwoDbUxuNsBPtlvaycIkBIghx8UswdIFhyWRYYMUezCWGcChHMbIC/vd9/7I/f7/fYdw+EAEYegI/W3QMJf9x3c0/Lkpb1fp738+zukgSY6tHVDRDHkDWzSFpl5etlArC2yxoj+RgaMdybWe19b/XQPkzDbEk5J2Gkpmom5t77OB/nermylPf7PcACofbWv/2eWf73f/fv008/OUXz8ePjxxjqQLuOUU8IMDdEHBowgj2ufW31LPm2XRZyH9PEqX2ojTHmra1qahoBpCqSzHwqMojRw2MYARBiFvFwZtE+bAxHhojRh6mFR2JJLB3g8NZrU/N13VJKYwz8DDeQ9JlEyjwF2yJCAWvOE8Bh7gMVwzR09tfWpbTRm6sHPKHoz0ivBA6gvt2WRAzqgWQ6ho08s97GAGBOwki1D3R4eXlRV/2hJWVBDhszhgJQAsDcZpBc792I1sul6yDrpSwlJVB7f/9Y1+Xr19fLy0XN1AO7g2GPYGHO+d4PJs8p5etKFL2fKRfm631/HPsZiOZqxJKyMYYII6ApjD4e96b6H//Tf4It//ZjkLmIyFNQZmZmRKg6plZaVRGeZiYPcqBo3d3asEecH/ddUzY3Zs4pu1sfQ8fIOZWcCXHMb7f787UKEBHN7B+/fbufZzPTpzcMwsMAA4iQxiS/PY7zH/7nP//t9zk8eoHbrdwMIhC2y8YsavrY60RCXK/XPwYfs7DziIm338+jhyehoSpESykzUgERe+/fvn2zCDc8ziopr+tlP7+33kgkMffz/PH92//xH/7j+nL9/ng/W+3jGGrmQcQ5Z6JploXeOwxt5/54l60kWMqkT9pQBBjmR+tTo+owXbbuETbGCKdAQMpJlm1xta7jtDEjG5ZSnJO14aa99YEQrgSeknAuoI4Orv5HN1NE/mjqT/HsH452CHiqlQJuy/VwvPc+YiRETkwChAE6EmFXc4ChBgCJRSavFaGwUEA7Tu+aRFJKfSYXTv8bxKR1mLmk/Ouf/nzUHQACYmjnIGBqYwSRe7TeIyILO8TZ+7/89hsRXi5bPav1fllXQDzO3dFY5LJtTPLjDrPx6gDXnFck8OitX9b08vqyH9QtOJd6togzEJvp6CN5OBMJbyUtzFnkhfnX2+3PL1cLPc+PaE2YGaf40bzWmpJ4eEpJn3r5AAADB8Su2oaKECABUB/KQYTxzIQEJ8QkUkoR5nnmIdIYo7YGhCISAGftxxg9ogFM2LJbAD39K6Y6TYxO9Gjt/dgL80+vL0r49vHhvQdESnK9XJacSkmPx0OHAqG69TFYWAA4iauZ6VCdOwEAhei6Xr5cbwlwKmqG+8fjnspKqfQxPh4/bi8v67p9PB7D2m1dAeO3v/71p5fXU/tff3w/95MdCqWXhabcHyHWsmThnnprZxLacsoIWiuE9zZ0aC4ZSGrt98fj5XYry+IxAObaNdOY1tPW2ut2u9xe3h93GIgEZEzMBuEZR+tnPaf2VpKoKgmUlIuUy+bPkFrmnHPvvbU2wZ7u074zSfmgqiWlkvJ1pW+tunuEJ+K1pLzll1yunJyw9PLo7f7YVc0Ac0pbWXJKGDDGcHNiTDkzIwiDKRElZtU+V7+5aevff/yo9TCf2ZXlOPbumnI6uh31sGfwQiRmklSHXi/bL3/607nvp0WvnQDLIsy03z9+fH/7+vXnn19ev15fPu732nsA3HI57/ve6hJWwAdh69pGbzqc0BBcCJg8TSdNd/BlXb+s5c8v16/LEu1koZ9fLkufMXXwjJMw9wl8zVlScmJ2M1eLcMSn5QqDAYIZCYEJZhzF/OXCQikR4BgDnSa3HAzmTxERQIo6mFlb9QiaTsKYcOXJaDNEwWmfJXRDR+ruH489dPz609fC1zAd9VxLWi8XB3jc72et87ueUkpMmVkka0caY3L/3CyRUMD5OCAnAViWBQmBEVhq0/04j+MhKX95fem1nue5EF2vtyg6Rnt8r3U0s7jkdc1LG6PWA8NLki3lxGyIlaBctpfLRu5aT/ewobU1R2g63h/7x8d9WS/s0VTdJ0hHLLSPJ7FedfRObsoAa8401OIZCMsezXx4hHuRIiBA83kvSVLIM3P2mQ8CYGZgM9YOKaVcspq11q45l5SpqQ9lxCTyksvX22W7LteUFk57q06g4bYs05qXU/r5558T8/1+B48Z742JZ3DtDCupYwAEEJjZcO9qf/32jQlzEjXPWZB49KZPhQE8o7YZJQmKLGX906+//uf//H/+03//7//tv/x/b9+/qem6/bRkiTX+9eNv3779f19/+vnnX/50e3n5IqnVaq1l9z99ubEkJ25jBPaufVif8RQQzk8nh5H5dSm/3m4/r+vXy0o2AKLklMuXVwiZXzVmxidXCjxcdRDNpA+fQ4achBAbOmIUljUnISCYdVsPkZTEQ59geXOcKYLTQ4Ooqr0PEkaIkoWOEIQprjaEmQhNhCSYEknKABDDJQkxD7Ve25bSWpZC1M99FSGIv/7rX1tvc/Y5VCfnfRAe4CkVSflyvZKktx/vvY+yXXzoCF1FkGlbNxJ8+/jx+9v73l1HX1J+PPZtWf/u51/ef7wJYk4iuUT4etl+/eXff//tWzyaSCrrer1e6vEAU3AfNrLw68t1uawcEGMg0DQsq5rW2lU5la8//ymv21CzwIl5AaHhcNQO4NfLerbWW5uAupwSWqiH5OwOFWlCtYb2vdXLtvp0PzMBkZur6RyBTVgYEfU+SAQjeu8qtI9OrV1LRkwQEObosS3p168/fV3LtqZE6O7g5r2DW04pZep9BOBRTyFWsySCgja0m7YxJg+mt4buLDSdt2Vb+zmq6SIZU2qqFgaIgdDH/P0AJzoy4qwVSlDm7+/v/+W//rfH9zd8WkohSSagkrevX38OfH+c7cf/+B/Lun39+tN1XW8vL7d1YcKz9Ufrk7uFreUwDAPgDBgW4IpuCeDXbf271xc2Px+PVg/78rpctsKyCMp8JAqzm/8xTh59zE7zJDdzSmvJvHFtrfe2plSYBQHBIUB7dzMmnGyplEQSx/wEEPCZylRrTTnPzgMDzCT0eXlgPFEwlIhlZlED89RXpZwyihThx/0BORUkUD0euyLeP+6AsCwLM9vE8hAN00driVMpy/VyzZLv9zshBgMD6hgMgpgiYgz98XG/q4e5Zkt8LSnflgXa6ONkQCbCT8WYsEDyvC7Xn74AxL/8Y93ve3BKgrLlsmSC54kAz3aAt960AxAty4qIrfU5gZpM6fM8hw0uGcGRSMMmUD8sKOeckh7nqDUvKzMex/leGyOc4Ec9ARAlWyAyWe+z/JXPeBt3N5/poIQYppaJkqQZOXXdrpdtq/sjzFaWr8sm4GZKTCUJtzkUCFUzNST/+PgQEUKso08ybsl55gXPyGdinid7Lpkk9/3sfQCT1zPMhDCJeAAQA9oMHoY5wghIpdTW0Pwf/uEfovYivCzruq4YOJpa+PXymtbr/Tjf7vfv9/3H4/hyvf3l56+/3C4zg0ZyWdMipVBYePQxhFM49DZ67wDOGLd15TFsjN7b3mrSS7dICAlIAtkJNMJV0SPzRAqAuwOCWbCkZVkZMSFqhJkTuZAkYA50iFJSIKrrkyJJzMAeHgjd1JkGwkBoYzhxpNwjdKbbzQSuAAogDwrGAOjqaEBPl2NKuK3CIWtKHA4UFt40wBNwYhQiQgdUTw5bySB0AvTaHrXV1v0K23r507LaaOfjrn1EBGDyANXAVAx5hCNgWpc///3f/fp3fz4/PraXi753BMi5OOKxHx8fHwS4cFohf7x/+/bt9/e3N2Hc1nx9fc0iYxgTUk5oPmpXdQcayLW3iGd//TN7AgIgM4IaYZSU4smNIBJhBjMbvbu6jRFItABCnOdxnOe6LJyTE48+tO/IvJQlM6LwXIkzWFxVZ2SIWs9MJsg5cxJEBI6t5JdtfX/so+pfv32/ZrkUHuEj4NTo6qPrHKYmxKVkADfrVd1mSYh0miWHWy5LKvOIdIuUeJXSSRhZ9XzUGuGEWCQl9WbmhMgJNBBn/CYEUB+aiRMRqm2lEEatXkfdDyrCEejITEKUtstrdfx43HV/mCuGvazLWc+Po3YANYiAy1oyp9vlcl034dT7mOCP0Vpiur4mFgYCYCJhDahDZXhYROggtQV5SWlbl7WUsCfoT0qeWUturq0LkARxECI/FVSoY/QgXNdFWBhwWr81Yqh1s6O1rhZuoHoOPUydCYlmFAAhCAIjJUqESIGcOAjP0btruJm2PgbBAszdwRHNLVFmFJE8dMBwcF9FVpbHcdR2TsbJUWu36OrX7VISv3y5HI+j1a7gAjg8Po6qHkwTHIi//f7bud+t1Z+/vqaczsc+NbegmiLO8+gApXDKwjZw9LVcb9tFkM+jQVBkCXNQRTMM1PBz6OOsgl5KGV1rb5ISMRETMLAgGiK4u/fJIZzpTgBnrehQypJKCWYDKDldEUWSiDCTB8AMNUMo23rsR+tdnhxIG6YAmJKouupQ51RKWRZgGj76UAxPLM30x3n+bb//wlv3+HH2CZIBoMQIiElSytRGjQBgCIMp6Ro6XONLXplkr40ICAAd2YEi5iO8q3YdhDjUhWi4D4BPYMwT6WwOx1FjKlbZOOdSkqI3749+Iq85LWZem7amChDAwPI4T3L9d7/8fHv58nJ7Sd/f7vX8p9/fv33sXy7btSRT/fbbb9frTdX/9uOjB+roSej1dnFX1VZK+Xq75CRv90NUh5omgIXT67Kul5WzBAA4JuaUMiCouyIBAxAR4EyudQRmFmFUOGqNwEByAAzQ+azJYsb7sR+tJ0nL5YIO42wegc/QH2TinJg8mHDd1iUlIRHhNoa6D1NV7UwE1LpiQp7FVgCgO2p3azqYSRBcpAM8ajvHKNtGFKONXmsEmvrtupSM68vLsnlv4+gNWYZZYpYkjAGq+3s73t58dHb/y59+7oJqI+cizBFoYimVLMV6fdku17Jeb9fwOB67e5RcZt777NuCQziEW4Azi6Rs85UAgMQBM00QkcQRp1b5/bETnWuWTOjmIomXHMzvx3E/z1SWl/IU8YeHEGdJs/fLROVZsyogIxHFjOqgIALkdVmvt5e1ZB1ax+gIzlS2VRZIjHtv8T6V2+ifg+SYEYaOYUTMFMATkB5mpu4RQAYzxxdJyLqpqap1sNra/JAA4B7NuxE7gH4WhH+oNiLi7B1KYVS73zXgRbghDUpvb99/HL2kOoaaAwgr4tlPABfmy7JNRFJOOaf0NS+P0x+PJkACFMO0q6ubxd8+Pj7cTAdB/KRtSbJ/vP/05fVyvT4+9r99f5cxOkVct+3rst3K0sCq9hgWfWQSmfAg5u462TYA6AAjTNWGUTZGgLKsKAzEXRUjEsnpY7/vR63HWSMgl4VYznaetT7DtmZ0EUsphfyzbKeZ9+5uJkRlmh6CAtE8WhsUtFwvpnrUCjQcQxEcIog+ejvGqB7BuTs0ta4GAcw6Pj40xvW2LQmFuGzpfP849rtkeaFtdBXmIsII5/0DJFnrqvryetsfh5oys2kg8K+//PqXP//y9vu/tt7LNUfA3nbtQ0TAbbSOiRLLPCORKMmM5AI1R+Kci883JLO6u/tSFiTsZ0VJc0CRmCg8F4mAR61HH2/7o4XfttsiaR6fE1EzS151s/ClFEA8agUkAESjcCMMJhRKjLQfO7pZ6++Pe2QBKZyTmztEcx1nNYA6rPWRRPLziR/uEMoi9JlnRYSIjMCQMQWTgqelRJhO/+qECwiDjamImRjjAPB4BjBPYkB8boZAPFXNYkGO1t5+b310BW9jJMF4NO09JUk5OeHwUVJ6KbfXyzpa/9tvv5WU394/ynL58y+/Xi+vjx8/EkZi3l63XNb22BVpD3WIjHCq5Vxy2XJaHej9bPfW5dl3S+m2bRlpeNRzr/cjI6eV3GwWQPPZJpLiSeYIU80pE2JizrnMqGVV1aGvL5mwvD/e9/2AAARQs7O1x1k/9ofBU2oyscnulp4qWjDT82xzrEuBW1l1Zhd7IFEQ6tDHY88i5v7+/m4QlISyoIINC592MdI+umltLSw8gAF992ZjK+VS1pLy5XpFYRm9njVav5b1Tz//fLtc6r6PWgH+LSxpP3YIYuSSl+t2YYCSMhMFwFlPiCBmh+ijm2s4qXjBNG3LEdZ6w0wpYCaL2ehmloj76I/9sW0jpdRqnSGBZoARqxCJqPmPHz9+HMdjdMo5j56CZpQOMhCzuQ0PA5skZw+QlGZU0URRR3hiFiYz+/724x1AmBVhnD3INAAAhxu6YRgxKwQyOaETIMtkKtcxoLmOAYDEXEpmZjcffbw97iScVASBCWmKv6aT0BMGs0jgfDKptT6NClNeMHtWAEDCQx3RA6F+fJgbiziCBS7CSNijEWHOAmEl5dfL9TUvgtBVW6tC7eNx2Mf5H//Tl//zP////vG//8Pb77+5qZRFgT6OWoe5OwUS4JbL18vLcvuyiLgBlZWXIQyRWWQmD0VgRK/d3S4vt5LKM5IawSAAIhE9j24ANSOyDigk5nDf9/4E9TDn3MLUfLYdhAQAh0UPH2ZBPHlmIhIerfVUCADvj6NIimGMiESqypGIwCNokkvCIWZUSyCiEKkNdYsRQASAOgGIHhYxIwIYwdwlJTUfR33c903yl9vt5eXl5XYbpt9aV8LRznC7bCu538eACCS4P04AUHOMKEve1hIxzsPCPdybjq5D3TRc1Sg8l+xJTjV1XdMqgnDuKaVcFmQhBApgSe7Rhh5nPc7GKVtA7cPNA4KQvlzWrVzt2TNhAMwpcymSMhBiYG91nMeyLCIC4MNU3QJwpjCNYR6RUkJG0AHgGAgeKWVz33UYALIQYG+VaCbAOiIyzGcJzTH5bNy5WQAicV6EEFOSnJK7Kfiho3eTJKK8lfSyrDkXNavmQLSsCwKa2SSe1zZr4E9azGewlYjkJG5ngCPznDeZOQAio9oQpHVbL+tSluTg6uquQ4eG22gEkFOp5m74P//5nxzi8fHe2nnWao89WH6739sYQpBZJPylbH/56edLSlrrP779fh+tq8qS8iVnYVbTiYwSROK0LgsDanjXYfEMD52+OxYpOcP1Vmslh5SzYnjAfpx9jG3bHufZXAVJlhUDAVCHGcHjPB2AEAP+zbc5Qz/nLL31LgHCklmSiIVbGIfllNacEtIicts2RqytR0B/aFMFSKY2zKcITg0CIZCQAREpJU5pbuTQqKPeA7IkYUqEL7drSfzx/l7PfT/2/dg/Hvfr5frnP/3d/XiM1hKXj7fvY9ScbuHt8Rij95mx1U3VzRGIuYgAy9707f1Bhr9+YQ4xwLJdUipDdQ4rAqDr6GOYepJU8iIiYTFgTIduG6OprkXCcSnLF5YR0dzkM/0KhF3H0epCaxKZoctqU8zi6jYD6EtmJgFzgTka82pjuJOkMAftrs+bBACYhACnhAIAwmJ2qDGAmc3mKyYAYDrhGEGyVHOFMBt+9MJ8W1YdY6/n4zwwYE5XLdwJuo15IeIns34mg2zbihDRGyDmnDqqTQ4/oIei2bZdLkspOZkbEQKgmdfoYaraiKhanL2v5fJ+HL//P/93ScJCH49HU68WVW2EZ5HElIAA7P54b4SZqGudaCD58vKyMCNA1+5MjlgkAUpJ2cyACAhVn/0sYfFwnDYchCxCga01J1zX5ehVwR2hjs7MT0+FhXmw8IgY7vE5b5to2ylbUVUkYGYKWCQvkiYsvPUeqkx4XZaXy5YQMZzDCaAI37ZLNxvnEUCAMHREBGFynHFDHh6AMNQFjYgSC1NaWRaR87GD2+V6WUtZigB4G+3++EAkda+jH60j5TbObVlvLy/WTxF072c9ereuWkcLRCdwgMQUwnvrv71//LifqLDvbdmyCQCSW0XEKYBRt2H6tKEE9Foh58QyYVpmFjZqHxDoFgi0pFKI4tjdzAjdYyYOuZu5z3GKaUzc+zxWLNzCI5CJhJmBwmOEA5GaRe9FSs7iqq7Ks+3GEuGMyMympm6Tr+oAY+hQj3BGwIiSZZLpUpKVEwD0erbWz9baOmKMo9bjPIQlE6vZdC+yiA2bdrOc0rqs04TALGjjkoUkAbHrlG3OlCpYF3m5rBjho89rxxEEeagGOJecU4ZgHPFxnGUpvGReMgD0HTrjaeYlLVwSR5h6wEd72I/2sq3bUkAohhGBiEhKyfuY3rOYSWYO4CYBIiKIiVlySqU89uP9Y48AIUzM4JaIIKCsy5eXm4fnWh1hDOVPhyaARXiYmxojDkCHZylFRBg+VB2NCAn8sqzrUgTJw9VVQ7sZhYnHBWd2DAhR4uTuKaPT7dB+ThEpkA0jCcYAjABAkVkuTsm8aXf1r7f1WgpG9Nbv+r5eFk58vd7249hbI+Lqfv+4f9uriBwfb3/++vL3f/lTpmtOgkCX2yt3/bIsb2/fP+7viSSXnFMCoPvjPGqt2tXivR0XK7fXG9MTT9h6f3L7IJgJ3JEZA8J8PG9XSYmcSA0/+gkBy7IiksVEvdvnYCTlnKeUsvfuAAFoTxkLhgdBzLwnQEGSZ0SXDg8TSQiYmJhwWbKqAYCGh3YhckPTMT2mpjbrvnOYBYRZJuxj1LMyIzGD+0VIUq4Uh1sd42/v7zrsbT/3c7xcS1pWPU8dGqphimocSEbT+wGEQ3WMjqaMswmnYwwzRQhJvOa8ZEyCENi6IiIjY8SsGhGhpIWJ3SMvufUHJUx50fA6WkfAJKskQEL0OeNOTIS0rduX16/aWgQMdyaW+/1Bl0tCDHjmtjMhI4ZqkUREiTAo79bv/Wzhp3utjSNua7mUUnJigFzymtLLdkHERz3NFAlTTiw82jDvZkjImaWrAzE8ByExBRc0O+MOQqQ6uhowavgIN0JyzigXSsRhHMxJgB0VMQhjyg4CgJGRkCAC7MloIyKcCUXYehu9rciJiT+Frh5xnmeytKzry8vrWfvRGqV8nh/nY3+5XcqaWWBb82Up9/d7IL98+XK+vQ81EVnLkoWWXJaSHent/R3NiDEQFPEIhX1HJA+cjGv0mOmuwgwkQsyJEelx7t3UegAimAvQbBMfvZOwmmk4IYXH0GFmMhOwzXvrMzRhNljm0wKRXLUP4AyypumonVDsqe0Ns+E+mcfm5uDhQZggYKiqGTGr6yy01AGIp0Te1XQokSACg68psRAaw7qeXX/UNtSbI6GYwTOUvvfEfFmW2+u2pGzhbQyLIJbCFAipFDDfz7ONQcKLpMxcUkqMEWZqQOSAgRgBhFByzkRqipPt6ZYSrVtiCtVhCE3NEd195pdJopySeiTkS9mu6w2dz30c51CHNScZNvrokrLMXGtCJBTANeeSS0Awwl7P7z++O8uyXZdlaa0zcSnL9eWawq0PHXq/3xUwS1pztBmqDrGty7quKefaVWed82ncB/eIZ1hiSpKFvXdzm4EREfDMLyLKTCXnpZQAMx86N27KVetR64w2nA+qWV1JpiQyFwTMa91sjAEA27oBkbo5gKRERRDdzVptpazXy0UkDzXwyHz8+eefr0u+rWm7XN2tmr3f3x+tuU79uPJTOhKIsC7p7/70S9q2b/v5t/eP2oeOUb0TMRKv65KTaG9z8JeEiaSwINFwK7l4q603IEok6uY6bC5qhBnRXnJGhPePD1W9Xi/7sdvzaDYLZxZmMvMk4u7TlvSsNYkiwtwQkCanzcPC52XkAfOsmF1Pd49Pw6G6zR9HpEy0JFkSryWlzIHzZBL1YJGVkmFHNk7g2APBfNR2bEVe1i+3bfnpy5fX7coOw+xxHm/vP4ZbIKSU87JphEWcvbHwtm4cEGaIlCQRJ4sJDhtDLecsKQAcmJ+GTgAh3rZL673WalMICDBTdKdECHGmAUtV/Zfv34vI6OPoTV1roARh13HJJUui8MQkQoTEwpie6VY+zjZGqKekiWVdViaUklhkQknco50VRTily3o5azvqxzgUIm7Xy5KLYxt1TJeFqc1cXsLJmXUAAHMwDSIqQjnV1iICmNzNCRCQRZBoDD9qd4h1W7vZ4zjULICYydidQZhT4pSSP2V8MIXZEJFzWi9bNzX3krNB2Bg5J8TobbjDRnxZV0S03tq+v67b9bLeP94QoCzZiE8dtj+uyzZj73ptkSQl6WpRK4e/LAvltXY3fQQFE5WcAEEIS0ropjqmeD6xZBZOEq0NQEA0d2IChKmYSCVPfpOZhcEwRQBzAwQWGaqqOqX/QjL7E8IQEQgoxDSHllNz87my56U3m3j+3GA0Vbthzy8XIk7i8OzTM2Eiuq7rKrKVlISBIhA6YFMHxEA++zhr9UAPMOvEIcTbkn758vLT7XZbihCFmqlFhCAsiRfOKSePcCYzX9d1r2fTMcZgSVMfQ5IC2F0j6Dx7V7XAOjqQ55QmdqWkRIKmz3zyiCAkRp9JJcRMJBBgHu4DAgDg0O7uGkZIfXSRlNwcmThJZhYEZlSzarofQ8OH234ew1QITZXTsq4rhNfW3TQhMmAA1jEYgBHDvLYxe6B9aK2NWNvQ3sfUT01o+ITQzISv3rsjFBGSGekQ041Az2EZIqK7e2jTMUwtItPmJAYzhzkIgIUiptllwuOf6dmfg3cM8+M4OgBH7O0kQhZeYxVmi6jHqerbtl0u28vtiqZrktHa9+/vj32/vl7XdZVc2nmuuYiIEJ+19lopZQObwPG927f7cX/7CIClZBZhQoLISabxR4iScMmJnXSMmIZDVUEqKQfh7EQKIYvMpjgQmftZa2/NI0op5m7uahYAcyA6N9WUwRHzdABMIGBEfI5nlF2EBWdGiIfPKEhCAsAI+SP0wS3m9ctcUqLwJaUlpW1difC+3492OjBSGjoex0fr3QNmFJW5kZAIAvp57HfXDK/d7cfHvVvkkpFIGZBiNh7Ox96GATMRLcsiNEktPsYQYXdVM/OorVvEJeWhNSK6GqqlJMNda9Wh/hkDQwAESDBnE2ThYBARw6yPgYS5FIcouaw5P85TICKlbBFGEEJDrTXrps3143g8ztNnR0y9rMzIREQBvfXez06wpBwBU8tPbjCgDztqRWZiRqIANPfWR+1DzYk4YswBPgJMHdiTUeOgampVzSCCkCBmMC2L8Bij6flopwYkSo9a77XqfEQRA06dP/TWwi2l9Ak+eE4ckyQGaL07UxEJxDq6nuMcnUmSiBDv59F6NR+vr69/+uk/1n3/7fdvUkpe1z5i6LGum7Y+PHDWnciPVvf+g5izoAh/PM73xynMPJusBEQoKFmSu34mRoLqiCB0HK0FwpJLEK4QU03ARVKSYdZ1IE36voaHmokIEs0NMCMMp6FvBmnOzI/5xUwiSSSeMQXq7h4ONtsB7OHz9J9v6zAnAHebtjIfTkAzyDKlFGO01tdU1EDb+HjU/TwN2aER03Bw5JTTPIA1aN45vXWt5zj5si6Xdalh38/jJlfB1N16PXQa95xMQb1qeFkXYdbWbYwkgoTTYwNEZSt9KBIQEgRQYFkWd29DaUZ8uyNATiWJzK7UMHcIDCAgQLJQBxASTimGziuORYSJA2NvZ2D8eHxQoCuM8GqjaleHcNChL6Vc1o2TTCjF+CxzQbirzgJam7bWPdAQiRkZ1dzcWQSQkCg0WJiZZ5ueEOIzLHqRJMTq1me8VoCbIZMw/VH/ddWmI4gT89Hb0TsSlbIE4nALDACvrWLEsizPKCGAKR/gpeRS5ukCwsu6+B5nO/u+tzbWdf3py6uHHcfOmVMRJn/sH+/3jyBO6yYk+/19+fKSy7rXfj/71PfV7q3VQMyZhbCro6TLujq6xogwjFBz0wHghCDPfW8WIZIRMTHPWqu3PhzuNrpPbNO0iFLgEw+YcmJmD58tmvlemmc/PpNByCaJjWhGIH4OW5CIMmePUHMicveYmgYSm/vGfPTGIpISM7tbYpljMgjYj5OAHvtp7lXt1KijecCyrsQS5uZP1ysC8cynYk6UtsuWrxeLCBbg1B106OhqFh6ISIDTCKiOMFQJSVVNTYQAPRUBwmGWsnBiFkyQBREIr9eXj8d9P0+LmSIXgpRTKinbsCm2dlUDUMCIIOYshIiJBDCs107EKQn4M6QHelNVcKynKsIA96dPF1joer2VnC0wIoYONVuypJxHWHOPgD5G66PVxpJTyoBoahQ+hpr7GIrESIE025lBiDwJXCKzdDMLjdkvtnAvknIqOXFOMlR3G45Tj0SBsJ/1aLWrAiAgWLh6DB004+wRp51/OsQRMafMzIBopt0GdpKSX+XLftYRoOHdjYX6qUc7c01ZaLtu/y7/b2/vD0l5W9Y1pUwAC9+PVlufMT7ry5YdztqQw8CJIacsiYdWGwZohKgWqpqYUk5EGBOe4YDkTLxiYaKUkrVBLLYs2mrvI/CT4eru4cIi8jRvACIj0mdxz4BMPH+CmfXe3XzAUAUkEhFE8ogIICZ3N7dZHqhZPF+bTh5PkwZCKYXdJzRovqrX7WqBY34aZOACPsK9DYU+wn1Z5s6GJImJcpIkRBBV7Z//9jtiqEai5N37UEQgYCaEgK4aAcyckgDhjFFiYUTwUAoGMlcF9KUUEcmMG2cH6GcdfZhqN0UmIgyk4zxsqM8oKkQHtwh75gELIrpZP6ubE5JO2AVErOvq4cOUmOsYp6uFs7AwzqHgupbLurqHhVsEEhITEDtiHd6eDDoMZM6FmGNOAdyfuFb1edsJkwYy8Wzlunu4zZFYmIcHED5BNcx5KZxTuLIQrQUQzAcae0RVO3s7W+uj45x0hns4I95ebtt6GWP0PubkMkkmovnmQQDCYCIwy5w5l1r7siwA0VrdluX15TUJ9VYrU7leX7Z16vLz9UrpMlojxpJKOFBKZV3X6zUQv//4oaMzYkQgkYeHBwYyJgI2UCJ8jlQ9hChJDo+jdbd6nGfXcVm398cHE5dtWwBmE2a6T9xDSIpkCHB4Wgrn9zgCLBymhHDeA8yA4BgYwUjzYLIIZH4m7IXZ8JQEAGs9AYCYUkqSiCDMjGkWvjxRBmtZZojI2dtx1qp9ju8TIiLIlDC5MgTBE0hBSIllyqmGg6nNewgCffajnlovCo9hZu7EnCSZu6nNBqMwIAoiQwASJEaS1FTPNg5oHlFHt3BHYsnPsTNSGzqGM5N9/kFCyBhI9GSAAdY2IoJEzIyGSs6ZCBnT5Mv2McyVma5rJgRXtNE5hruF09n7vZ2BIDkNt3HOB/t0tEAKTCwGgRHhBuCBOMyeEV3TLakOHjM4aBZ8AGGqAKhh6E+RIzMDoYaz29k78QEAfYwxpqkqnNAgJj8VEQFRWCIAAZZthRNTGWFOREwUHqqDGISYEBPxzIQtKfsljj4AfOaTbktJQq76+PjIgesGtyUHcm91P+sY6r1fty2xAFGZPxlhW5IzZpFhdt8f3TQiCERmVYs62ytuHhE8PUfmzEZEY4wRrhjOSEQW0WcLgXm23pkkEyeRyQH2sPnXDAgEBAwHR8Kc06z7LWcFB38G388nEEKM0c0dAZKwqZoqR1y3S0qp5BwUbZyjG4Ym5MkPjAgKZ2INA4IBOlwZSYhIKAPNNlR8wjkZEQg/qy8HD0BQM0JgEZwmJ+JZxmiYY4QguQCAqk/nflU9ibNIYhZJyDSz3Vu31tpQC+/PKPInCA+ny1KSQEAfQ4g458IcEQyO7oA4zNUCkALZIboDACdXmabDWtt5nmrqpltK1+v1dtmeaWwsrqpjAEodrY4GRCBspqY22YxowR6JuJRi4V21I0ThiOhDCcnDnzIIxImrIZpfkLhsGwT00c9anxLZiPM8ZwUGOnprH/sxS6tZ5IXHVG14PIPfEaFIcvN2NvrxYwI6CAAhRBg8hhkiiHBizkQlpzl/+PMvP+/n2Xpz1cu25MRuykvGlHjmhCKK8KjdzUrOH/suKZV1JWafMD4ARhSRJRfv9XkazTceEiDOaEcIeMJoAcx93vVzIDh697Jc1wsCNNWJuU4iEdDNlpyXXOYSU7fE7ggeMckB8wF5WdYvr6+j9f04mMg9htnQkXOejng15WdrhJZc3MxVBfl2uSy5IKCjCYFxGq2DR5gzsbsBghTpY/TWwnwKcmYkQgDMu+6PcktEWCRgdnKNYE480D/TMufUAimeD/c5BgUaY6jp8z+ZEXGMAebMYqptDCA0n6m6OKv/P0wFn91bYppwE4uI+eABADMIi4CwmEAjZGYMDzMmIHBBpj7GcR7Trrqm9LJdU8rpOaSClLBHc3OQGPMvSmgYjhCENhQ8EtK2Xr5cbiVnVf143N+1WmI302aEgUQMNK9p/CzdZpNu9ii3tMUzpwTgM0oxIhwwPMB9NrgQ0QEtzDUMfB5vam7mDk+lYatnkiSMMjW9qqrateWSGDNPk69ZEI5Wk1DmGNYhvAjdLtvzTHFgSinPzChPSV7kWnIWhDH69Xa53G4/Pj7uj7tFhNuMekkTKNQaAQjzbE+Zk7o6mOT8lDGrAqIQhztKYiBByjn1PohZksxQvpgBTGPYHKcxEwDP0RsAETKSMOckEyNuqmP0mcuGiOEzesvNlAAuy4r0XF4YIUCodklly4uN4URrKa2370ebJzkTC7LFU2QhzHNrBWBMgIdZEckptdb0j6GbWyACBDx9GhiEo/c+upAE4NQ9IZC6qRoTP18HiAHw7Bw+g8Xh7A0A+ug0HwVIPumj88mD+Czo5/BOn4ahuQeetxOSE044Dn3uugiQMMHYskjv/TyOMUZ4XLdtS2Uh1t5b7/y8dg0BRRKVQu0MhekgnP6mIJwhRIZerY+qHt5cLWZuNMwPlJNwYjMPU4A/di0i0r7vTLRu2yxbc86qKvKMd0fA8RzKwKwgn9vj80swZwsspGZEVEoRwak4YCJ4Nsji+bRNQvN5Fi6IOvrjYyAEmhYRBmi1icj1ej3OFh7XZWUxOw5CLCUTEb1c39/f+2hc+dg/3t9/uPvlemFM9dy7DgRPQm6emBKTmsHEHhKZGzIHooFjUEopPGaat5ox8XEcLUxd3S2GM5IA+lwmnOZMa7YtCUmIBCnc63FWj7afhEjMKSVJgoS99YBQHQiRmGjeQ2FmgRHgkIkxnCf604OAqoWah2ouC7OAuoafrT6V7UjNnrQEiKcCj0VwjNmnImZAVFNEDHdGmK7IcGck9wAE90APZI7nFBsini4ZAJhkA5oSPtW5WgIgMZeyeHjr43M94B/mtTmPnx6DPwagz7OahHi2WIxmD9+NIAgjgX3ZbrI/HhDBgDnn1+0afYC5IKramJN8ZECY704h5mkc8DDVMPNwRETCrqP3xiySpYGaGysCYWZxDAgwdyRCIrDnL6FZmkBMtcJzNDnjj9x77/Nqs9myZZykAwAYqk/oYnq2n2e7M4lsSw4frkrAwsIpYUZCMh/HuY/eigiGM6EIJS4QnoRxW1mSpKRqx9lUAzm9vl4D6P54H73fblcdffQ+zCTJGD1277Xa6EzMAW5DmMzJu0Y4EzACISBAYsZSZrUXpkiIzKbmY8yjiwLUDV1rb4/RFIMBE0uRxIXcfVkXDgQIi5wg5gWCM34iQlUFSV2XUl5uL2Vd7sd+nEfKoqpumlIiJDcjIiTq/gSoXNYtIQWE2jCLklKSvF1uez0mrh3d54MtALZlWdc14OPsPRAkJWL2iD46IKScJ+1iqrGICJkT01yJQFRyoWCLaWZ2Nx/TWokOgOEeEDPPExEDwp/A+5ia1ogQoqVsb37vtf4vcnr8XPExr44/LJdzRz0J2jGhz4hh7ooIi9BtWf7y0xcBi5fLZeImE5ICEAERI5G6MwsgxwwZVsssJeWmw2OAOSMtLEtK27JkSftxdNM++jBD94wAAYmTEgwzi1CbZEEMM3eAILPBRM5svU89cK11boC5oYl49rMjfP6tIwKe6daOYcIcAQHAaXpmFNzhCfECSpmJZ7UsSYhQmAB825bb5WJj6BgQYRHa1YE9yIH/8V9/C4f8t29fX1+3dUFEQpCcCDx6HLW+v79fLpeUJDPPN6W2FohjNNOBAMKMEK6aSFLKXTV6C4cxegCQCDANdXeLCCEOpmaqGMjEjBl5Tfm2btuyvn98zAcPBq5lAcY2Ru+dGElE3RCBkYqkpZRwn09ZdwsM1Q4B27osuegYCLPvzGPo6AMvEITnaMDALCllF456jIgYg5AyctPRtDOLMEvOS621d4vJdA1Vnec9CzPwlJyggwiVnJ86PYxS1pSyjXDTuWPncYCILDCXewAFwFCd8+xZLBGRpESA4d5qc7WckkWctc5BNX6yUBGeoq/5I3/cA2Y2B04YPt1VFlpS/um2/bs//fTldpXLsmx5ESL0iK6MxPP17K59blPzAIwYtUX4khIijKGJ6LpdXvJySUmmt+g4w4GZc0m58MoZhWVZfuyPb+/vHtF67+qEMyAI/FkEhs5R2meZOz/9vOMQAMERZvVCk6k0ZwiMkUtOIr0PdyfC+asJkWVe7DBpjdNUuS4lMZecM63ruqgOVxNJZiYsQ61266rHUYcBAtTWWh8i/OXlBgAQzkRLyW/vP378eFuW8vpyMx06+XMAtbfen/BnCHoCmxEAQJiY2SEc2WYcC3H48EALc4dzNAgApmlGR4IkTADaOyEMHZKyjsElc0oePgZgxIzDIObLui2Sk4iH19bCPeVkPkBkCk7mSokIQMwpMdHb/nj7eBeRMLteroTURn+vx6MePYw5OeJwm1O0iDjPyn20s44xjHHqbyDC3eeA4lmVBjCADwXmmdMc7pjCxvwmT9li4JxhR0wPmqrap5hn/gvNEgdJRIQoLKbyMKesTzciRcTo/Y+R/4CYz4c/km9UlQASo7AwgjAxgtD6erv+/Hr7ellzFrktG7irPrnEgsgB5C4e7B6AARGENq2c7pQ4SQpzBr6mZWGWWXCpMcCtFE4CRIK8SFmvl+V2i7/96/f3H6ZjntzwFCrNTCqMwKE+Q6pmsg3CvAchkAARfD4kJKVETBDg4YCO9KzMEpFDeDx9YO4G5oQUga1VdxMRYpm0Y0IWFiYxa+a2bWsuiSXvZ3scFR01nES2dSkpffn65dz34zxz4h6ecwLmr7/8qZujpPV6C+Lffvttb62klCStZRVTHerDiAGJZ5csl+IA3lzNZxVqZq46TM2cOKI1QmREBkIzAK/naa3llEgQ3HyyVsLCgIVut0t4TApLexwfHx8tlVIyEDlBN+29EcK2XCggzMCAnBDgidHNsi/r0Sr2saYCjtXHXvf7uXfXkuS6rAnJWgcIRkIkD6hnbUMRmQAjcOqF5vszItwsiOwJKY5uKjTnWd7aIJruSgKI+cSAT9WdPXfZM7Ns6riI6CnxdTdEs0FE6njc3wNxK5mJtI+X6y3cW2tnHwqfNClAIXKz8KCAC6fXLy/X26WUxBACsOacEiFiSYvYGBCRc56q8ixpTeLm3UZGmvBmmEFMyARsbuCRJG0pLylBuIYBQEDknGF2Bj0Q3cO7jn7/aK0+IzidiGAClubDzsyRcNKjEWk6aABw0paYaaqGcs5T3pNYIsIDkSXQ1HSG2064Pj2bwk/6VEAMMzeDXCQnJiYAHdo9GldGyCULE5haBIXlxEM1JRlqc2J9HMd5HhCmKkQAhHnZJPEvv/6l9xYk2/WlPI6Pjw8k/vrltYz18Xh0GGN0d3ACmfGViPLpOIwAm9A1DwqYBfvzf5lnkiQFAMZoIzwVUdcAdwhM3N28jln5IGIbvfUREVNB2FWBCYAMJ2sPMZDmGFhDmIXlUrIkPkyJyAIZKUkmYOM4fHTTxHTJZZMUpoAxZaZdLSA0wgKImIgCHJ5NmGdBZx4YAISO/oyaBGciSXkWqhBzGsNzUOUxYytBiOZSnz1uESmlPP932LPF445zmuQmQsJ5W5YB8HK5MtJ5HP/0+zeNmF7FWWQKwLZdbuv69eX1ctvqqOe+J0YiNo/My3LbmJKMMZacGSncTBVzEpFufabNCAAl7m6hVvJiEGdvMVWfTD0sIybkmEc5USASkU5mymj1x+99QqKFc7DrGL3PNLhJYJ9v+vlWwE/HBhMFxnCbj+mllJzT7BnNft8sBZ4HTxhOFTgCMgOEIAUTIbo7ATASAQhEAkMLFl5S5gnPWJa1FHdXdZuDfjNBROIwY+bjOEyfV/P+ONysrJfZFhCkH9++qw5GSiy994/Ho4/eamNmyVlNScQstDfJueTyOI7wQEZGjABmySkP06FK9JzdrjkzMTGta57l2nQNBYTaszHwx4NBVQEp5bSWlQFnSGgfo46OEcIy3x0yOe5EiGBqYWauMeVzEFXHJHOZqQghoIeP3tAdwomQmNtoRLJtZdgYk2vvIcJMPA/peUghYoAPiwk/7L3PqRkTPxnMz4ktTr2nzwCVz8p1PlpyzvCZePfHj0+5ODMTU4Dv51nPGmat9yKp5PzzL1+b+2jNxhCc8ZXX1+tNgMJ9f9xrr+5a1mVitF9u15LTOIcggpsHOwIQ4OjjRCCkvCzQh5sTsUUM7cIpIrQPBWfmrno2WJHK7eVyvVrEx/EYqsP6WWvT3vswD2JOuYhIqJHOG3NemPo8r6dROiwCIyw8goBZRBYiWpIUeUp6AMAnTwpRXQEDiZk4ESdJQ4dDCNE8bpkZn5JSIICSaCnCiCWlJWeEoNl98ABgANBhpjZXtoUuufyH//Af/uVf/uX7t99VNSeZa66k5I6jtSWVt7e39/cfP//88227/Hi83499/pyhfco2KUkdp7uPMWYaNHYABxGWRMICzGerYQ4RFLikVHJGeppJIxgRGNEdffpViUop0z04n7kiTERu+qQSW0TYLJoBwdynGczIEj8pPR4WEEKcU3bAZjpMfY5zA4igpDSb9QhMiQ2JO5IgEIjMCYADors/+ZWIIimJmOoYBuGEKEgoiT9NeTQTHRGH6mcHHEspLDIFkSWn3ucwVOYQbc7bhDnnHBG1VjMLhABoo4d5YmHwxHjaAIhrKbyW3hoDfP3y+stPX1318XF3cxa+bmu4I3gp5eXLa0qpnmeMkGmQmDlzs1Abqtt2SZI8wFCHOXgIMnowYpi10TgnERltWMCaMqZ09Prj/nH2PsIcAOcZiwSA07Nn7u5OiE8py2ei21Shx5QuPl1QQAilZCJm8KdsLrD19nzezdKBiJFyStuyYsDZaxuDEQhdCLclY8As1BBwSXItKeecU3a1MQYiIVAEmsVZ+8wFFORwCn92ka/X67fff58LbjamzvN0gzBHopfbLYksy3Icx77vLrgsy2R+TVp19NZaF5aAMPOckqqaGwEwS1gMbdq7EC1lScQC6OGE/IclBWASg8g+OSJT7zAbZWZGz/rLlpRFuGqfj+x5ZDo4Ezu4w+cEmkiYCbzk3MOHh4FPaS6Fp5IRwmxYuOR02VaHqGYi1Ea3CGaiIAx7Wvpcp3BddUxBMiESciImJE7Pk2tGloTTUzIKCAA55/ngmf41RMg5zUXhpu5BAMycRYRIVYUQHEa4hSMipyQpOeCpffSB7rb067a9XrfLur7eriUJJt5KDnckMrPzPAnher2Vdbs/PkatCVgu26ZjWDixSM6EYKPXWj1NgXU27WAxTYZEXHLpbqoWAWraAH//eP/t/t5Vnyp+YUBkIRFx8zFUVSmg1nqelUVYCN3pCcVy9zkHQQSQnGbcBhLNlg8FEALO1yGRuwP4bPC6mmKApKmdZuQkETYwQhCXnAmp1za9UWuRLJxYckojoLWBDMQpkE/t394/amvLsrIkTnItZa/nP/zDP8w7as7VSykRsR/HjPW27rnkdVsjoCzLuq5HP+cof+IPkggT07qMrr332Su8bpuZDx3u0ccwCGZOOV/WLYuQQ+2Ho0/8oLsjEnPOOalp1zHGqLXOzRlP6T+FeyJZlmKq7BhAk8AIBDM8bLaJLTwcjHFZCiJkN6h19spml31KCcLNHE1cOAtTHeoeADjTfjgnIkYwRJh/9CzapvAWIgAiiwjL3MFu5p/H60xTnRaoOQudBx/P0W8EAWSROWWbbLLZXulNZ6ZGTAFIwExY4s9O/2yYjqHv7+8PgNv1UpJgeLgn4USECOFWhF9eXpfL5X6c//r7dwxAA1nLAstq4Wra3BgDwsH0Of1FZCQmgkAPcHBkSjn3esYYQoRIuw0zZxEWQWER8QjCQHM0zyxOEADyGWTCQv82tMMAAGJk4tnzeioK51ADIieZSQLMyDx7CBgBAjRMZ/k7ZiyKMDHBnFwQgHspOa1TlupMDIBtjAAi4mk2rRqm48dj/36/61ANWDfkoKMevY/by22McblcwvR2uy0l7/tjmHl472360FLKampuLy8vpZf92MN9vjKTpJRSZPiw+xxyA0DZylr4se8atl62o1W1EQCOEAjDjZMQ2hiuOuUFgMjhcLZT3cwU4JkIMw/Ry2WzMXptpgOerYWJKwpAEqSZrKpu0COLDPfTBiCq+7auATRVxQSQE4fzBClnYTdrtZ5dP87WekciSdkdw4NpEq2diAAhZja9iI4BHoIkxPZ0JdtnQBYCPO1sbfYuZ68vAmOWbPjc1TN2aU5vAD61ksCE4OARjM/Vgk9WLSqOZ68GwdyPo9734zxOM/v560teM7oxwO32ent9Pcf47dvv//jbNwsicwEPKRIOqt7HQLNCKMJqFoDmqhAI0E2BubZeR5OckkqoJZ7FvgGz5Cwis6p9rmIdbj4le+6RJOXsSHi5Xs7zrLVOvcPcDClNxgB5+HS1frbYgpAmhRcifE6zI9CImcF8Oj9gTswjssiaiJB6q2FGiARoqiBM6xIANRTAax1qDkd/nOf9PGY42jk6dg731mqStCwLALSqZz1b2y7bysyPc+/m53kysyMsABH+2++/CfPL9dKJgfjLly9T5jBUu2l6Wkx8fpiJ/WqtS8kw0DS6aZzHGaCtr2uSTPFkaQazJEm9j/OsknhZllkpmtm6rlO8/VCFOY9nIvM5H7CIGSc8peaJmHMZZtX6vUdvvXfdLlfEsDEQYFmWbc3hfoaHznHVQABVAmFz7wAAlAtJREFUnxgHQnHHoRZIRAzaInyexD4zSsZAgDKTDcxUx8T1RTgQejg91do4oU8ewcJh5maIgID+bwoxfy5nmLYeSCkhwKkKHsI8O2ZhAE+r1RRgQ7iXJVNA6+MYAyNeb5v2KJLXbdsuW0T03h/7/mM/9u4FWUZYb+YR0zwuEQikk97A+GhnVXWi4UpMTUdAlCQXXKc2MIhgcLinlBFRVc1UZC5lQOLZX5GUSKhgjtkxdWCSpSy9d9NOs4ELEM+pNcXMgY4IAyFecmZmtOjaZ680IYVQkHt4t3B0fSYulrQUSfI4jr1WJlpyjvDa1MOJxcG6eu2jqfc+zrpn4ct2KSVHODOFA2Biordvf3M3UxWmfb8DWGvtbANIANAjznoM65frlTO3Ohz5+vLiY2SRqW7fz3qedW7vP0Yzqtp6NzOtp+pw8N7r2UKQKMCbWTMImF+TlIQQCGIV2bY1r8vj2Fs3REhJchJtLfrInFi4j9HG0LBAkOkGZAigEX6v5+OsSy4o6OA2BiNnya01GwqINroywOwduQ8PEAFAZ14uV3dvvR/nCYC5lNmaZAQhSkmC0M3djZlJ2BBAiCgBoNkcTyER8UwZcxciQCJwCpiAloiYzPDnCAwRaM4EIRBZZNk2HSNqlSTzrAOMGc8F07eFTEiBmrNgKMDICTKnrSQmyCUv69rNjvN0IOKkakAUhNJjkoADkba1oBk5AFEgtYiP1n7sexBJlmXNGsZE4QYQkliEzaKwBAUGqOm01/XeQ2SOptXnZAsmWiZxcvPZGve5+5/8gjB/AlMDAeApFBUkRsqUmNhJNZABkVgYhptP3UgEIM9Agz7GfjRKevbRer0ua8pZzdtoKWXk1Np434+9jW7e1DLAl3W9Xi45S60HYgCjDhfCpZBpDMDL5QnjJsLEokFMMnT0Ubdtbb1erpezvlFKa5LHx4/zPNT0qP3jvrvHUvJ8LURAf/oZvCzZAB7n8HAPY+acU6hbRB0W7kKcgHLK21Iy0Zo4JUFmImQmFl5KToRmniWJyHALHcREAYSYCATRmbpHNxjuY9jwIGEWJCAw731MpYCFt1ozY0pJIdSDE0eSptYtgqjpaKMPHUSkiiKyJDG3hCgIhsjC7ujuXccwI8KpSnB3iEB49oL+6PeD2XQOQYCkNL/vzDxz+ABAYApQAIgj4vHY1cynuZH+ja4+6wRE6l0xomQidKa4rPKyrpnlsmTmtF4u6vD9/vGxHy+vX8uyMgKFW4TY0xHqy7Isy9LPU4cSoYbvZ33UU91m9bYUOSGI0IcOHSCJEG06ZYgDws2JiYVV1dVYkOaLKEkSsd5NLRzm9BueICecHAf8DPWcD8GAmRtJANBVsZ7EZObIFNO4jQGmboZTr8cMDKoaDlU7gZhbeDDRmheSdKTCpQzzs+vZx8fjGAGAyIIWMd9Y89UwRgeIJS8UGIGJZM3L7eX28f4BFCa+72etDQkmoQ08JEtO+f5x74kF8TiOOE6NqVLHdVuZudbKPLOEggGWdQmCox3aqhCty1JS7tFGrwjBREtOaPGs5JIk4TkXRQ8m2srCxMd5mo5lWQKgtz+0kDHZW5loIIA/ozKZCRDVLYKXlLS2+/5ARIfoOhKhe6iaqgUCsbhDV1MDt3EcxwQrzRn2HOBAxBhj0lmebnp3V3OfbyYi5kmgmGpKna0/JvhsBtkzae/po5+XJHz+M2/LudZn23eOsf/QPvyvewAY3cLczfRyKV9uL5dS0EEkL9vmiPfjcbZ6nMfZx1k7EYHaUJX6B6uaaIavAKG61j6Ofg4wKSLCM29NIgRlxCicIkDbCCYDH6qmFu4ppdm1RJhZFtMAGao6X+STU5bkOeOAT9N6YgZ3mlZ5AMaZluWOqOgxOjm5x9wqMWNQzdydn8BBBwD0cIABgDrcTJDA3Hpfl9UWeTvrx2M/W6/DmhowL8tCYH2M/dwjFkQ0895aTomR0FGIU1mEeEkl//TL77//fvQ6u5zLkn/99dd9f/TWmPD1ers/dkpy2bbR2lEbpbRsGzMjUet9tm4BIZc8KyYg/PLyQjudrQoguBPBlOVCQJGUCgvT/rjPzgkzc04QcVnW6+UqIqP1lHMupbamZogoLJMgRFMROWEsZhFBxEQ4BfqOQEkgYOIkJkGkDU2AkjKYmvkwV7M+fKhNgfpcbXO5z8Gau9daieg5nJ4tbCJCTCnDEwRtGBCEQWBhMDXtzwnXZ/voE170x4jgqRZxnxJJ+LSI0P/Cl/7j3ogIFJrTpNG1vFyXVAhoKWXbrobx4/3j+4/3NnSo39/fHDCljFYJSfZae+8Q8TjPUspsMDfTOrqZBUEWAldtZ05SkogIliIpn631oePpPA6cuFP8PPVFZvN3ZjeYm4JCOCHIbEtF/IHtcveZqwMAmQU+xa4+/adEFt7bmGOgp1rw0w/ASE/vVUQQHqNpuBAL4pJKkTTdg/f9+H7fz1Zb124+TIWIRTJzgJ21upkQgDsBrblkyRRwnucYZurMcru9AOB+Hhqg4ftx3O93YcqSGIlSuq7baKeV9PL6OvztaL0bsDDDU97nzYlo27ZccoRZH0XkuiyClHKaH4lKuWwbRJRchCjcw6w1TTmLJADYlnVZlm27HPX08CkxVNOhajPREDHPdvL0lBI/xcFIhGxgQwe4F5br9dp7vz8eQTjxiVNe2tVmH98Dxhh92B9zm/k7zR6kmc51Py+H2fxFj60sc4jr7iTiTgBgGEGgOrksc+TjQzsC8ucemKv8UxUH8Uk6enr/P3tfs1VIRE/cy7MFEiI0MV5FEpgL57Js6vG+3/fzHGZt6F7rXlsADA8mZmIZZurh7uAeiMNDTbtbt8FMIpxFCtIvt8vKyJKYBUjaMOcEDg7GrtOQPrvsjDTjJewJ5BF3V4/59/zDEYYAbva87SIICSfQJiVVmyYhIYInTxbmL5/uHHdjIkxJxwB3ZhHEdVmXsrydj28fP9xMUl5SWpcll+IIR2/7WWurahZEKTELmbamruAdIGL5cr0KAkfcrtfXL19qbd/e383sdrvhcTzOGhBlWY/zCAgmOs/zsq6JiRER8Ha9fq+nDl3Wsq7r3vownfHrz/DGCI/oYyCR21DtiSXjjMLMTbGOjg4SUcpSStahZ++9VUL88uXLsqw6xnMwxsxIHjF6H9N3DZFSit4DZnLgp+uIkIlSEiYhYhvNR/cAIJl9R0SYWKQxNKAFhLqhB6D3PsZQ95jr/lO/iX8s1rku/+hgPs9jeHJcPhXsUwam8yzz8PnZkIhKngPouej/ONQRcV4zfzx+5kL/Q+WPn5rnWXAiYmb2MTjRz69fv768rst6uVw4lce5v9/vrfdhbhHq0XU4gPqTECNpWYY/6VfNjC0AaebYMiEBUMRtW//up5/IRgByKhb4+Pi9taERlDDRNN9GQtokZ0ngfrQO8iSTqaqbMZGk5KZjdDfjT9cmfIqWC2cikiTG1nqbCpjeGxIyIhEjzE0f89svwhTzzAYfhiky88vlerRqra+5LGVhYRTuNhwDwImwSELCACEiIHA1IFy3y1rKtHQv/3+q3nRJjuTY0tTNzNwjIhcAtZCXPdLd8/4PNdPTdy7JKiyZsbibmS7zQz1BTlKkhAIUMlER4Wa6nPOd1hjp/XYbasO91OpE121XVSJUpKmaCQm1tiKCEDaVkIDk6XxWG49tk1pKqzqVUZgwYbcs4u6ZX0/oGG460lDKAFUYufX75nNSrT7n2Pf9cQeI5+dnIppjEOJS6ul06nMw0RzjWAMJM4T+xOAhYmKyICDSIghEJCwNQnWAh0/d7o+IaFKYRVUfj8eyrqWWANSZSLZssTIMTv698v6JH/1ZysLHe9l1HuYbRGZmYmQWcMQQEQRAIlP1CGFRP56S+AhQyh/08xnL1iLnvz83SfnN86k4dkuIgvRyuvz1l9+e1nVZVyr1um9vt/vtce9DHVAdpNWmp23fzaapArNsY6h7HEpMtNzBHRHXEBBhxgGVuBAiEbBsw7LwaCwDLTljpZTXy2WpDT21UHheljHnj7e3fGOIJAvE9PikdmqMrlOROdwBvfcxO4kIA1WpIlyZ09WRo9WSUsTUBUVayXyO2ViEyKYSY2UZMHO9EgDT7DH6dBWhUtdaC0CMMdzNwlio1Xa5XDhijrGsi7CY2vv1GizIjMxdp6l5xL5vM2CGVyk5stjcT0ubcxIiEdda7z9u02Y9rcuyvj2+ufa1llpL7oMyOm6qEppAMGKTsi4NsvsJH+CELISj7266LK22drlc+tA57fl8qSw25uNx37f90I0gns9nd7++vxMdhGz3AMpG01VVLUy9FENCCijES6lraUikruYOzMu6lFoONTMAQDAzESe3h4l+yniIyN3GGPmhhJ/lKLNHAOGcBm6IWBAMIhQrYcGj4jdzMxOiItLNZwB+pEfmJ37OuW2be4h84Ps/PuvhkaLwfAgRMdc1PvqyLL+8vF7W02lZUGSf49v1/Xa/pXf3/Xrdp5W2eoADuHstRUTE5gSIFCqpGSNDQJLXMTCQhsdtzB+P/akUBx1z71OJuYo4IocXwLUtr0+XTy/P6LBve0beUlvf4qZhM4ejmm4bcpQEOwEEIgkfCEXLzbjanCMdrLWcW1siYuoEoEikKMZj33IUSETqOsaQ05mKIKNBqPs0u297KbVG3WdSVzXCXHWC59I+uR3p0nR3YW7LWtuy3W67+j66LFEKV2Emnkhb7wYY4ee2npY1zGwOD3x5erm+X7fHRoiAlWq9/7hf+1jWFafNfRNcuYjBwa9mAEYCUCAopZ1P67IsLPIY+7jfMKDV2loLCBa5XM61NQAg4qdLaVLNbN/6mHPqTF3purbny8nMbB6tsKlONQzSY66CqQy3GFIKEidK111nn9JKrRxYkNk0Q/ecESPQ3YuUSP0hAAOY6hyD1zXdHG4eHslgTgKXgQdRZNZ5hKvmZwyFzBQBSiki0pYFf3Id+5xjTNXEm+bpJixO8XP4Y6b5HoVb5q2lKk5EqhTtY6nl88vpfG5UmGv1CJ2K5ivX5VQee3+/b0P7vb+pOyKtS319foIAaYUBEXJ36MaEjOwINiwcDCMCbmp///F+LyVVHEeBVjjcFywL85dPz19eX2yOOQa0Mg0WFAXIEtIQzD3cT7UVrqqhahYTEQrLupwoYozkfCI4qKog/iRMARJzAQSPCHRC4pJyKyRma9UwBvht7Aw4IGa4IW5j1N651G3rXacOcw8iZM71s+Xqg5DAfd+2HlGQC8meRBG1GB25EEtBkirTXNxLwFpqY5nmSOLqt+v2eHRXD/ehyq1RrWPbw/zLy0tfV4fYRzcALgwIqWpflvbLl5en89nN5pxI8HS5rOtya7dM1SYiAM9zMccJ69IcbPh0hrYu3QzVEKwQVmFqRedp67u5q8U0i0jUGLVSIjQIESndiKFGEQwRYYXEY2773Lt57s4x19WMWNa2TNU5JyCWnBMCFGYPTz3p4VxFSgSSA40xVT175qxr3GNMRRuI6Efe3LHwQWImio96OLe8qWZ181TIiYg7521jY4J7EJZSWcTGrEit1Odz+f3Lp5fny+l8olLQvVn5/PTMXL5+f/v7+9c+FIjMTN2LUC18boKBsrQFEPoYKWJhxMKs7nConYKZAmKfo/IhXs5xXlaEDHiu9bKsDGAQyKwe177lQvJ2v5sZEBCRBKaL9MM+xxHW+yiAa22tYO+TAeu61AQgE2w6BTHCANwcECPJoowiWCDAMYXT4RG7Tgjorn2Mg8RFxK3E7Ps2ttGRcGlnZtr3HZKkFkGIBTnH5c7YdRqEQgAdwDk1q5W4FH88+hiFZd93RHx6uhDg2HuudbN3tK6N10+vn678LsQvT8/v99s/v3199J2Fz3xOE8zr88vr8zlCr/dHqhTd/Xw+v76+Pr+82pyqmgagnK5s27aPMd2en1+IhdHbsnazebunu83NW2tPT09q9rheR2IaApC4EK2lCpBbRMCW2xMPIzydT+u6qOtje4xp2Tsw89IWBBAWYS616O1mZsuyZNVqZiI8NaQcX6mTzSfB8vGuNT7MjZG4A6FSam6wcsWLiOZHSMrPHdnPwb+IUAbSESFi4nZymIvpIgIsCEJ0rvJyvjyf2m+fP51PZyS2qQGAzEB23fb/+vrt71+/jYhg8kAIshk9+kMeybnBxJFmIVSlpCpBEmmAUYsIsSVNwh08WhURSUqrAFzWhQH6vgOBIeym7/v2/v6Y6goOacSgSB8dEImU6dPMUsnXx6gip2UFBzVzc3UbNt2AhF/WswBHIBMiZsXpiEAQiIenLJH/Go6IFjFNGYCF99Hfb7dH33tYEAlLAOx9jKFJlnUPJl5aI6Qe3dyvj7uqlSJtWdHMzB5jBJe5bd/f3hzg999+r8TZ1WxjrOvy2y+/vr+9ff36x967uXMpp8t5u/P9fgeA5XxGYVKCiLHtDHg+nS+nk5l9+/5Nda7nMxGPMefblaWc1zWL2p+z4FRBdlWLsAjLkn0OVSPh07qeaiEiBGqlCYkNNTVCAqTC8nx5KlJs6r7to4/r2O+F0WNty2lZ3O1+f6jbz+JeRGpNCSIkB2POiUfQzmFSSemlQyzL8nMtZXasC4QII4pwcKp3wTzMdAYShcjhNciti4Mj8c85D3/42Zm5lZLQocfjsa5r/h1Kbe7hpmPbCsXn56dfX1/OS3teTy/rJQOYdaojXB/b//7P//fPH+8/HttuAcKAFOFZYjz6bIRLafKhRkKMEObCnGoNJjI3MAcIAgiMniIfoOE2u0aEqbbWBNHmCHQQdqQg7uaPMcwChCPn+QFIVGpjZBs92TREyESmtu87A1UpxDzNVEfqwc1gn53UirBQEUJCcAtGgsAcgIw5h6qGJy4mR2yl1soS5u+36zb6rrNwQeJMEQUkd0AiKQQAlg7u8GkKDuaOQud6KgDX63Xvo3ts297n/Pz5y5fPX5jw+9dvU3XbHm7mv/zCIkgMqAGJGsfz+Xy73b5++/aX0/r09KRzYkRBvpxOz5enx+PxeNynjiAYCb0za6W4g5m56bIsrbWcDDLz+Xx2hLauZvp+vS/raT4eU2cttUg5redkbpv70tZaKgACkkcw4Kkt59N6f79KqwMhOARqmK+1EdB9HwmKho8JT5r1Use5PR6Ax98hD+CPdSy3Vvcx7vf7T4tCDm3S01eE848cZ3nLStNU1Twox4PJFEq2vnv+y/DhWi7psHHbH5uOaVJERH1CYHjYGALx+XL5y+dPL5fTWmsrbd87i0y3rjoj7o/t+9vbt7f34eBEwuK5KUUSKT4USZb1LBDBxJk5LlIgPsie4cKcckJAR8ZAYJFw79s++wj3y3p6fXm+XM46Ry4QjAuxEAuWajFMJ0DC6CAQxpwEuTVDPwpBJKLw2PZ9aWumjv4EZ0XE/bFRxIrrtN5KaUXSoaymDmQI0z3wgB7b1LW1y3o6L2uVMnr/8f6eY8f09Wc3mRNwd7cAD9jnAD2Wi5HRSUS9dyca7t1yy+RItPX+f/2v/0UAfd/O64lLUdP//Z//aao5MazMRcSmtlJbaxZxu91Op1XXMwGsy8LEj327Px6uaqrOBEJJSvRA1RCpc2w/fvxAxNPpdLlcDu1nW1pdVC3TVva+I9LL5enU2lobEGaWaavtvJ7PZ6xt6X3MMWbvU8hc1YbZQPClFKkMHtu2zz6FKwiBWuam5cE8x0zmIeBBrToEbcz+QV75l4y3lH8BCQGEKEnOP8dEzIxMaqb6mGoOxwc9S+qfA9Cs946xkrupRkQtBdY12dNuDqQMUAR/ff382+dP51Zenp5aLY+9v79f69KAeJjtY+5jAnGtVYB2nXP0QEJAFmIkEAjm277/FF5jKnARghgdECGIICwwMvacIJn9ARTAgMty+vz66XQ6KVi3kdLf4d2ohoOGTwD3w4udZZWZO0S20GPOIERC8KAqgbjpMPfkO+Ti0tzMwYBAjSKQhBh9hrupuyIahBFlerabCctS2qm0AmR9aB/gITnRAkSkMSeA+QeEi5gRXCHcLTzSwlJZCFD7VIgMKximamkkJAIQwr13BHx+eqIE9rs99k2Em5RaSrgjU62Va1HVivzf//q30fvb+9uPxzUYjaDUisgTPJgtpgOOoffH9nReEfF2u/XeT6eTu2flXUQWKU7Sa7teb6OP8+UpBaRzqocDIou0ury+fgqAWput2nuP8GVpY/brbbew2qoBuk4d6m6HnMayZmbIpQ3mrioQcVkX+vjQjzH4oOFGriyzbsknIa8CQWTKtjsSdmCqrhpMfaraQcDNWbaafYCe4HQ6ZR2VV4fGFCQizoSUw75qZmGntX75/OmXl5en9bS0dlrPwBDm73Pfb+9PT8/ExQC3MdTj88tLkfL17cfXtzcnROJAMTdmuo8x3n6Imebo182d7OAWICRUGQFyGUyEqppoZUQ8n06vl+e1tj76FkPHAIg+dJ9eT7Ww6DSPkFLlUEVRPma54GNkCSECRgxXAATCGYcIHhFzuzindo2hJsytCEtlgzF0jhGMLriPAXxkmpvaura1tkrsU/u+m9tpWSrEdbuHg0Ie8WAfuXqBPgyEgZhEqJXKSAwY0zCCRKRChNskZOegpbRU6C3Lkn3b1vfRRykFib788guYjT7crdGpSPn+7c/ZRwP6j19+e1MT4ra0Dk4ES1nnvU8dAehIgeGB29bf39/Ppwofhq/e+8yXnaWyBMHr5QksQv3UWiY3C0seyTmKWdoaEEtbMGC2NnQigbopOjeRItv7Q4fmHzQ382NNhkgQbmoeLlzmmKoa8S9xzs86hxHVLVvm/PWfXSyVUkUY0TxNPtBHNzVZV0BAwnyWSiml1vzWImRmdNj9jpVCwsSLyNJazgnm1CLyfKq/vFxeL0+ryKm29XT2gDldEa9zfPvx/b33OXV0zZuzIUHAyvz55XmEXx8PJGdMaoFNM8nNPDMfyYoA6kcOBXgI5QpdAALB1Q4mcCHa53D35gKQcFW0QCrtMeb3673PiUdYBRACUzpHlZgQoxAXWc0t8Rop6dAcznuIlJRST4ep1sfEhmPq3gcjjalDtUoFwHAIt0BQdTXvpo/ZzSYEaDgQtVatDwDuU5FCRACicOaIqbtR4NN6YUSfiha1CRGNOSIQmRo3cZcsZwFq5SJMCBSAHm6zCgsvz68vfViATJ2Px31pdc6xtNYy4QTDQx/9bmFcpCE4QCHGItN0mhcgBbeIzea39/c5W2G5rOfGJcyD8DFGBNRSW61P7cSFPIzztSUiRgE2xwBXm73viHiqUpnAwZm2PnpXogoO91t/PDKyO1szkCq5yXdTh4CPfW2rZZFCxNvQOUeRrH/U1ZgpAKSImeGH6iJVwGrKhK4pDZaAyC2nh7dl2ff9UF4eCpiYpkQ1NUV5mcSxMTQDbMuynE6Juwubv315/eX1ScLCDYXb+XTv+9cfPx77vof9/Z9/9Ok/tnl/bOh+qu3cqs4RhuD+vC7BvDDns+fIt633x0PgY9bWWiOiETo1EvCGCOChw0eY8MH+dwAQ7mG2bwtLRGPCAFKP6TDDv95u3243Im6F06DNFOaKTKVgKQjwwYFR6x//wQcsm8jDzH26DzWNA3tNSCki6DoDg4STrLS2Rc3GnBFAzBqw27QgZlaKOcbD9H7fzNzMl3UlRHcDAiQqTO5QAFeSpVRe6H6/25xRi0Iggs8BE1hYIAIMCZGmJ4DLYS311JYigsK//fWv337cdPjS6u36Y/oowIXqWtqms1TquqPgNnegTHAjcyXEJoJugrCpbnOgYK2LOiy1tca1SIa272P0Ps3scjmVysT86fOLSEUgDzNAKoxBY+REYEbE6EiV+9DH9K1PpArh9/tt790DSDjB9gCAGBhRCIhoV51qABzga1ub1G7+0H1MBUwwLGa7ldF9fY6lLYHwEdLoHuRwJNpzJiwRk4Calw9jUC53j8gWR/+Icsqb5NBFp0fUbNu7q/V9Py/l10/PC1N/jMvL0+Xl9a7jn9++br33MSdEAA2z3Xw34MA1Q2LCEQWy0ga71IqIPqfqiGFgIVyEiEwNEC189JGI04xsYUQCcJ2X89OX1xdH+P7+9tg3V+XaSisWDo6IYWbhsY/+b9xGKKXUIgSh05kJAfd9L6UBQO89dwI5ejvuVhEHMI+pOqcCIIksIphLx0NlFR6hbgg05uy9T1MSFinm/ng8CtG6rok3zRVS9lKn1morbgfeV3UW5kL8eDyUx9PlUmoNTYdKuJlPrbVyEAG0WokQMMCcApmIA9lBkMLhP//v//V+29b1vC6FCNw03MJ1LXJ/H+Hr1z+/1mWBVG4RAxIJFmRkwg9DTHokSm1Pzy+FyHRONxbWj7WRqr69vWUILHNpdQEg/1DSq2q+pIhoprfH49FhG3rvtg319F6JFES3hG+Hu01TRCqEl7qc1vX79b1vu8UwpEFiZkOdmZalESExITLkVGDqY9szqCLiWNmu65rJ3j8PtdwuT1WLoN6Phvjf8J1MlKEn+Txkw21mHowie+/Xtyu6X5by+eWJ0SHg+fL8dH5y9/f7/d57Nxvh932/7eMxxjim6yAsS1tH3w2g1ErMPQMoiOac96HTwcMlEh3AbOmK9EBMNr8X4ppxtgifL5eXdXWIx/WtqwUEMyJDaBBxKbz1jZkB9BBCJdOiVkSA8FKLMEHEvpt7z/F26sjpSHJ2d4+DeHPIAwkxAERKhJmbqiIGEUL4mDMAsoyLYwCHrmo6qMoYA3Jfh1RrdY9KsogUYg3PAMsBQESt1P7YxpyPbTuEVkLDXXs31cvlkomMjQsRHaCowAQ7GTGWwoz3bSfV649vDwYphBA6R0X68nKpElvf397eXz9/aa1t71fgkNI8fAaknSjb8Vqrud/v21NbB4LOzoQfZIl1qUsVeTyuycYaQ8NRZCEWIHD33vvPAmPOcQ8zsMfQXeGeAZ1mhNFE1lpPp9VN+76FuQC0Up/X9bye+uNxRwpAriXCr4/7NJfaSilEaOYiEgD3bfeI/ORMtZ8CZvMYU+lD3DZVU7KWa6/ee3768x44qiCI/Hdy2/CvL2aWotp19HOrv76+/PXXX1olMHhaX5D429v7//OPv3+73XadGjHUuqoFIoJUQbUqdanrGCMJpgSQUU3u3lWHmwIGhEy18JmzJ/NgFg93U0RYank+nSmilXJZKoyBCC9tYfcxZ5j23dCpLFxrdXB1KJooiwNwlX6IQsSM7sFEy7L0Pn/Ku//dJhcfibbEYmZTLSl2qUv15HVglA83WQKKk88eHnP2ZJEzy4dSihACAEWksFA+WGMYRGsfDBqI2iqWSKeNmhGXzK5prUkprohMrRRiFCIB5sC+75n4QkSF5Wk9X1bopuqa+W9gBuFV+G9/+cuf377db3eds5aS8syA0PBcghZp5jbmTFyK7j101lJaLeva5piXy+nl+TlTtyJOakNECCXn1eaWWICfYrIUzDrBsOjmm8b7tm/b7m46hgC8ns+fAZoIE621rku7nE5LqeR+LlVPZ25NWtvGdDcY002DMICPGWWeAICJxjEPy6jP1gKwj5EcGnc30/QwJLs8E6Ly4M+DT1V1AjP9dNvkh9/dw0OngtnTafnLl0//8duv53V1V2n10UdM/PZ+/cef3+5zKuVQANQOkq2U6mBb7+/3bVfTOJyDhAfIywAMYrpDgHxENhyDcAYmImEWgFbKl9fny7I0kcrkc0LE+vLy6XLZZz8suU7u0HsHhFLKmaTdHv2xi5SPgRd6OAUFZD4u5MH/U1770wcUH+QzlqLm88MVMMYgSuU6WjhoMDMXUfcxekZlhfvSWpGi2pEAEUXwuIeRU5eVG3hhtjDznHe5hZXSpHAml001nDBdkanWBgCIUKWsy+KqBNCkNCmEuO87F7k8PTFRlWrh0Lf+mD/er8x0WlpD3LfHeV1/+/LL4759v75fPn26nM/7VDVFYh3KzG1ZLCfrZkxcazOI674bAhZhhGU5tbpgBBHXWsynqYlUMwgn+zetfGst17F5RRiBAz22x2PrfSpEqAWK7BZ/fHtbq3x+vpxPS2GkgP2xEWAV+fz0RKXk4nz0HQKIJaMA1BJqasQlIqwrMwWglMrMxJxp1UdWfZBjkDASRk7DRVLfn0KPLJwQgbnRhx0+PoiXRFiZ6to+X07/7fffnp+eAGCf+PXH9XHfy7q8PzYFNMAAtHAPcAMRMptzdAj4cb8/9lGLOOgHhvD4sjxKARBBMl8lIjkMMVWZsLGsrbw+PV3W9dRKEwF3B7E5K6GU9nRaHWK67RrquG3399u160PWM0Ds+15ryRwxYapFmDAAdE53YBb+d+xjEtLNVJWLIDFElFKGqqoG0NRJCEurhGim0yy/uYcjUWFJWLewFBEAA4yIYKYImFMP4wFCCvAhUYmUFHL0CFVta0WMx+hTJzN6RPbcjCSEEGFTTWchclAjtghDSBhamM05A2Ef8+16u+9Dzd6v999fX87NzayW+tfff5da6/k0zG77DwcMt6GT3IFwzukfumJEJBZCHG405yKy7/vTejotS6kMEHv/ubJFcyCkn6nuP3UTHwqRmNP2PlQdAom4NTbz7riP8XhsBHT5y69MoEPNJzNXLovUtK0/t8VOZ8JN03LAjBNvt9swJ5ZMzfAACE+3w/zIc0guHRIyCMm/5OsUB8I/C7a8/2st/G+e4PwwMJMQLoKfz5ffXp/PCcG3uG6P//X3f5oF3+/XbRvqubsiYGYGnRRBxBHOLDNic49wZoDDOIgQ0MeYc5Z1WaTqmOLmh5zjyDwCwsySyTAhnd113xBhXVoRylqYAAJRp9owkJZM8/v9Pm6Pbeu11vwORCXckr2en0hA+OlziwP36T874FyQ7X2wHCydUip7RBgi5QED+ak1RaK0z9IHFMhUmdl8jjFKqaVUiLRNRGmFhHLVEh5IgAQs4hb3+91Vz+s5sRxuBhCYq6DwIgtBzDEyW4CApqq6AdMMe7/fdO9gPqf92B7n59df/vb8zz//2O/3sqweMMesXF6fX4B5My0iEEHCHoDMgLiPoXO2WlOUNdzRTKpo+H17yPmy9zGHwgLMAhAiBZF0er50HhAYPyfoOWMBABhj33ufNvs0NUAKCyScGoFeqIDj+2N7vz2el7oUQQwUsvBES0doBLKHIKrZ3rsj7n2MOS0wMBn/hJCYe9SpqUBZWkmy/U+B0OHkQkrYW97z9pERmBpS+De7vYgIc2N4PbXfP7++rAsh7fv+tukf39/vQ4nQ9n2oojDOUHVzL0QFGMKRwTzpwagBNnoh/9leA4BDIJObQyh4SGE296kzIjM5ODOE9x4/8NbnCJ3h9rou//3336pUEXHVBG42KY71btCH34f1oPuY996pNGFO2hSSmOm0CIQAFBESidSdQyR7ObFHrg5EY/be+7IAYjJPjPFARkA4M4mUPCQQ/xWts67rWisFaNh1DFMvAuGBCJkOBgBDHQHck2SGQgyOgvR0OlUp6dZBLkn7Yy7p3BcMBOTahNkT12XmYXlsjzG3x1a5bPu87532yT/ex9grIYaTlExjvt3v379/NyIppZQ63AoLfXQdhnCgHCg9D8iIhKRdRx/XAPM/Hvv+H7//JoUJCzCbTQBw1L0PQEJEYXHXCPQAdd/HmDqnWp972tRVdXZDJHNrS1lqGfv9++27xGnhS5gHcgBMMEL0AAjDTLMbY9v6Y45uSqUQM4ALE/ARi+oRxICITBFgmZwZH1/5/wEPN0ee9/zho88EMUAOIDN1mxWpEL6u6398/vz69FSlTPXb2/XvX7//8+2qEDqnDsWPPI6MgZuuggyAbuhOKbTxOR2NKkv6mIncnZiDKNN70UOYwN1NJxAyc2HmjO4i2sz7tqtOgihINp0qB9IM/MC8QO/6x7f3r9f3zbQDG4cGwpgIQJDZ2Sy1AUBXm3MuCwXMTLpU8713IgrmCLQADkRiZM6oHGbOUG53hwiqJXEDc07yAPwwTDQSpkJUkBUlmxsmzjshH7BM++OMliEpXBjQ1RCwEEpERTyfTnxCJi4iQPHYHtOMmD0AiB9T99u9IJyaEBO7MPM+xn2Mawwz3KfO221t9bTUxgRuUsQgHn1/v1330XlZWq2tlLGpFBagzMiZiOZepRTBkdsoj1NpsVbV+eN6f9s2Nf/86culLfs+5+wJfw4wYuLSTNUyzQSxz/nY9qmKAbVILTw8WAhJupkQIjhTSKXRXV1rq1WEARzog7kNjuEOGkBUloV3j3vSUJiZCAN+wnnc7Ug3h0A0U5sOPyWi8ZHWCEdwBnxkIaQJBd0tAgI8kAHYtVPx57b85fOnT8/PS2lq/n59vD8e975168CyDw2zyoUhMxsgd3Fc2NTmNERkEgZADiRiQf4pZ8IMbsSJrqEnqWJmOqeaMiYZn9KGnnNJhDAdTDQDrmpj28cYc87W2ul06r3/4/v17z/ehpuLzGlD1dOLGOEQjEwsgKRmOdc3i/voeS2OMVSdKMx7hjyB63QziKlzORSOehRORIwM4eBeiNQUGXOSMOfcHdCc2kpHDsYhJfhJUc5fsQAmKUWaiKuGmTA/tWVpbV3Xy/moghDRIfaxj74LAkpBomnW53CCInhqi4dquDsQsSXH0+zT6+v/+T//+/P55DqKkBD2+93Dl/VUz2cq9bZtRFxSjU005uhjEkthAUAHIBYAcA+LKCxItJv1ffzpP5b6n//tb3/b9810tiq1SGFRM4+4bVsmFI4x3q/vvY8m8tROzjT7/Ha7IYCaA4QgIoT3McJAY9exbQqnSgzDdbh5GFgAErE4hmKEEDAhkjCGpewIzR0/Ego/Ik6ywgFESgHpz56EOfUqxxQo9Z5HjR1BJHNM97mUcrmcf3k+/+XL6+eX14wDuz0e0w2ZIWUU2s1MkEsRId5Hz2tEzcgsC2z+YFK0VgkD0THXWdlnEiOTEKPh0+UiKZnILiqn6RFHO0KIphoWLDw9/uvHm5k/Ho85R61tWRZ3u/X5UAumOfveh6kjZkCNm6tEABzmZQBYlsU9pqa1y80hgMwh0cAeh6c7EKmwI6hNM210YEMpEQcRa1ss/N439yDiAEwb5DT7QBYfl+/Prj8iEMBMKbwSAvFSSjudLrWea1laW06r1Gqmw9TcUu8eEO+323q+FOJ9jOm+HMO+uY8x1eY0kcJcqsTT+fK3v/7lf/6P/9EK/7//+b///PPPZWkcQTRJZN/3cb9rQBUZxKam7kOnmiMhgIEHIwFThIdHEkQCIreq2xz/+cc/jfC8LILAREIRFoCg4Pe+Xe83Qppjzt5rKb++fjpLvc85LkPNrvsADCmCgG7KKFPNHQbg+z6fhjPCsOHuFqpugIRmo+ttn7vZ1ru6EVEmE1OAhn/k8SAz4QH2MSJclmXOCck1QUJCV4uP/CL/CDk9dgVDiQERKlNj/HQ5/fXXL799fqlS9j72Ph5jOGE3G1NVNdFQbtb3jq0Jsbq5WVgEWZaRCHDoczE/NMmnQhJBomRzhMdS61LqMYv8+UQOnUcYbV4kxKXUdWnD9K2PiOjhCrCN/j4GEjmRMU7XcSwAg4kwUFUDUc09xs85QPKzdB4FXAB6aq2YPVTdEHFpzTI+5AO6TamGSPYLCwMJS26Vw4OEA2C6k5morlWkFOo9P/e5NjrAAYzgzIhLKc+X81pqYXpZV8kzDWL0fcxxezz6HAHALE+XJ8C7mfXbbc4RER7Y1bapiPSTYJ5vZmHat8c//v5f67L8+fXbt6/fPr2+Pp0WdeOgb9++fX9///Tll1br47HNqQbpSShq6hGOwIgfW0joY/QAD9/G7oi1lnvf//HHH8+XSxN+OZ9rKWNMBbhr33qflqNsjYi1Lgsyq7G6RFRmIUQpahEQTgSV3V2NAPHh8cftZmOj0NqEGAPzI+L3fX+7bZsaM9dSkhyaKkkJxwBCdA/Ib+sG4IylsmAaG8LgGMB5ErCZ+ejRUwg0p5sJcRM+tfq8Ln/99fP/+G9/u5zXt7e329f7o/cZ8Jjz2/v7+/1uFodsOmkNUxEOpmD5qN7T4W06OfOJMycFErWb6svwCPBoJOQgAJnOdYgxstoWwsihCvH5vJzP53/++N59MLMfJXu4e44fDGLqQY9JAzUDT52A6AGuJqm/j/AxIeLgPzMDYh7/LGxTMaKIECAjOSbpAwSAzAPUE5yrjgj76AEw1cJhTkNCApzm2xwwKClxP3OEcudQa6mFQ037ECIOqEyChACOaGb9/rjf732OzGgvpbZFLGJtyz5n33cMSMi9AahZaryZS2uNkCZ0wri+vz3ut/P5HO61LX1qncpSmKjUysSllLasW92nBgEcuYk5zPaAsHAzSPdcWOYqIgOGmlcRD/jx/l5ZdExiqcKItD3e977DIWw2AaxImqu6IiIsRBGm04CIS1GK3SZ4lMoVyWLetuv2/rYWkfKMBPl6ktRlgds+BEA+VOLJNQqEVEghQC2FCKfOHF4TsU5Noei/hF7H0NZ/1j9ZHfV9D/OV6HJq/+0vv3x+fvrrb799+vTp7e3t/f3e5zSAe9+/Xq/dQj08giLyaRNCBDA/Pkul1CKHOXPOqXO01pBFhODALEc+CdkfBofufQYdAoxDL3+AFx0RK1ElEsTL6cxIYUfcSJGSuJ78xAM4ApB/bHM9ABgJk1od7uYuSDmLzCA4IAfEQA/0UnnO2fsDkda61FrNjAIKsxC7mQSepJZS+hzDNVPTkDI1lT0ZW0TJbrxv+957KVRrTbrGT3VhnhnhDm5MSBDkwRzTbJ9jT5UIIpIsIoioOn3MOdXmLMRNivfBzEDc59j3nYCqFAwSLlyEiaowUZYELK0h0ePxGDqrUQU4Xy5D7Xw6mR3xsBbgDlwkAOZUBGBJd0EgYt7UR6tIxEzrsgjx43EfMACCr++tFibRPlJT33uPMV+fXp7Xk6h5qDQpWjBzKXWwlDADC4pg95XweamXZVlruRNEQBUJMEJC4tpa4dKn0T5sKpgjs7truAPkC6g2idEgWLhIS9RxqzUPIPlQth2LTj/IihGRN7OICPvnp+XL6+XXl8tffv11Pa1/fv32zz+/9W2LAHO/btuP200DLcIBbCoG1CTpm5UigDhMMTXJifMew1VlXaWI6iRKGhskhMLDW6lcmvVZkOSY1MqHGSJyjcrLshzPAHPfdgxnBJvD8mkyQ4DCkjsZRkq+EARAXqAQhwaEOUudDPuJj+xHszHHPJ1PgDTnZCJK6LgZAxISBxLSubZPpwsxvT/AIwwCICy7hgAmIcJpc6oWlpRqmx2d1uVySaqemc0RDMEIQAjhTIgIcwxDfKhetw08LqczIao6EzEQeFSWWiow12pu7x6han1MQCJiMx/73vf++fXTeV0hrBRZ1lMA5BOV7D1iMjckXE+ru48x5piIxIxuEIiQF0uuot00vGaXjIiEBIxMTYrgAcZTs25627d738kjpqV+GNwJsBLH0OkaFO5+fdyvt2spcmaa0129BZWIAvDrcv7rl8+nWgrjtbbbnBZm7pRpFmoUdF5WM9DAWooDDDdHMII+R3PMzRczXU4nEbnfb6Z2AP/iyO2MA+QmgHBkJZlFRBG5vDz/cl7/+vr0+nR+eXoqjNf36z/+/P79/cEYEfbjer09Hur+6DMxWXP0yrK0lkM8QgJBEiakDCggwAxWvJzPiHhz0zD6GIMiEQaclxOYWWAlltymuRmnOtYcWcJhqKakU82I6Xk9GcB9e+y9Z0hLYE4tEHPPRujTMsuFhArWfe/EDBEp9SdmYUZBZnR3t+EekaGWHqWQEBJGYRKE9GchwJfL06XUrnNhNkJFHGEfgHUphQExdJgqIZ5bQwIPxYhKdK4NCe/b9na7IvAcoQCuhlsn4FoWorINnaZMzARVGBIMyExYwhzTfp+xWW5bHwoQGK02AtzHZqZC1Jqsp+X2/g4BrbqIVBENHzr30dvClfh8WsJj6kQCYqgZnuUxRje1zIDylMGDS6lLrW6HSc8gm4GucwJCIO5jOmy1VQJwt2FqrmDWiBBj2nQ1KkKei1K8nE61tm17bF0B6cT0urTPp9PLuhwjp/BcogOhRqTa7yeLAAgcwwCCMPneSM5FwB0QSi3C4uZFCgHZyL8kZDyMQ+4KIFCQkQgWkcr8+eX1r7/9diq4Crw+vwi363X//uPH+/sNEUfA17fr1+v1um/TfaojBGMwUatlaaUyY8Aw3cZEgOk6QoUZidGVCJdaSylj9Pf7HoFWoXDl3AtBBAQyMZOQsMPRGGOgICGQm/cxnGn03edYS6nM67qmKt8QgVEB1D1X2B5upgCe9JMZiZAyYvIIcCdEztQ/Bwd0B0KpZZn7ZMLTciqFiSkiElnoakRAiEIoCI54bpUZ7rODem3VplIAZ1V2WrPGwSNUXipzJQHVoOMtRAREmqpjzmneltNmQebIWFjaSQqREJqpgStMoYrAAE4EJFxdSit/fP/hSMtpKVKZ0M1aLUXEwadO8wC3sXc5cQ7QuHJtS11OnGxQs3AHBA8LpHAHMx+TCaVWVR86A4IAmECYgUjNLBzcxocn/ShZzck8+jyo3G4EURBqLR7+6Hd04gAmXsoRQFaIqDYSUYgSIQJ7v6NPAHSkfe5OTiLqAEhSBBxc3c0JAQm6jqE61ACRAwtzKQxBGfLgZgeY0cNUkUlqpUbTbCYzZXggt4KN6Wmtv718+v3zl0UqoD69PNXlcr3u//XH99vtRhRq+o+369/fDqUnIAU4BohwKbWV0mqpQjoHuROGW0T4T0hpTvttjlANNTQIQDMY0wmcq7jNMCtSkEAAAQKYKfMvEZAgkLAIC5H1PsY4t2VplUVKqa21buoR5JFTf/hgWwtzcilMHTyjkZ0O1wVEuNvMNGszC/dWq5syYa2VCPIBcPO8RhHAAPaxX9aFCOajm8d5Oa0QgaCWNnhDxFpKNlVmFuGJEJ2zM/OyrqXI0hZKWTXC1OkRW9+/mcfU2mpdylpqIMypKSsBwiQzYzgjtVLUbGmltXLv4/q4B0CrZZqeTysiXh+3MQcGSG1U5DH2re/DNJg47yhAMx9jqhkKqfswnR65PmDKTCkEncyMEKo6cNRSUmY77vcxxk86fkoJsrRztwiHCBauXKpUJmIpYe5hqh0wAFAtHEw1plmf3d1WX1vqcIh1aOFyWmSG+QwpFTOrKlAgzm1hHLfHg9wrcYouOBA9aqmONsf0ojmWYeH1ci61uvscAzFen1577+/3bZqW4OfT+svL85fXZyGYYz+9nLG1b/fbH9++/9fXP/ex11Ye+/2P79dtJNYdHZyJmhQhxqSM2TjVstRaRWw6M5IpYhYxqAWLlL33OScgnS+XqT7U9r0zuoCvVYoUBBxjiKpJEUIskr/rTNljUisyTZNogswewUXWdUWdZBZjsmOkHZuIWIhY3ROrlgDQbP+zAPvgB6N/5HsCwLIuuaGIyA06RDggJJomIrY5rmMvIsEUpqd1FZHH42Fjz48CfCQMRAYQmZIQRoADEE6dGLnbDjNNbk+YPfqebMXH6NvcZ21LKYVoaaW1JrVAgPoIC5tjIhDEy9PFgf6ff/zzMWc3RadA6KoQDghgs5IEgoZd36/7HFgknPCxNym0IkqZatf7bTmtxOyaR+aR4piY/lprouM5h+uYRqB/9ZE/v0op2UcutemcY/ShRhWMS5CIFEcVJiVEIC5luPd96HRkIICXp+f/4/ffK4ZP7VPNrbXycr4Mt7jdzEPnCA8MFCJmSq38ULXMKyFaal1qqaXYVKitiOjUc12Xy2mY3m43UwVzcL+8LM9lOddl175W/vXz8+eXJwbX0V8uz+fL0+2x//nt+9dv36bP2+Mxr7PPcd96liNEFK5MBBBuypwKEmCiVgQdgj2AUCoRAaK0ct82NZsQpVWRAsh63yLCTAEiqizLsmROcITQgWiMCCjMRaQIkXA6xSgA1SOij4GEc85UB2Rw8xGBwQIIgcQsqDZZzZyQSjkmvmnscDN1A6AchyUZRliWVvPA7r0DQAJh4EMm3cf4+uN7ulSLCBFxMovM7INEAB9wembOiLFUTyBTIISbEEFA8lEAEZgAUMHT+EtMXFupJWN5EuUnxMw8baYMmEsxh1JLqWUtaVfQWkRN5xgiTBAOM6lnDsEiKMUiPGCo7n0QchL3kXhZz8OjT2XmUqtHjKma7LsAQiilEnFE7PuuH7y0+GCtJSXq2HYjgQMBBYabm8c+JnAgOBEMg21MR+zTvv+4Esmnl0uoNpanywXH2NUiIj2AwmLhcGjXEIkYKBCz2RLifc5H765aSy3MbraNSYi1FAR8Ol+YaLg/+q5uS22NpUmhAO19FTqf11r45byutYD56Xx+eXqZ0x/fb/YYC5fT62lty/V2+/72XsmCxQmoSMMS7mDORMLErZxEzq005sKlcQ0gtxhjmLsAfX55baf12/vb97fvaikgttZq78PDzaz3nSDSkiX04fhmYhZZhGsm7hJGQDADoAfYmBqq5uZOIAAgLCkZIBZP6jF86PsActKS0Y7Z/s6Ej0D2RVCKtNZY/i03CiBhGwwY7mnSn3MAYS6LOSLvNY/IUM74QMrEhysPIrJYtCBzDzPGD+k3AABYeM5XprsDMAozZyYaMY8xvr+9Bcbnz59aqYGEjEAEJHPq7b6NoSMs6Xw2lRBMdc4OXk+11lwULYuaK+CYY47BAAzcSkipSLJ3pcK11m3vRLSsax9j7yMnJJIC+oiIRAfpEYr7bzvUJIYf4g4zO/TJZhFpisEiiNhtXvt+3fbu4TnjRbQ5CxJ4zL1zWEIUcz+a37yUsk9FwCLCyOndmeYRXosgkxQRKeZm6cVjllIIcR+9934f+23sjIRrDN+nlKU2QQ6zVuXc2nlZW6nt3J4uL6Z+/XEd1x0tnpfTcGss5eWzK/auIRRMGaoVEcKU08/Gcmp1ERYEcM8UeqlZ9Y05p7Raal2WJndxB6c06IRIRlm4WaJckIiEENVNWEqpwozgQoQY5m4eqhMMCnskNyiXZgCMTJXNTT9ct/nr6IEA/AHZIABiBoC+b5EwTo9cICCSqQ7wzGgS4Rzef8iVckGHrTVJbY9HID76nvAm+jDU9JTTfYTngKeQGT0ciABxTmVAOihDDoQ5WnFKBVdMs7fb1Zd1eX5py2pq6lmeOGBB8GEeYduwfXqtLfOXKCDMucjaFp1jreX1+XI5nZlKBN7u+/bY5pxqY0nivjlmVvEYoVCXVmudaqoGSXJDytyxcHP36Y6Ay7IMVdVDPJyekux8juRJQAtAgCBUj21OEYk5zfz9cX9/3IcbENfaWuVTWxnh0pan88XNhLCw9KlSJCDGHKm6sd4zhGFplYSmafThqh4gxGmHP/jMBF3nNBVmABij9zkBgJgsHAG6a0wM9wpxapfTura6ENGyng3o29vb9x9Xn9rWOkO/fv/654/3upyxlPPTc9d9n3PMkS+NIzpgFbrUdq7VZ8/1a6nrNDUBQxiqgbC/zT9/fMv8SWHufQKAu+XN5h5zzsrJJWT5CCo7tBnu7pQr1wikCMjREmE4ZBimgTsSswjlv2rGgIGHj0TnhI9yJY7tF6RRGADnHA7ETGb20FmFCaGIlFoCjtKIAA+5FYAQF+ZEhD+2rc+eC7dSaoLH4oOumsVxPnvHXk8YA4BoKZVF5n6HzAMfY1kXZkEmD+hzwtAC2NvyfDpfLpet74992DaYgAgD4v3xftvHdACIKgVYwu1yPr88P5lq3x5EbnNu93uTxR37Y7ehS2lbOBERUxZgFu7h+z4sPD5o4IcnjjCdIuFWpWQctHtKDCBzUH7ekz/N44EYRAE5T3aYY1maqe9dH+pGks4KCC9Ep1bW1ihs9v6tH7GQxJywbHW38JFcSg+HcIRw76PvfZ9qw73POdXVHIXyHhZidXeNYy+JUEpdWqulgAdmFovraV3XZRUuiNTWE7B8/fH27cdVPaTVh+mfb3/+8/uf748d+3CURWRpTaqUKVMVIEJd50TitBqObSMED5h9A5LefajurqXUgECitdXHtqVPOi/AOWfhPJAjkVsAITqmCHMEhwnAWutlXW7bNvoOzMJSuVTmrnOfqqqZqQpoAgFwYH4REZAyMiRNvZGb3gjTQZkeIZKCbI+oiaIwFaSl1RyBq3lEoEjeIbU1VyWPhXgpxSH2PUTYEjCOYId0nuEjhKuVysSBgBiFPvQXEbs5+DDzLAMYkQIQD+uqg1KBPeaP7a7h4G5qXW3vcz2tpRUUft++3fsobQEIxChFKBgZPGz2PcXkU9UEYSlmsfd9mldhRBhj7ntfqkgRFprTgdgAP8oSisBa23Sbo4c7IweSEwWSqk41izAzBEQwpmOipqNnS+MY+dJXoIUlzLcxzLFwBWbHQEK3ySKGBmiJq+ljtOV8frqYeZkTmILBp86+kxmzNKZw7e67+6Zm4UFkgAqgERxQMr1CChEl0ToQSiEiED52eGFK4ecmn55PXz4/r6f2+vQUiNfvb9cf7+BWmmxzfvv+7ev3b9tUdXBVR3eb4CK11tqAyU0DobKUUhxiWnBtTJRGxgAa5sDkCBqZTR+1lgK0W0xgDSeIgGjC5yJnWSocF6kwoiBiOLoRobCUssbWp7mbOzsLLKUQcyAhC1DAh2Mw72UiyswCRq61qh0LLgcycAMMxEIMiEK81mKmBF6YSRpGVGJzN5tHfpgZMrub6XT3QnxaFxEZrhl6CJGMR3ACU0NBQRYkcD/IxUThCu7HtYPYzcyVMBBwKfWynrLKogAEBwoRCYceijpsKjgICzJpxBxju/XHGFiOC88B3KKJWHjve4SJsKshFg/apyISFiE0JKhc55yPx51gYUEgSNSPBU41MK+1JvrdIexjP+NAgOwQwz3hSMiSEfAinCjv8IxYRgsD94V5lVpE+uj7vi9lZQTw2Hw4BjGxyNDx1h/t9enp+Vk7Jy8VETjCAKb5HLMELEVaW6TWadHnvI+hAA6U6jYuxSHjT2GMMfrIGymnCxLEBJTLH+IiRXw+n9ovL6fLqdZWIOx+fXz948+ptp5P+xzb9oCIp9OT9EE0dlMlQEBVV+8oLE1qaz4nA7RWDUPdKTCAWqsEGO4CiFM1C5cAztgBt6keXAAgwM+n5XlZFoAVqQBlbyDrsnDGfSBMt+vjMc22OSzRNqr7tvc5AqnbAS79qebLOj3/mY9dqWUBGFPdIvk6bgpBIRkHiK3ViKKZGF4kq/MPFXSqqeinpCkiNjTYN9i3aWru7mAWSEBCTJzUdSFaarMxM9cTMRC8CK21LOfz8Pj24111cq3MvNS6tMXm1KlCHIGOKCTTDQPGnPveCehyrlzksT2m22Pfhk7BShxmBh7MxdSmewGozEXYpwNyvgtmJiLEclgj2MOPAU5iSWttI7NHkbKaNzcblsb/PF+GzozMweQmOekYJMxS1BQzBAmCAApiKeVcFwY0NySutS21VS7FJg2YrhBQMz0MEABMzXTexmZjtlIxC7A5tPe11sv5lKOxbSjsm+nManuaW2K1iRBxHNEYOOegn4x/M0JgVwJfSllOy5nlt0/Pn56eTstal/V6v/94fx/hsrTbvr+93+a0InW9LLWMZva+b9ftgXBEqEaE98HLskqj8IJH2nEfQ4lO61pE3n68SWmn2sYYEwwIA3CGd5tmE/PgX0+XtdUImkOEWqsesa6r4IenYap1VWHeTYFAw6cqEwHGpgOR7cO8e9Q8Px8ETDQxZvuaU858BBHAHdPKWErqxvGgA4yRQi9mBgQG77P/fB3pIx0tEO463T0smHJKyOkNyJzTQsxITQRZ3Cy30uBzaeV8XqW1bjFaM51MVEUqCzsgkJBQDnKpQGAOQ4bqUCWW3RQjus0+RgCUUhP9t/etloJSTJWJeGFTCzNhycSnFNKloQQh5pxTR+F2qLJFYuuJCmaiWioTq6qbH9pvwFzkPfbN3KUUJM8u2Tw4JbEebspEzIQBjaiw4EfwxLKsDZH8yOhdaj2V1d0AAiOkcCt1jjHHAAsPz26V1FCjIj+t55enJw/Yp+3bNvZuprN3IBIWIjL3Y8CdPQlCrnTsiPPhwPT6B9pcZf3yfP788lSlQNC+j+vtsY3Jrd32/vd//mNs41QWWcXDwPzUliDqc/gHOAgDrE8HOl+eJc2EDExMFUVk733f98e2nYLOT+tSqo49e8FpOt2YgDmEY2VoCAWhLPVyOWHgGFpEhBGnmwPlKEeEsTACkBkTracTEemc2VfmwpU/UhKyCSNm00DCTEnpY6iZoBEWIBThgMgA1wwiSG/Kh6HOkxFURAIjvz9+AOPdPZg8qf8YhIwQlD86nNKG515raaW0UtKJFqZh47TWZWn3fd+u91BlQIzgQAq0OcEDU4hkykwkJCyWdxeSA1wf93Dv+z5V65LhxAERQowBpiaI7m6qnEWgh7kRQx72UwdLQUI49tycUtlUBY/HHYDCXBoz4D5G1ym1WBATQ+Ax+AcACPfYto0S7W3hnNhWIpFaSyNOig64IzMC3/d9jElMve/murS28kqEaqpjrMxhmVGExGkYgQQmCWJdT2ttBMhFHn32MYhp4ZqTZCIJAPXIOjMRawEBePzPwoULIqJZIThX+XQ5fX59eXm6IMhtG7fHZgBB/P3t+o+vX2/7Y6WazlUDy3QFU01dpoiYmatWxKf1fC6N3R86uxtErOu6rusYmTjKU2ff9lqK2JzhUqS7sQgBpk6RXCVKEWbEbXRXJ+DvP35IJK8IcjNF00EQcwTBldbW1H3MmRxWAEiCV57i+bokoCqpYH2MdAII82ldkWnoNFdhKoXBAJD+RQogKkUgRw4fhPgUVhwjqQiOIIBChMxVhOEYNu0eDNCWlQEri86hvRcWIiIEIWbk8CBIk9QUZATKuYQDOGQGAiCREwYAME2d25waEIiC4HP2OZDIj9TFYwYvRIW4ioTOsffny7mKqFrmrXtEKQWQ4mizWI4teKjpvndVdSApnHYvh8AAAiTEtS0s0rcOAK01NZuq6fA84gERgSgczEP3Hh6n0yqAGk4IfYz73t3DHbjyRJciXCXCVd1csZAwJ6UHMrQhYqrmC7XWWmtFOqAOj31zBBFObY0DINDep6kCYF0aI3quywA+fA0O7sxcGNfCv35+/eXTp+fzmVC2Yd9vj23fQfjb+/Wf377d9h2R27IS0N47ADhg37Zb3zV5F3Ecdq21dVmJKClcJIcCIO8fZCqtgqGHq8be+zCt4Wa2tGU5C4bNfb6+vNZyBIR+e3/ToU+nCzMJAZopoCCShoVOGcClLqVmtqDazOsbA+MICDmMs0gEkBsD71Onqpql+i+TdKVKbE4WGe6CRAFokHuAoxwK87lPAw+Mn2d//iAmqkiL8GlZl9ZarYQ0eg9zL/LtfsUAOVJ/GQkYCZAiQtXuj44IabUqpWWqZBJsAAGYhuuYg4ls5H6AhlnXdN94KyxMbV3zrYA4eI+5umYkSb9ohBBDhIgEUrYp+YQjcSk1MBfOR/xWrRXgftTKhBDQ9z3CaynE0k0fj+1o0JFq/VfZeST6IfUxdQyd/bgMY23EA/G+77cx1CGxZkstJRDdTyyntqiOoYCM59YqibuBRyBMUwQkpqSNSi1AqGH3++P77aqBGZ4A7khIKRbUiUg+CIkriQhHhJoRETGkuODc2l9en//yy5en85m5PLp+vz1uY7zf78NsHwOQRSoRldpC53QjpCDU8Bn2E5RvcYB6NMyQECFDowOP6LSpM/GShDxGv+/bY/QgYGU3Z8DIuwo5PHRaqWUGvG0d3VsYmgsz2bCcKeZcLjxMNU9QhwDCIlKkMLCZHgA55myALELNLKKPHgGU218kgJhzBLrpFGFEcLMwD0CWAkym5m5zZMIuASIg5ENESMhYS22t/XI5PZdiaiLMlO0Bcq1eytt2s6lUjmC/XBNOjfvebY6lFiQwj9rWJlXnLIwa/uP6NsxAcskPCt51jKmlVHW3iCRzDbUgZGaHoAy5AUyBEwSozSQMXE5nEQlVJJzuY4y9d1UDJPeohB7AjDXVu2kPJ0xoZEHCD2vIUqua9X1/PLZlWZlZ3cDTOPrTeElmPkZ308QPllpP63oB6BHzdoM+cknYWj3VGgqt0CpyllqWVcO7TgxHd/AoIiSco7xSa5GKKWR0s+lf3940PFhSbUFEgeiBubRBJAiIaSJSSQCBIifhgRCt8i8vT3/55fPz5VRr7V1vW9+mPnT8+fY252zLaVlWQI6A8/mMpkPfxtQ5R0/KAPNxqCG6WZ/j7X6j07kiJeIlKYNjjABwDIs0wriGS5EAaFJK5TBPoua296Wuy1K2PrdhwRLkRlCLiAEgizmAe2FhAJumgUhZwWJlTqgVY4hI3/Y81cI8e7k0m7sFIyICIxIzE6mHD3WLwEAmCGxtGceU1yKcEPvcGQkQWqlSZN/xPkZAMB4fawIe3focQBiIj23bt01EoNX72CECmZuUPucck4gew9+2ffS9EDHCaV2WZU0Rxj7ThRAaDhZchBBNA1CQAEiYAOyYbJAHOExXQCARYqnEgmTme9/dphI9n06n1gqyA5g5ohMBETqChXmgG1XmylITWeeBAMQcyKiWpLTz+RwRVMq+b4HMpWo46P9PAydIpchMsgaClCIA7P7E9VKquAL4Uytu7b7vphuyz9sDdZ5ePz0vC0ecS5Ui276PvUe4s2ApTtinQWAAAx0jLDflIuYwzad2JGgiifYYfQpwYZFSkMncTM3ViKjVqmGEgD7OjT5dlvNaq4iZXW/3xz7vU//88b71CRE8tZV2rs2moUUaXh+jB5IjmmfB5jvMIoIeNnp/9Mq1PT0Tqnvsc3x9v+06Lk/ntRUwY4bWGm4+xhCWSrjUgg59jq5u7l1npcUsIPxpPT32x30MBxCWwhZmChboIbVYuDt6SgY8KKIhEaIOBaIqEkzqkQuaRKWaOgYwIQFmQJoDTrW8fTCIgCHApqurByRTEJCTwqJzVhEKLMzn9aRq+74RYJNy9W08+rBpBFzL47E9HvelNlY1dEK0fd9p5lvU+/jzer+bI4AANGZZGtt0sw54n9NNgQgSIWaOiH0f5kTIbi7CpS1zTpuTAJN8v8/Rx3Tyupxqbc7ubhhGCMwpQAOfHuhBxhitJrR0BnLuyAUyGM2z4DZ3rrXUxubu5uFq5rvftn1kpGy2pR82QgSotRRhtznBEAkAwbwiPkkpiB6GEecip9dn9fPQ6e4ciNEqo43d0uStAnOuSMzFCk/G2xxbHwHokKENiIHh5Ip9wn2bvJRW8nFD07BpFMwkHKwWGhEBIDR0MjgQIMZpra+X9em8tlod4v16u+37Y9c/3t///P4G7kLsFqGuY9jUa7gjTDUDhASCsEBmVCCEOweao8759fs7U1lb3fbt2/3xto8RinMi+yq0SAkP3e9LqU+XcwSE6piqarUIMf+4vvNSXp5eXA0jtNQRZoFyXMmJUc5WBo79P6RaFw5yHQtbJBtfkufgqn1Ozz0lYipAaxECzGGsWw5FXU3zhCyVsbCb65wYUEopzD1AzXTbELG01lZKPk/X2fexPbbpFkLi5uClNWRRM4UoUobH0LkurAADwNKEwETMgdhV1abOqUjDA9OBmDxd89qaFY+RAQ1IHhEWZplL4O59jmFKSOq67zsDIpMfI2qUksI1QOHKVJHUQwMgyB2mBwCObddaACpEEFIRYUSdE9yJmYV09Pu2AXP63A670sfXoQfO4XLEh60ImXApstRChPqhBxHmBnJpSyZWYya/pU/CfLMBEMSCgoHRR1e3ttT8Gbe+//n2Dh5MTMI/ro+BvoAIUDezaWbRVc0CLZgdmD0QmZ1pqPu2VYilyJfXL59fXi+n5wh6v24/bvfbrt/eb3++v3edGGDuY8xt301VmE+cBDUgpkAsUjJeSQA8J2seAUHCm84/r291k/3x2MzsYx0bBIRIDMx8Wc9LW8IhPE7r6ekso08u5bH1odqn3vZtuAkSEgugSJW57xQuSCBYpRABgoiIuxFxkRxigIcTs6tGhM45zYLI3fe9WzhR8txLzRwADwAS4uHu7rXVU2uFCQHu+z6m5sog91oOBEgAOF0jYJ/zY5+L6k5M2IrPGKa9GzO3UkRKAM6+3+8bAOSR1Hs3VUdY1rouK6RZhHGfOucEYvMACGaS5KZ7ZFySoQoXJBpzzjmdcGktAvTDdMKlIGAfHTxAUMMWptpKrQUJbRoENimX07n3+eiDmrj59bFJEc0kiDi2UK3UViqou+oIP7Wl1tLnGObMbATCJJRthqoZIlr4HCZEH1w2ZoTi3kSEwHSqWdLafKqqFuKSYWcsAaCQ2u9QswAARkB0AgNTHVJraU3Nv397//F+Z5ZlWcDs27ajsDezUAadYwJQeD56QYJLWYDoMbdNp4ahz8r8t9dPvz5/vpyemcq27+/37baPP97vf/543/IENGNAU02WySoMRRDDVA/ZeUJbI8gjE0MJETIlgeg2ut1vhEhFONJkiQVJgNCCiT6/fDKz7dHd4+3H29/+9rfz6cJS/vj2LQC23rtqCo1zsqGm0kQ8YLdJmIsOijBIdfQhMEuq+pFG4RBDdaoh81BNQeiytFZLTSgXQEBAQsLcT8vy25fPrcjoHSHGnDaTZuVBmSzv6qncJNWZGxaKoCBAZOGykBcej/vQiap5/mbRMjO3kHDOGZDvjlbC59MyVfd9n6bqikWYC0xL9ZEw5VwSPIpwWZelLW7xCPBpKMJSNFxNIzI8XJgys0x9RoCX9bS2ihGmU0iQKcX+lUmZ0KESCyJFiBCLmDszYAqd1XyauaKTMa/LUkr9cbve+p6pchlD6O6YSLHEXGaMHgEigrsgXdZlrUVnV1XKAIupY9u5LcM6AbWKSfCebsPNIAJi9NmcS61d50FJCf9xu972LVhcJA/XzBepFooQgCiVSSyNvSII2OdA5Me+De+t4GVpf3l++T9++3VdL8h1f2z37TGmPfb5fn/c+8iK2gECgmsV5nA3IsPIUUogJh1Z09nnno1+9t+BsOtMFslpWaUImFYuVUjwoL+FAhYMByRmwr0/7vt+Wk5IXlvjraj7oSw0Y6JWqrnLl9fX77fbVGVhRPRwiDBzJtKMHGATYRB2cMuCNQKZAlFNiahkhLcUpoza9DlU1RiZwim87xuo1MN3VhyIRLa+e+rXAWYEuLnH3gf+BI7RAbOWIkGUpKoqcqqNkUy1CZV18cxUDa9MUpqNMUe3sQuxEPYxxhgB2ArWUjNIsRQBd8pIdEYOOC1rGKxSIGBzm1MNIhBqqYQHWptLUTPVgRitlEWEEgUmFAE6x0MH0JEktCxtmA7VTHbKh02QWqmnujDZ0EHgc++obgExJ0VkDJPOScym6maO4BCAONTAAhmmmkQ8ndfLuhbCrpM+ZLy1NZHCRJZRPzrVveuc4YZBRQBxuplBNXNgEr7eHrd9e/QeUKQUde+jmzsRVRYOpKT2AQSiJF9Myhjjvt3CI8AW4efW/uPzp7++vpzO5yLtsY/H7e7uYTbH0KlEHAAAnt75AExR2VS977swGTgQJp3Bf/qeD/9GqCogAIKGjz5rXU4sDl4gSk7qHIZZQzGLqbaPGUSK8M9v316etJS6jRFEXCTyNgYMjzGmh8tSy5fX1zltnxrgGfkU4QdLBSEdQxh08I3cWRgB9zEcgA4UI0ydVIqZHcJAj5SsnFplhDDDpF8hoMh0TzyvzukZ+BWgc85Uk+dzD5AMlYVQ5zDVpbVWqiCje4S3VoRF5wSPpA0XkShltiq1ApHNOTyYWC0w/0vcIzDYJcEWZojUagFTcrws697n9f2tQwQjYkiRAogBRUogTrOAaMyNRQAlACyYQsOGGwkx1Y/IWQUIFp7mj8eDz6tUyZDZdVkWZLOJYDYUkeZUPp3X8G6m6n3MxOwn2D+pjhzELB4Bic9nrkWWWpmeh9u+79MMibhwUlKn+wx3jEFggYaAEERMpWm4T2+1sZRx3e/b8NwsuSEEJbfAg4EbAjhmAAwj5z5Mx9gfjz53YmpET6X8dnr6/eXz+XSahNv26I/dVAED3CrzudY5t00N6PBLQcCcOU83QK/luM8hz26IjEfwpBzkB+k4EqnVJiQQzgAIFkBACMBuPlQxwAGpyG3f7/uGTLvauq7Xvg8zNkpzOrgnXSYQZI7BpWbOAxBFAELIIeSJj4+Np/3Hs6UCUICtd8jcA3d1G25hChGmk5AqS2ttaa0VSVcABmyP+2NoRxqqXSfmKohQ3d2cALgUVeNSEdFMuZTC5J7B5U5EVaRxIXNnkEKMsFCpxEWkSbFpu+21FkCc7hwgRCy1z4mAphoewPkzDxVGk3paFzKw4YT08nT5vm+P7aFpNTKPwKVU/piRE8B5Xc+tNcTTmkB2iDmRMRNhHWKabfu+j1Fba0tTtcMwl3YLVQPHsKWKnBuzTLVd9d732HcHr1KkFPNMFD/iB5GZgA+pGTMjuZnNCZF6jcks6VIdNtVV4xi5AhUAz81lIATyUOv37bQC4uxDI9jCCbESGsAxzMaoCBXSBcWFhJEzhyXcCbEuggwnlN+env/2+uW5nRzpNsd+v9FU1RngYXFeamkL4Y8/3q7zwG3yNLVpapoWUPMAyfhD0G6q5mqGEUwiQh45bHNVQpJSwaNve5VYmpRSgNAC4ojYmPuc+5zTHYs4wLfrW5t9qBqEKAqzjRmqBGTh0qpMs8f2tukIIUVDQAYAAkBwdwRKGbObq9ow6+pOFAhMSAhTrZvlU7L1AenIIzqvp6e20GFddQe8976p7UM1SctjpkxXhMODEFqthDj6WNeFkEwNEdWn+uRCATTHcCkoBRkpONXOhenUWkUSIiNXAEt0GXJrS/cY08Ji2hAGFq6Fz8vCACCiY46u749+aetyWrdtX1r7/fNrfLP3vgNyOKjDDIyhAU4RjeDzWp9qaQEMaObmQVyC4D6naZ8Rfdo252NOAjidToig4dk7bfs+zRyBAXtXL7gwArJp96lo3pCoCBLP2A2OSEB1AA4DBXQGIjSzsY++0fF5LMuCiOrmNve9ezhCMmacSSDh/MwaR1jUDHvfHwGoYaUW8RCmUsTDAUGMwl2KOEN4EECET/UAZ+GgQIHqKOBfLue//vL5aT3VUm6z7/sGDgC0Td1nn+G1LEXql/NpjHGbk0WQCboZAzAHHoCPAAvAOGJTII67AigrQE9eESNgHrKEcF5PS+H0gggTNe77drvv96EpiI20LtbqqTHPASsEJGCNDiet9Klv91s3DaaIqCxmTm6U5w9RDtwho0iAHVA9iHFZFhtbd/VjnB+eInEglLIup1Op++junmOqpDrFYQFRcw0EYmCgbPKZQlWr5DuWOSLuqlSIUksQsPdNdbZahQgdCMAA3DwyrBggQ8ydEBC4iMxye3TzEM4YGR+jF0QhXkqlUt/ut/evPwpdPz89rbWK6bmWXy8nHWOz0ABz0DELI7lS6POlfV6XEjH73KY5ULAMt8cYj75PMwcY7oHoSHOM3QNsLIhVXqfOx75ZOOeV0vvY+/QgIotgYiEiYGYBQlhX7pgSdGHOgJUAKAinWoSom3ZcLMIJEBNC6ZCA+3SYQTBCFfKAfc68EZLhqNEeYwwzBFxr5UBmklpzYAoBQeSIPTznS+oKCMhokbZwXRB+PT//5cuXl6enWurUud1u6I5AM+Kh/s+3m0F8ea1z7jXo0/nk+x4QKBxUNBxU1TQg3MI/FJBw9H4uiMRHrF0OLJiFiNGNMJj5vJ4Loc8hhKdWEIChaoQSj0BHVjMiICKIVE9Q5gky05GyjgKA8u9eckCYcwhQfGj0jwF/rnUzjwN8DC1FCos7qnpwunBRWNzMzXXqY3sUAMsNgAUaTT1CnD18mB6Iz4BKvNRGECQ0YCCSu0IQBLobAnBAinBEZN/3fXQgDMnAo0gsbiHwwxwEFuDmR2AgsRABhBwxZbCPHjFaKdvQOecMM4gxhut8XtaltlplkVrl8IZTorUA3KwWfro81bqMPtQCuMyAYXbvfds2CyOWn29YOlkz/AGEmHldV7P488fbdrsh4lIrEO5zlFojkV7MBJx/fKnNAPr96upSyktZnkqtpaqpgyUfcgdDOpRokKPtvADdIoI/hFU56beIx77t4U0KE7u5TZUEyk4TETUfc5pZICBTAOhUO2DMkYE5YYZqlel5XX/59PnT82try+zzdrvr9KF6fWzb1Pvsu8Y+e6n9aVkBMTNJzd2GdZ12cIAd3MOBPxyecKSkUamCCOleTyUIHJM7UJ0iZO4c2KQsRZZSEAABiBuV+ce3t6BA98olCHofeQkAAhPUVpaazGUiJpFSVly99+kBhGNMZjxIsgD40/HINNX7nH10t6BaMZiw1hIzDkIBAiyt9X031bfrLYWB2b5EgAFaRLc5DYYpMp/WtrA04gbk4CmH7L1DABK4BzPVsjABppuLCJZl6MxyggIwAj/+6SJJftEjptyFea11rutt21QtuwgP2oZ2TUa8B0OAV+IxZ2c5tQU8wExSQ+Vpc83cPn66nNblpAbDIKQMi/ftce9jekDEUkutTd19YjKrkhzDwqd1lVKIKKOYIvv+eQCJQ+dj23Kk25hCDZlLkVZKLYXCW1teTpdTEBIWwuGYQZcRgUK5Lc6NZUSUpUmribMNi6kKSEZoHtv2CDVri0XoVAJiJFXrvVcP/BjrIZH7oXEkzg4Zs48T4KXw8+X8y8vz6+VcperQ++0xpmvgnz/e/3y/TgCFCOZd4/v9AVTQ/L49uo1MklF3yzQNAGE+dG//pjFLWsK/uZ8DIBPEjIgcYeh8f3+/1Hp+fmosMC3TWKrQ6ojuGMERC4tUkoDpvk8zDyIuLFUqII5pB/DdR2rewDxX+0a15US/lDL6yL+rmers1jsSU+SmmNzTqR1JSSEkIXZ3RxgRMYe711qXZW0Z/Og+IBS9MrfWTqXSNAqgNKVRHp8RHmMas7RSK7MfwbpZH4T54acFdwMY7jW8EBIWZiEYYEZA4MAUa6vT5lRTQEAkRg93RAdwQE+Dcd4VIv4RMHy5nOY+rvctez4CT87Xtu8KpO7D47rv9z6nBxA1QWAaub1ibqW4JzXeAyJnZSlMZBEJhI987z7GT/NDba3WpjEcQqeaW80lHOJtbPccdokQxmFuDqSACQGI5pZmulJKjm5dLaU2aq4aI0JKMUA1DwBwKMKMDEjZE7kb5O96jDlmyqKEltaYWYiEuCI+resvnz6dWhWW0UffR++6TX173P/r2/f7UKgViJApuN72afYOHmrD0SOAmEkEIRSMDp9/pPQ/l9/MrBpzzloLfEAH4XgCCRBrqYVyIQKh5kigOtVkXQBRuJzX877vHoqml/Xy1BYDeN/2H+9XBhTiwgIAweAeEgBjTFNFEXDjD1E+faRaZKiBjUE6SzgyRkTMMQOmunkuN6JKYcK0YyIgEPYwT4O5WSCdTqcAtIg8uoJi3ztNW1kyapCYWAoE3LcNAJixFAb8aPDdkSl1vEIciBpBSAoAERnsOEynewCaOqJKKYUFmfoUdcv+Az3AgQkLi7lN14R81NZKrcePQFjb+nC/3aOI1CIItBZutaiqBRjhdd9v+27I6V2wCIPQOc1jWQsRm+vPVzJhXqUUxN5qdTRUZQQRyfjvvBaE2dzGsQ0EZC7MY87ex3tMI2DEVcrL+bSWOu59xNZODRkQQIgAcwWEmLaBxNBD5JJ1G91yy4hQuKwViRhYUMQ8tn2bfZg7izATEoUCIBaWVkphEaQqcqnLy9MlFeBzat+Hajz6/HF7vO/73eJuHr2zCKj6gTbahRmOwhDQnTSOXE/3ZGAm4iUNsYdJ0DzTED/cIz9RO9GkXpaFLAkb4e5MRALTYp99G+buiNBqZQgGPy3NkZF47B0RE7EYARjGiLL3XmuVUu7bNsYotSYJI1/HMQZEdHeO+O3pyU0tXCN29Wuf+5wB0WoRFmGW5NZlCiqEAniAI/YxgBiIRg4EPSBcFXp0ElvPBUUgpmAK6RZAUA8JdwD1nLtGBBCEEBVmNethw50RSSQf0yBS96GJyQEMWLjUtgj4Nvb77BHOTAAB4ZW5Fgbg4dyNK9LSliCYru5OhOFmakwERO5WGJdWC7OFAaOGG3kIuhkhC+asJhG2Oboeo0/3KEVaExZO8OMRBuOuY7CIFKpS3Mzyt80zbTc3kkzk6q7GiCtXqoyevhiwqeY2LMQLIprN0+mUTHZplHzKQ9iFUFoNM9RpZoUlACOiSI0AD3SLbYz7/RFmpTVA9ACRmkFhS60FOR+lQsxEifoSbnPkwhPet+37tj3MBrGRJsMwxX+ZhkJCgGieFloPdRHJ+LawxOXnPss/rLYBCGOMjPbJA1NShm2G6oJUCnFEfmdA8MBtzPve32+Pfc5lbb/9/msrxGaVaJ8Kcy4lFTSTEUsp4C6SsbWE7jnwwiIyj6AB+4lhivDLuvz++lIL16WN8K+3x//9jz/f936cOpkZCOhZEkV0m4pgajanmwPsc06d6u6MCIHgHoRHoVl4YVlb6XMQYJUy+576yXzJEIkJhaVKgQhQ2z29yKHurbb/r6t3W44jR7p0/QhEZJKUNNVdPWbz/i+2Z++Lnv/vqhLFzAgAftgXHmS3TV7JJBMPmQjA4b7Wt4Bo2JoVcECsqhIY7mvOCZ6QrSuEYzmXI8EXEqqqcAMATsiINaOCAxxyjmPZZMZSIrTWWlMAJ8FEcHNS2rjPYZwkyCvWMPN0BDrHmQFuDgmO4AyExHypP9ecc1pGpkcsi2UA0EQAMNxDiIhr62EiUkVEFdmIOxbtHMYaPz/+4i7by02aMoJBYiTlJVN3W3NOZCK8bBvMvO2bnyeLKnKsClqADD/OcayZgKwNkMwDPFiVRRGRgHIZiRJA0yqdFxN9HD7XjIDHsf6///Pffz6OxbIAE5whmMqvGpUYUgPWS2wZxQvPKyKOCOBa6/AZl10zgbWmOwNgay0+BymFEREgykRIc4cIIRyew9wBULgJta0hY2RQeEbO40zP27YBsdsSZBW5bV1VBSHTTIhfbjeLSAQLC4+VtfcAhO+qe+OIAdARc57j8XjMORGJRcziXGfXdivYfES1/guenh5CTHQJhyIwEZkVASDCYp3z3Pd+2++kLc6JAJ3ESJ6+iLmaKJDgmYixzMJjeRBiF3bzjLSIjzFKDwCAaRFIBnhahE/HXBGFNEsPC0Mki4g1x1qiygBMFBmWGZBEmAGn+YxEwobUVe5dG1Yge08ACMRAw2S57p6WgIkiWpNOkupk4773RqDKIuqRj+P8eB7TvWozg/SrNCjTF3YRYZm2ADLckbAJE6IiaSKzoDIjPEWScGVEwiYiyHMOKdh9BJFoI48EwvB0C23ttXWVZpFukQDLVu1b5ivChGTXLYXen49hk211bYx4rOem3Htn5gQUaQhwDIPhATE8fh7PP4/jYcs9vOa8n5qBogZfom5MJSIiM4OsILkiDVJkrGUKUJkjdsEmEhLNvEnbt23NNc5R5wO3RkQ+Rro5YjIthvfHmJa315fvt1sBSubylYHu4GuYEzdRvd1fzNbxfM65agIrjSVtQQayELFD7NyXBySah4ffmtxvnflSRpxzPI/z4+Nh05oISjNbARQJHomQy2eh49IdEzZtXZs0fY5zrOlBxKqkjIlhQhTuv369j3He+t6JNxaI3LlN97MAjolR2VIs/onEIgBBcoKMgATzKAVVtZMnEVywRBSVyn4SAAMjZOpcbfMxJ4RvrRcLskiXnw01dVgCKZg34U4AYUA1eWdFjgqQBSh6JiBCpJs7XJGbSEBMwlB9HxYBpGPMsZZHMDM1jcwR5h4Ns1NhIctUvxCSCOq+tLXOTdITVJKgy/aDf6z0xOLOxJzT3bWReVh4ZHpAJGHAMs9M4lDim/bDbIwDLxt3JCRSEoEgM+mIWJkjHN0wYSMGCmKtC8k5F5Ew8pgO4IH5Mccfz+MZblSSZEoAz0yL2hgIgUsgBSkFzAp0d0wUFiT0yLUiAcyDASMTr0Dfa1ofEfM8r+xbd2f86/kxz+O3++umjRBW+DB72tr2lxplNC1mlzDz83l8PB6WQLZgTotYc7l73xsACJHc9l2oagmo5qCqKIFZjjWFeG+9iQqhijZtnilEm7S9JSc6kiMQgrmdI5WppNqARIh7710VAVm4hRJiEnTV0g303jENCSp91ZfJ/RVYI7yJ3jNy5vKAy4nbEdE9EDA5EUFJEtPNKIsTFZk1zgCocV8FhCEgItC/+eJ12nIxFgFYmImmj2Ix7Nvm7mirM2M4AzLTJWhLWGvOacuMRZFJSdZaGaHXvAGuZnZlBxFBgja9wCHmTLT1bhGt6VorEbS1GIOIWmsYGR4rrojPaiJ7JgoHk4VNn5RETMU6rWye5T7NiSmJl1fXH/LzK0TkF2Speu0RDlFQE7wKRpJwel/jWPOxxvJFkbBctv317X7rikC23DEDhps/nwcxapf343zM4YhxTQsq4y+ZUJmJqVgKVBpuwiREYYCKowkITLiq/8sFT5+dIaTqvtha7sHEIgxBC/MYJxBvIrTtFLDSg/D127ff/sff11p//PFHtVNr04SymNWHkvDHz7/M7O3+4u5h3lQFMgqENJYf54yU1mVZPHMluRAJSUZNhERIGPK+7b/9EOnnH++PjznDVkYQF/fcEUClBaQq7/uGmWGOwMzYmmaSMgGEEO17F9qYoAQtZUDprIIkSLs0FX2uca5Vd5VaoCoVS5utjJfM9ciRXJznYWuWCPQ/sKGEfKGLAB6PR20PRJThVYAmovaeked5IhFkKGJ1V5QFMBNxxXrOWTK+HRWKNeJFRUqsqA7V8v7WFiRUwaRESGssQtpatwwiWusydJuZMhMREy4wt2rFMDHPWJlhGQ+bx3GstZhwa+22bZt2jCCS6abbpr0HZI5EIsiM9Fp8tRS+LtZRiEWmgFweY6xjrhUxI4fVs2eQ0ZBUeO9744aBxEQiQDwi35/Pj8ejqYjLr+P4dc7TVoWDIhBkYgWIMglr71o8TMBISocEJgQO9xUeEYRc7g/7BIrVTYAQIr6cWKV/F6ywEcoMMMgUPtYcayZRhzXnrKVfr3rsx1qVIS1E5eR8eX398f17up3nAZkiTFtTAiIgDCDM1mRpdt1u2z7XKtrotCKzJTEJ820jT/z1OKszAxn4ecOhgiNAqHC4Sa2msHRvwkRSAithDPdEIpRIYBEEGHMeyC/7rei2AlgG+zAr5FXTpqpC6ObKVJPROS40DQsHouWFZqi9pKIDMNM/l93z+ey9994LbLHcPLy3rqKlfXV3BBCswTwKS0KssDHMM6W3zEzC6ugT0fE8qtgNDw9XUWU5z/PXGErwdt++3d8IcZynzVWMbI8QEYxY4yxf0S5t04ZEJEwglSsFCI/j6ccjmc0zwsNNz+c/+LcfL6/kkUxJNsOeax1zrLWUdW+NWaoSgE8EU/XapwVTjGVz+THWMdeYKxJHxuF21S0JSCiiKkrEtRU7wDnXMeev4zzWOsziEaetGTEjACuINwRA6MoucPc5s7IiI+0TPVXvOgFgjS+KBk6fRMAv5MkXO6f03nQZrUJFKCEQF4ABWAIjs7Y6+nvvt9ut936e5+Px8KqK3RPx/vLy/e0bEVZFA/kN6qdVIrfIZWAuSl3ofBznady6mb+vB0DcRV76NpYp8JjjOdY5zH2lW1NuTZZbeDqGRaQDUTbhcAOWAn2ecwBTV4U64jLCl4Oc7sUIUeZIO2227BWRWXEG1bphlcrZvfpleQ3MmEiE6TM/whC5WIIA11jxCvCO6rKp6uvr69e7XJLJOistvMI1lFkwzRwMGbB4huGBgV0VhSvqtNV0CMmv2RJqa/XgIQAjqSiDd22btvQ4jyMjRDUCpi1FRMICjW2teaGhCR2yi1JSZQEi01qz2LOIAITE5AjI0oWT6fH8+HWcv87nx/F0c0F62W+bSnT/qgRaa5f2i8jdzzGPZcNieM7A8CwSSYU0UwYDNWnMnECBnICP43x/PIb7CjdEiLTpp0cZbgCDKQUpESOACREwMuas7QcBAxPoIpsQEyOipVl6xfLWM1AfFiJmXh9fZhaCjoiBYWNOSF9FXFhETFTM3HYeBxHpfzz2mQkRTZRfXt5eXv7x99+/vX1bc7o5X9qqFGVqKoEBDj4N3DIYMuea4fHnr3ePuO3brW/BfLoZxHR7nsdzLAsjAmmCRGJ8zjWXeaSItkaqrLXQiETY04etNU9B2rctMueYSTVThqbaWEbkMPt1PpnZ3Ym40LP1W+F1K/Kq3QNi+gJAC4cwREzIucr5B//Rw603NBHxPE8i6r3X3zNz5SblWgYXUbUME9KElVg7F3wJiRiVBRhAEBRrnjHnGmNYOGQBsOXrEK8SSBnutxsTR7mQWiNVSq86uGbb9ZrnCKR22yN8jCElJgLsvR9htSNaBDES4sw410QSDPnr/dc///zXGTbcapQWHx9PSIaisFBr7cePH9u2mVkm2DIze44xDFaAe4ZDZBkGqDELy713YfFIR1hrjed6HMfjOFcEECWiTV/TDIp5xACAAcRIRe+pRZ/gxYkiQkwBvN5hQIzIrIv0dTe7VECfd4B/vyIIgIkjo7hOxYOJyDkXc2NWRrFpa56qWouktVZr4H5/2fvOfKGlFGnbbxHhvo7jGRHycr83FU9PgUGkjUX4dtvPgP96/ziXAcIIX5ArYpqFr3r4AmLbu/RGQsc55hzhqap8TT9RmJWZEgMcCHvviQARTeV+uyHig57uYQXjbp0BFtGw+fP5qP5Z0yYAL21vTevNcDfILCBXEl6RGxjuUXg588jEylj/vH5dV0nIy87Qe4fPKHkizAyLqKK7QmUQ0S0T4yZNgAlx02ZmCIiC3BiFn+f4eD7HXJ7BXJi3LEKWu9eVhpkbsRDX6cRU3yEyE4liLWDetk1VGcmBoqjCkJ7BhdxEYBYkEkFAyFjV1X3O+efHx5mofXse53GOaJyEAcCAkKgqt64vr68IMNcCgLVWXmIK3W9s0j7+/LkczBOCmAgDFXBj3bTtvQmxRz7Occ5xjDHNIgCQIsBs2bJwENWsVhUEFeEaPIkgL5hehcERkSApEWOVMdUbdShII109hip3au+vpMCqquu2ykSiDBE1F6rMWcJobevKCNhae319u9321rqqiOiPHz9e76+KnBdVL9MvLeBY55wDEcUdTjeb0yMtVi6yzOfyj+cx5wKEADjO+YuPe+uI+XicCTA9gFh658SEiDjWPDOzbXuFxRKjICgjAyz3ZQEJKr00veecrbW2bRHpxxMQjnFS+YWYMzwBhbmJEAJg1sgbERvzZ7sTPBERGDnS00t0fWViuIGZA8JnzYnKjGZ738rz7xHLFhIJsHApjHK5176FAIqIQGUNOcYTwQVJpXHTJJpmj3N8nOeyyhjmCpTwORVwEz2BlpsDYVomcOWQpz3nuQIc0sMhQYVFxM2QuKlaWe8JhTgSRoZFIS4UiQAzgzCcEc8Z/zx/ksdvP34g160wBXNX+b7fXtr2dt9fXnZt/VzrnDMTzmOsuZq219tNIGMa/vzlaZnIgISAglvTvbXGosKiutyfx3iMs2KpMoEYzNzdS02MWFaU0qPGzNCkW2sVbkuQyULE2tp9a12v7ORl5uZdW986xALI6etYyxOSMDPcg5g8vZCj4Q6OnMwS6Q7uxKytCWAEzHE2kf/x42/f3l7f3t5aa623q9FHTJBma61VdDMzM3CPSMz9tkemvP86OKPSrg08gdDQHOZyjxDRGsc+Hs/nvt1f7sE65jqGTRvwOCEBIeY6VGnv7b7vDIIVAkOpjJie3Ej6DPzz1/NxPieEZ6745CEzm9n5cfQmL6+vHBVbwMrStJWNyc2uYp25qbrZDD/HmB4v+w0tKEBaA0aQCAtUNcSoAEkiUoW44oojYo4x16rhZPVwvlolqlrBwsKiRBWughr9tt23Lcym5Zjr5+Pjz8ev6cbMXDocIJCkRE7o2hrrOW0uQ0aPus8BCBj4iPTiSkJ6BLmPc6SI9K1vnRgBY5mvSuhhCgAINLe1KqQIw2KmTwQC3OZkxC7iaUr0P79/+19/+zsugwxY82OczzlXpHALj/B0sN7aOc7n46MCa4SEHJiyNW5CRClMzHys9TiOY87TlplVNRXu5gYAlR131f+ANedFAkF43baGwBmbMhPXbL6zUmYE2LTlhonpAJQ3lm8v28L84/Hr53k6ooiMMecyrzwEYiD0DLdILMsHNWJmcRsRfttv33+8/uP33//x+z9ut1uJJpi52oDu08OJCZECITCrWdSaSpPzHDLG2JvGZ1N8mRMxN+1bP9wgYa7FzG7r58evomtMt+H2OI+EulADE7297G/3266Nk8ASIVUIwMMASVhbcsth83gYYmaO84RP7BAitt4qSRIReysyZ10lUVkQoeAiRU0zW+cca83X/fay9xPzPJ0xIoEAhZgbhug0wzRASgsHz8/adK7lZlwVKwAGQKayRIStVb3U4/GErRcG8P66f/v2tsZ4jtMcTs/pZmbuxsyROdZExNu+37Y9LImpb11tuRlCrrkgs/dt2RI+ONwjoRKNIJnKpUJREvmorKPSQIZHLI9Ypkza5Pl8YpAgVIckM8fj43Xff3v7xsqtyevtZhGPxweEI1MQDvcABPTEBIRwY2zKlGuyu0IqMzO3hvtOAszEzHys+fP5eBznCi8zEhFVdVftmiv7KhOgTCuABMyyI751vTWVjK0pJEwPT1zup63hNs5hESriZiNClRO3bdtfiUbCr+MJhUWo4LOEzCSkK+jWDBABcwHUwKH3/ve///1//uMfv/3229vbm6p+0cvrmpd5qehKmIRIzEKUqs1tuYe4GbTmESusMttEOSI8EomqSddEt9stMY5xIktBTM8188rZY0G8t34XlQBFJsbIhRfzocbiiRm78t6aUem+Su+xiKiAQk2l4lI+80aAkBhSiYnQ0JfZWgsQIgMgG2MXvm29C4fNCK+Mkogo6RknNhZEsvC1liN86roDL/QQCSIrlVv3CugtR0tkeGRk9XzOMddc09wSl0dk9t45BBF774TkbonogNPn+VyAuO09T2gI1Y68EDeZCBc3BiAjoBpTZnZ8fDTVihZnEQTDiLJm9K311oiI1mRmbUpIADDm2Fi/32/bvnvGOc85pq91rAWQSuge09wixEOQAJIwFeP7/fbx+jLHeoAxUZf2eZtjBzjG+Pl4POe0YqjXYPFTs32NFNyrVYNEEcAEgtSZ//Zy+9vrbROmCMxwT9W2Io9zPMZY5nNZhGOAdkIgzzjOke4TMjLrLlcRfcooIozkdlFS3B2JkdLdzVfv/du3b7///vfv37/fbjdhFVYmKWGhSoMrvAWYJT5Rk9den3HamQBy2/eKHTIL8/TEOeav43GsyVuLCBVhRhHOCt+CDKiI82RlEkbMdEezDsSZDBGBiemYATnTGUmEkTEEiZEgEVFF3SNsNdV933tvSDVNYULAhDknAbJorRhMrFFRgehEhYGZ0OZAxN7a4zymrZQNk4g4PdacNWGonO0RRlHhxmhrUYISC6MQIVKNDuhK6IhkDovzOEOVEOYcIiKtned0yG3f2OQcIzIQMQnT8Tzn43kW42nfNlFlTCESFgT0ZeEBESUCK70zZEYmMQXkdENhyMgV5JaRmCnMr28vt/2mIhneIKgKQWYmisi9dQF6noctY0RLP8MTCSIAObMAcRDuSclE99b+/uP7/dv3bd8x4F9/fUSSim6qgplIy+3X4/k4zyAilYyI5dVerE7U9QxcstRyXyYREeSu/Pfvby9N1nkCJiEh0Tnn43kuS8/SRBgiSsUdMCHTMdcc58w4beUF767YTEwPy6hCgIjCL1dGhc7t23a/33vfet9630WaSE0vax4lEeHsmd771UIsSt5aa8xhESwiquK1nIFYyRfYtGk+zbZUKo0/lEgME9Ld3RzKiUxUzuWttS7SKs3WY3k450x/nuv948Ha9puL8HE+V3rXToSqLTP0c2LKhJFu5kycdRPN5GtsnqUpyEL9ZqYHVe2FNNa6HMXEgB4ZxUqCou1dYgfpSr6mm5XAW7niblUQVaj0hmYLkTJjzoBEIhFWIi46/ljrOL2stCq6bzsiPs/jnNOzAB9g7kgAAOccGq7CvYa6iGYLE6ryh8o9To8IcSemAECm53lUm6uJdpGm0kXebvv9dqvOOkM+n89Ya80ZzPu+37cOkeMEipDWFOVxnpGARMIN0zOhTHMM2RnvW3vd2q3r729vjx/f0WGsgArLcZ9m51orjFWYyD1tFWPg2jj/rVmo8pWuNiZkMuYm2lXCbc5ThVm7RzpAv90/HicgU8YGJAThpWBAFhnznOnB5JecrBClWVxuIhJmrEKodxX1uLBWgDjnPM+DmVprcq3IfwevfNkpP/8+qtdarfNedV31o83cIgAZmUBAez/DzjkAstD2REj1tiIRkPdtLVNRJVKC768vL/ue4e5ukQsBC+AHMR3d1nN+MKavqURtF6wWAWD7bJyne6QVt6XgmE1FRcecvkJTAS+DXPllgQCZwsMTESgwSbsQlYQ6EKhpVwEkQJpznudcEO6GhISFaaOMAEICVmbpArBnptkS4jLH2qUkqyiJWGYOkIjLbMtEQDMbZiCs3BIAASOdCAKTGTfVTVpTRUQzI0RhJvTC513p1VdsQibh8IUATURr4k3UhH2Ow020AZBN83VhWMNjnONBJEQF5QYP1cZAFSvGyACgFAygjEq0i75u266Ma3bIH7fbsz3Tx/TlAZFhkKfNSktgpEhLr9BFKDVRfAZ0ZwAQwpVakJmBmBi+5iTKIAjEEbEcFuD97ft6/PPX89mZN2Zl8itQd3lYQKAQMaM5ADJLeqXLJTMTYkaI6L5tjGRWASY4xjCzprqWfQ6YGQCLZ5sJZj7nMjOukT6W2fNSSQBCg95aE6gBqpt5rLWk3wqTn4jmLoxrra5CCJTIyMiMibSzLU8ADBBhIarxPiBgk2pZciA65sIEIGQhaExbl723GnxUQU/wmVnxGTyTHmVCP8+1PLR3x2QkYRZiFWGW9+PxHBMzKSGOsWwZJDBDBmapoMgjzJd5AKRBluqmzlBIaKpbaxjehJW5KvWImBOFyBsui8fjw8wgkBhJuDFDuM9VRr21lpsHJCFKUx++3KYbA26qTRsBUOU7ZY7jlKZYdwyuRauFIYkoVy+wiK0VAEAF22Mm9LVsnCoG3NyDWSs6pOjkx3EIk5AIky0PMPBMhEA39xV2KTGBbtrebreXW1fhSoxohHvTuQwAnNACofSsVWMA0CfnI/9tTQQiqisvAXpdZyq7093mHGNQF2RZmTbHOePjsP/6OP/49TzNpG3INMdkKuR+WFRsLWeiR21fRYgE+oSjqCgjj+OsGZs2xYTlU5jXWo/HIzzqUlS3u9JU15OLiEzCzMJSd6fIABitb8hIRLI8zjVXOf3cUe2c41gVitYQ083NMhtVOhGUHtMNw3trW2s3YSEl6QlRkTXr+TRf5jnD2yYR2ZTu+yYEAIGUBMBEGGQQSBd6AUCQGAEdDCpLGKJVnBBxRcowECUeH4+fP38uyPu+p+daVkEgDunljnW3NWytCzaGmOEYrpmtcBuAm0oXSUtlbEyYwYjMEuwZiVR5oO7uNbsnYXfHlb23sM9uoDTJMM85zdbyNXbGe++3vjVSiCSsDkQsm9p1621W1gmif9UT7kDAQhS0DkuPrgpIFnCeAzOZ8JxTFXprjRUzIZIwRZARlIiVnxHT3Gwe4ZapgZQBkPfb1ln2JjfVm3BjBVRCwsgG8K2rQszI9+UfK2Gc6YkBFQ7BSMBXpk5kQgYjSgYjttYC8PArIywTEjGR50rlbEIRK8ISCvvMTYSY931nkcdjMOFngHesucDDIseaEWDg1a5jSiZsKnvfCPF4PkW4tW7u4e7mFbpIV/amZ0YdTGXzr4FaZqW1NhHtrUVk2mq6qbZltmzJxzjXMkckIiWycAcHwjommBhJPdA8kSgjzUbVWF1VmBVRkJfFY8xla60ZEOc4DTGICZEbNqK9t71XW9QTwN3BPdzTPSALchgOUemwlgS5NWmMay6zTIqsHqbA8zw+Pj4iAgnXmASgKiQ8wx/Px6ppjcc4T0Lq2nprgIjjRKTWW0U8EdEcwxHf7jdlBMQ5V3gSMSCxtnA75xkZAWHLMEihTVtjnBcwAxAS3WNOM/dFpgz3Jt/vt7dtE5LzdPMEAaQgztbavt+CBs0Tq6eL6eAegYQAgIRNxXqzucacH4CMxKUcS8QMX4OqGI5oTL0JIXCAMi9ET18YA2AxQBISgnsjet23XfjWZG+yqUrvJHo1FSJeuuxdjjUf74cjJJKImCclIpITBaBBcgIDNJFdZWPeVHvfTrd8fhyxAjIBPXF6jukCgJ0Qopzxrenbj9/j//zXv/76c4i8H49znq2zRDZBBmDi3vtxTi4yItaNOlV4K0WGrUBUkRrXVFNIhW/77dvr2943W6uYGpBli/Iq2LZtL7rVZ2YLI+anUC9WBAaJeVXRWDKmS1R/STkgSy+K5BFM5O7Hec45v9SUSWQE5xzrMSvDs9gLiZcZnABa06aaHkAglScHRETuQSQBaRZMgIhhYWZjjHQTiHbfM+unSG6KAKVuZdWO4pAYgQmttQSAcBEZc5YJc83VW6/l7u6lJVLVcl7XzbucA61vAGgOHlEo/LWs4Cu18xU34BjT3cPrFkAAaOaZEG4YKQk/Xt5e964EDJSlFwi4aRPhTzZkOd/F0Y/jWSmoTTUyvAQJiL01t/AMu9wqrAyUaKuSsFYXJUhKEC6cMpZzOjIznRI6AQF25ibtvm8/Xu8E2QVbExZiSkjz5ZFOzBH56/F8P4/ntGEx1ioUaRSQqnqIRRnBCpktWZYkYgISMV37bprHMecHSYQMAyYHRAsYluuvv55zDJs56ZgzM2xYYpCgqjCDQHYBJrWIuaww3wBg7rYs8yoZAMBjRUBm9ta0NVERlbXW83iISmHw3KuKv1ZvaZP+M9suItyvuacEESCu08zMI4C4/uenEC8Rr8t11lwCshos1Y8fFo95IoKbiVCJduraXhCGaquvMTBTmYDCM5X4fr8zvZ3jfH98rGXlnTDzUoAAwDJDQlFlEMRrFHqBa4SoAKYAYa6qY836vkJsNt0sy5wZseYiwtvtJp+Swy91ZAnr5lpInIjnnHBRI65UMHePyGV+jgraSYRs2gBprhURCChMSPDW9zdpmuhjTUlmWe5zLcQdEW0ZIlYPaq457PPeVsOBak5gBa7TVAMAFMaEiGRiJQYPC8ysgRbMiPU8e2v3vmFpcBAxnTObcBPZWV77drvfbvtWDk4RBoRpByRmYEI64F8fz3/++dfh8XOth9cE2i0jLRM9IghAAQlxa+3WNiEkJPd8zuO0NasEgsogzuUxIsHydCMMQgygY9j49V9jDYtpIwFQEDbVm7KCv73cVIWYz4Ur4pwzA0gwEsdcxzmYSFmYKDOYMwGR0M3Mfc5pEeec7x+/9ttt27bWqqG/RIrkghHOzL33ksdV1fmVUyrCcq4FSMOiCEoEwMyRMM3c/WLSVyooIqvQ4k1FtWHx+CAreeXqgSACJKtqRfZeqzCJqa4piNRV090sdGtEQsRrrTmXsNQfmJmFIzwiW+vI7Rznr48Pcydhm54ArTeFWjB5HMfH82kZ1FWEaVFGMhIU/gmx7TskePinyLRmmWFmTHSMmZUyjRgAq4z6GeWAcPdzzshklgTHSAD0CKvBSvh929/2+7fW2QIRs3OB0QFBlEX5S+pY3zEjVZWEq4HIRCSKkYAlqsH7fptrWngCcoK5KZBqw4jMNDfI1Or59Ua9rWOs8AxPtyb82tu9t1vr921vrUkjRE4Iz1hu6YaACOIZH+dxmDvpc57vz/Nwq0yNRCh2c2ZihiL11vZtb6IFQvZlM/z0NStyijA/N8t1XZmRAZlwrvU857BI9NYK9otd+Pv9/v22bQy9CZSEPiOWZ7oqAWEGIgim1bsdCUJUOt/KbSiGIwuPOcYYt32/3/a6B89pwkLEAEHErbWr01iK2uvlVRfJjLhcrSLVZBRmIknEueaay90owTMICACwZNaECTBtTb9i/YRUhRHAzJ0dBQGymM/CJCxCqOUhjhxjPe0o/P8cVuYgQ7OvAgyyaCiq8jjHnJMKhEroAR6O7tUOIsBzjDHOZG4pbl7r4zJzqTTRfduEqEjjpTr86ugBUSBE5lhrLfPIGoe7W5kwIgvgkIEJSNu+NdXTJmUmJJoL4X3vN+0c6QHDLSOnzYDUpkwXp6e6RpmJhEyESIWO46+s6gQE3FkJGQGWm0cAoGdYOkKx8UrUCAY+zeOIOU57HixMivd9e71tb7fbvVdxIKoaEGYWmfUFa4jrZr+e85hT9/3H7fWP//3/mrsyE7P7YiQUAvMIZ6AatzOTuZn5LGEcwor0AEbExMJ3BNKx1rmMIpRQmEr1jJhVsBASIe8qSkSQTVSJVgQh3m93WnO4Db9y0/LKRearNw5oHixc9DYzIOY5JwJG+J9//bVv3d3mtExorSOi6q331i8zrecn56qEwKosIuIAHrHyCjEP9wqQqV5o1buZOcZYawIAMY85660stTeWR4MIEswsPWwaJnh4iUjmnErUt5swrcjzOMdxbtrWsrjEsZfjuW66ACCi2tTMns/n81wAwCqEucKnL4sgZnN3cmXeeh+jg7L0foyFCVvvCJXaVmgWo0pogkurzXxJlMcY0y0BjnPMuZAYiT3q6HKIgLJwIGQCixDJmHas6RkAgeFrjlhL9lt6PMZxLgvA5YGQKtf6r1Xgn9yb+DR5FMDw1jYWhShxPIWtGRDEdSX0yBVBldLKlJmRloCB9pwLkDvhvut225rqfetdWIFIOBGea14pTyyR6RbnPFd4Jv3rz3eQvt1u9/1+++OP7TioRLK5EFBFhCQzGJMzENEzzjnnsrEWsdTw7kKIJxJdKb8lrKJITIYIZtr33iGEkBHdkwlr7kkIzNS3LtlKKXSMeU47zVAFkEs0jsRQFMKEMSY7ExdGF6atv37+vN/vW++P58f/87/H1vv9/vry8tZ7v5qzWbNQgE/FdemF3C9up8wSGSJlhpkLoruPsiJneIQKV5pA6Y8boooQcxVSQBfMEQATkiH3vjESMQFk09ZFxvEs4lC4l4OkKrDP82glovSWgUhS7EDMaJ8J5K21ecmU/FxzuDFL9UUrm0xVW2vVnFcVFW2tFfTGr/9nhIBCtQEwMyC6+/P5PMZYGe6xCikEiIARGZF1Hl03IBYoLkHEWmstCwzAlHIeRUybY87HGDMAkJZbYxDhKlXWWm5W6c81FIsrLbzCj7IOSagHj3ggOYZBrvAEhHQFUKydIoACGZVFmN+kfdOmvUmrLElWLJZDjrCxVnggUHiOc7j5z8cHCPe+r8jz4/HHx3FGZsKP72/PY6wxGSkL5otpDsyAmdOmRU7zYTbNCZAxE7J2vWs+wFworKvHXbM/AmVGFs4Ez8hMNwgmasg0feWRzDrM3p/P55wWaZHgQVj9h0gCAKAEIHKP5UaM4d5bJ6LKceutEdMY53kcqo2ZmMnDxjyJuPet1noFsJcjilnMPCIkKmcTACIJAZHWXGutpIt1boABEGYM2VUZoLeuTTNzzHmaTzOAUOG9NWHZ2lZPHAWQJWJs0m7b1lgsQhAoIyGQMtMRQoVZZd/2iAuERZiZ0UQZKiawQHoFr8zP8xOIkIWBkIT226buFo4qTNJaW7bMkklFpPdW07aIQKJAnGP8/PXreRyeGQARSVcyV7mYAgBE9asVBtVvjjztdC8KuQIkQSTSacve3y3RMwv4fbXMMQFyLBvLyrbsbuGe4Z6JSBDg7gsnA4goIQQAi7TUc5zLVsEuzYMwG5NEKrOwsJA0bVt7kbaTEJGoMHFGmruDr/DD1jIrB5aZPR8PImJVFAYEVsq1AMDmCUQIcs5hGfu+I5J7wVmmJwbCKuRk7TcJiVlIQ6g7DFI1apA4oXDCGWEZhkCSyEkZEVfWUozzfA9309L0NW0LIhD22x5CcZ5enDYsrZRD5XREEFPRNQFRVBCxtXa/3W77/uPbN2Fay+73l33fW+u1b1VlUb7wLzFctUQBprvLZUjLhIiS1IDoWFZM5+JaWAQR3rfeRRV5a52JtLdTdfz5J6Xf9/7SdG+KQBZxTYRZ3JbPBRnzAL4cXYYFn4IEAlbelZmZACOBIJUZMS2CMkW4YHKQiRDMfO991Q0GMDPHWsKBZe/0QI9GFOFpFm4ZjkzaJSCXubB6wjrPj/Mcc57jLGtWeTIzgYngUg9lZkrTkpVHRJ3CALlseaYnQgYhesIZq6lICqBEYmQQBCEoE4LbWgGcwIVY9Lj6qoglLqwxHUGkr1nPFSFxkBInRUTmckxkoZu2W2u7SC/d49aAkZEEmADBYMVaaxESM5nHHOt5PKUpEy1fiZkEmKgikSkq+w2XZ0SMtRzTAUT124/v7vHf//zvOeZci0ANs2ymZdwq+GjhmDLCI0UkAQipQgCJsbGkeSK01piYEv0rKBwgIC3Ckfq2SyYxYniEjTXOOcIWIUY5QuWTip5ZXekiEEIAi5TTAjIpLyhtv28vLy/btu37DoDhiVgkmCiRQSki6kmoDqkwE6MWwzABSbGS5Iq1U/w2Qmytae9dVEmaaIQn1BkVr7f799e7YGbdrhMTiJmztgLAyHyc53OckOHAgUTcHBhRkDEjVySCY6aobvuGALNmIkRILsiJGICKRCIeyYIAkIjT1jlGE034fHtYiLAa1e5nRI6iWyfa8rnmmDMv7vaFJ1vm+Pn60v2Wr+IaonxJrPKq3AiwfnePIPjU17qZR2lWhbj1vm03Jo3A2hE8gFQpOdb0BI9ggN6aMFfIKSJgmodzxi7EyGNMJnrZ7/euP173l33vxMoUbhZOiEKEFlanJyEJIdExR6XUrKICEWYGiVwrlfjx8Xj/+R5ADjjnnMseNucYAPj+/o6lJmoKhIaf3YJPPc2XrvirsK79lZmLxIsJxEiqwIoi0wMRE8HqgEtgJu4tkN6fTzAjgBk+0izTM7CWxefX/woNuH4ARAQQFRWJAnh4iAqLfE67qCSfVSfzBVin+mTxiizKr19HMpIRgcgy15rusQpPh+juIgz5iSUCsAjGYBUK+vnr1+N87r19f3tNd4Mg4qhIKwgWJBbza0aDn6EvSeJJwLKAzrGqHUlESkAZdU0soE0SeSYSh/mcc5o7wBpzme+3W7gXDc7XWsuEuPeObkik2pAQmQPB3Gt00LSNc1681ZqORVj4Mv/Pj/Yy7GLdXC80MXyFJCSWKJU+oRKQCQhccHd3SLz4KAmi7W+//+6Wf/16VnE3l4egJcwI84QIihDAm7aOjECUIIIN4FgOaaJ0k61Je7u/vt33W9etXYmDwMrJnuHL0hwQSC6fxlzzj7/+TOQA8gyzdF8q0lrzTFWtKeHzeSRx31/KXW4BymwWP//6mQCfwUr4fzXNvraJK5AAEa9kl2vAAo5pFitQGABm0SYRI2NWXCUkOYJwILgZuDMyiszlnokkABBAjFDzdib+7N7QJcnITPBxnEKs+95a2/f9UiYDmNl5ngB4u91721Slitv/lLJ+IRFUVcJMtFUVQYAJKSoV0F0SsbrdZuRY0xJm4prT3Y8xEuHbvqfZ4/HRe99vtzJkCZMIY0JvEsml9coMRDrHeoxZdUYRRABARCgMw7fekLmptE/bbgXjjPMRiKzqCWOeCScxTos1FyEyRkh22gnVzeZaHkHCiOSx5losYnaOY9REsHIALpdRrK8f42uH+PpQy1paiKXrn2okebEPCBIoXVkoMylq3OvukHGc5+N5JBAisMhnIVeQOOCiLFasE0Dp3sAcwZkwhERa33cRhchb7697b8LMZGbLjD7V7YwEDJ45zR7zfH8+UPjX8QwgRIaErTdAmhFUD/zyOqC3/YYkbb/N5WNaJwxM4ZzLolCT4cxMQJfn4RNM9rVfwGee6deDgQBMgkpAGJnTLN0cMsrnW6sfkQnyPOZaqtK1VZCCJzhgOVcTAYUIIT8PH2YuskY19wSo4lHC/TiOn+/vY2gTud3uNaSvOZVc6ol/H2KZudYaY7h7aw0RL9jOcN96v99uzzmGWaQj4tb7bdsSYM4REHXExDLPqFsIEc15HmOOuTwykDPDbTHC621vIg6VwwEsQtwzc34c1Vmvc7O0qFURU4JFjk82NUDaWojW+9ZatwwWJWmP5zjPAZgkVGG6kPByv1smVHE5l4eTMBKNuaZ5LqusX484jqNOgMisXwQACoj9BaL5er/q/K02Tp3yXAO+/PxsEkqPpcKMGEAfz3OZN+XjnP/68+e+b8QCEAjBBBGuiLsIRgBEeHQE9HV5SjiFWZvstCczMiMgAb7c7o25IHbnXLN8C5G2zNYaNi3CM05b5xy3lztoO55nKVNWeG9KCDlHzRwYSFhVNJC3be/9RvLnz8eZFgsts8KmLCrKJa+k7v/rEPjPV60zqBFQRvWFAvL6bLjsfWXxSICEgLk+bZ8c4eEZyVje+ksbWRxcvjLDLz9kAhNt2oQZiXpr1c4ec2IGtOh9++p7fv14mRdwtz7BawzmXoyp/x/M9UXU4YwQWAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "choice = 'roads.png'\n", + "image_dir = f'images/{choice}'\n", + "image = Image.open(image_dir).convert('RGB')\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prediction: tensor([[ 1.7050, 1.5137, -3.3119]], grad_fn=)\n" + ] + } + ], + "source": [ + "proc_image = preprocess_image(image)\n", + "\n", + "# prediction by model\n", + "preds = model(proc_image)\n", + "print('prediction:', preds)\n", + "target = torch.argmax(preds).item()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "GBP = GuidedBackprop(model)\n", + "guided_grads = GBP.generate_gradients(proc_image, target)\n", + "grayscale_guided_grads = convert_to_grayscale(guided_grads)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = np.squeeze(grayscale_guided_grads.transpose(1, 2, 0))\n", + "fig = plt.figure(frameon=False)\n", + "ax = plt.Axes(fig, [0., 0., 1., 1.])\n", + "ax.set_axis_off()\n", + "fig.add_axes(ax)\n", + "ax.imshow(img, cmap='gray', vmin=0, vmax=1)\n", + "fig.savefig('out.png', bbox_inches='tight', pad_inches=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "predicting-poverty-replication", + "language": "python", + "name": "predicting-poverty-replication" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/figures/activations1.png b/predicting-poverty-education-replication/figures/activations1.png new file mode 100644 index 0000000..3d31627 Binary files /dev/null and b/predicting-poverty-education-replication/figures/activations1.png differ diff --git a/predicting-poverty-education-replication/figures/activations2.png b/predicting-poverty-education-replication/figures/activations2.png new file mode 100644 index 0000000..582e161 Binary files /dev/null and b/predicting-poverty-education-replication/figures/activations2.png differ diff --git a/predicting-poverty-education-replication/figures/activations3.png b/predicting-poverty-education-replication/figures/activations3.png new file mode 100644 index 0000000..7d10d6c Binary files /dev/null and b/predicting-poverty-education-replication/figures/activations3.png differ diff --git a/predicting-poverty-education-replication/figures/ethiopia_results.png b/predicting-poverty-education-replication/figures/ethiopia_results.png new file mode 100644 index 0000000..03c4398 Binary files /dev/null and b/predicting-poverty-education-replication/figures/ethiopia_results.png differ diff --git a/predicting-poverty-education-replication/figures/img1.png b/predicting-poverty-education-replication/figures/img1.png new file mode 100644 index 0000000..2baa43d Binary files /dev/null and b/predicting-poverty-education-replication/figures/img1.png differ diff --git a/predicting-poverty-education-replication/figures/img2.png b/predicting-poverty-education-replication/figures/img2.png new file mode 100644 index 0000000..0d4bdb4 Binary files /dev/null and b/predicting-poverty-education-replication/figures/img2.png differ diff --git a/predicting-poverty-education-replication/figures/img3.png b/predicting-poverty-education-replication/figures/img3.png new file mode 100644 index 0000000..ab96ee7 Binary files /dev/null and b/predicting-poverty-education-replication/figures/img3.png differ diff --git a/predicting-poverty-education-replication/figures/malawi_results.png b/predicting-poverty-education-replication/figures/malawi_results.png new file mode 100644 index 0000000..95cdaa7 Binary files /dev/null and b/predicting-poverty-education-replication/figures/malawi_results.png differ diff --git a/predicting-poverty-education-replication/figures/nigeria_results.png b/predicting-poverty-education-replication/figures/nigeria_results.png new file mode 100644 index 0000000..0217dc8 Binary files /dev/null and b/predicting-poverty-education-replication/figures/nigeria_results.png differ diff --git a/predicting-poverty-education-replication/gold_standard/remote_features_survey_model.ipynb b/predicting-poverty-education-replication/gold_standard/remote_features_survey_model.ipynb new file mode 100644 index 0000000..9009215 --- /dev/null +++ b/predicting-poverty-education-replication/gold_standard/remote_features_survey_model.ipynb @@ -0,0 +1,1191 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This file grabs everything from the LSMS survey that I think an image could possibly recognize and uses those features to predict consumption. This serves as a \"gold standard\" for any image-based model. Of course, this is no indication of an \"upper bound\" on CNN performance, but rather offers some means of comparison to a model that was built using only survey data.\n", + "\n", + "I only implement this gold standard for Malawi, but it could be done for the other countries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "\n", + "RANDOM_SEED = 7 # for reproducibility\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "RESULTS_DIR = os.path.join(BASE_DIR, 'results')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(BASE_DIR)\n", + "from utils import merge_on_lat_lon, assign_groups, run_randomized_cv, run_spatial_cv" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def process_malawi():\n", + " np.random.seed(RANDOM_SEED)\n", + " lsms_dir = os.path.join(COUNTRIES_DIR, 'malawi_2016', 'LSMS')\n", + " consumption_file = 'IHS4 Consumption Aggregate.csv'\n", + " consumption_ph_col = 'rexpagg' # per household\n", + " hhsize_col = 'hhsize' # people in household\n", + "\n", + " geovariables_file = 'HouseholdGeovariables_csv/HouseholdGeovariablesIHS4.csv'\n", + " lat_col = 'lat_modified'\n", + " lon_col = 'lon_modified'\n", + "\n", + " # purchasing power parity for malawi in 2016 (https://data.worldbank.org/indicator/PA.NUS.PRVT.PP?locations=MW)\n", + " ppp = 215.182\n", + " \n", + " df_geo = pd.read_csv(os.path.join(lsms_dir, geovariables_file))\n", + " df_hhf = pd.read_csv(os.path.join(lsms_dir, 'hh_mod_f.csv'))\n", + " df_plot = pd.read_csv(os.path.join(lsms_dir, 'plotgeovariablesihs4.csv'))\n", + " df_com = pd.read_csv(os.path.join(lsms_dir, 'com_cd.csv'))\n", + " df_com2 = pd.read_csv(os.path.join(lsms_dir, 'com_cf1.csv'))\n", + " df_tie = pd.read_csv(os.path.join(lsms_dir, consumption_file))[['case_id', 'ea_id']]\n", + "\n", + " hhf_input = df_hhf[['case_id', 'hh_f10', 'hh_f08']]\n", + " com_input = df_com[['ea_id', 'com_cd01', 'com_cd16', 'com_cd18a', 'com_cd20a', 'com_cd22a', 'com_cd24a',\n", + " 'com_cd27a', 'com_cd36a', 'com_cd40a', 'com_cd49a', 'com_cd51a', 'com_cd60a', 'com_cd67a',\n", + " 'com_cd69a']]\n", + "\n", + " com2_input = df_com2[['ea_id', 'com_cf08a']]\n", + "\n", + " geo_input = df_geo[['case_id', 'dist_admarc', 'dist_agmrkt', 'dist_auction', 'dist_boma', 'dist_borderpost',\n", + " 'dist_popcenter', 'dist_road', 'af_bio_1', 'af_bio_8', 'af_bio_12', 'af_bio_13', 'af_bio_16', \n", + " 'lat_modified', 'lon_modified']]\n", + " geo_input.rename(columns={'lat_modified': 'cluster_lat', 'lon_modified': 'cluster_lon'}, inplace=True)\n", + " geo_input.dropna(inplace=True)\n", + "\n", + " plot_input = df_plot[['case_id', 'dist_hh']]\n", + " \n", + " df_cons = pd.read_csv(os.path.join(COUNTRIES_DIR, 'malawi_2016', 'processed', 'clusters.csv'))\n", + " df_merge = merge_on_lat_lon(df_cons, geo_input)\n", + " df_merge = pd.merge(df_merge, hhf_input, on='case_id', how='left')\n", + " df_merge = pd.merge(df_merge, df_tie, on='case_id', how='left')\n", + " df_merge = pd.merge(df_merge, com_input, on='ea_id', how='left')\n", + " df_merge = pd.merge(df_merge, com2_input, on='ea_id', how='left')\n", + " df_merge = pd.merge(df_merge, plot_input, on='case_id', how='left')\n", + " return df_merge.drop(['case_id', 'ea_id'], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/envs/predicting-poverty-replication/lib/python3.7/site-packages/pandas/core/frame.py:4133: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " errors=errors,\n", + "/home/jupyter/.local/lib/python3.7/site-packages/ipykernel_launcher.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n" + ] + } + ], + "source": [ + "df_mw = process_malawi()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countrycluster_latcluster_loncons_pcnightlightsdist_admarcdist_agmrktdist_auctiondist_bomadist_borderpost...com_cd27acom_cd36acom_cd40acom_cd49acom_cd51acom_cd60acom_cd67acom_cd69acom_cf08adist_hh
0mw-17.0951535.2172131.4232390.0252061.021.0145.021.04.0...NaNNaNNaNNaNNaNNaNNaNNaNNaN1.2
1mw-17.0951535.2172131.4232390.0252062.020.0145.020.04.0...NaNNaNNaNNaNNaNNaNNaNNaNNaN1.0
2mw-17.0951535.2172131.4232390.0252062.020.0145.020.04.0...NaNNaNNaNNaNNaNNaNNaNNaNNaN1.7
3mw-17.0951535.2172131.4232390.0252062.020.0145.020.04.0...NaNNaNNaNNaNNaNNaNNaNNaNNaN1.7
4mw-17.0951535.2172131.4232390.0252062.020.0145.020.05.0...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.9
\n", + "

5 rows × 35 columns

\n", + "
" + ], + "text/plain": [ + " country cluster_lat cluster_lon cons_pc nightlights dist_admarc \\\n", + "0 mw -17.09515 35.217213 1.423239 0.025206 1.0 \n", + "1 mw -17.09515 35.217213 1.423239 0.025206 2.0 \n", + "2 mw -17.09515 35.217213 1.423239 0.025206 2.0 \n", + "3 mw -17.09515 35.217213 1.423239 0.025206 2.0 \n", + "4 mw -17.09515 35.217213 1.423239 0.025206 2.0 \n", + "\n", + " dist_agmrkt dist_auction dist_boma dist_borderpost ... com_cd27a \\\n", + "0 21.0 145.0 21.0 4.0 ... NaN \n", + "1 20.0 145.0 20.0 4.0 ... NaN \n", + "2 20.0 145.0 20.0 4.0 ... NaN \n", + "3 20.0 145.0 20.0 4.0 ... NaN \n", + "4 20.0 145.0 20.0 5.0 ... NaN \n", + "\n", + " com_cd36a com_cd40a com_cd49a com_cd51a com_cd60a com_cd67a \\\n", + "0 NaN NaN NaN NaN NaN NaN \n", + "1 NaN NaN NaN NaN NaN NaN \n", + "2 NaN NaN NaN NaN NaN NaN \n", + "3 NaN NaN NaN NaN NaN NaN \n", + "4 NaN NaN NaN NaN NaN NaN \n", + "\n", + " com_cd69a com_cf08a dist_hh \n", + "0 NaN NaN 1.2 \n", + "1 NaN NaN 1.0 \n", + "2 NaN NaN 1.7 \n", + "3 NaN NaN 1.7 \n", + "4 NaN NaN 0.9 \n", + "\n", + "[5 rows x 35 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_mw.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(19865, 35)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_mw.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "df_use = pd.get_dummies(df_mw.drop(['country'], axis=1))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "clusters = df_use.groupby(['cluster_lat', 'cluster_lon'])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "cluster_df = clusters.mean().reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cluster_latcluster_loncons_pcnightlightsdist_admarcdist_agmrktdist_auctiondist_bomadist_borderpostdist_popcenter...com_cd27acom_cd36acom_cd40acom_cd49acom_cd51acom_cd60acom_cd67acom_cd69acom_cf08adist_hh
0-17.09515035.2172131.4232390.0252061.50000020.125000145.00000020.1250004.12500020.125000...NaNNaNNaNNaNNaNNaNNaNNaNNaN1.510000
1-17.09235135.1146431.2662040.0000008.10526325.578947146.36842125.57894710.10526325.578947...4.06.02.0NaN6.06.045.045.06.00.492308
2-17.01669835.0796291.5668700.00000015.76190523.047619134.85714323.04761921.52381023.047619...0.060.030.0NaN15.060.060.060.045.00.311765
3-16.97724335.2057061.6692450.0082666.97058811.764706135.76470611.76470613.50000011.764706...1.015.03.0NaN3.03.015.015.015.02.594118
4-16.95638535.1689671.0898910.00229513.00000013.681818130.18181813.68181820.63636413.681818...500.040.015.0NaN15.015.040.040.040.00.122222
..................................................................
775-9.59137833.0574501.4099320.0000007.66666726.222222235.27777826.2222225.944444103.666667...1.03.03.02.0NaN3.030.030.05.00.022222
776-9.55039733.2915581.2428010.00000010.18518518.370370228.74074118.37037017.48148182.481481...0.021.00.0NaN7.021.021.021.021.00.107692
777-9.51923033.1391931.8041220.0035575.05714324.971429238.40000024.97142917.42857198.828571...0.041.08.0NaN8.08.041.0NaN8.01.681818
778-9.50753833.2596491.7917250.0000004.46511621.604651234.20930221.60465118.44186090.000000...0.05.05.050.0NaN50.050.050.020.00.319512
779-9.42966733.0221181.5347020.00044818.78947441.789474253.52631641.7894746.210526116.473684...200.07.07.07.0NaN5.030.030.07.02.988235
\n", + "

780 rows × 34 columns

\n", + "
" + ], + "text/plain": [ + " cluster_lat cluster_lon cons_pc nightlights dist_admarc \\\n", + "0 -17.095150 35.217213 1.423239 0.025206 1.500000 \n", + "1 -17.092351 35.114643 1.266204 0.000000 8.105263 \n", + "2 -17.016698 35.079629 1.566870 0.000000 15.761905 \n", + "3 -16.977243 35.205706 1.669245 0.008266 6.970588 \n", + "4 -16.956385 35.168967 1.089891 0.002295 13.000000 \n", + ".. ... ... ... ... ... \n", + "775 -9.591378 33.057450 1.409932 0.000000 7.666667 \n", + "776 -9.550397 33.291558 1.242801 0.000000 10.185185 \n", + "777 -9.519230 33.139193 1.804122 0.003557 5.057143 \n", + "778 -9.507538 33.259649 1.791725 0.000000 4.465116 \n", + "779 -9.429667 33.022118 1.534702 0.000448 18.789474 \n", + "\n", + " dist_agmrkt dist_auction dist_boma dist_borderpost dist_popcenter \\\n", + "0 20.125000 145.000000 20.125000 4.125000 20.125000 \n", + "1 25.578947 146.368421 25.578947 10.105263 25.578947 \n", + "2 23.047619 134.857143 23.047619 21.523810 23.047619 \n", + "3 11.764706 135.764706 11.764706 13.500000 11.764706 \n", + "4 13.681818 130.181818 13.681818 20.636364 13.681818 \n", + ".. ... ... ... ... ... \n", + "775 26.222222 235.277778 26.222222 5.944444 103.666667 \n", + "776 18.370370 228.740741 18.370370 17.481481 82.481481 \n", + "777 24.971429 238.400000 24.971429 17.428571 98.828571 \n", + "778 21.604651 234.209302 21.604651 18.441860 90.000000 \n", + "779 41.789474 253.526316 41.789474 6.210526 116.473684 \n", + "\n", + " ... com_cd27a com_cd36a com_cd40a com_cd49a com_cd51a com_cd60a \\\n", + "0 ... NaN NaN NaN NaN NaN NaN \n", + "1 ... 4.0 6.0 2.0 NaN 6.0 6.0 \n", + "2 ... 0.0 60.0 30.0 NaN 15.0 60.0 \n", + "3 ... 1.0 15.0 3.0 NaN 3.0 3.0 \n", + "4 ... 500.0 40.0 15.0 NaN 15.0 15.0 \n", + ".. ... ... ... ... ... ... ... \n", + "775 ... 1.0 3.0 3.0 2.0 NaN 3.0 \n", + "776 ... 0.0 21.0 0.0 NaN 7.0 21.0 \n", + "777 ... 0.0 41.0 8.0 NaN 8.0 8.0 \n", + "778 ... 0.0 5.0 5.0 50.0 NaN 50.0 \n", + "779 ... 200.0 7.0 7.0 7.0 NaN 5.0 \n", + "\n", + " com_cd67a com_cd69a com_cf08a dist_hh \n", + "0 NaN NaN NaN 1.510000 \n", + "1 45.0 45.0 6.0 0.492308 \n", + "2 60.0 60.0 45.0 0.311765 \n", + "3 15.0 15.0 15.0 2.594118 \n", + "4 40.0 40.0 40.0 0.122222 \n", + ".. ... ... ... ... \n", + "775 30.0 30.0 5.0 0.022222 \n", + "776 21.0 21.0 21.0 0.107692 \n", + "777 41.0 NaN 8.0 1.681818 \n", + "778 50.0 50.0 20.0 0.319512 \n", + "779 30.0 30.0 7.0 2.988235 \n", + "\n", + "[780 rows x 34 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cluster_df" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "com_cd01 0.032051\n", + "com_cd16 0.379487\n", + "com_cd18a 0.350000\n", + "com_cd20a 0.257692\n", + "com_cd22a 0.151282\n", + "com_cd24a 0.191026\n", + "com_cd27a 0.032051\n", + "com_cd36a 0.032051\n", + "com_cd40a 0.032051\n", + "com_cd49a 0.603846\n", + "com_cd51a 0.288462\n", + "com_cd60a 0.032051\n", + "com_cd67a 0.078205\n", + "com_cd69a 0.214103\n", + "com_cf08a 0.434615\n", + "dist_hh 0.042308\n", + "dtype: float64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# a few columns have a high percentage of NA\n", + "nas = cluster_df.isna().sum() / len(cluster_df)\n", + "nas[nas > 0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def nan_handler(df):\n", + " nas = df.isna().sum()\n", + " for c in df:\n", + " if nas[c] > 0:\n", + " df[c] = df[c].fillna(df[c].median())\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "cleaned_df = nan_handler(cluster_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cluster_latcluster_loncons_pcnightlightsdist_admarcdist_agmrktdist_auctiondist_bomadist_borderpostdist_popcenter...com_cd27acom_cd36acom_cd40acom_cd49acom_cd51acom_cd60acom_cd67acom_cd69acom_cf08adist_hh
0-17.09515035.2172131.4232390.0252061.50000020.125000145.00000020.1250004.12500020.125000...2.012.05.010.06.010.020.025.07.01.510000
1-17.09235135.1146431.2662040.0000008.10526325.578947146.36842125.57894710.10526325.578947...4.06.02.010.06.06.045.045.06.00.492308
2-17.01669835.0796291.5668700.00000015.76190523.047619134.85714323.04761921.52381023.047619...0.060.030.010.015.060.060.060.045.00.311765
3-16.97724335.2057061.6692450.0082666.97058811.764706135.76470611.76470613.50000011.764706...1.015.03.010.03.03.015.015.015.02.594118
4-16.95638535.1689671.0898910.00229513.00000013.681818130.18181813.68181820.63636413.681818...500.040.015.010.015.015.040.040.040.00.122222
\n", + "

5 rows × 34 columns

\n", + "
" + ], + "text/plain": [ + " cluster_lat cluster_lon cons_pc nightlights dist_admarc dist_agmrkt \\\n", + "0 -17.095150 35.217213 1.423239 0.025206 1.500000 20.125000 \n", + "1 -17.092351 35.114643 1.266204 0.000000 8.105263 25.578947 \n", + "2 -17.016698 35.079629 1.566870 0.000000 15.761905 23.047619 \n", + "3 -16.977243 35.205706 1.669245 0.008266 6.970588 11.764706 \n", + "4 -16.956385 35.168967 1.089891 0.002295 13.000000 13.681818 \n", + "\n", + " dist_auction dist_boma dist_borderpost dist_popcenter ... com_cd27a \\\n", + "0 145.000000 20.125000 4.125000 20.125000 ... 2.0 \n", + "1 146.368421 25.578947 10.105263 25.578947 ... 4.0 \n", + "2 134.857143 23.047619 21.523810 23.047619 ... 0.0 \n", + "3 135.764706 11.764706 13.500000 11.764706 ... 1.0 \n", + "4 130.181818 13.681818 20.636364 13.681818 ... 500.0 \n", + "\n", + " com_cd36a com_cd40a com_cd49a com_cd51a com_cd60a com_cd67a \\\n", + "0 12.0 5.0 10.0 6.0 10.0 20.0 \n", + "1 6.0 2.0 10.0 6.0 6.0 45.0 \n", + "2 60.0 30.0 10.0 15.0 60.0 60.0 \n", + "3 15.0 3.0 10.0 3.0 3.0 15.0 \n", + "4 40.0 15.0 10.0 15.0 15.0 40.0 \n", + "\n", + " com_cd69a com_cf08a dist_hh \n", + "0 25.0 7.0 1.510000 \n", + "1 45.0 6.0 0.492308 \n", + "2 60.0 45.0 0.311765 \n", + "3 15.0 15.0 2.594118 \n", + "4 40.0 40.0 0.122222 \n", + "\n", + "[5 rows x 34 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cleaned_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "y = cleaned_df['cons_pc'].values\n", + "\n", + "to_drop = ['cluster_lat', 'cluster_lon', 'cons_pc', 'nightlights']\n", + "x = cleaned_df.drop(to_drop, axis=1).values" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "r2, _ = run_randomized_cv(x, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.08803164394491252" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r2" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "r2, _ = run_randomized_cv(x, np.log(y))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.46636052584664556" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r2" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "groups, _ = assign_groups(cleaned_df, 5)\n", + "r2, _ = run_spatial_cv(x, y, groups)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1.2040690308579176" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "predicting-poverty-replication", + "language": "python", + "name": "predicting-poverty-replication" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/papers/.DS_Store b/predicting-poverty-education-replication/papers/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/predicting-poverty-education-replication/papers/.DS_Store differ diff --git a/predicting-poverty-education-replication/papers/Satellite imagery and ML to predict poverty.pdf b/predicting-poverty-education-replication/papers/Satellite imagery and ML to predict poverty.pdf new file mode 100644 index 0000000..c6ef14e Binary files /dev/null and b/predicting-poverty-education-replication/papers/Satellite imagery and ML to predict poverty.pdf differ diff --git a/predicting-poverty-education-replication/papers/Supplementary Info Paper.pdf b/predicting-poverty-education-replication/papers/Supplementary Info Paper.pdf new file mode 100644 index 0000000..b2a05b4 Binary files /dev/null and b/predicting-poverty-education-replication/papers/Supplementary Info Paper.pdf differ diff --git a/predicting-poverty-education-replication/papers/Transfer Learning Paper.pdf b/predicting-poverty-education-replication/papers/Transfer Learning Paper.pdf new file mode 100644 index 0000000..fee5682 Binary files /dev/null and b/predicting-poverty-education-replication/papers/Transfer Learning Paper.pdf differ diff --git a/predicting-poverty-education-replication/papers/aaai16.pdf b/predicting-poverty-education-replication/papers/aaai16.pdf new file mode 100644 index 0000000..fee5682 Binary files /dev/null and b/predicting-poverty-education-replication/papers/aaai16.pdf differ diff --git a/predicting-poverty-education-replication/papers/jean_et_al.pdf b/predicting-poverty-education-replication/papers/jean_et_al.pdf new file mode 100644 index 0000000..0fa7284 Binary files /dev/null and b/predicting-poverty-education-replication/papers/jean_et_al.pdf differ diff --git a/predicting-poverty-education-replication/requirements.txt b/predicting-poverty-education-replication/requirements.txt new file mode 100644 index 0000000..fc8142c --- /dev/null +++ b/predicting-poverty-education-replication/requirements.txt @@ -0,0 +1,8 @@ +numpy +pandas +requests +scikit-learn +geoio +Pillow==6.2.1 +matplotlib +tqdm diff --git a/predicting-poverty-education-replication/scripts/.DS_Store b/predicting-poverty-education-replication/scripts/.DS_Store new file mode 100644 index 0000000..05a5f92 Binary files /dev/null and b/predicting-poverty-education-replication/scripts/.DS_Store differ diff --git a/predicting-poverty-education-replication/scripts/.ipynb_checkpoints/feature_extract-checkpoint.ipynb b/predicting-poverty-education-replication/scripts/.ipynb_checkpoints/feature_extract-checkpoint.ipynb new file mode 100644 index 0000000..5878a9d --- /dev/null +++ b/predicting-poverty-education-replication/scripts/.ipynb_checkpoints/feature_extract-checkpoint.ipynb @@ -0,0 +1,744 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the images marked as valid per cluster, we pass them through the CNN and extract their feature vectors. the results are stored at a per-country basis. For example, all Malawi feature extractions will go into results/malawi_2016/cnn." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil\n", + "import numpy as np\n", + "import pandas as pd\n", + "from tqdm.notebook import tqdm\n", + "import pickle\n", + "\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "import numpy as np\n", + "import torchvision\n", + "from torchvision import datasets, models, transforms\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import copy" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "PROCESSED_DIR = os.path.join(BASE_DIR, 'data', 'processed')\n", + "RESULTS_DIR = os.path.join(BASE_DIR, 'results')\n", + "CNN_TRAIN_IMAGE_DIR = os.path.join(BASE_DIR, 'data', 'cnn_images')\n", + "CNN_DIR = os.path.join(BASE_DIR, 'models', 'trained_model.pt')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(RESULTS_DIR, exist_ok=True)\n", + "for country in ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']:\n", + " os.makedirs(os.path.join(RESULTS_DIR, country), exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Feature extract with CNN\n", + "If you have run this step before, you can skip it and run the commented out code in the next section to quick-start." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df_images = pd.read_csv(os.path.join(PROCESSED_DIR, 'image_download_actual.csv'))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_binis_train
04.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng1True
14.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng1True
24.285842272936016_6.238809056956016_4.31578611...4.2858426.2388094.3157866.2687534.3177170.123354ng1True
34.270870351534024_6.253780978358008_4.31578611...4.2708706.2537814.3157866.2687534.3177170.123354ng1True
44.345729958543984_6.253780978358008_4.31578611...4.3457306.2537814.3157866.2687534.3177170.123354ng1True
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 4.31578611574_6.223837135554024_4.31578611574_... 4.315786 6.223837 \n", + "1 4.330758037141992_6.223837135554024_4.31578611... 4.330758 6.223837 \n", + "2 4.285842272936016_6.238809056956016_4.31578611... 4.285842 6.238809 \n", + "3 4.270870351534024_6.253780978358008_4.31578611... 4.270870 6.253781 \n", + "4 4.345729958543984_6.253780978358008_4.31578611... 4.345730 6.253781 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \\\n", + "0 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "1 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "2 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "3 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "4 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "\n", + " is_train \n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_images.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using cpu as backend\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/serialization.py:493: SourceChangeWarning: source code of class 'torch.nn.modules.container.Sequential' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n", + " warnings.warn(msg, SourceChangeWarning)\n" + ] + } + ], + "source": [ + "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + "print(f'Using {device} as backend')\n", + "model = torch.load(CNN_DIR, map_location=device)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sequential(\n", + " (0): Linear(in_features=25088, out_features=4096, bias=True)\n", + " (1): ReLU(inplace=True)\n", + " (2): Dropout(p=0.5, inplace=False)\n", + " (3): Linear(in_features=4096, out_features=4096, bias=True)\n", + " (4): ReLU(inplace=True)\n", + " (5): Dropout(p=0.5, inplace=False)\n", + " (6): Linear(in_features=4096, out_features=3, bias=True)\n", + ")" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# rip off the final layers\n", + "model.classifier = model.classifier[:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sequential(\n", + " (0): Linear(in_features=25088, out_features=4096, bias=True)\n", + " (1): ReLU(inplace=True)\n", + " (2): Dropout(p=0.5, inplace=False)\n", + " (3): Linear(in_features=4096, out_features=4096, bias=True)\n", + ")" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1712e3d5767847a9b3fef1fe5f4ab51b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/154 [00:00\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"\", line 22, in __getitem__\n X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n File \"\", line 28, in filename_to_im_tensor\n im = plt.imread(file)[:,:,:3]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/pyplot.py\", line 2407, in imread\n return matplotlib.image.imread(fname, format)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/image.py\", line 1501, in imread\n with img_open(fname) as image:\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/PIL/ImageFile.py\", line 95, in __init__\n self.fp = open(fp, \"rb\")\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/valid/0/11.965055592105976_8.717694503334023_11.9201398279_8.76261026754.png'\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mimage_order\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mdataset\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimage_list\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0;31m# forward pass for this class\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 45\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataloader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 46\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/notebook.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;31m# return super(tqdm...) will not catch exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1177\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1179\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1180\u001b[0m \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0mnext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__next__\u001b[0m \u001b[0;31m# Python 2 compatibility\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 845\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 847\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# (https://bugs.python.org/issue2651), so we work around it.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKeyErrorMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: Caught FileNotFoundError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 178, in _worker_loop\n data = fetcher.fetch(index)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in fetch\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in \n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"\", line 22, in __getitem__\n X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n File \"\", line 28, in filename_to_im_tensor\n im = plt.imread(file)[:,:,:3]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/pyplot.py\", line 2407, in imread\n return matplotlib.image.imread(fname, format)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/image.py\", line 1501, in imread\n with img_open(fname) as image:\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/PIL/ImageFile.py\", line 95, in __init__\n self.fp = open(fp, \"rb\")\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/valid/0/11.965055592105976_8.717694503334023_11.9201398279_8.76261026754.png'\n" + ] + } + ], + "source": [ + "transformer = transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", + " ])\n", + "\n", + "# custom dataset for fast image loading and processing\n", + "# does not follow the usual style of folder -> folder for each class -> image\n", + "# we just want one folder with images\n", + "class ForwardPassDataset(torch.utils.data.Dataset):\n", + " def __init__(self, image_dir, transformer):\n", + " self.image_dir = image_dir\n", + " self.image_list = os.listdir(self.image_dir)\n", + " self.transformer = transformer\n", + "\n", + " def __len__(self):\n", + " return len(self.image_list)\n", + "\n", + " def __getitem__(self, index):\n", + " image_name = self.image_list[index]\n", + "\n", + " # Load image\n", + " X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n", + " \n", + " # dataloaders need to return a label, but for the forward pass we don't really care\n", + " return X, -1\n", + " \n", + " def filename_to_im_tensor(self, file):\n", + " im = plt.imread(file)[:,:,:3]\n", + " im = self.transformer(im)\n", + " return im\n", + "\n", + "model.eval() \n", + "classes = [0, 1, 2]\n", + "# shape of final array will be (num_validation_images, 4096)\n", + "# we also want to record the image each index represents\n", + "feats = np.zeros(((~df_images['is_train']).sum(), 4096))\n", + "image_order = []\n", + "i = 0\n", + "for c in classes:\n", + " # use the validation images to do the forward pass\n", + " dataset = ForwardPassDataset(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid', str(c)), transformer)\n", + " dataloader = torch.utils.data.DataLoader(dataset, batch_size=8, shuffle=False, num_workers=4)\n", + " image_order += dataset.image_list\n", + " # forward pass for this class\n", + " for inputs, _ in tqdm(dataloader):\n", + " inputs = inputs.to(device)\n", + " outputs = model(inputs)\n", + " feats[i:i+len(inputs),:] = outputs.cpu().detach().numpy()\n", + " i += len(inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.26415765, -0.28140783, -0.29993755, ..., 0.33739716,\n", + " -0.96456331, -0.95310527],\n", + " [ 0.55027246, -0.06091447, 0.11403629, ..., -0.08996978,\n", + " -0.62236136, -0.96085918],\n", + " [ 0.52193987, -0.29220241, -0.45371717, ..., 0.34175205,\n", + " -1.1439786 , -0.85960728],\n", + " ...,\n", + " [-0.50936353, 0.39209121, -0.29870456, ..., 0.0661362 ,\n", + " 0.43009469, -0.34069228],\n", + " [ 0.24428365, 0.07818466, -0.89307284, ..., 0.29522306,\n", + " -0.72958505, -1.24356151],\n", + " [-0.30123377, 0.6785413 , -0.19940855, ..., 0.14395328,\n", + " 0.52420121, -1.16047859]])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "feats" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_namefeat_index
010.513181862198008_39.768191057994024_10.52815...0
1-14.632534157196016_34.981995235794024_-14.662...1
2-14.526346764205977_35.593520078598004_-14.481...2
37.4290196173360155_7.26950147266_7.45896346014...3
4-10.405547698244352_34.14279535535209_-10.4038...4
\n", + "
" + ], + "text/plain": [ + " image_name feat_index\n", + "0 10.513181862198008_39.768191057994024_10.52815... 0\n", + "1 -14.632534157196016_34.981995235794024_-14.662... 1\n", + "2 -14.526346764205977_35.593520078598004_-14.481... 2\n", + "3 7.4290196173360155_7.26950147266_7.45896346014... 3\n", + "4 -10.405547698244352_34.14279535535209_-10.4038... 4" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "forward_pass_df = pd.DataFrame.from_dict({'image_name': image_order, 'feat_index': np.arange(len(image_order))})\n", + "forward_pass_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "df_consumption = pd.merge(left=df_images, right=forward_pass_df, on='image_name')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# have we maintained all validation images?\n", + "assert len(df_consumption) == (~df_images['is_train']).sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_binis_trainfeat_index
0-17.125093842803985_35.18726915719602_-17.0951...-17.12509435.187269-17.09515035.2172131.4232390.025206mw0False318
1-17.140065764205975_35.232184921401995_-17.095...-17.14006635.232185-17.09515035.2172131.4232390.025206mw0False1861
2-17.065206157196016_35.262128764205976_-17.095...-17.06520635.262129-17.09515035.2172131.4232390.025206mw0False836
3-17.07737907859801_35.069727235794026_-17.0923...-17.07737935.069727-17.09235135.1146431.2662040.000000mw0False18
4-17.137266764205975_35.08469915719602_-17.0923...-17.13726735.084699-17.09235135.1146431.2662040.000000mw0False1051
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 -17.125093842803985_35.18726915719602_-17.0951... -17.125094 35.187269 \n", + "1 -17.140065764205975_35.232184921401995_-17.095... -17.140066 35.232185 \n", + "2 -17.065206157196016_35.262128764205976_-17.095... -17.065206 35.262129 \n", + "3 -17.07737907859801_35.069727235794026_-17.0923... -17.077379 35.069727 \n", + "4 -17.137266764205975_35.08469915719602_-17.0923... -17.137267 35.084699 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \\\n", + "0 -17.095150 35.217213 1.423239 0.025206 mw 0 \n", + "1 -17.095150 35.217213 1.423239 0.025206 mw 0 \n", + "2 -17.095150 35.217213 1.423239 0.025206 mw 0 \n", + "3 -17.092351 35.114643 1.266204 0.000000 mw 0 \n", + "4 -17.092351 35.114643 1.266204 0.000000 mw 0 \n", + "\n", + " is_train feat_index \n", + "0 False 318 \n", + "1 False 1861 \n", + "2 False 836 \n", + "3 False 18 \n", + "4 False 1051 " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_consumption.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aggregate Features\n", + "For each country, we aggregate the image features per cluster and save them to results/country/cnn" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "country_abbrv = ['mw', 'eth', 'ng']\n", + "country_dir = ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']\n", + "\n", + "for ca, cd in zip(country_abbrv, country_dir):\n", + " df_c = df_consumption[df_consumption['country'] == ca]\n", + " group = df_c.groupby(['cluster_lat', 'cluster_lon'])\n", + " x = np.zeros((len(group), 4096))\n", + " cluster_list = [] # the corresponding clusters (lat, lon) to the x aggregate feature array\n", + " for i, g in enumerate(group):\n", + " lat, lon = g[0]\n", + " im_sub = df_consumption[(df_consumption['cluster_lat'] == lat) & (df_consumption['cluster_lon'] == lon)].reset_index(drop=True)\n", + " agg_feats = np.zeros((len(im_sub), 4096))\n", + " for j, d in im_sub.iterrows():\n", + " agg_feats[j,:] = feats[d.feat_index]\n", + " agg_feats = agg_feats.mean(axis=0) # averages the features across all images in the cluster\n", + "\n", + " x[i,:] = agg_feats\n", + " cluster_list.append([lat, lon])\n", + " # save to the correct directory\n", + " save_dir = os.path.join(RESULTS_DIR, cd, 'cnn')\n", + " os.makedirs(save_dir, exist_ok=True)\n", + " np.save(os.path.join(save_dir, 'cluster_feats.npy'), x)\n", + " pickle.dump(cluster_list, open(os.path.join(save_dir, 'cluster_order.pkl'), 'wb')) \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "testenv", + "language": "python", + "name": "testenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/scripts/.ipynb_checkpoints/train_cnn-checkpoint.ipynb b/predicting-poverty-education-replication/scripts/.ipynb_checkpoints/train_cnn-checkpoint.ipynb new file mode 100644 index 0000000..c87e48d --- /dev/null +++ b/predicting-poverty-education-replication/scripts/.ipynb_checkpoints/train_cnn-checkpoint.ipynb @@ -0,0 +1,1190 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil\n", + "import numpy as np\n", + "import pandas as pd\n", + "from tqdm.notebook import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "RANDOM_SEED = 7 # for reproducibility\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "PROCESSED_DIR = os.path.join(BASE_DIR, 'data', 'processed')\n", + "\n", + "# these relate to training the CNN to predict nightlights\n", + "CNN_TRAIN_IMAGE_DIR = os.path.join(BASE_DIR, 'data', 'cnn_images')\n", + "CNN_SAVE_DIR = os.path.join(BASE_DIR, 'models')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(CNN_TRAIN_IMAGE_DIR, exist_ok=True)\n", + "os.makedirs(CNN_SAVE_DIR, exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Preprocess\n", + "After doing this once, you can skip to the training if the script broke" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "actually downloaded: 25246, expected: 14500\n" + ] + } + ], + "source": [ + "df_download = pd.read_csv(os.path.join(PROCESSED_DIR, 'image_download_locs.csv'))\n", + "downloaded = os.listdir(os.path.join(COUNTRIES_DIR, 'malawi_2016', 'images')) + \\\n", + " os.listdir(os.path.join(COUNTRIES_DIR, 'ethiopia_2015', 'images')) + \\\n", + " os.listdir(os.path.join(COUNTRIES_DIR, 'nigeria_2015', 'images'))\n", + "\n", + "print(f\"actually downloaded: {len(downloaded)}, expected: {len(df_download)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_bin
04.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng1
14.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng1
24.285842272936016_6.238809056956016_4.31578611...4.2858426.2388094.3157866.2687534.3177170.123354ng1
34.270870351534024_6.253780978358008_4.31578611...4.2708706.2537814.3157866.2687534.3177170.123354ng1
44.345729958543984_6.253780978358008_4.31578611...4.3457306.2537814.3157866.2687534.3177170.123354ng1
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 4.31578611574_6.223837135554024_4.31578611574_... 4.315786 6.223837 \n", + "1 4.330758037141992_6.223837135554024_4.31578611... 4.330758 6.223837 \n", + "2 4.285842272936016_6.238809056956016_4.31578611... 4.285842 6.238809 \n", + "3 4.270870351534024_6.253780978358008_4.31578611... 4.270870 6.253781 \n", + "4 4.345729958543984_6.253780978358008_4.31578611... 4.345730 6.253781 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \n", + "0 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "1 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "2 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "3 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "4 4.315786 6.268753 4.317717 0.123354 ng 1 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_download.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df_download['row'] = np.arange(len(df_download))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "\"['-13.642146764205977_34.846897078598005_-13.597231_34.861869.png'\\n '-15.84688_35.071951921402_-15.84688_35.05698.png'\\n '-11.884834921401993_34.132379_-11.869863_34.132379.png' ...\\n '-11.305565235794024_33.48830884280398_-11.350481_33.458365.png'\\n '.DS_Store' '.DS_Store'] not found in axis\"", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0midx_not_download\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_download\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'image_name'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdownloaded\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'row'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mdf_download\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0midx_not_download\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36mdrop\u001b[0;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[1;32m 4313\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4314\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minplace\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4315\u001b[0;31m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4316\u001b[0m )\n\u001b[1;32m 4317\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mdrop\u001b[0;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[1;32m 4151\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4152\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4153\u001b[0;31m \u001b[0mobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_drop_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4154\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4155\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m_drop_axis\u001b[0;34m(self, labels, axis, level, errors)\u001b[0m\n\u001b[1;32m 4186\u001b[0m \u001b[0mnew_axis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4187\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4188\u001b[0;31m \u001b[0mnew_axis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4189\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0maxis_name\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnew_axis\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mdrop\u001b[0;34m(self, labels, errors)\u001b[0m\n\u001b[1;32m 5589\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5590\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0merrors\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m\"ignore\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5591\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{labels[mask]} not found in axis\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5592\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mmask\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5593\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: \"['-13.642146764205977_34.846897078598005_-13.597231_34.861869.png'\\n '-15.84688_35.071951921402_-15.84688_35.05698.png'\\n '-11.884834921401993_34.132379_-11.869863_34.132379.png' ...\\n '-11.305565235794024_33.48830884280398_-11.350481_33.458365.png'\\n '.DS_Store' '.DS_Store'] not found in axis\"" + ] + } + ], + "source": [ + "idx_not_download = df_download.set_index('image_name').drop(downloaded)['row'].values.tolist()\n", + "df_download.drop(idx_not_download, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "df_download.drop('row', axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.41379310344827586, 0.3586206896551724, 0.22758620689655173)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# the distribution\n", + "(df_download['nightlights_bin']==0).mean(), (df_download['nightlights_bin']==1).mean(), (df_download['nightlights_bin']==2).mean()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Split images into train/valid.\n", + "Each cluster will contribute 80% of images for training, and 20% for validation." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "df_download.reset_index(drop=True, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_bin
04.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng1
14.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng1
24.285842272936016_6.238809056956016_4.31578611...4.2858426.2388094.3157866.2687534.3177170.123354ng1
34.270870351534024_6.253780978358008_4.31578611...4.2708706.2537814.3157866.2687534.3177170.123354ng1
44.345729958543984_6.253780978358008_4.31578611...4.3457306.2537814.3157866.2687534.3177170.123354ng1
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 4.31578611574_6.223837135554024_4.31578611574_... 4.315786 6.223837 \n", + "1 4.330758037141992_6.223837135554024_4.31578611... 4.330758 6.223837 \n", + "2 4.285842272936016_6.238809056956016_4.31578611... 4.285842 6.238809 \n", + "3 4.270870351534024_6.253780978358008_4.31578611... 4.270870 6.253781 \n", + "4 4.345729958543984_6.253780978358008_4.31578611... 4.345730 6.253781 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \n", + "0 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "1 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "2 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "3 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "4 4.315786 6.268753 4.317717 0.123354 ng 1 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_download.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "df_download['is_train'] = True" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/indexing.py:1637: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " self._setitem_single_block(indexer, value, name)\n" + ] + } + ], + "source": [ + "np.random.seed(RANDOM_SEED)\n", + "groups = df_download.groupby(['cluster_lat', 'cluster_lon'])\n", + "for _, g in groups:\n", + " n_ims = len(g)\n", + " n_train = int(0.8 * n_ims)\n", + " n_valid = n_ims - n_train\n", + " valid_choices = np.random.choice(np.arange(n_ims), replace=False, size=n_valid).tolist()\n", + " current_index = g.index\n", + " idx_valid = current_index[valid_choices]\n", + " df_download['is_train'].loc[idx_valid] = False" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7978620689655173" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_download['is_train'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# save this new dataframe\n", + "df_download.to_csv(os.path.join(PROCESSED_DIR, 'image_download_actual.csv'), index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'train'), exist_ok=False)\n", + "os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid'), exist_ok=False)\n", + "\n", + "labels = ['0', '1', '2']\n", + "for l in labels:\n", + " os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'train', l), exist_ok=False)\n", + " os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid', l), exist_ok=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "t = df_download[df_download['is_train']]\n", + "v = df_download[~df_download['is_train']]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(11569, 2931)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(t), len(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "copying train images\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c73db387267d48fc8812f72932669dda", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/11569 [00:00 10:\n", + " # fine tune whole model\n", + " for param in model_ft.parameters():\n", + " param.requires_grad = True\n", + " optimizer = optim.SGD(model_ft.parameters(), lr=1e-4, momentum=0.9)\n", + "\n", + " # Each epoch has a training and validation phase\n", + " for phase in ['train', 'valid']:\n", + " if phase == 'train':\n", + " model.train() # Set model to training mode\n", + " else:\n", + " model.eval() # Set model to evaluate mode\n", + "\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + "\n", + " # Iterate over data.\n", + " for inputs, labels in tqdm(dataloaders[phase]):\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # forward\n", + " # track history if only in train\n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, labels)\n", + "\n", + " _, preds = torch.max(outputs, 1)\n", + "\n", + " # backward + optimize only if in training phase\n", + " if phase == 'train':\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " # statistics\n", + " running_loss += loss.item() * inputs.size(0)\n", + " running_corrects += torch.sum(preds == labels.data)\n", + "\n", + " epoch_loss = running_loss / len(dataloaders[phase].dataset)\n", + " epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)\n", + "\n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + "\n", + " # deep copy the model\n", + " if phase == 'valid' and epoch_acc > best_acc:\n", + " best_acc = epoch_acc\n", + " best_model_wts = copy.deepcopy(model.state_dict())\n", + " if phase == 'valid':\n", + " val_acc_history.append(epoch_acc)\n", + " \n", + " print()\n", + "\n", + " time_elapsed = time.time() - since\n", + " print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))\n", + " print('Best val Acc: {:4f}'.format(best_acc))\n", + "\n", + " # load best model weights\n", + " model.load_state_dict(best_model_wts)\n", + " return model, val_acc_history" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0/19\n", + "----------\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "98513fb13ff84100b70ad72b4ebc3a18", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1447 [00:00\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/1/5.577058854163986_5.771977164594023_5.547115011360002_5.8168929288.png'\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Train and evaluate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, dataloaders, criterion, optimizer, num_epochs)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;31m# Iterate over data.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataloaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mphase\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 30\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/notebook.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;31m# return super(tqdm...) will not catch exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1177\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1179\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1180\u001b[0m \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0mnext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__next__\u001b[0m \u001b[0;31m# Python 2 compatibility\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 845\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 847\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# (https://bugs.python.org/issue2651), so we work around it.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKeyErrorMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: Caught FileNotFoundError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 178, in _worker_loop\n data = fetcher.fetch(index)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in fetch\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in \n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/1/5.577058854163986_5.771977164594023_5.547115011360002_5.8168929288.png'\n" + ] + } + ], + "source": [ + "# Setup the loss fxn\n", + "criterion = nn.CrossEntropyLoss()\n", + "\n", + "# Train and evaluate\n", + "model_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A model is already saved at this location\n" + ] + }, + { + "ename": "AssertionError", + "evalue": "None", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCNN_SAVE_DIR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'trained_model.pt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'A model is already saved at this location'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Saving model to {path}'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAssertionError\u001b[0m: None" + ] + } + ], + "source": [ + "path = os.path.join(CNN_SAVE_DIR, 'trained_model.pt')\n", + "assert not os.path.isfile(path), print('A model is already saved at this location')\n", + "print(f'Saving model to {path}')\n", + "torch.save(model_ft, path)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2fe8181ce2654062ba50450b26a2f647", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1447 [00:00\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/0/10.271252764598009_9.682578659135977_10.286224686_9.637662894930001.png'\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m# Iterate over data.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'train'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/notebook.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;31m# return super(tqdm...) will not catch exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1177\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1179\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1180\u001b[0m \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0mnext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__next__\u001b[0m \u001b[0;31m# Python 2 compatibility\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 845\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 847\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# (https://bugs.python.org/issue2651), so we work around it.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKeyErrorMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: Caught FileNotFoundError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 178, in _worker_loop\n data = fetcher.fetch(index)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in fetch\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in \n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/0/10.271252764598009_9.682578659135977_10.286224686_9.637662894930001.png'\n" + ] + } + ], + "source": [ + "# you can run below if you want to see the final accuracy on nightlights over the train set\n", + "model_ft.eval() # Set model to evaluate mode\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "running_loss = 0.0\n", + "running_corrects = 0\n", + "total = 0\n", + "\n", + "# Iterate over data.\n", + "for inputs, labels in tqdm(dataloaders_dict['train']):\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + "\n", + " # forward\n", + " # track history if only in train\n", + " with torch.set_grad_enabled(False):\n", + " outputs = model_ft(inputs)\n", + " loss = criterion(outputs, labels)\n", + "\n", + " _, preds = torch.max(outputs, 1)\n", + "\n", + " # statistics\n", + " running_loss += loss.item() * inputs.size(0)\n", + " running_corrects += torch.sum(preds == labels.data)\n", + " \n", + " total += len(preds)\n", + " \n", + "print(running_corrects.double()/total)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "testenv", + "language": "python", + "name": "testenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/scripts/download_images.ipynb b/predicting-poverty-education-replication/scripts/download_images.ipynb new file mode 100644 index 0000000..577509c --- /dev/null +++ b/predicting-poverty-education-replication/scripts/download_images.ipynb @@ -0,0 +1,3074 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "download_images.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "eb03e01e458a4797a88152b874f376e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7c0a93896bc04018beac3d9d8634fa5e", + "IPY_MODEL_516f34ee82664b1d8d9b385efa35eaa7" + ], + "layout": "IPY_MODEL_8f50de1322db49869a25e53ad103cdfe" + } + }, + "7c0a93896bc04018beac3d9d8634fa5e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "100%", + "description_tooltip": null, + "layout": "IPY_MODEL_e8a9e60dfc8341a18d60d9aa25fcf4c4", + "max": 14500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bec8e5c2800b433394e2c0856dd0d526", + "value": 14500 + } + }, + "516f34ee82664b1d8d9b385efa35eaa7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_466113287a364f27bdc04158b27555bf", + "placeholder": "​", + "style": "IPY_MODEL_dee1210a038945c9aa01296d060eaa6b", + "value": " 14500/14500 [4:31:10<00:00, 1.12s/it]" + } + }, + "8f50de1322db49869a25e53ad103cdfe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e8a9e60dfc8341a18d60d9aa25fcf4c4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bec8e5c2800b433394e2c0856dd0d526": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "initial" + } + }, + "466113287a364f27bdc04158b27555bf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dee1210a038945c9aa01296d060eaa6b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Aj2mm397iqS-" + }, + "source": [ + "Skip the first two steps if you've already ran them and simply need to continue downloading images" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6MlpN1c5irpO", + "outputId": "41e6525a-594b-400e-f02b-c143946d3913" + }, + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Mounted at /content/gdrive\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1KpqrxtQiqTD" + }, + "source": [ + "import math\n", + "import random\n", + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "from osgeo import gdal, osr\n", + "from tqdm.notebook import tqdm\n", + "import requests\n", + "import matplotlib.pyplot as plt\n", + "from io import BytesIO\n", + "import logging\n", + "import time" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "e9KaUKaXiqTE" + }, + "source": [ + "BASE_DIR = 'gdrive/MyDrive/geo'\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "PROCESSED_DIR = os.path.join(BASE_DIR, 'data', 'processed')\n", + "# can try using the google downloader, in which case change this to be your google api token\n", + "ACCESS_TOKEN_DIR = os.path.join(BASE_DIR, 'planet_api_key.txt')\n", + "\n", + "RANDOM_SEED = 7 # for reproducibility\n", + "\n", + "# each cluster must have AT LEAST this many images after doing nightlights processing\n", + "MIN_IMAGES_PER_CLUSTER = 10" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Uyb7qkkhiqTF" + }, + "source": [ + "# from ctypes.util import find_library\n", + "# find_library('geos_c')\n", + "import sys\n", + "sys.path.append(BASE_DIR)\n", + "from utils import create_space" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iRIf2ixRiqTG" + }, + "source": [ + "# Generate Download Locations" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DrRhGn1kiqTG" + }, + "source": [ + "# # df_mw = pd.read_csv(os.path.join(COUNTRIES_DIR, 'malawi_2016', 'processed/clusters.csv'))\n", + "# df_eth = pd.read_csv(os.path.join(COUNTRIES_DIR, 'ethiopia_2015', 'processed/clusters.csv'))\n", + "df_ng = pd.read_csv(os.path.join(COUNTRIES_DIR, 'nigeria_2015', 'processed/clusters.csv'))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 300 + }, + "id": "YDMyNVxriqTG", + "outputId": "ec6a6a5d-bf9e-41ff-e986-322f93d972bc" + }, + "source": [ + "for country in ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']:\n", + " os.makedirs(os.path.join(COUNTRIES_DIR, country, 'images'), exist_ok=False)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "error", + "ename": "FileExistsError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileExistsError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcountry\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'malawi_2016'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'ethiopia_2015'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'nigeria_2015'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmakedirs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCOUNTRIES_DIR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcountry\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'images'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexist_ok\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/lib/python3.7/os.py\u001b[0m in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 221\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 223\u001b[0;31m \u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 224\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mOSError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[0;31m# Cannot rely on checking for EEXIST, since the operating system\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileExistsError\u001b[0m: [Errno 17] File exists: 'gdrive/MyDrive/geo/data/countries/malawi_2016/images'" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QlxLFk0tiqTH" + }, + "source": [ + "def generate_download_locations(df, ipc=50):\n", + " '''\n", + " Takes a dataframe with columns cluster_lat, cluster_lon\n", + " Generates a 10km x 10km bounding box around the cluster and samples \n", + " ipc images per cluster. First samples in a grid fashion, then any \n", + " remaining points are randomly (uniformly) chosen\n", + " '''\n", + " np.random.seed(RANDOM_SEED) # for reproducability\n", + " df_download = {'image_name': [], 'image_lat': [], 'image_lon': [], 'cluster_lat': [], \n", + " 'cluster_lon': [], 'cons_pc': [], 'nightlights': [] }\n", + " \n", + " # side length of square for uniform distribution\n", + " edge_num = math.floor(math.sqrt(ipc))\n", + " for _, r in df.iterrows():\n", + " min_lat, min_lon, max_lat, max_lon = create_space(r.cluster_lat, r.cluster_lon)\n", + " lats = np.linspace(min_lat, max_lat, edge_num).tolist()\n", + " lons = np.linspace(min_lon, max_lon, edge_num).tolist()\n", + "\n", + " # performs cartesian product\n", + " uniform_points = np.transpose([np.tile(lats, len(lons)), np.repeat(lons, len(lats))])\n", + " \n", + " lats = uniform_points[:,0].tolist()\n", + " lons = uniform_points[:,1].tolist()\n", + " \n", + " # fills the remainder with random points\n", + " for _ in range(ipc - edge_num * edge_num):\n", + " lat = random.uniform(min_lat, max_lat)\n", + " lon = random.uniform(min_lon, max_lon)\n", + " lats.append(lat)\n", + " lons.append(lon)\n", + " \n", + " # add to dict\n", + " for lat, lon in zip(lats, lons):\n", + " # image name is going to be image_lat_image_lon_cluster_lat_cluster_lon.png\n", + " image_name = str(lat) + '_' + str(lon) + '_' + str(r.cluster_lat) + '_' + str(r.cluster_lon) + '.png'\n", + " df_download['image_name'].append(image_name)\n", + " df_download['image_lat'].append(lat)\n", + " df_download['image_lon'].append(lon)\n", + " df_download['cluster_lat'].append(r.cluster_lat)\n", + " df_download['cluster_lon'].append(r.cluster_lon)\n", + " df_download['cons_pc'].append(r.cons_pc)\n", + " df_download['nightlights'].append(r.nightlights)\n", + " \n", + " return pd.DataFrame.from_dict(df_download)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "l1BRpf9yiqTI" + }, + "source": [ + "# # df_mw_download = generate_download_locations(df_mw)\n", + "# df_eth_download = generate_download_locations(df_eth)\n", + "df_ng_download = generate_download_locations(df_ng)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "y5r_X3L2iqTK", + "outputId": "cbbf8934-ddb5-48b4-c614-1d66a28275df" + }, + "source": [ + "# df_mw_download.shape, df_eth_download.shape, df_ng_download.shape\n", + "df_ng_download.shape" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(33200, 7)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Nhd481lriqTN" + }, + "source": [ + "# df_mw_download.head()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "id": "SqvHNzWciqTO", + "outputId": "fb1b5833-4e0b-4809-ae6a-c73611d69391" + }, + "source": [ + "# df_eth_download.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlights
03.410784802784024_39.47107816189403_3.45570056...3.41078539.4710783.45570139.51599414.8546340.0
13.4257567241860163_39.47107816189403_3.4557005...3.42575739.4710783.45570139.51599414.8546340.0
23.440728645588008_39.47107816189403_3.45570056...3.44072939.4710783.45570139.51599414.8546340.0
33.45570056699_39.47107816189403_3.45570056699_...3.45570139.4710783.45570139.51599414.8546340.0
43.470672488391992_39.47107816189403_3.45570056...3.47067239.4710783.45570139.51599414.8546340.0
\n", + "
" + ], + "text/plain": [ + " image_name ... nightlights\n", + "0 3.410784802784024_39.47107816189403_3.45570056... ... 0.0\n", + "1 3.4257567241860163_39.47107816189403_3.4557005... ... 0.0\n", + "2 3.440728645588008_39.47107816189403_3.45570056... ... 0.0\n", + "3 3.45570056699_39.47107816189403_3.45570056699_... ... 0.0\n", + "4 3.470672488391992_39.47107816189403_3.45570056... ... 0.0\n", + "\n", + "[5 rows x 7 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "id": "unWw1QyTiqTO", + "outputId": "98877468-1022-418f-95c9-3bc26c2bb0a1" + }, + "source": [ + "df_ng_download.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlights
04.270870351534024_6.223837135554024_4.31578611...4.2708706.2238374.3157866.2687534.3177170.123354
14.285842272936016_6.223837135554024_4.31578611...4.2858426.2238374.3157866.2687534.3177170.123354
24.300814194338008_6.223837135554024_4.31578611...4.3008146.2238374.3157866.2687534.3177170.123354
34.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354
44.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354
\n", + "
" + ], + "text/plain": [ + " image_name ... nightlights\n", + "0 4.270870351534024_6.223837135554024_4.31578611... ... 0.123354\n", + "1 4.285842272936016_6.223837135554024_4.31578611... ... 0.123354\n", + "2 4.300814194338008_6.223837135554024_4.31578611... ... 0.123354\n", + "3 4.31578611574_6.223837135554024_4.31578611574_... ... 0.123354\n", + "4 4.330758037141992_6.223837135554024_4.31578611... ... 0.123354\n", + "\n", + "[5 rows x 7 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xf6dj5P8iqTP" + }, + "source": [ + "# # df_mw_download['country'] = 'mw'\n", + "# df_eth_download['country'] = 'eth'\n", + "df_ng_download['country'] = 'ng'" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "LW49lKmliqTP" + }, + "source": [ + "# for image download purposes the country distinction is irreleveant\n", + "# df_potential_download = pd.concat([df_mw_download, df_eth_download, df_ng_download], axis=0)\n", + "df_potential_download = df_ng_download\n", + "df_potential_download.reset_index(drop=True, inplace=True)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "id": "DkrzvDA3iqTP", + "outputId": "fce118b0-c801-4948-9ebe-f3782f2433d3" + }, + "source": [ + "df_potential_download.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountry
04.270870351534024_6.223837135554024_4.31578611...4.2708706.2238374.3157866.2687534.3177170.123354ng
14.285842272936016_6.223837135554024_4.31578611...4.2858426.2238374.3157866.2687534.3177170.123354ng
24.300814194338008_6.223837135554024_4.31578611...4.3008146.2238374.3157866.2687534.3177170.123354ng
34.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng
44.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng
\n", + "
" + ], + "text/plain": [ + " image_name ... country\n", + "0 4.270870351534024_6.223837135554024_4.31578611... ... ng\n", + "1 4.285842272936016_6.223837135554024_4.31578611... ... ng\n", + "2 4.300814194338008_6.223837135554024_4.31578611... ... ng\n", + "3 4.31578611574_6.223837135554024_4.31578611574_... ... ng\n", + "4 4.330758037141992_6.223837135554024_4.31578611... ... ng\n", + "\n", + "[5 rows x 8 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tkvD_SW7iqTQ" + }, + "source": [ + "# Filter Download Choices" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "g8TQCFGLiqTQ", + "outputId": "a2ccf8d4-f34a-432a-a3ca-68c53b7dcf56" + }, + "source": [ + "df_potential_download['nightlights'].max()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "67.03113555908203" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4GnrymuoiqTQ", + "outputId": "4c7e5d49-97b9-44c1-8337-ed23fed5f93a" + }, + "source": [ + "# most nightlights are 0\n", + "# let's download images that have nonzero nightlights to induce variety into the model\n", + "print((df_potential_download['nightlights'] == 0).mean())\n", + "print((df_potential_download['nightlights'] <= 2).mean())" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.23343373493975902\n", + "0.786144578313253\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6ibURIDaiqTR" + }, + "source": [ + "def drop_0s(df, fr=0.1):\n", + " \"\"\"\n", + " Solves for d:\n", + " (c_z - d)/(n - d) = fr\n", + " Where d = rows to drop, c_z = num rows with zero nightlights, n = num rows, fr = frac remaining\n", + " \n", + " Yields:\n", + " d = (c_z - n*fr) / (1 - fr)\n", + " \"\"\"\n", + " np.random.seed(RANDOM_SEED)\n", + " c_z = (df['nightlights']==0).sum()\n", + " n = len(df)\n", + " assert c_z / n > fr, print(f'Dataframe already has under {fr} zeros')\n", + " \n", + " d = (c_z - n * fr) / (1 - fr)\n", + " d = int(d)\n", + " print(f'dropping: {d}')\n", + " \n", + " zero_df = df[df['nightlights']==0]\n", + " zero_clusters = zero_df.groupby(['cluster_lat', 'cluster_lon'])\n", + " per_cluster_drop = int(d / len(zero_clusters))\n", + " print(f'Need to drop {per_cluster_drop} per cluster with 0 nightlights')\n", + " \n", + " drop_inds = []\n", + " for (cluster_lat, cluster_lon), group in zero_clusters:\n", + " z_inds = group.index\n", + " clust_drop = np.random.choice(z_inds, per_cluster_drop, replace=False)\n", + " assert len(group) - len(clust_drop) >= MIN_IMAGES_PER_CLUSTER, print(f'dropping too many in {cluster_lat}, {cluster_lon}')\n", + " drop_inds += clust_drop.tolist()\n", + " \n", + " # this is how you do it purely randomly but some clusters might get wiped out\n", + " # z_inds = np.argwhere(df['nightlights'].values == 0).reshape(-1)\n", + " # drop_inds = np.random.choice(z_inds, d, replace=False)\n", + " return df.drop(drop_inds).reset_index(drop=True)\n", + "\n", + "def drop_in_range(df, lower=0, upper=2, fr=0.25):\n", + " \"\"\"\n", + " Very similar to drop_0s calculation, but more generalized. Lower and upper are inclusive.\n", + " \"\"\"\n", + " np.random.seed(RANDOM_SEED)\n", + " boolean_idx = ((lower <= df['nightlights']) & (df['nightlights'] <= upper))\n", + " c_under = boolean_idx.sum()\n", + " n = len(df)\n", + " assert c_under / n > fr, print(f'Dataframe already has under {fr} rows in the given range')\n", + " \n", + " d = (c_under - n * fr) / (1 - fr)\n", + " d = int(d)\n", + " print(f'dropping: {d}')\n", + " \n", + " select_df = df[boolean_idx]\n", + " select_clusters = select_df.groupby(['cluster_lat', 'cluster_lon'])\n", + " per_cluster_drop = int(d / len(select_clusters))\n", + " print(f'Need to drop {per_cluster_drop} per cluster in the given range')\n", + " \n", + " drop_inds = []\n", + " for (cluster_lat, cluster_lon), group in select_clusters:\n", + " z_inds = group.index\n", + " clust_drop = np.random.choice(z_inds, per_cluster_drop, replace=False)\n", + " assert len(group) - len(clust_drop) >= MIN_IMAGES_PER_CLUSTER, print(f'dropping too many in {cluster_lat}, {cluster_lon}')\n", + " drop_inds += clust_drop.tolist()\n", + " \n", + " return df.drop(drop_inds).reset_index(drop=True)\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wkVCur9diqTS", + "outputId": "2b60cb24-9ca3-4f75-f091-ae9610d99893" + }, + "source": [ + "df_mod_download = drop_0s(df_potential_download, fr=0.1)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "dropping: 4922\n", + "Need to drop 31 per cluster with 0 nightlights\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "o5bCJVKtiqTT", + "outputId": "2dabd475-8549-425f-a657-dcc4dc02db3c" + }, + "source": [ + "(df_mod_download['nightlights'] == 0).mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.10371544285965839" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "i5lOnFRbiqTT", + "outputId": "e642dc2e-3afb-41b5-b557-7467eb850275" + }, + "source": [ + "df_mod_download = drop_in_range(df_mod_download, lower=0.001, upper=3, fr=0.4)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "dropping: 14153\n", + "Need to drop 35 per cluster in the given range\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uljZ8WWGiqTT", + "outputId": "a5fc0874-f106-4219-f05b-31e4ed183dd3" + }, + "source": [ + "((0.001 <= df_mod_download['nightlights']) & (df_mod_download['nightlights'] <= 3)).mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.4106896551724138" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "z70U-yLhiqTT", + "outputId": "a24e2172-f6a8-4060-9ab0-927ab98da944" + }, + "source": [ + "# this has gone up now though\n", + "(df_mod_download['nightlights'] == 0).mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.20310344827586208" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3gj6x123iqTU", + "outputId": "b14af133-13ee-4684-fd93-4c25d27deab6" + }, + "source": [ + "df_mod_download = drop_0s(df_mod_download, fr=0.2)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "dropping: 56\n", + "Need to drop 0 per cluster with 0 nightlights\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "chGJ_9byiqTU" + }, + "source": [ + "At this point the low nightlight clusters (0 and under 3) have 11 and 12 images respectively, meaning very few more images can be dropped without going under 10." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hxY4yTXjiqTU" + }, + "source": [ + "from sklearn.mixture import GaussianMixture as GMM\n", + "X = df_mod_download['nightlights'].values.reshape(-1,1)\n", + "gmm = GMM(n_components=3).fit(X)\n", + "labels = gmm.predict(df_mod_download['nightlights'].values.reshape(-1,1))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qSI-sY6tiqTU", + "outputId": "db7934df-3db8-4109-9e2a-906d57c79bf4" + }, + "source": [ + "(labels==0).mean(), (labels==1).mean(), (labels==2).mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(0.57, 0.017241379310344827, 0.4127586206896552)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CFymdGg8iqTU", + "outputId": "b7567870-f606-406c-cc79-449aefe29806" + }, + "source": [ + "# these are the cutoff for the labels identified by the Guassian Mixture Model\n", + "label0_max = df_mod_download['nightlights'][labels==0].max()\n", + "label1_max = df_mod_download['nightlights'][labels==1].max()\n", + "label2_max = df_mod_download['nightlights'][labels==2].max()\n", + "\n", + "label0_max, label1_max, label2_max" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(16.685375213623047, 67.03113555908203, 0.04805320128798485)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Llb78MTviqTV" + }, + "source": [ + "# I am going to hand reassign these to have better representation among all three classes\n", + "# these are not ideal distributions obviously but the model should still be able to learn\n", + "# something like a quantile cut might work better and be less arbitrary, but for reproducability \n", + "# purposes I'll stick to the GMM-based approach\n", + "label0_max = 0.05\n", + "label1_max = 5\n", + "label2_max = 70" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VSZAzq5uiqTV", + "outputId": "2af58315-d0d2-4a36-9ada-a6a45ab25d70" + }, + "source": [ + "def query_df(df, lower, upper):\n", + " return df[((lower <= df['nightlights']) & (df['nightlights'] < upper))]\n", + "\n", + "print(len(query_df(df_mod_download, 0, label0_max)) / len(df_mod_download))\n", + "print(len(query_df(df_mod_download, label0_max, label1_max)) / len(df_mod_download))\n", + "print(len(query_df(df_mod_download, label1_max, label2_max)) / len(df_mod_download))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.41379310344827586\n", + "0.3586206896551724\n", + "0.22758620689655173\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ErMOpsbjiqTV", + "outputId": "62f374b0-13ad-402d-f908-3f68f5a29b3b" + }, + "source": [ + "def create_nightlights_bin(df, cutoffs):\n", + " assert len(cutoffs) >= 2, print('need at least 2 bins')\n", + " cutoffs = sorted(cutoffs, reverse=True)\n", + " labels = list(range(len(cutoffs)))[::-1]\n", + " df['nightlights_bin'] = len(cutoffs)\n", + " for cutoff, label in zip(cutoffs, labels):\n", + " df['nightlights_bin'].loc[df['nightlights'] <= cutoff] = label\n", + "\n", + "df_download = df_mod_download.copy()\n", + "create_nightlights_bin(df_download, cutoffs=[label0_max, label1_max, label2_max])" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " iloc._setitem_with_indexer(indexer, value)\n", + "/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " iloc._setitem_with_indexer(indexer, value)\n", + "/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " iloc._setitem_with_indexer(indexer, value)\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WPirq5YKiqTW", + "outputId": "02da8141-0df2-4257-9869-781cd5f0a065" + }, + "source": [ + "# these should match above\n", + "(df_download['nightlights_bin']==0).mean(), (df_download['nightlights_bin']==1).mean(), (df_download['nightlights_bin']==2).mean()\n" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(0.41379310344827586, 0.3586206896551724, 0.22758620689655173)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ug1a-EotiqTW", + "outputId": "a24a3ff2-9057-4628-8a2b-30af7aaef499" + }, + "source": [ + "df_download.shape" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(14500, 9)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "lvUEfdJiiqTW" + }, + "source": [ + "os.makedirs(PROCESSED_DIR, exist_ok=True)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "n0fk443siqTX" + }, + "source": [ + "df_download.to_csv(os.path.join(PROCESSED_DIR, 'image_download_locs.csv'), index=False)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "87oQFeHbiqTX" + }, + "source": [ + "# Download Images\n", + "If the script breaks, you can restart here by uncommenting the line below and running the below code again. It won't download images you have already downloaded." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Z_hZTdiiiqTX" + }, + "source": [ + "# df_download = pd.read_csv(os.path.join(PROCESSED_DIR, 'image_download_locs.csv'))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "LKqxVTZRiqTX" + }, + "source": [ + "# you can try the google downloader if you don't have the planet API key\n", + "# the tradeoff is that planet's data can be queried with time, but Google's images\n", + "# are higher res\n", + "from utils import PlanetDownloader" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + }, + "id": "rPdAoDDeiqTY", + "outputId": "8a30ef75-9283-4d4a-c80e-fa052d92dafc" + }, + "source": [ + "# this demonstrates the API call\n", + "lat = 38.441332\n", + "lon = -105.234751\n", + "min_year = 2016\n", + "min_month = 1\n", + "max_year = 2016\n", + "max_month = 12\n", + "\n", + "access = open(ACCESS_TOKEN_DIR, 'r').readlines()[0].strip()\n", + "pd = PlanetDownloader(access)\n", + "plt.imshow(pd.download_image(lat, lon, min_year, min_month, max_year, max_month))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 33 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "o0cMhBHdiqTY" + }, + "source": [ + "def download_images(df):\n", + " \"\"\"\n", + " Download images using a pandas DataFrame that has \"image_lat\", \"image_lon\", \"image_name\", \"country\" as columns\n", + " \n", + " Saves images to the corresponding country's images folder\n", + "\n", + " To use the Google Downloader, switch PlanetDownloader to GoogleDownloader and make imd.download_image only\n", + " provide lat and lon as arguments. Use zoom = 16.\n", + " \"\"\"\n", + " access = None\n", + " with open(ACCESS_TOKEN_DIR, 'r') as f:\n", + " access = f.readlines()[0]\n", + " imd = PlanetDownloader(access)\n", + "# imd = GoogleDownloader(access)\n", + " num_retries = 20\n", + " wait_time = 0.1 # seconds\n", + "\n", + " # drops what is already downloaded\n", + " already_downloaded = os.listdir(os.path.join(COUNTRIES_DIR, 'malawi_2016', 'images')) + \\\n", + " os.listdir(os.path.join(COUNTRIES_DIR, 'ethiopia_2015', 'images')) + \\\n", + " os.listdir(os.path.join(COUNTRIES_DIR, 'nigeria_2015', 'images'))\n", + " already_downloaded = list(set(already_downloaded).intersection(set(df['image_name'])))\n", + " print('Already downloaded ' + str(len(already_downloaded)))\n", + " df = df.set_index('image_name').drop(already_downloaded).reset_index()\n", + " print('Need to download ' + str(len(df)))\n", + " # use three years of images to find one that matches search critera\n", + " min_year = 2014\n", + " min_month = 1\n", + " max_year = 2016\n", + " max_month = 12\n", + " for _, r in tqdm(df.iterrows(), total=df.shape[0]):\n", + " lat = r.image_lat\n", + " lon = r.image_lon\n", + " zoom = 50\n", + " name = r.image_name\n", + " country_dir = None\n", + " if r.country == 'mw':\n", + " country_dir = 'malawi_2016'\n", + " elif r.country == 'eth':\n", + " country_dir = 'ethiopia_2015'\n", + " elif r.country == 'ng':\n", + " country_dir = 'nigeria_2015'\n", + " else:\n", + " print(f\"unrecognized country: {r.country}\")\n", + " raise ValueError()\n", + " image_save_path = os.path.join(COUNTRIES_DIR, country_dir, 'images', r.image_name)\n", + " try:\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " if (type(im) == str and im == 'RETRY') or im is None:\n", + " resolved = False\n", + " for _ in range(num_retries):\n", + " time.sleep(wait_time)\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " if (type(im) == str and im == 'RETRY') or im is None:\n", + " continue\n", + " else:\n", + " plt.imsave(image_save_path, im)\n", + " resolved = True\n", + " break\n", + " if not resolved:\n", + " print(f'Could not download {lat}, {lon} despite several retries and waiting')\n", + " continue\n", + " else:\n", + " pass\n", + " else:\n", + " # no issues, save according to naming convention\n", + " plt.imsave(image_save_path, im)\n", + "\n", + " except Exception as e:\n", + " logging.error(f\"Error-could not download {lat}, {lon}\", exc_info=True)\n", + " continue" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "background_save": true, + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "eb03e01e458a4797a88152b874f376e3", + "7c0a93896bc04018beac3d9d8634fa5e", + "516f34ee82664b1d8d9b385efa35eaa7", + "8f50de1322db49869a25e53ad103cdfe", + "e8a9e60dfc8341a18d60d9aa25fcf4c4", + "bec8e5c2800b433394e2c0856dd0d526", + "466113287a364f27bdc04158b27555bf", + "dee1210a038945c9aa01296d060eaa6b" + ] + }, + "id": "5bQ9hanyiqTZ", + "outputId": "d51b54bd-146f-4092-cb08-becd932f7f66" + }, + "source": [ + "download_images(df_download)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Already downloaded 0\n", + "Need to download 14500\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eb03e01e458a4797a88152b874f376e3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=14500.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Could not download 4.31578611574, 6.223837135554024 despite several retries and waiting\n", + "Could not download 4.330758037141992, 6.223837135554024 despite several retries and waiting\n", + "Could not download 4.285842272936016, 6.238809056956016 despite several retries and waiting\n", + "Could not download 4.345729958543984, 6.253780978358008 despite several retries and waiting\n", + "Could not download 4.300814194338008, 6.26875289976 despite several retries and waiting\n", + "Could not download 4.330758037141992, 6.26875289976 despite several retries and waiting\n", + "Could not download 4.345729958543984, 6.26875289976 despite several retries and waiting\n", + "Could not download 4.345729958543984, 6.313668663965976 despite several retries and waiting\n", + "Could not download 4.283803377034025, 6.263256104344025 despite several retries and waiting\n", + "Could not download 4.283803377034025, 6.278228025746017 despite several retries and waiting\n", + "Could not download 4.3287191412400015, 6.278228025746017 despite several retries and waiting\n", + "Could not download 4.313747219838009, 6.3081718685500014 despite several retries and waiting\n", + "Could not download 4.343691062641994, 6.3231437899519936 despite several retries and waiting\n", + "Could not download 4.283803377034025, 6.338115711353986 despite several retries and waiting\n", + "Could not download 4.298775298436017, 6.338115711353986 despite several retries and waiting\n", + "Could not download 4.313747219838009, 6.353087632755978 despite several retries and waiting\n", + "Could not download 4.358662984043986, 6.353087632755978 despite several retries and waiting\n", + "Could not download 4.373634905445978, 6.353087632755978 despite several retries and waiting\n", + "Could not download 4.290142273407084, 6.296692183585628 despite several retries and waiting\n", + "Could not download 4.443342532885977, 7.139046639044024 despite several retries and waiting\n", + "Could not download 4.440163648431993, 7.122018824984023 despite several retries and waiting\n", + "Could not download 4.455135569833985, 7.122018824984023 despite several retries and waiting\n", + "Could not download 4.440163648431993, 7.136990746386015 despite several retries and waiting\n", + "Could not download 4.455135569833985, 7.136990746386015 despite several retries and waiting\n", + "Could not download 4.438511483134734, 7.12623269530718 despite several retries and waiting\n", + "Could not download 4.574461166034023, 7.640029737454023 despite several retries and waiting\n", + "Could not download 4.634348851641992, 7.640029737454023 despite several retries and waiting\n", + "Could not download 4.574461166034023, 7.6550016588560155 despite several retries and waiting\n", + "Could not download 4.634348851641992, 7.6550016588560155 despite several retries and waiting\n", + "Could not download 4.6044050088380075, 7.68494550166 despite several retries and waiting\n", + "Could not download 4.634348851641992, 7.714889344463984 despite several retries and waiting\n", + "Could not download 4.649320773043984, 7.714889344463984 despite several retries and waiting\n", + "Could not download 4.649320773043984, 7.729861265865976 despite several retries and waiting\n", + "Could not download 4.633468852209999, 7.656062334554024 despite several retries and waiting\n", + "Could not download 4.588553088004023, 7.671034255956016 despite several retries and waiting\n", + "Could not download 4.663412695013983, 7.686006177358008 despite several retries and waiting\n", + "Could not download 4.648440773611991, 7.715950020161992 despite several retries and waiting\n", + "Could not download 4.6215271599577346, 7.657246030680976 despite several retries and waiting\n", + "Could not download 4.7087128449559765, 7.287448788724023 despite several retries and waiting\n", + "Could not download 4.643263203974024, 7.663839143824022 despite several retries and waiting\n", + "Could not download 4.658235125376016, 7.678811065226014 despite several retries and waiting\n", + "Could not download 4.68817896818, 7.678811065226014 despite several retries and waiting\n", + "Could not download 4.733094732385976, 7.708754908029999 despite several retries and waiting\n", + "Could not download 4.643263203974024, 7.723726829431991 despite several retries and waiting\n", + "Could not download 4.718122810983984, 7.723726829431991 despite several retries and waiting\n", + "Could not download 4.703150889581992, 7.753670672235975 despite several retries and waiting\n", + "Could not download 4.718122810983984, 7.753670672235975 despite several retries and waiting\n", + "Could not download 4.70728140817, 6.043187026464023 despite several retries and waiting\n", + "Could not download 4.722253329571992, 6.043187026464023 despite several retries and waiting\n", + "Could not download 4.722253329571992, 6.058158947866015 despite several retries and waiting\n", + "Could not download 4.752197172375976, 6.058158947866015 despite several retries and waiting\n", + "Could not download 4.737225250973984, 6.073130869268007 despite several retries and waiting\n", + "Could not download 4.70728140817, 6.088102790669999 despite several retries and waiting\n", + "Could not download 4.752197172375976, 6.088102790669999 despite several retries and waiting\n", + "Could not download 4.692309486768008, 6.103074712071991 despite several retries and waiting\n", + "Could not download 4.70728140817, 6.103074712071991 despite several retries and waiting\n", + "Could not download 4.722253329571992, 6.103074712071991 despite several retries and waiting\n", + "Could not download 4.737225250973984, 6.103074712071991 despite several retries and waiting\n", + "Could not download 4.752197172375976, 6.118046633473983 despite several retries and waiting\n", + "Could not download 4.747722175680069, 6.044642939388144 despite several retries and waiting\n", + "Could not download 4.699336230828008, 7.212831141355976 despite several retries and waiting\n", + "Could not download 4.71430815223, 7.212831141355976 despite several retries and waiting\n", + "Could not download 4.699734956834828, 7.212242098215538 despite several retries and waiting\n", + "Could not download 4.74375535836, 6.822015620135977 despite several retries and waiting\n", + "Could not download 4.758727279761992, 6.822015620135977 despite several retries and waiting\n", + "Could not download 4.717062213806016, 7.273772634216016 despite several retries and waiting\n", + "Could not download 4.776949899413984, 7.273772634216016 despite several retries and waiting\n", + "Could not download 4.717062213806016, 7.288744555618008 despite several retries and waiting\n", + "Could not download 4.74700605661, 7.30371647702 despite several retries and waiting\n", + "Could not download 4.791921820815976, 7.318688398421992 despite several retries and waiting\n", + "Could not download 4.715844019424024, 7.209912888695976 despite several retries and waiting\n", + "Could not download 4.76758083369, 6.943311839634024 despite several retries and waiting\n", + "Could not download 4.782552755091992, 6.943311839634024 despite several retries and waiting\n", + "Could not download 4.7975246764939845, 6.943311839634024 despite several retries and waiting\n", + "Could not download 4.812496597895977, 6.973255682438008 despite several retries and waiting\n", + "Could not download 4.730980759024024, 6.8695305684639845 despite several retries and waiting\n", + "Could not download 4.730980759024024, 6.884502489865977 despite several retries and waiting\n", + "Could not download 4.813704083363985, 6.976052903154025 despite several retries and waiting\n", + "Could not download 4.828676004765977, 6.976052903154025 despite several retries and waiting\n", + "Could not download 4.774767226928008, 6.352828032855976 despite several retries and waiting\n", + "Could not download 4.78973914833, 6.352828032855976 despite several retries and waiting\n", + "Could not download 4.804711069731992, 6.352828032855976 despite several retries and waiting\n", + "Could not download 4.763027457364024, 6.928135920174024 despite several retries and waiting\n", + "Could not download 4.777999378766016, 6.928135920174024 despite several retries and waiting\n", + "Could not download 4.792971300168008, 6.928135920174024 despite several retries and waiting\n", + "Could not download 4.763027457364024, 6.943107841576016 despite several retries and waiting\n", + "Could not download 4.777999378766016, 6.943107841576016 despite several retries and waiting\n", + "Could not download 4.792971300168008, 6.943107841576016 despite several retries and waiting\n", + "Could not download 4.80794322157, 6.973051684380001 despite several retries and waiting\n", + "Could not download 4.8229151429719925, 6.973051684380001 despite several retries and waiting\n", + "Could not download 4.837887064373985, 6.973051684380001 despite several retries and waiting\n", + "Could not download 4.8113188547300005, 6.965991353474024 despite several retries and waiting\n", + "Could not download 4.826290776131993, 6.965991353474024 despite several retries and waiting\n", + "Could not download 4.841262697533985, 6.965991353474024 despite several retries and waiting\n", + "Could not download 4.8113188547300005, 6.980963274876016 despite several retries and waiting\n", + "Could not download 4.826290776131993, 6.980963274876016 despite several retries and waiting\n", + "Could not download 4.841262697533985, 6.980963274876016 despite several retries and waiting\n", + "Could not download 4.767380794814023, 8.161771710364023 despite several retries and waiting\n", + "Could not download 4.797324637618007, 8.161771710364023 despite several retries and waiting\n", + "Could not download 4.812296559019999, 8.161771710364023 despite several retries and waiting\n", + "Could not download 4.782352716216015, 8.176743631766016 despite several retries and waiting\n", + "Could not download 4.797324637618007, 8.176743631766016 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 4.812296559019999, 8.176743631766016\n", + "Traceback (most recent call last):\n", + " File \"\", line 46, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 4.827268480421991, 8.176743631766016 despite several retries and waiting\n", + "Could not download 4.767380794814023, 8.20668747457 despite several retries and waiting\n", + "Could not download 4.782352716216015, 8.20668747457 despite several retries and waiting\n", + "Could not download 4.797324637618007, 8.20668747457 despite several retries and waiting\n", + "Could not download 4.797324637618007, 8.221659395971992 despite several retries and waiting\n", + "Could not download 4.782352716216015, 8.236631317373984 despite several retries and waiting\n", + "Could not download 4.797324637618007, 8.236631317373984 despite several retries and waiting\n", + "Could not download 4.782352716216015, 8.251603238775976 despite several retries and waiting\n", + "Could not download 4.782409637894023, 8.052724953836012 despite several retries and waiting\n", + "Could not download 4.8123534806980075, 8.082668796639997 despite several retries and waiting\n", + "Could not download 4.8273254021, 8.082668796639997 despite several retries and waiting\n", + "Could not download 4.842297323501992, 8.097640718041989 despite several retries and waiting\n", + "Could not download 4.842297323501992, 8.11261263944398 despite several retries and waiting\n", + "Could not download 4.857269244903984, 8.11261263944398 despite several retries and waiting\n", + "Could not download 4.842297323501992, 8.127584560845973 despite several retries and waiting\n", + "Could not download 4.822758349486196, 8.066377107545561 despite several retries and waiting\n", + "Could not download 4.858164785873984, 6.610742571134024 despite several retries and waiting\n", + "Could not download 4.813249021668008, 6.640686413938008 despite several retries and waiting\n", + "Could not download 4.82822094307, 6.640686413938008 despite several retries and waiting\n", + "Could not download 4.873136707275976, 6.700574099545976 despite several retries and waiting\n", + "Could not download 4.794197859974024, 6.932358914714023 despite several retries and waiting\n", + "Could not download 4.809169781376016, 6.97727467892 despite several retries and waiting\n", + "Could not download 4.824141702778008, 6.97727467892 despite several retries and waiting\n", + "Could not download 4.83911362418, 6.97727467892 despite several retries and waiting\n", + "Could not download 4.803255570534024, 6.942066615554024 despite several retries and waiting\n", + "Could not download 4.818227491936016, 6.9720104583580085 despite several retries and waiting\n", + "Could not download 4.833199413338008, 6.9720104583580085 despite several retries and waiting\n", + "Could not download 4.84817133474, 6.9720104583580085 despite several retries and waiting\n", + "Could not download 4.818227491936016, 6.986982379760001 despite several retries and waiting\n", + "Could not download 4.833199413338008, 6.986982379760001 despite several retries and waiting\n", + "Could not download 4.84817133474, 6.986982379760001 despite several retries and waiting\n", + "Could not download 4.834944730758007, 7.326533303524024 despite several retries and waiting\n", + "Could not download 4.819972809356015, 7.416364831935977 despite several retries and waiting\n", + "Could not download 4.904933960635977, 7.043627224258009 despite several retries and waiting\n", + "Could not download 4.819735270454023, 7.834977320648008 despite several retries and waiting\n", + "Could not download 4.879622956061992, 7.894865006255976 despite several retries and waiting\n", + "Could not download 4.843150984816015, 6.867310670296015 despite several retries and waiting\n", + "Could not download 4.9030386704239834, 6.9421702773059755 despite several retries and waiting\n", + "Could not download 4.846246607926016, 6.786322199314023 despite several retries and waiting\n", + "Could not download 4.9061342935339844, 6.786322199314023 despite several retries and waiting\n", + "Could not download 4.861218529328008, 6.801294120716015 despite several retries and waiting\n", + "Could not download 4.831274686524024, 6.861181806323984 despite several retries and waiting\n", + "Could not download 4.8986575724, 7.034441365283985 despite several retries and waiting\n", + "Could not download 4.913629493801992, 7.034441365283985 despite several retries and waiting\n", + "Could not download 4.9286014152039845, 7.034441365283985 despite several retries and waiting\n", + "Could not download 4.8986575724, 7.049413286685977 despite several retries and waiting\n", + "Could not download 4.913629493801992, 7.049413286685977 despite several retries and waiting\n", + "Could not download 4.9286014152039845, 7.049413286685977 despite several retries and waiting\n", + "Could not download 4.903783503998008, 6.199261082994024 despite several retries and waiting\n", + "Could not download 4.888811582596016, 6.229204925798008 despite several retries and waiting\n", + "Could not download 4.903783503998008, 6.229204925798008 despite several retries and waiting\n", + "Could not download 4.894441895506016, 6.936036111738007 despite several retries and waiting\n", + "Could not download 4.909413816908008, 6.936036111738007 despite several retries and waiting\n", + "Could not download 4.969301502515976, 6.995923797345975 despite several retries and waiting\n", + "Could not download 4.964420059423983, 7.937385238586015 despite several retries and waiting\n", + "Could not download 4.979391980825975, 7.937385238586015 despite several retries and waiting\n", + "Could not download 4.93711593292, 6.394170511863984 despite several retries and waiting\n", + "Could not download 4.93711593292, 6.409142433265976 despite several retries and waiting\n", + "Could not download 4.982031697125977, 6.409142433265976 despite several retries and waiting\n", + "Could not download 4.977858413253984, 7.7583190461 despite several retries and waiting\n", + "Could not download 4.977858413253984, 7.773290967501992 despite several retries and waiting\n", + "Could not download 4.94791457045, 7.803234810305976 despite several retries and waiting\n", + "Could not download 4.96225342141, 8.297358519786016 despite several retries and waiting\n", + "Could not download 4.96225342141, 8.312330441188008 despite several retries and waiting\n", + "Could not download 4.96225342141, 8.342274283991992 despite several retries and waiting\n", + "Could not download 4.977225342811992, 8.342274283991992 despite several retries and waiting\n", + "Could not download 4.977225342811992, 8.357246205393984 despite several retries and waiting\n", + "Could not download 4.974769912887915, 8.361608173193538 despite several retries and waiting\n", + "Could not download 4.96425337683, 5.77154382849 despite several retries and waiting\n", + "Could not download 4.9792252982319924, 5.77154382849 despite several retries and waiting\n", + "Could not download 4.919337612624024, 5.786515749891992 despite several retries and waiting\n", + "Could not download 4.934309534026016, 5.786515749891992 despite several retries and waiting\n", + "Could not download 4.949281455428008, 5.786515749891992 despite several retries and waiting\n", + "Could not download 5.009169141035977, 5.786515749891992 despite several retries and waiting\n", + "Could not download 4.919337612624024, 5.801487671293984 despite several retries and waiting\n", + "Could not download 4.934309534026016, 5.801487671293984 despite several retries and waiting\n", + "Could not download 4.949281455428008, 5.801487671293984 despite several retries and waiting\n", + "Could not download 4.96425337683, 5.801487671293984 despite several retries and waiting\n", + "Could not download 4.9792252982319924, 5.801487671293984 despite several retries and waiting\n", + "Could not download 4.919337612624024, 5.816459592695976 despite several retries and waiting\n", + "Could not download 4.934309534026016, 5.816459592695976 despite several retries and waiting\n", + "Could not download 4.949281455428008, 5.816459592695976 despite several retries and waiting\n", + "Could not download 4.96425337683, 5.816459592695976 despite several retries and waiting\n", + "Could not download 4.9792252982319924, 5.816459592695976 despite several retries and waiting\n", + "Could not download 4.96466286575, 7.774760404396016 despite several retries and waiting\n", + "Could not download 4.979634787151992, 7.774760404396016 despite several retries and waiting\n", + "Could not download 4.96679274568, 6.352797664331992 despite several retries and waiting\n", + "Could not download 4.96679274568, 6.367769585733984 despite several retries and waiting\n", + "Could not download 4.921876981474024, 6.382741507135976 despite several retries and waiting\n", + "Could not download 4.936848902876016, 6.382741507135976 despite several retries and waiting\n", + "Could not download 4.951820824278008, 6.382741507135976 despite several retries and waiting\n", + "Could not download 4.966145979146016, 8.312583253214024 despite several retries and waiting\n", + "Could not download 4.966145979146016, 8.342527096018008 despite several retries and waiting\n", + "Could not download 5.026033664753984, 8.387442860223985 despite several retries and waiting\n", + "Could not download 5.041005586155976, 8.387442860223985 despite several retries and waiting\n", + "Could not download 4.973558081616016, 7.94191212047 despite several retries and waiting\n", + "Could not download 4.966674708914024, 7.934654492188008 despite several retries and waiting\n", + "Could not download 4.966674708914024, 7.94962641359 despite several retries and waiting\n", + "Could not download 5.028007334971992, 7.850132108061992 despite several retries and waiting\n", + "Could not download 5.01303541357, 7.880075950865976 despite several retries and waiting\n", + "Could not download 5.028043145781992, 8.298575720736016 despite several retries and waiting\n", + "Could not download 4.968155460174024, 8.313547642138008 despite several retries and waiting\n", + "Could not download 5.043015067183984, 8.358463406343985 despite several retries and waiting\n", + "Could not download 5.028043145781992, 8.373435327745977 despite several retries and waiting\n", + "Could not download 5.044115686533985, 6.499834221374025 despite several retries and waiting\n", + "Could not download 5.035767191028008, 8.294498340284022 despite several retries and waiting\n", + "Could not download 5.065711033831993, 8.294498340284022 despite several retries and waiting\n", + "Could not download 5.0507391124300005, 8.309470261686014 despite several retries and waiting\n", + "Could not download 5.0507391124300005, 8.324442183088006 despite several retries and waiting\n", + "Could not download 5.080682955233985, 8.324442183088006 despite several retries and waiting\n", + "Could not download 5.0507391124300005, 8.384329868695975 despite several retries and waiting\n", + "Could not download 5.05398782837, 8.377504333514024 despite several retries and waiting\n", + "Could not download 5.098903592575977, 8.377504333514024 despite several retries and waiting\n", + "Could not download 5.05398782837, 8.392476254916016 despite several retries and waiting\n", + "Could not download 5.05398782837, 8.407448176318008 despite several retries and waiting\n", + "Could not download 5.009072064164024, 8.42242009772 despite several retries and waiting\n", + "Could not download 5.024043985566016, 8.42242009772 despite several retries and waiting\n", + "Could not download 5.024043985566016, 8.437392019121992 despite several retries and waiting\n", + "Could not download 5.009072064164024, 8.452363940523984 despite several retries and waiting\n", + "Could not download 5.0689597497719925, 8.467335861925976 despite several retries and waiting\n", + "Could not download 5.011549953964024, 7.873707481204024 despite several retries and waiting\n", + "Could not download 5.101381482375976, 7.91862324541 despite several retries and waiting\n", + "Could not download 5.125065485025976, 6.801879419218008 despite several retries and waiting\n", + "Could not download 5.125065485025976, 6.81685134062 despite several retries and waiting\n", + "Could not download 5.065177799418008, 6.8318232620219925 despite several retries and waiting\n", + "Could not download 5.08014972082, 6.8318232620219925 despite several retries and waiting\n", + "Could not download 5.110093563623984, 6.8318232620219925 despite several retries and waiting\n", + "Could not download 5.035233956614023, 6.846795183423985 despite several retries and waiting\n", + "Could not download 5.095121642221992, 6.846795183423985 despite several retries and waiting\n", + "Could not download 5.0625741540540234, 8.227348541615976 despite several retries and waiting\n", + "Could not download 5.190932250975976, 6.571307695204023 despite several retries and waiting\n", + "Could not download 5.116072643966016, 6.61622345941 despite several retries and waiting\n", + "Could not download 5.131044565368008, 6.61622345941 despite several retries and waiting\n", + "Could not download 5.160988408171992, 6.61622345941 despite several retries and waiting\n", + "Could not download 5.116072643966016, 6.631195380811992 despite several retries and waiting\n", + "Could not download 5.131044565368008, 6.631195380811992 despite several retries and waiting\n", + "Could not download 5.14601648677, 6.646167302213984 despite several retries and waiting\n", + "Could not download 5.190932250975976, 6.646167302213984 despite several retries and waiting\n", + "Could not download 5.1011007225640235, 6.661139223615976 despite several retries and waiting\n", + "Could not download 5.116072643966016, 6.661139223615976 despite several retries and waiting\n", + "Could not download 5.131044565368008, 6.661139223615976 despite several retries and waiting\n", + "Could not download 5.175960329573984, 6.661139223615976 despite several retries and waiting\n", + "Could not download 5.162194178291992, 6.314337852258008 despite several retries and waiting\n", + "Could not download 5.226314816306016, 6.574498277034024 despite several retries and waiting\n", + "Could not download 5.241286737708008, 6.574498277034024 despite several retries and waiting\n", + "Could not download 5.3011744233159765, 6.574498277034024 despite several retries and waiting\n", + "Could not download 5.226314816306016, 6.5894701984360164 despite several retries and waiting\n", + "Could not download 5.241286737708008, 6.5894701984360164 despite several retries and waiting\n", + "Could not download 5.3011744233159765, 6.5894701984360164 despite several retries and waiting\n", + "Could not download 5.226314816306016, 6.6044421198380086 despite several retries and waiting\n", + "Could not download 5.241286737708008, 6.6044421198380086 despite several retries and waiting\n", + "Could not download 5.25625865911, 6.6044421198380086 despite several retries and waiting\n", + "Could not download 5.211342894904024, 6.619414041240001 despite several retries and waiting\n", + "Could not download 5.271230580511992, 6.619414041240001 despite several retries and waiting\n", + "Could not download 5.286202501913984, 6.619414041240001 despite several retries and waiting\n", + "Could not download 5.211342894904024, 6.634385962641993 despite several retries and waiting\n", + "Could not download 5.271230580511992, 6.634385962641993 despite several retries and waiting\n", + "Could not download 5.286202501913984, 6.634385962641993 despite several retries and waiting\n", + "Could not download 5.211342894904024, 6.649357884043985 despite several retries and waiting\n", + "Could not download 5.25625865911, 6.649357884043985 despite several retries and waiting\n", + "Could not download 5.211342894904024, 6.664329805445977 despite several retries and waiting\n", + "Could not download 5.226314816306016, 6.664329805445977 despite several retries and waiting\n", + "Could not download 5.241286737708008, 6.664329805445977 despite several retries and waiting\n", + "Could not download 5.25625865911, 6.664329805445977 despite several retries and waiting\n", + "Could not download 5.239647461556015, 6.259141996204024 despite several retries and waiting\n", + "Could not download 5.2546193829580075, 6.289085839008008 despite several retries and waiting\n", + "Could not download 5.26959130436, 6.289085839008008 despite several retries and waiting\n", + "Could not download 5.284563225761992, 6.289085839008008 despite several retries and waiting\n", + "Could not download 5.291371142401992, 7.751515845553983 despite several retries and waiting\n", + "Could not download 5.306343063803984, 7.751515845553983 despite several retries and waiting\n", + "Could not download 5.280780263364023, 6.851805846504025 despite several retries and waiting\n", + "Could not download 5.280780263364023, 6.866777767906017 despite several retries and waiting\n", + "Could not download 5.280780263364023, 6.881749689308009 despite several retries and waiting\n", + "Could not download 5.370611791775976, 6.926665453513985 despite several retries and waiting\n", + "Could not download 5.370611791775976, 6.941637374915977 despite several retries and waiting\n", + "Could not download 5.366012679523984, 8.380754045945976 despite several retries and waiting\n", + "Could not download 5.380809528853985, 7.371945324386016 despite several retries and waiting\n", + "Could not download 5.420351476265976, 7.0723601283380075 despite several retries and waiting\n", + "Could not download 5.448626963423983, 5.712169139884024 despite several retries and waiting\n", + "Could not download 5.463598884825975, 5.727141061286016 despite several retries and waiting\n", + "Could not download 5.388739277816015, 5.772056825491992 despite several retries and waiting\n", + "Could not download 5.403711199218007, 5.787028746893984 despite several retries and waiting\n", + "Could not download 5.418683120619999, 5.802000668295976 despite several retries and waiting\n", + "Could not download 5.483399643465976, 6.168482320814023 despite several retries and waiting\n", + "Could not download 5.44315706398, 7.022593698656015 despite several retries and waiting\n", + "Could not download 5.4880728281859765, 7.022593698656015 despite several retries and waiting\n", + "Could not download 5.401324742004023, 6.981277471266015 despite several retries and waiting\n", + "Could not download 5.431268584808008, 6.996249392668007 despite several retries and waiting\n", + "Could not download 5.491156270415976, 7.026193235471991 despite several retries and waiting\n", + "Could not download 5.413769956224024, 7.192073491756017 despite several retries and waiting\n", + "Could not download 5.443713799028008, 7.222017334560001 despite several retries and waiting\n", + "Could not download 5.478065316348006, 6.1759533895240235 despite several retries and waiting\n", + "Could not download 5.537953001955975, 6.1759533895240235 despite several retries and waiting\n", + "Could not download 5.508009159151991, 6.190925310926016 despite several retries and waiting\n", + "Could not download 5.522981080553983, 6.205897232328008 despite several retries and waiting\n", + "Could not download 5.470082359546016, 7.231366137513985 despite several retries and waiting\n", + "Could not download 5.470082359546016, 7.246338058915977 despite several retries and waiting\n", + "Could not download 5.471188130634023, 5.663180244784024 despite several retries and waiting\n", + "Could not download 5.486160052036015, 5.663180244784024 despite several retries and waiting\n", + "Could not download 5.5011319734380075, 5.663180244784024 despite several retries and waiting\n", + "Could not download 5.51610389484, 5.663180244784024 despite several retries and waiting\n", + "Could not download 5.531075816241992, 5.663180244784024 despite several retries and waiting\n", + "Could not download 5.546047737643984, 5.663180244784024 despite several retries and waiting\n", + "Could not download 5.471188130634023, 5.678152166186016 despite several retries and waiting\n", + "Could not download 5.486160052036015, 5.678152166186016 despite several retries and waiting\n", + "Could not download 5.5011319734380075, 5.678152166186016 despite several retries and waiting\n", + "Could not download 5.51610389484, 5.678152166186016 despite several retries and waiting\n", + "Could not download 5.471188130634023, 5.693124087588008 despite several retries and waiting\n", + "Could not download 5.486160052036015, 5.693124087588008 despite several retries and waiting\n", + "Could not download 5.5011319734380075, 5.693124087588008 despite several retries and waiting\n", + "Could not download 5.51610389484, 5.693124087588008 despite several retries and waiting\n", + "Could not download 5.471188130634023, 5.70809600899 despite several retries and waiting\n", + "Could not download 5.486160052036015, 5.70809600899 despite several retries and waiting\n", + "Could not download 5.5011319734380075, 5.70809600899 despite several retries and waiting\n", + "Could not download 5.51610389484, 5.70809600899 despite several retries and waiting\n", + "Could not download 5.471188130634023, 5.723067930391992 despite several retries and waiting\n", + "Could not download 5.486160052036015, 5.738039851793984 despite several retries and waiting\n", + "Could not download 5.5011319734380075, 5.738039851793984 despite several retries and waiting\n", + "Could not download 5.486160052036015, 5.7530117731959765 despite several retries and waiting\n", + "Could not download 5.5011319734380075, 5.7530117731959765 despite several retries and waiting\n", + "Could not download 5.552325673303984, 7.0343431087580095 despite several retries and waiting\n", + "Could not download 5.5074099090980075, 7.049315030160002 despite several retries and waiting\n", + "Could not download 5.552325673303984, 7.049315030160002 despite several retries and waiting\n", + "Could not download 5.567297594705976, 7.049315030160002 despite several retries and waiting\n", + "Could not download 5.567297594705976, 7.064286951561994 despite several retries and waiting\n", + "Could not download 5.577058854163986, 5.771977164594023 despite several retries and waiting\n", + "Could not download 5.592030775565978, 5.771977164594023 despite several retries and waiting\n", + "Could not download 5.577058854163986, 5.7869490859960155 despite several retries and waiting\n", + "Could not download 5.592030775565978, 5.7869490859960155 despite several retries and waiting\n", + "Could not download 5.584606468777418, 5.791342288128962 despite several retries and waiting\n", + "Could not download 5.5491711665860155, 7.034897209741992 despite several retries and waiting\n", + "Could not download 5.564143087988008, 7.034897209741992 despite several retries and waiting\n", + "Could not download 5.5491711665860155, 7.049869131143984 despite several retries and waiting\n", + "Could not download 5.686671033293984, 7.277837499354025 despite several retries and waiting\n", + "Could not download 5.686671033293984, 7.367669027765977 despite several retries and waiting\n", + "Could not download 5.709804141455977, 6.996414183744023 despite several retries and waiting\n", + "Could not download 5.649916455848008, 7.011386105146015 despite several retries and waiting\n", + "Could not download 5.619972613044024, 7.056301869351992 despite several retries and waiting\n", + "Could not download 5.619972613044024, 7.071273790753984 despite several retries and waiting\n", + "Could not download 5.634944534446016, 7.071273790753984 despite several retries and waiting\n", + "Could not download 5.679860298651993, 7.086245712155976 despite several retries and waiting\n", + "Could not download 5.634520199444024, 7.112446462513985 despite several retries and waiting\n", + "Could not download 5.634520199444024, 7.127418383915977 despite several retries and waiting\n", + "Could not download 5.725540957935976, 6.3656870288940235 despite several retries and waiting\n", + "Could not download 5.750183920463986, 7.256033670591991 despite several retries and waiting\n", + "Could not download 5.7463142697, 6.957473407466015 despite several retries and waiting\n", + "Could not download 5.716370426896016, 6.987417250269999 despite several retries and waiting\n", + "Could not download 5.716370426896016, 7.002389171671991 despite several retries and waiting\n", + "Could not download 5.776258112503984, 7.002389171671991 despite several retries and waiting\n", + "Could not download 5.716370426896016, 7.0323330144759755 despite several retries and waiting\n", + "Could not download 5.731342348298008, 7.0323330144759755 despite several retries and waiting\n", + "Could not download 5.7463142697, 7.0323330144759755 despite several retries and waiting\n", + "Could not download 5.761286191101992, 7.0323330144759755 despite several retries and waiting\n", + "Could not download 5.779988858273984, 5.955662984224024 despite several retries and waiting\n", + "Could not download 5.779988858273984, 5.970634905626016 despite several retries and waiting\n", + "Could not download 5.779988858273984, 6.000578748430001 despite several retries and waiting\n", + "Could not download 5.794960779675976, 6.000578748430001 despite several retries and waiting\n", + "Could not download 5.779988858273984, 6.015550669831993 despite several retries and waiting\n", + "Could not download 5.705129251264023, 6.030522591233985 despite several retries and waiting\n", + "Could not download 5.75004501547, 6.045494512635977 despite several retries and waiting\n", + "Could not download 5.862283011205977, 8.07352598035801 despite several retries and waiting\n", + "Could not download 5.804250622696016, 7.002834653328009 despite several retries and waiting\n", + "Could not download 5.882288204475976, 7.167790600561992 despite several retries and waiting\n", + "Could not download 5.962678824495977, 7.117318050273984 despite several retries and waiting\n", + "Could not download 5.91892832509, 7.377582693104024 despite several retries and waiting\n", + "Could not download 5.888984482286016, 7.437470378711993 despite several retries and waiting\n", + "Could not download 5.965219560435978, 4.9311438196160156 despite several retries and waiting\n", + "Could not download 5.953399632633984, 7.520043095326017 despite several retries and waiting\n", + "Could not download 5.938427711231992, 7.579930780933985 despite several retries and waiting\n", + "Could not download 5.968417882185976, 6.220389998924024 despite several retries and waiting\n", + "Could not download 5.968417882185976, 6.235361920326016 despite several retries and waiting\n", + "Could not download 5.878586353774024, 6.2503338417280085 despite several retries and waiting\n", + "Could not download 5.893558275176016, 6.2503338417280085 despite several retries and waiting\n", + "Could not download 5.878586353774024, 6.265305763130001 despite several retries and waiting\n", + "Could not download 5.893558275176016, 6.265305763130001 despite several retries and waiting\n", + "Could not download 5.878586353774024, 6.280277684531993 despite several retries and waiting\n", + "Could not download 5.893558275176016, 6.280277684531993 despite several retries and waiting\n", + "Could not download 5.878586353774024, 6.295249605933985 despite several retries and waiting\n", + "Could not download 5.893558275176016, 6.295249605933985 despite several retries and waiting\n", + "Could not download 5.964289812223983, 8.117081926626016 despite several retries and waiting\n", + "Could not download 5.979261733625975, 8.161997690831992 despite several retries and waiting\n", + "Could not download 5.889430205214023, 8.176969612233984 despite several retries and waiting\n", + "Could not download 5.954723846056016, 6.873102267136016 despite several retries and waiting\n", + "Could not download 5.956927376628991, 7.0997860693502775 despite several retries and waiting\n", + "Could not download 6.042681742206015, 6.794410187834024 despite several retries and waiting\n", + "Could not download 6.042681742206015, 6.809382109236016 despite several retries and waiting\n", + "Could not download 6.085599016606015, 6.146675225616016 despite several retries and waiting\n", + "Could not download 6.145486702213984, 6.146675225616016 despite several retries and waiting\n", + "Could not download 6.160458623615976, 6.146675225616016 despite several retries and waiting\n", + "Could not download 6.11554285941, 6.161647147018008 despite several retries and waiting\n", + "Could not download 6.130514780811992, 6.161647147018008 despite several retries and waiting\n", + "Could not download 6.11554285941, 6.17661906842 despite several retries and waiting\n", + "Could not download 6.130514780811992, 6.191590989821992 despite several retries and waiting\n", + "Could not download 6.157142120393985, 6.150001140924024 despite several retries and waiting\n", + "Could not download 6.142170198991993, 6.164973062326016 despite several retries and waiting\n", + "Could not download 6.157142120393985, 6.164973062326016 despite several retries and waiting\n", + "Could not download 6.082282513384024, 6.179944983728008 despite several retries and waiting\n", + "Could not download 6.0972544347860165, 6.179944983728008 despite several retries and waiting\n", + "Could not download 6.082282513384024, 6.19491690513 despite several retries and waiting\n", + "Could not download 6.0972544347860165, 6.19491690513 despite several retries and waiting\n", + "Could not download 6.112226356188009, 6.19491690513 despite several retries and waiting\n", + "Could not download 6.127198277590001, 6.19491690513 despite several retries and waiting\n", + "Could not download 6.0972544347860165, 6.224860747933985 despite several retries and waiting\n", + "Could not download 6.112226356188009, 6.224860747933985 despite several retries and waiting\n", + "Could not download 6.112226356188009, 6.239832669335977 despite several retries and waiting\n", + "Could not download 6.175725221875976, 6.922742052756017 despite several retries and waiting\n", + "Could not download 6.090171543674024, 6.2944873011619915 despite several retries and waiting\n", + "Could not download 6.120115386478008, 6.2944873011619915 despite several retries and waiting\n", + "Could not download 6.090171543674024, 6.309459222563984 despite several retries and waiting\n", + "Could not download 6.105143465076016, 6.309459222563984 despite several retries and waiting\n", + "Could not download 6.13508730788, 6.309459222563984 despite several retries and waiting\n", + "Could not download 6.090171543674024, 6.324431143965976 despite several retries and waiting\n", + "Could not download 6.105143465076016, 6.324431143965976 despite several retries and waiting\n", + "Could not download 6.120115386478008, 6.324431143965976 despite several retries and waiting\n", + "Could not download 6.13508730788, 6.324431143965976 despite several retries and waiting\n", + "Could not download 6.180003072085976, 6.324431143965976 despite several retries and waiting\n", + "Could not download 6.132053407918007, 8.262274875055978 despite several retries and waiting\n", + "Could not download 6.15062167012, 7.915096986886016 despite several retries and waiting\n", + "Could not download 6.195537434325976, 7.930068908288008 despite several retries and waiting\n", + "Could not download 6.151757315128008, 6.998163450564023 despite several retries and waiting\n", + "Could not download 6.152818369228009, 6.991717119328008 despite several retries and waiting\n", + "Could not download 6.242807500533984, 6.680889736486016 despite several retries and waiting\n", + "Could not download 6.249641592023983, 4.628069795666015 despite several retries and waiting\n", + "Could not download 6.234669670621991, 4.643041717068007 despite several retries and waiting\n", + "Could not download 6.234669670621991, 4.658013638469999 despite several retries and waiting\n", + "Could not download 6.249641592023983, 4.658013638469999 despite several retries and waiting\n", + "Could not download 6.264613513425975, 4.687957481273983 despite several retries and waiting\n", + "Could not download 6.273133818143984, 7.587237739806017 despite several retries and waiting\n", + "Could not download 6.198274211134024, 7.6171815826100016 despite several retries and waiting\n", + "Could not download 6.258161896741992, 7.632153504011994 despite several retries and waiting\n", + "Could not download 6.231460060404023, 5.611257657656016 despite several retries and waiting\n", + "Could not download 6.246431981806015, 5.611257657656016 despite several retries and waiting\n", + "Could not download 6.231460060404023, 5.626229579058008 despite several retries and waiting\n", + "Could not download 6.246431981806015, 5.626229579058008 despite several retries and waiting\n", + "Could not download 6.231460060404023, 5.64120150046 despite several retries and waiting\n", + "Could not download 6.246431981806015, 5.64120150046 despite several retries and waiting\n", + "Could not download 6.231460060404023, 5.656173421861992 despite several retries and waiting\n", + "Could not download 6.246431981806015, 5.656173421861992 despite several retries and waiting\n", + "Could not download 6.321291588815976, 5.656173421861992 despite several retries and waiting\n", + "Could not download 6.231460060404023, 5.6711453432639845 despite several retries and waiting\n", + "Could not download 6.246431981806015, 5.6711453432639845 despite several retries and waiting\n", + "Could not download 6.2614039032080075, 5.6711453432639845 despite several retries and waiting\n", + "Could not download 6.27637582461, 5.6711453432639845 despite several retries and waiting\n", + "Could not download 6.291347746011992, 5.6711453432639845 despite several retries and waiting\n", + "Could not download 6.231460060404023, 5.686117264665977 despite several retries and waiting\n", + "Could not download 6.246431981806015, 5.686117264665977 despite several retries and waiting\n", + "Could not download 6.2614039032080075, 5.686117264665977 despite several retries and waiting\n", + "Could not download 6.27637582461, 5.686117264665977 despite several retries and waiting\n", + "Could not download 6.291347746011992, 5.686117264665977 despite several retries and waiting\n", + "Could not download 6.2852450514400005, 7.360891214375976 despite several retries and waiting\n", + "Could not download 6.244031297734024, 9.120246218723985 despite several retries and waiting\n", + "Could not download 6.273975140538008, 9.120246218723985 despite several retries and waiting\n", + "Could not download 6.303918983341992, 9.120246218723985 despite several retries and waiting\n", + "Could not download 6.273975140538008, 9.135218140125977 despite several retries and waiting\n", + "Could not download 6.303918983341992, 9.135218140125977 despite several retries and waiting\n", + "Could not download 6.308970527785476, 9.123614431783546 despite several retries and waiting\n", + "Could not download 6.2948770108800005, 7.094112656263985 despite several retries and waiting\n", + "Could not download 6.309848932281993, 7.094112656263985 despite several retries and waiting\n", + "Could not download 6.280008938656017, 5.69852872786 despite several retries and waiting\n", + "Could not download 6.2949808600580095, 5.69852872786 despite several retries and waiting\n", + "Could not download 6.309952781460002, 5.69852872786 despite several retries and waiting\n", + "Could not download 6.324924702861994, 5.7284725706639845 despite several retries and waiting\n", + "Could not download 6.354868545665978, 5.7284725706639845 despite several retries and waiting\n", + "Could not download 6.324924702861994, 5.743444492065977 despite several retries and waiting\n", + "Could not download 6.31723421115, 5.657578470090001 despite several retries and waiting\n", + "Could not download 6.332206132551992, 5.657578470090001 despite several retries and waiting\n", + "Could not download 6.272318446944023, 5.672550391491993 despite several retries and waiting\n", + "Could not download 6.2872903683460155, 5.672550391491993 despite several retries and waiting\n", + "Could not download 6.272318446944023, 5.687522312893985 despite several retries and waiting\n", + "Could not download 6.2872903683460155, 5.687522312893985 despite several retries and waiting\n", + "Could not download 6.272318446944023, 5.702494234295977 despite several retries and waiting\n", + "Could not download 6.2872903683460155, 5.702494234295977 despite several retries and waiting\n", + "Could not download 6.302262289748008, 5.702494234295977 despite several retries and waiting\n", + "Could not download 6.365613656275976, 5.573604465104023 despite several retries and waiting\n", + "Could not download 6.32069789207, 5.648464072113984 despite several retries and waiting\n", + "Could not download 6.335669813471992, 5.648464072113984 despite several retries and waiting\n", + "Could not download 6.32069789207, 5.663435993515976 despite several retries and waiting\n", + "Could not download 6.335669813471992, 5.663435993515976 despite several retries and waiting\n", + "Could not download 6.32851769839, 7.893282336246014 despite several retries and waiting\n", + "Could not download 6.32851769839, 7.908254257648006 despite several retries and waiting\n", + "Could not download 6.381566444165975, 5.551828192544023 despite several retries and waiting\n", + "Could not download 6.366594522763983, 5.566800113946015 despite several retries and waiting\n", + "Could not download 6.324780391316015, 5.64703466044 despite several retries and waiting\n", + "Could not download 6.324780391316015, 5.662006581841992 despite several retries and waiting\n", + "Could not download 6.309808469914023, 5.6919504246459764 despite several retries and waiting\n", + "Could not download 6.326769733816016, 5.6497511196819925 despite several retries and waiting\n", + "Could not download 6.326769733816016, 5.664723041083985 despite several retries and waiting\n", + "Could not download 6.350126992688009, 4.745522215884024 despite several retries and waiting\n", + "Could not download 6.365098914090001, 4.760494137286016 despite several retries and waiting\n", + "Could not download 6.380070835491993, 4.760494137286016 despite several retries and waiting\n", + "Could not download 6.410014678295977, 4.775466058688008 despite several retries and waiting\n", + "Could not download 6.366917857000001, 7.179579409854024 despite several retries and waiting\n", + "Could not download 6.3369740141960165, 7.239467095461992 despite several retries and waiting\n", + "Could not download 6.37205907464, 4.745537667764023 despite several retries and waiting\n", + "Could not download 6.416974838845976, 4.760509589166015 despite several retries and waiting\n", + "Could not download 6.416974838845976, 4.7754815105680075 despite several retries and waiting\n", + "Could not download 6.335870188714023, 4.757183470966016 despite several retries and waiting\n", + "Could not download 6.380785952919999, 4.757183470966016 despite several retries and waiting\n", + "Could not download 6.425701717125976, 4.772155392368008 despite several retries and waiting\n", + "Could not download 6.425701717125976, 4.78712731377 despite several retries and waiting\n", + "Could not download 6.353935121414023, 6.6136068491859765 despite several retries and waiting\n", + "Could not download 6.416355007558008, 2.849532898596016 despite several retries and waiting\n", + "Could not download 6.416355007558008, 2.864504819998008 despite several retries and waiting\n", + "Could not download 6.416355007558008, 2.8794767414 despite several retries and waiting\n", + "Could not download 6.446298850361992, 2.8794767414 despite several retries and waiting\n", + "Could not download 6.416355007558008, 2.894448662801992 despite several retries and waiting\n", + "Could not download 6.43132692896, 2.894448662801992 despite several retries and waiting\n", + "Could not download 6.416355007558008, 2.9094205842039838 despite several retries and waiting\n", + "Could not download 6.446298850361992, 2.9094205842039838 despite several retries and waiting\n", + "Could not download 6.417194824338008, 7.445259981854024 despite several retries and waiting\n", + "Could not download 6.477082509945976, 7.445259981854024 despite several retries and waiting\n", + "Could not download 6.417194824338008, 7.460231903256016 despite several retries and waiting\n", + "Could not download 6.43216674574, 7.460231903256016 despite several retries and waiting\n", + "Could not download 6.447138667141992, 7.460231903256016 despite several retries and waiting\n", + "Could not download 6.462110588543984, 7.460231903256016 despite several retries and waiting\n", + "Could not download 6.477082509945976, 7.460231903256016 despite several retries and waiting\n", + "Could not download 6.447138667141992, 7.475203824658008 despite several retries and waiting\n", + "Could not download 6.462110588543984, 7.475203824658008 despite several retries and waiting\n", + "Could not download 6.477082509945976, 7.475203824658008 despite several retries and waiting\n", + "Could not download 6.447138667141992, 7.49017574606 despite several retries and waiting\n", + "Could not download 6.462110588543984, 7.49017574606 despite several retries and waiting\n", + "Could not download 6.477082509945976, 7.49017574606 despite several retries and waiting\n", + "Could not download 6.387250981534024, 7.505147667461992 despite several retries and waiting\n", + "Could not download 6.402222902936016, 7.505147667461992 despite several retries and waiting\n", + "Could not download 6.458159639134412, 7.476152431879382 despite several retries and waiting\n", + "Could not download 6.447651523391992, 6.167314974286016 despite several retries and waiting\n", + "Could not download 6.402735759186016, 6.227202659893984 despite several retries and waiting\n", + "Could not download 6.431525767468008, 3.30557127872 despite several retries and waiting\n", + "Could not download 6.44649768887, 3.30557127872 despite several retries and waiting\n", + "Could not download 6.461469610271992, 3.30557127872 despite several retries and waiting\n", + "Could not download 6.476441531673984, 3.30557127872 despite several retries and waiting\n", + "Could not download 6.491413453075976, 3.30557127872 despite several retries and waiting\n", + "Could not download 6.416553846066016, 3.320543200121992 despite several retries and waiting\n", + "Could not download 6.431525767468008, 3.320543200121992 despite several retries and waiting\n", + "Could not download 6.44649768887, 3.320543200121992 despite several retries and waiting\n", + "Could not download 6.461469610271992, 3.320543200121992 despite several retries and waiting\n", + "Could not download 6.476441531673984, 3.320543200121992 despite several retries and waiting\n", + "Could not download 6.416553846066016, 3.3355151215239838 despite several retries and waiting\n", + "Could not download 6.431525767468008, 3.3355151215239838 despite several retries and waiting\n", + "Could not download 6.44649768887, 3.3355151215239838 despite several retries and waiting\n", + "Could not download 6.461469610271992, 3.3355151215239838 despite several retries and waiting\n", + "Could not download 6.476441531673984, 3.3355151215239838 despite several retries and waiting\n", + "Could not download 6.416553846066016, 3.350487042925976 despite several retries and waiting\n", + "Could not download 6.491413453075976, 3.350487042925976 despite several retries and waiting\n", + "Could not download 6.430287915517978, 3.3056344489836555 despite several retries and waiting\n", + "Could not download 6.416696212006015, 7.439815488204023 despite several retries and waiting\n", + "Could not download 6.476583897613984, 7.439815488204023 despite several retries and waiting\n", + "Could not download 6.416696212006015, 7.454787409606015 despite several retries and waiting\n", + "Could not download 6.4316681334080075, 7.454787409606015 despite several retries and waiting\n", + "Could not download 6.44664005481, 7.454787409606015 despite several retries and waiting\n", + "Could not download 6.461611976211992, 7.454787409606015 despite several retries and waiting\n", + "Could not download 6.476583897613984, 7.454787409606015 despite several retries and waiting\n", + "Could not download 6.416696212006015, 7.4697593310080075 despite several retries and waiting\n", + "Could not download 6.4316681334080075, 7.4697593310080075 despite several retries and waiting\n", + "Could not download 6.44664005481, 7.4697593310080075 despite several retries and waiting\n", + "Could not download 6.461611976211992, 7.4697593310080075 despite several retries and waiting\n", + "Could not download 6.476583897613984, 7.4697593310080075 despite several retries and waiting\n", + "Could not download 6.44664005481, 7.48473125241 despite several retries and waiting\n", + "Could not download 6.461611976211992, 7.48473125241 despite several retries and waiting\n", + "Could not download 6.476583897613984, 7.48473125241 despite several retries and waiting\n", + "Could not download 6.401724290604023, 7.499703173811992 despite several retries and waiting\n", + "Could not download 6.491555819015976, 7.499703173811992 despite several retries and waiting\n", + "Could not download 6.437106191682019, 7.466605388684359 despite several retries and waiting\n", + "Could not download 6.435760430148008, 3.2970155456660164 despite several retries and waiting\n", + "Could not download 6.45073235155, 3.2970155456660164 despite several retries and waiting\n", + "Could not download 6.465704272951992, 3.2970155456660164 despite several retries and waiting\n", + "Could not download 6.480676194353984, 3.2970155456660164 despite several retries and waiting\n", + "Could not download 6.4956481157559764, 3.2970155456660164 despite several retries and waiting\n", + "Could not download 6.435760430148008, 3.311987467068008 despite several retries and waiting\n", + "Could not download 6.45073235155, 3.311987467068008 despite several retries and waiting\n", + "Could not download 6.465704272951992, 3.311987467068008 despite several retries and waiting\n", + "Could not download 6.480676194353984, 3.311987467068008 despite several retries and waiting\n", + "Could not download 6.4956481157559764, 3.311987467068008 despite several retries and waiting\n", + "Could not download 6.405816587344024, 3.32695938847 despite several retries and waiting\n", + "Could not download 6.420788508746016, 3.32695938847 despite several retries and waiting\n", + "Could not download 6.435760430148008, 3.32695938847 despite several retries and waiting\n", + "Could not download 6.45073235155, 3.32695938847 despite several retries and waiting\n", + "Could not download 6.465704272951992, 3.32695938847 despite several retries and waiting\n", + "Could not download 6.480676194353984, 3.32695938847 despite several retries and waiting\n", + "Could not download 6.405816587344024, 3.3419313098719923 despite several retries and waiting\n", + "Could not download 6.420788508746016, 3.3419313098719923 despite several retries and waiting\n", + "Could not download 6.4956481157559764, 3.3419313098719923 despite several retries and waiting\n", + "Could not download 6.405816587344024, 3.356903231273984 despite several retries and waiting\n", + "Could not download 6.420788508746016, 3.356903231273984 despite several retries and waiting\n", + "Could not download 6.4956481157559764, 3.356903231273984 despite several retries and waiting\n", + "Could not download 6.45073235155, 3.371875152675976 despite several retries and waiting\n", + "Could not download 6.465704272951992, 3.371875152675976 despite several retries and waiting\n", + "Could not download 6.4956481157559764, 3.371875152675976 despite several retries and waiting\n", + "Could not download 6.45311631035674, 3.3694700512672733 despite several retries and waiting\n", + "Could not download 6.410586360204023, 7.434143106744024 despite several retries and waiting\n", + "Could not download 6.470474045811992, 7.434143106744024 despite several retries and waiting\n", + "Could not download 6.485445967213984, 7.434143106744024 despite several retries and waiting\n", + "Could not download 6.410586360204023, 7.449115028146016 despite several retries and waiting\n", + "Could not download 6.4255582816060155, 7.449115028146016 despite several retries and waiting\n", + "Could not download 6.440530203008008, 7.449115028146016 despite several retries and waiting\n", + "Could not download 6.45550212441, 7.449115028146016 despite several retries and waiting\n", + "Could not download 6.470474045811992, 7.449115028146016 despite several retries and waiting\n", + "Could not download 6.485445967213984, 7.449115028146016 despite several retries and waiting\n", + "Could not download 6.410586360204023, 7.464086949548008 despite several retries and waiting\n", + "Could not download 6.4255582816060155, 7.464086949548008 despite several retries and waiting\n", + "Could not download 6.440530203008008, 7.464086949548008 despite several retries and waiting\n", + "Could not download 6.45550212441, 7.464086949548008 despite several retries and waiting\n", + "Could not download 6.470474045811992, 7.464086949548008 despite several retries and waiting\n", + "Could not download 6.485445967213984, 7.464086949548008 despite several retries and waiting\n", + "Could not download 6.45550212441, 7.47905887095 despite several retries and waiting\n", + "Could not download 6.470474045811992, 7.47905887095 despite several retries and waiting\n", + "Could not download 6.485445967213984, 7.47905887095 despite several retries and waiting\n", + "Could not download 6.500417888615976, 7.494030792351992 despite several retries and waiting\n", + "Could not download 6.500417888615976, 7.5090027137539845 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.419484369444024 despite several retries and waiting\n", + "Could not download 6.471258510201992, 3.419484369444024 despite several retries and waiting\n", + "Could not download 6.4862304316039845, 3.419484369444024 despite several retries and waiting\n", + "Could not download 6.501202353005977, 3.419484369444024 despite several retries and waiting\n", + "Could not download 6.426342745996016, 3.434456290846016 despite several retries and waiting\n", + "Could not download 6.441314667398008, 3.434456290846016 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.434456290846016 despite several retries and waiting\n", + "Could not download 6.471258510201992, 3.434456290846016 despite several retries and waiting\n", + "Could not download 6.4862304316039845, 3.434456290846016 despite several retries and waiting\n", + "Could not download 6.501202353005977, 3.434456290846016 despite several retries and waiting\n", + "Could not download 6.426342745996016, 3.4494282122480078 despite several retries and waiting\n", + "Could not download 6.441314667398008, 3.4494282122480078 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.4494282122480078 despite several retries and waiting\n", + "Could not download 6.471258510201992, 3.4494282122480078 despite several retries and waiting\n", + "Could not download 6.4862304316039845, 3.4494282122480078 despite several retries and waiting\n", + "Could not download 6.501202353005977, 3.4494282122480078 despite several retries and waiting\n", + "Could not download 6.426342745996016, 3.46440013365 despite several retries and waiting\n", + "Could not download 6.441314667398008, 3.46440013365 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.46440013365 despite several retries and waiting\n", + "Could not download 6.471258510201992, 3.46440013365 despite several retries and waiting\n", + "Could not download 6.4862304316039845, 3.46440013365 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.479372055051992 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.4943439764539836 despite several retries and waiting\n", + "Could not download 6.4562865888, 3.5093158978559758 despite several retries and waiting\n", + "Could not download 6.453208255828009, 3.5117014445740242 despite several retries and waiting\n", + "Could not download 6.4382363344260165, 3.5266733659760163 despite several retries and waiting\n", + "Could not download 6.453208255828009, 3.571589130181992 despite several retries and waiting\n", + "Could not download 6.498124020033985, 3.586561051583984 despite several retries and waiting\n", + "Could not download 6.498124020033985, 3.601532972985976 despite several retries and waiting\n", + "Could not download 6.47041667546, 7.442715252614023 despite several retries and waiting\n", + "Could not download 6.485388596861992, 7.442715252614023 despite several retries and waiting\n", + "Could not download 6.425500911254024, 7.457687174016015 despite several retries and waiting\n", + "Could not download 6.440472832656016, 7.457687174016015 despite several retries and waiting\n", + "Could not download 6.455444754058008, 7.457687174016015 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 6.485388596861992, 7.457687174016015\n", + "Traceback (most recent call last):\n", + " File \"\", line 46, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 6.47041667546, 7.457687174016015 despite several retries and waiting\n", + "Could not download 6.455444754058008, 7.472659095418007 despite several retries and waiting\n", + "Could not download 6.47041667546, 7.472659095418007 despite several retries and waiting\n", + "Could not download 6.485388596861992, 7.472659095418007 despite several retries and waiting\n", + "Could not download 6.455444754058008, 7.487631016819999 despite several retries and waiting\n", + "Could not download 6.47041667546, 7.487631016819999 despite several retries and waiting\n", + "Could not download 6.485388596861992, 7.487631016819999 despite several retries and waiting\n", + "Could not download 6.500360518263984, 7.502602938221991 despite several retries and waiting\n", + "Could not download 6.431778452264023, 3.305904738064024 despite several retries and waiting\n", + "Could not download 6.446750373666015, 3.305904738064024 despite several retries and waiting\n", + "Could not download 6.461722295068007, 3.305904738064024 despite several retries and waiting\n", + "Could not download 6.476694216469999, 3.305904738064024 despite several retries and waiting\n", + "Could not download 6.4916661378719915, 3.305904738064024 despite several retries and waiting\n", + "Could not download 6.506638059273984, 3.305904738064024 despite several retries and waiting\n", + "Could not download 6.431778452264023, 3.320876659466016 despite several retries and waiting\n", + "Could not download 6.446750373666015, 3.320876659466016 despite several retries and waiting\n", + "Could not download 6.461722295068007, 3.320876659466016 despite several retries and waiting\n", + "Could not download 6.476694216469999, 3.320876659466016 despite several retries and waiting\n", + "Could not download 6.431778452264023, 3.335848580868008 despite several retries and waiting\n", + "Could not download 6.446750373666015, 3.335848580868008 despite several retries and waiting\n", + "Could not download 6.461722295068007, 3.335848580868008 despite several retries and waiting\n", + "Could not download 6.476694216469999, 3.335848580868008 despite several retries and waiting\n", + "Could not download 6.4916661378719915, 3.35082050227 despite several retries and waiting\n", + "Could not download 6.506638059273984, 3.35082050227 despite several retries and waiting\n", + "Could not download 6.446750373666015, 3.365792423671992 despite several retries and waiting\n", + "Could not download 6.461722295068007, 3.365792423671992 despite several retries and waiting\n", + "Could not download 6.4916661378719915, 3.365792423671992 despite several retries and waiting\n", + "Could not download 6.506638059273984, 3.365792423671992 despite several retries and waiting\n", + "Could not download 6.521609980675976, 3.365792423671992 despite several retries and waiting\n", + "Could not download 6.446750373666015, 3.3807643450739837 despite several retries and waiting\n", + "Could not download 6.461722295068007, 3.3807643450739837 despite several retries and waiting\n", + "Could not download 6.4916661378719915, 3.3807643450739837 despite several retries and waiting\n", + "Could not download 6.506638059273984, 3.3807643450739837 despite several retries and waiting\n", + "Could not download 6.521609980675976, 3.3807643450739837 despite several retries and waiting\n", + "Could not download 6.446750373666015, 3.395736266475976 despite several retries and waiting\n", + "Could not download 6.461722295068007, 3.395736266475976 despite several retries and waiting\n", + "Could not download 6.476694216469999, 3.395736266475976 despite several retries and waiting\n", + "Could not download 6.4916661378719915, 3.395736266475976 despite several retries and waiting\n", + "Could not download 6.506638059273984, 3.395736266475976 despite several retries and waiting\n", + "Could not download 6.521609980675976, 3.395736266475976 despite several retries and waiting\n", + "Could not download 6.464454916618007, 7.723408767874024 despite several retries and waiting\n", + "Could not download 6.5093706808239835, 7.738380689276016 despite several retries and waiting\n", + "Could not download 6.479426838019999, 7.76832453208 despite several retries and waiting\n", + "Could not download 6.434511073814023, 7.783296453481992 despite several retries and waiting\n", + "Could not download 6.464454916618007, 7.783296453481992 despite several retries and waiting\n", + "Could not download 6.434511073814023, 7.813240296285977 despite several retries and waiting\n", + "Could not download 6.4440371855340235, 3.301675547338008 despite several retries and waiting\n", + "Could not download 6.459009106936016, 3.301675547338008 despite several retries and waiting\n", + "Could not download 6.473981028338008, 3.301675547338008 despite several retries and waiting\n", + "Could not download 6.48895294974, 3.301675547338008 despite several retries and waiting\n", + "Could not download 6.503924871141992, 3.301675547338008 despite several retries and waiting\n", + "Could not download 6.4440371855340235, 3.3166474687400003 despite several retries and waiting\n", + "Could not download 6.459009106936016, 3.3166474687400003 despite several retries and waiting\n", + "Could not download 6.473981028338008, 3.3166474687400003 despite several retries and waiting\n", + "Could not download 6.48895294974, 3.3166474687400003 despite several retries and waiting\n", + "Could not download 6.503924871141992, 3.3166474687400003 despite several retries and waiting\n", + "Could not download 6.4440371855340235, 3.3316193901419924 despite several retries and waiting\n", + "Could not download 6.459009106936016, 3.3316193901419924 despite several retries and waiting\n", + "Could not download 6.473981028338008, 3.3316193901419924 despite several retries and waiting\n", + "Could not download 6.48895294974, 3.3316193901419924 despite several retries and waiting\n", + "Could not download 6.503924871141992, 3.346591311543984 despite several retries and waiting\n", + "Could not download 6.533868713945976, 3.346591311543984 despite several retries and waiting\n", + "Could not download 6.503924871141992, 3.361563232945976 despite several retries and waiting\n", + "Could not download 6.533868713945976, 3.361563232945976 despite several retries and waiting\n", + "Could not download 6.487317196382653, 3.3173926006543253 despite several retries and waiting\n", + "Could not download 6.445481534634024, 3.305640659428008 despite several retries and waiting\n", + "Could not download 6.460453456036016, 3.305640659428008 despite several retries and waiting\n", + "Could not download 6.475425377438008, 3.305640659428008 despite several retries and waiting\n", + "Could not download 6.4903972988400005, 3.305640659428008 despite several retries and waiting\n", + "Could not download 6.505369220241993, 3.305640659428008 despite several retries and waiting\n", + "Could not download 6.445481534634024, 3.32061258083 despite several retries and waiting\n", + "Could not download 6.460453456036016, 3.32061258083 despite several retries and waiting\n", + "Could not download 6.475425377438008, 3.32061258083 despite several retries and waiting\n", + "Could not download 6.445481534634024, 3.3355845022319923 despite several retries and waiting\n", + "Could not download 6.460453456036016, 3.3355845022319923 despite several retries and waiting\n", + "Could not download 6.475425377438008, 3.3355845022319923 despite several retries and waiting\n", + "Could not download 6.4903972988400005, 3.350556423633984 despite several retries and waiting\n", + "Could not download 6.505369220241993, 3.350556423633984 despite several retries and waiting\n", + "Could not download 6.535313063045977, 3.350556423633984 despite several retries and waiting\n", + "Could not download 6.460453456036016, 3.365528345035976 despite several retries and waiting\n", + "Could not download 6.4903972988400005, 3.365528345035976 despite several retries and waiting\n", + "Could not download 6.505369220241993, 3.365528345035976 despite several retries and waiting\n", + "Could not download 6.520341141643985, 3.365528345035976 despite several retries and waiting\n", + "Could not download 6.535313063045977, 3.365528345035976 despite several retries and waiting\n", + "Could not download 6.461657705577472, 3.3164105510626967 despite several retries and waiting\n", + "Could not download 6.448046524714023, 3.303887952668008 despite several retries and waiting\n", + "Could not download 6.463018446116015, 3.303887952668008 despite several retries and waiting\n", + "Could not download 6.477990367518007, 3.303887952668008 despite several retries and waiting\n", + "Could not download 6.492962288919999, 3.303887952668008 despite several retries and waiting\n", + "Could not download 6.5079342103219915, 3.303887952668008 despite several retries and waiting\n", + "Could not download 6.448046524714023, 3.31885987407 despite several retries and waiting\n", + "Could not download 6.463018446116015, 3.31885987407 despite several retries and waiting\n", + "Could not download 6.477990367518007, 3.31885987407 despite several retries and waiting\n", + "Could not download 6.448046524714023, 3.3338317954719923 despite several retries and waiting\n", + "Could not download 6.463018446116015, 3.3338317954719923 despite several retries and waiting\n", + "Could not download 6.477990367518007, 3.3338317954719923 despite several retries and waiting\n", + "Could not download 6.492962288919999, 3.348803716873984 despite several retries and waiting\n", + "Could not download 6.5079342103219915, 3.348803716873984 despite several retries and waiting\n", + "Could not download 6.537878053125976, 3.348803716873984 despite several retries and waiting\n", + "Could not download 6.448046524714023, 3.363775638275976 despite several retries and waiting\n", + "Could not download 6.463018446116015, 3.363775638275976 despite several retries and waiting\n", + "Could not download 6.492962288919999, 3.363775638275976 despite several retries and waiting\n", + "Could not download 6.5079342103219915, 3.363775638275976 despite several retries and waiting\n", + "Could not download 6.522906131723984, 3.363775638275976 despite several retries and waiting\n", + "Could not download 6.537878053125976, 3.363775638275976 despite several retries and waiting\n", + "Could not download 6.451864592804023, 3.301400714508008 despite several retries and waiting\n", + "Could not download 6.466836514206015, 3.301400714508008 despite several retries and waiting\n", + "Could not download 6.4818084356080075, 3.301400714508008 despite several retries and waiting\n", + "Could not download 6.49678035701, 3.301400714508008 despite several retries and waiting\n", + "Could not download 6.511752278411992, 3.301400714508008 despite several retries and waiting\n", + "Could not download 6.451864592804023, 3.31637263591 despite several retries and waiting\n", + "Could not download 6.466836514206015, 3.31637263591 despite several retries and waiting\n", + "Could not download 6.4818084356080075, 3.31637263591 despite several retries and waiting\n", + "Could not download 6.49678035701, 3.31637263591 despite several retries and waiting\n", + "Could not download 6.511752278411992, 3.31637263591 despite several retries and waiting\n", + "Could not download 6.451864592804023, 3.331344557311992 despite several retries and waiting\n", + "Could not download 6.466836514206015, 3.331344557311992 despite several retries and waiting\n", + "Could not download 6.4818084356080075, 3.331344557311992 despite several retries and waiting\n", + "Could not download 6.49678035701, 3.346316478713984 despite several retries and waiting\n", + "Could not download 6.511752278411992, 3.346316478713984 despite several retries and waiting\n", + "Could not download 6.541696121215976, 3.346316478713984 despite several retries and waiting\n", + "Could not download 6.49678035701, 3.361288400115976 despite several retries and waiting\n", + "Could not download 6.511752278411992, 3.361288400115976 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 6.541696121215976, 3.361288400115976\n", + "Traceback (most recent call last):\n", + " File \"\", line 51, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "ERROR:root:Error-could not download 6.50086128035502, 3.280458884913953\n", + "Traceback (most recent call last):\n", + " File \"\", line 46, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 6.49837750849, 3.3441339482340244 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.3441339482340244 despite several retries and waiting\n", + "Could not download 6.49837750849, 3.3591058696360165 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.3591058696360165 despite several retries and waiting\n", + "Could not download 6.453461744284024, 3.374077791038008 despite several retries and waiting\n", + "Could not download 6.49837750849, 3.374077791038008 despite several retries and waiting\n", + "Could not download 6.513349429891992, 3.374077791038008 despite several retries and waiting\n", + "Could not download 6.528321351293984, 3.374077791038008 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.374077791038008 despite several retries and waiting\n", + "Could not download 6.453461744284024, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.468433665686016, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.483405587088008, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.49837750849, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.513349429891992, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.528321351293984, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.3890497124400003 despite several retries and waiting\n", + "Could not download 6.453461744284024, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.468433665686016, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.483405587088008, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.49837750849, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.513349429891992, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.528321351293984, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.4040216338419924 despite several retries and waiting\n", + "Could not download 6.453461744284024, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.468433665686016, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.483405587088008, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.49837750849, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.513349429891992, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.528321351293984, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.418993555243984 despite several retries and waiting\n", + "Could not download 6.453461744284024, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.468433665686016, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.483405587088008, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.49837750849, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.513349429891992, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.528321351293984, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.543293272695976, 3.433965476645976 despite several retries and waiting\n", + "Could not download 6.501125953552996, 3.3779899290701763 despite several retries and waiting\n", + "Could not download 6.50045244209, 3.59690898231 despite several retries and waiting\n", + "Could not download 6.456820426674025, 4.799983078813984 despite several retries and waiting\n", + "Could not download 6.459431334864023, 3.303253964316016 despite several retries and waiting\n", + "Could not download 6.474403256266015, 3.303253964316016 despite several retries and waiting\n", + "Could not download 6.489375177668007, 3.303253964316016 despite several retries and waiting\n", + "Could not download 6.504347099069999, 3.303253964316016 despite several retries and waiting\n", + "Could not download 6.459431334864023, 3.318225885718008 despite several retries and waiting\n", + "Could not download 6.474403256266015, 3.318225885718008 despite several retries and waiting\n", + "Could not download 6.489375177668007, 3.318225885718008 despite several retries and waiting\n", + "Could not download 6.459431334864023, 3.33319780712 despite several retries and waiting\n", + "Could not download 6.474403256266015, 3.33319780712 despite several retries and waiting\n", + "Could not download 6.489375177668007, 3.33319780712 despite several retries and waiting\n", + "Could not download 6.504347099069999, 3.348169728521992 despite several retries and waiting\n", + "Could not download 6.534290941873984, 3.348169728521992 despite several retries and waiting\n", + "Could not download 6.549262863275976, 3.348169728521992 despite several retries and waiting\n", + "Could not download 6.459431334864023, 3.3631416499239837 despite several retries and waiting\n", + "Could not download 6.504347099069999, 3.3631416499239837 despite several retries and waiting\n", + "Could not download 6.5193190204719915, 3.3631416499239837 despite several retries and waiting\n", + "Could not download 6.534290941873984, 3.3631416499239837 despite several retries and waiting\n", + "Could not download 6.549262863275976, 3.3631416499239837 despite several retries and waiting\n", + "Could not download 6.459431334864023, 3.378113571325976 despite several retries and waiting\n", + "Could not download 6.504347099069999, 3.378113571325976 despite several retries and waiting\n", + "Could not download 6.5193190204719915, 3.378113571325976 despite several retries and waiting\n", + "Could not download 6.534290941873984, 3.378113571325976 despite several retries and waiting\n", + "Could not download 6.549262863275976, 3.378113571325976 despite several retries and waiting\n", + "Could not download 6.475854565146016, 8.840218174156016 despite several retries and waiting\n", + "Could not download 6.50579840795, 8.840218174156016 despite several retries and waiting\n", + "Could not download 6.535742250753985, 8.855190095558008 despite several retries and waiting\n", + "Could not download 6.550714172155977, 8.87016201696 despite several retries and waiting\n", + "Could not download 6.50579840795, 8.885133938361992 despite several retries and waiting\n", + "Could not download 6.470551677024024, 3.3030515341760163 despite several retries and waiting\n", + "Could not download 6.485523598426016, 3.3030515341760163 despite several retries and waiting\n", + "Could not download 6.500495519828008, 3.3030515341760163 despite several retries and waiting\n", + "Could not download 6.470551677024024, 3.318023455578008 despite several retries and waiting\n", + "Could not download 6.485523598426016, 3.318023455578008 despite several retries and waiting\n", + "Could not download 6.470551677024024, 3.33299537698 despite several retries and waiting\n", + "Could not download 6.485523598426016, 3.33299537698 despite several retries and waiting\n", + "Could not download 6.500495519828008, 3.347967298381992 despite several retries and waiting\n", + "Could not download 6.545411284033984, 3.347967298381992 despite several retries and waiting\n", + "Could not download 6.5603832054359765, 3.347967298381992 despite several retries and waiting\n", + "Could not download 6.500495519828008, 3.362939219783984 despite several retries and waiting\n", + "Could not download 6.51546744123, 3.362939219783984 despite several retries and waiting\n", + "Could not download 6.530439362631992, 3.362939219783984 despite several retries and waiting\n", + "Could not download 6.545411284033984, 3.362939219783984 despite several retries and waiting\n", + "Could not download 6.5603832054359765, 3.362939219783984 despite several retries and waiting\n", + "Could not download 6.500495519828008, 3.377911141185976 despite several retries and waiting\n", + "Could not download 6.51546744123, 3.377911141185976 despite several retries and waiting\n", + "Could not download 6.530439362631992, 3.377911141185976 despite several retries and waiting\n", + "Could not download 6.545411284033984, 3.377911141185976 despite several retries and waiting\n", + "Could not download 6.5603832054359765, 3.377911141185976 despite several retries and waiting\n", + "Could not download 6.546280651193984, 5.672829526930001 despite several retries and waiting\n", + "Could not download 6.504390547856016, 3.3426545327740245 despite several retries and waiting\n", + "Could not download 6.53433439066, 3.3426545327740245 despite several retries and waiting\n", + "Could not download 6.549306312061992, 3.3426545327740245 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.3426545327740245 despite several retries and waiting\n", + "Could not download 6.504390547856016, 3.3576264541760166 despite several retries and waiting\n", + "Could not download 6.53433439066, 3.3576264541760166 despite several retries and waiting\n", + "Could not download 6.549306312061992, 3.3576264541760166 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.3576264541760166 despite several retries and waiting\n", + "Could not download 6.504390547856016, 3.3725983755780082 despite several retries and waiting\n", + "Could not download 6.519362469258008, 3.3725983755780082 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 6.53433439066, 3.3725983755780082\n", + "Traceback (most recent call last):\n", + " File \"\", line 51, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 6.549306312061992, 3.3725983755780082 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.3725983755780082 despite several retries and waiting\n", + "Could not download 6.579250154865976, 3.3725983755780082 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 6.4894186264540235, 3.3875702969800003\n", + "Traceback (most recent call last):\n", + " File \"\", line 51, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 6.504390547856016, 3.3875702969800003 despite several retries and waiting\n", + "Could not download 6.519362469258008, 3.3875702969800003 despite several retries and waiting\n", + "Could not download 6.53433439066, 3.3875702969800003 despite several retries and waiting\n", + "Could not download 6.549306312061992, 3.3875702969800003 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.3875702969800003 despite several retries and waiting\n", + "Could not download 6.579250154865976, 3.3875702969800003 despite several retries and waiting\n", + "Could not download 6.4894186264540235, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.504390547856016, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.519362469258008, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.53433439066, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.549306312061992, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.579250154865976, 3.4025422183819924 despite several retries and waiting\n", + "Could not download 6.4894186264540235, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.504390547856016, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.519362469258008, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.53433439066, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.549306312061992, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.579250154865976, 3.417514139783984 despite several retries and waiting\n", + "Could not download 6.4894186264540235, 3.432486061185976 despite several retries and waiting\n", + "Could not download 6.504390547856016, 3.432486061185976 despite several retries and waiting\n", + "Could not download 6.519362469258008, 3.432486061185976 despite several retries and waiting\n", + "Could not download 6.53433439066, 3.432486061185976 despite several retries and waiting\n", + "Could not download 6.549306312061992, 3.432486061185976 despite several retries and waiting\n", + "Could not download 6.564278233463984, 3.432486061185976 despite several retries and waiting\n", + "Could not download 6.500612866060731, 3.3560429887079737 despite several retries and waiting\n", + "Could not download 6.499420652814024, 3.2970355889740244 despite several retries and waiting\n", + "Could not download 6.499420652814024, 3.3120075103760165 despite several retries and waiting\n", + "Could not download 6.499420652814024, 3.3419513531800003 despite several retries and waiting\n", + "Could not download 6.54433641702, 3.3419513531800003 despite several retries and waiting\n", + "Could not download 6.559308338421992, 3.3419513531800003 despite several retries and waiting\n", + "Could not download 6.5742802598239845, 3.3419513531800003 despite several retries and waiting\n", + "Could not download 6.499420652814024, 3.3569232745819924 despite several retries and waiting\n", + "Could not download 6.54433641702, 3.3569232745819924 despite several retries and waiting\n", + "Could not download 6.559308338421992, 3.3569232745819924 despite several retries and waiting\n", + "Could not download 6.5742802598239845, 3.3569232745819924 despite several retries and waiting\n", + "Could not download 6.499420652814024, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.514392574216016, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.529364495618008, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.54433641702, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.559308338421992, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.5742802598239845, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.589252181225977, 3.371895195983984 despite several retries and waiting\n", + "Could not download 6.499420652814024, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.514392574216016, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.529364495618008, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.54433641702, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.559308338421992, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.5742802598239845, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.589252181225977, 3.386867117385976 despite several retries and waiting\n", + "Could not download 6.504260955087261, 3.3065040275603064 despite several retries and waiting\n", + "Could not download 6.536318459618008, 8.869393726864024 despite several retries and waiting\n", + "Could not download 6.55129038102, 8.869393726864024 despite several retries and waiting\n", + "Could not download 6.5812342238239845, 8.899337569668008 despite several retries and waiting\n", + "Could not download 6.566262302421992, 8.944253333873984 despite several retries and waiting\n", + "Could not download 6.631121206735976, 3.198581672726016 despite several retries and waiting\n", + "Could not download 6.543993772714023, 3.348758235476016 despite several retries and waiting\n", + "Could not download 6.558965694116015, 3.348758235476016 despite several retries and waiting\n", + "Could not download 6.573937615518007, 3.348758235476016 despite several retries and waiting\n", + "Could not download 6.543993772714023, 3.363730156878008 despite several retries and waiting\n", + "Could not download 6.558965694116015, 3.363730156878008 despite several retries and waiting\n", + "Could not download 6.573937615518007, 3.363730156878008 despite several retries and waiting\n", + "Could not download 6.588909536919999, 3.363730156878008 despite several retries and waiting\n", + "Could not download 6.543993772714023, 3.37870207828 despite several retries and waiting\n", + "Could not download 6.558965694116015, 3.37870207828 despite several retries and waiting\n", + "Could not download 6.573937615518007, 3.37870207828 despite several retries and waiting\n", + "Could not download 6.588909536919999, 3.37870207828 despite several retries and waiting\n", + "Could not download 6.543993772714023, 3.393673999681992 despite several retries and waiting\n", + "Could not download 6.558965694116015, 3.393673999681992 despite several retries and waiting\n", + "Could not download 6.573937615518007, 3.393673999681992 despite several retries and waiting\n", + "Could not download 6.588909536919999, 3.393673999681992 despite several retries and waiting\n", + "Could not download 6.603881458321991, 3.393673999681992 despite several retries and waiting\n", + "Could not download 6.6188533797239835, 3.393673999681992 despite several retries and waiting\n", + "Could not download 6.543993772714023, 3.4086459210839837 despite several retries and waiting\n", + "Could not download 6.558965694116015, 3.4086459210839837 despite several retries and waiting\n", + "Could not download 6.573937615518007, 3.4086459210839837 despite several retries and waiting\n", + "Could not download 6.588909536919999, 3.4086459210839837 despite several retries and waiting\n", + "Could not download 6.543993772714023, 3.423617842485976 despite several retries and waiting\n", + "Could not download 6.558965694116015, 3.423617842485976 despite several retries and waiting\n", + "Could not download 6.573937615518007, 3.423617842485976 despite several retries and waiting\n", + "Could not download 6.588909536919999, 3.423617842485976 despite several retries and waiting\n", + "Could not download 6.553862450814022, 3.345283882305976 despite several retries and waiting\n", + "Could not download 6.568834372216014, 3.345283882305976 despite several retries and waiting\n", + "Could not download 6.554027420784024, 3.343271466031992 despite several retries and waiting\n", + "Could not download 6.568999342186016, 3.343271466031992 despite several retries and waiting\n", + "Could not download 6.554027420784024, 3.358243387433984 despite several retries and waiting\n", + "Could not download 6.568999342186016, 3.358243387433984 despite several retries and waiting\n", + "Could not download 6.554027420784024, 3.373215308835976 despite several retries and waiting\n", + "Could not download 6.568999342186016, 3.373215308835976 despite several retries and waiting\n", + "Could not download 6.583971263588008, 3.373215308835976 despite several retries and waiting\n", + "Could not download 6.59894318499, 3.373215308835976 despite several retries and waiting\n", + "Could not download 6.556147980314024, 3.3528454902359757 despite several retries and waiting\n", + "Could not download 6.571119901716016, 3.3528454902359757 despite several retries and waiting\n", + "Could not download 6.585449447434024, 3.3630790885759763 despite several retries and waiting\n", + "Could not download 6.624188540466016, 3.867525352093984 despite several retries and waiting\n", + "Could not download 6.639160461868008, 3.867525352093984 despite several retries and waiting\n", + "Could not download 6.624188540466016, 3.882497273495976 despite several retries and waiting\n", + "Could not download 6.709727838735977, 3.1194055995460164 despite several retries and waiting\n", + "Could not download 6.634868231726016, 3.194265206555976 despite several retries and waiting\n", + "Could not download 6.6674215866180075, 7.253603776614024 despite several retries and waiting\n", + "Could not download 6.652449665216015, 7.268575698016016 despite several retries and waiting\n", + "Could not download 6.6674215866180075, 7.268575698016016 despite several retries and waiting\n", + "Could not download 6.68239350802, 7.283547619418008 despite several retries and waiting\n", + "Could not download 6.637477743814023, 7.29851954082 despite several retries and waiting\n", + "Could not download 6.637477743814023, 7.313491462221992 despite several retries and waiting\n", + "Could not download 6.712337350823984, 7.313491462221992 despite several retries and waiting\n", + "Could not download 6.637477743814023, 7.328463383623984 despite several retries and waiting\n", + "Could not download 6.6426397093640235, 3.20068664011 despite several retries and waiting\n", + "Could not download 6.69118125694, 8.090186760154024 despite several retries and waiting\n", + "Could not download 6.721125099743984, 8.105158681556016 despite several retries and waiting\n", + "Could not download 6.664060555186017, 3.056837762044024 despite several retries and waiting\n", + "Could not download 6.738920162195978, 3.056837762044024 despite several retries and waiting\n", + "Could not download 6.679032476588009, 3.0718096834460162 despite several retries and waiting\n", + "Could not download 6.6940043979900015, 3.086781604848008 despite several retries and waiting\n", + "Could not download 6.723948240793986, 3.086781604848008 despite several retries and waiting\n", + "Could not download 6.708976319391994, 3.116725447651992 despite several retries and waiting\n", + "Could not download 6.738920162195978, 3.1316973690539838 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 6.761198113495976, 8.902699118784021\n", + "Traceback (most recent call last):\n", + " File \"\", line 46, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 6.694550227774024, 3.025148089914024 despite several retries and waiting\n", + "Could not download 6.724494070578008, 3.025148089914024 despite several retries and waiting\n", + "Could not download 6.7544379133819925, 3.025148089914024 despite several retries and waiting\n", + "Could not download 6.769409834783985, 3.025148089914024 despite several retries and waiting\n", + "Could not download 6.709522149176016, 3.040120011316016 despite several retries and waiting\n", + "Could not download 6.724494070578008, 3.040120011316016 despite several retries and waiting\n", + "Could not download 6.73946599198, 3.07006385412 despite several retries and waiting\n", + "Could not download 6.7544379133819925, 3.085035775521992 despite several retries and waiting\n", + "Could not download 6.784381756185977, 3.1149796183259757 despite several retries and waiting\n", + "Could not download 6.73947844291, 3.136252953026016 despite several retries and waiting\n", + "Could not download 6.723021555624024, 7.633186747338008 despite several retries and waiting\n", + "Could not download 6.818706899445977, 3.1823028681560164 despite several retries and waiting\n", + "Could not download 6.803734978043985, 3.197274789558008 despite several retries and waiting\n", + "Could not download 6.818706899445977, 3.197274789558008 despite several retries and waiting\n", + "Could not download 6.810196777023983, 3.2035536425840245 despite several retries and waiting\n", + "Could not download 6.745360146454024, 4.4881754665 despite several retries and waiting\n", + "Could not download 6.760332067856016, 4.533091230705977 despite several retries and waiting\n", + "Could not download 6.82426073472, 3.174401844454024 despite several retries and waiting\n", + "Could not download 6.839232656121992, 3.174401844454024 despite several retries and waiting\n", + "Could not download 6.809288813318008, 3.189373765856016 despite several retries and waiting\n", + "Could not download 6.8691764989259765, 3.204345687258008 despite several retries and waiting\n", + "Could not download 6.839232656121992, 3.21931760866 despite several retries and waiting\n", + "Could not download 6.8691764989259765, 3.234289530061992 despite several retries and waiting\n", + "Could not download 6.849107800415081, 3.2092273528897355 despite several retries and waiting\n", + "Could not download 6.842401553481992, 7.418058468686015 despite several retries and waiting\n", + "Could not download 6.8573734748839845, 7.418058468686015 despite several retries and waiting\n", + "Could not download 6.872345396285977, 7.418058468686015 despite several retries and waiting\n", + "Could not download 6.842401553481992, 7.492918075695975 despite several retries and waiting\n", + "Could not download 6.880465844363984, 8.430195644648007 despite several retries and waiting\n", + "Could not download 6.85900318163, 8.885972186535977 despite several retries and waiting\n", + "Could not download 6.881680958474024, 7.487816047954024 despite several retries and waiting\n", + "Could not download 6.904864771504025, 7.448601936896016 despite several retries and waiting\n", + "Could not download 6.919836692906017, 7.463573858298008 despite several retries and waiting\n", + "Could not download 6.934808614308009, 7.463573858298008 despite several retries and waiting\n", + "Could not download 6.917319070494024, 3.609559104614024 despite several retries and waiting\n", + "Could not download 6.917319070494024, 3.624531026016016 despite several retries and waiting\n", + "Could not download 6.932290991896016, 3.65447486882 despite several retries and waiting\n", + "Could not download 6.932290991896016, 3.669446790221992 despite several retries and waiting\n", + "Could not download 6.947262913298008, 3.669446790221992 despite several retries and waiting\n", + "Could not download 7.007150598905977, 3.669446790221992 despite several retries and waiting\n", + "Could not download 6.932290991896016, 3.6844187116239837 despite several retries and waiting\n", + "Could not download 6.9921786775039845, 3.6844187116239837 despite several retries and waiting\n", + "Could not download 7.009570499581993, 3.650173005834024 despite several retries and waiting\n", + "Could not download 6.994598578180001, 3.665144927236016 despite several retries and waiting\n", + "Could not download 6.964654735376016, 3.69508877004 despite several retries and waiting\n", + "Could not download 7.009570499581993, 3.69508877004 despite several retries and waiting\n", + "Could not download 6.949682813974024, 3.710060691441992 despite several retries and waiting\n", + "Could not download 6.994598578180001, 3.710060691441992 despite several retries and waiting\n", + "Could not download 7.039514342385977, 3.7250326128439837 despite several retries and waiting\n", + "Could not download 7.024542420983985, 3.740004534245976 despite several retries and waiting\n", + "Could not download 6.953261713234023, 3.607852866766016 despite several retries and waiting\n", + "Could not download 6.968233634636015, 3.622824788168008 despite several retries and waiting\n", + "Could not download 6.99817747744, 3.652768630971992 despite several retries and waiting\n", + "Could not download 7.013149398841992, 3.652768630971992 despite several retries and waiting\n", + "Could not download 6.99817747744, 3.6677405523739837 despite several retries and waiting\n", + "Could not download 7.013149398841992, 3.6677405523739837 despite several retries and waiting\n", + "Could not download 7.013149398841992, 3.6827124737759758 despite several retries and waiting\n", + "Could not download 7.043093241645976, 3.6827124737759758 despite several retries and waiting\n", + "Could not download 6.993899744958008, 3.759700670524025 despite several retries and waiting\n", + "Could not download 7.00887166636, 3.759700670524025 despite several retries and waiting\n", + "Could not download 7.023843587761992, 3.7896445133280086 despite several retries and waiting\n", + "Could not download 7.038815509163984, 3.7896445133280086 despite several retries and waiting\n", + "Could not download 7.038815509163984, 3.8495321989359765 despite several retries and waiting\n", + "Could not download 6.968371756184023, 3.603065300505976 despite several retries and waiting\n", + "Could not download 7.123776591733984, 4.778507805014024 despite several retries and waiting\n", + "Could not download 7.09383274893, 4.793479726416016 despite several retries and waiting\n", + "Could not download 7.09383274893, 4.808451647818008 despite several retries and waiting\n", + "Could not download 7.118890978694023, 3.2466539307940243 despite several retries and waiting\n", + "Could not download 7.133862900096015, 3.2616258521960164 despite several retries and waiting\n", + "Could not download 7.118890978694023, 3.276597773598008 despite several retries and waiting\n", + "Could not download 7.155518622468008, 3.365200087313984 despite several retries and waiting\n", + "Could not download 7.245357438293984, 4.902629393894023 despite several retries and waiting\n", + "Could not download 7.260329359695976, 4.917601315296015 despite several retries and waiting\n", + "Could not download 7.200441674088007, 4.9325732366980075 despite several retries and waiting\n", + "Could not download 7.245357438293984, 4.9325732366980075 despite several retries and waiting\n", + "Could not download 7.2303855168919915, 4.9475451581 despite several retries and waiting\n", + "Could not download 7.245357438293984, 4.9475451581 despite several retries and waiting\n", + "Could not download 7.260329359695976, 4.9475451581 despite several retries and waiting\n", + "Could not download 7.260329359695976, 4.962517079501992 despite several retries and waiting\n", + "Could not download 7.260329359695976, 4.977489000903984 despite several retries and waiting\n", + "Could not download 7.253882544021992, 7.191676208054024 despite several retries and waiting\n", + "Could not download 7.268854465423984, 7.206648129456016 despite several retries and waiting\n", + "Could not download 7.273432766373984, 4.88333742804 despite several retries and waiting\n", + "Could not download 7.258460844971992, 4.913281270843984 despite several retries and waiting\n", + "Could not download 7.213545080766016, 4.928253192245976 despite several retries and waiting\n", + "Could not download 7.258460844971992, 4.928253192245976 despite several retries and waiting\n", + "Could not download 7.273432766373984, 4.928253192245976 despite several retries and waiting\n", + "Could not download 7.2884046877759765, 4.928253192245976 despite several retries and waiting\n", + "Could not download 7.289811854895976, 4.876583980615976 despite several retries and waiting\n", + "Could not download 7.284933328458009, 5.140163299796016 despite several retries and waiting\n", + "Could not download 7.274171415134022, 4.939282913204024 despite several retries and waiting\n", + "Could not download 7.289143336536014, 4.939282913204024 despite several retries and waiting\n", + "Could not download 7.304115257938006, 4.939282913204024 despite several retries and waiting\n", + "Could not download 7.334059100741991, 4.939282913204024 despite several retries and waiting\n", + "Could not download 7.289143336536014, 4.954254834606016 despite several retries and waiting\n", + "Could not download 7.334059100741991, 4.954254834606016 despite several retries and waiting\n", + "Could not download 7.334059100741991, 4.969226756008008 despite several retries and waiting\n", + "Could not download 7.349031022143983, 4.969226756008008 despite several retries and waiting\n", + "Could not download 7.364002943545975, 4.969226756008008 despite several retries and waiting\n", + "Could not download 7.364002943545975, 4.98419867741 despite several retries and waiting\n", + "Could not download 7.304115257938006, 4.999170598811992 despite several retries and waiting\n", + "Could not download 7.364002943545975, 4.999170598811992 despite several retries and waiting\n", + "Could not download 7.3190871793399985, 5.014142520213984 despite several retries and waiting\n", + "Could not download 7.334059100741991, 5.014142520213984 despite several retries and waiting\n", + "Could not download 7.4162054131839845, 3.843102910034024 despite several retries and waiting\n", + "Could not download 7.410451191728009, 4.537162084498008 despite several retries and waiting\n", + "Could not download 7.413233856424024, 3.8326875529240247 despite several retries and waiting\n", + "Could not download 7.419940563274025, 5.459334583103984 despite several retries and waiting\n", + "Could not download 7.499920944693983, 4.581471422471992 despite several retries and waiting\n", + "Could not download 7.467449884376016, 4.492781585124024 despite several retries and waiting\n", + "Could not download 7.527337569983985, 4.492781585124024 despite several retries and waiting\n", + "Could not download 7.501940224864023, 3.5242385814380084 despite several retries and waiting\n", + "Could not download 7.576799831873983, 3.5242385814380084 despite several retries and waiting\n", + "Could not download 7.609928345694024, 4.701428455964023 despite several retries and waiting\n", + "Could not download 7.6548441099, 4.716400377366015 despite several retries and waiting\n", + "Could not download 7.707767585184023, 4.583969018963984 despite several retries and waiting\n", + "Could not download 7.722739506586015, 4.583969018963984 despite several retries and waiting\n", + "Could not download 7.737711427988007, 4.583969018963984 despite several retries and waiting\n", + "Could not download 7.752683349389999, 4.583969018963984 despite several retries and waiting\n", + "Could not download 7.707767585184023, 4.598940940365976 despite several retries and waiting\n", + "Could not download 7.722739506586015, 4.598940940365976 despite several retries and waiting\n", + "Could not download 7.737711427988007, 4.598940940365976 despite several retries and waiting\n", + "Could not download 7.752683349389999, 4.598940940365976 despite several retries and waiting\n", + "Could not download 7.767655270791991, 4.598940940365976 despite several retries and waiting\n", + "Could not download 7.711429930184023, 4.579425538183985 despite several retries and waiting\n", + "Could not download 7.726401851586015, 4.579425538183985 despite several retries and waiting\n", + "Could not download 7.741373772988007, 4.579425538183985 despite several retries and waiting\n", + "Could not download 7.711429930184023, 4.594397459585977 despite several retries and waiting\n", + "Could not download 7.726401851586015, 4.594397459585977 despite several retries and waiting\n", + "Could not download 7.741373772988007, 4.594397459585977 despite several retries and waiting\n", + "Could not download 7.756345694389999, 4.594397459585977 despite several retries and waiting\n", + "Could not download 7.771317615791991, 4.594397459585977 despite several retries and waiting\n", + "Could not download 7.713079722004023, 4.576122964501992 despite several retries and waiting\n", + "Could not download 7.728051643406015, 4.576122964501992 despite several retries and waiting\n", + "Could not download 7.7430235648080075, 4.576122964501992 despite several retries and waiting\n", + "Could not download 7.713079722004023, 4.591094885903984 despite several retries and waiting\n", + "Could not download 7.728051643406015, 4.591094885903984 despite several retries and waiting\n", + "Could not download 7.7430235648080075, 4.591094885903984 despite several retries and waiting\n", + "Could not download 7.713079722004023, 4.606066807305976 despite several retries and waiting\n", + "Could not download 7.728051643406015, 4.606066807305976 despite several retries and waiting\n", + "Could not download 7.7430235648080075, 4.606066807305976 despite several retries and waiting\n", + "Could not download 7.75799548621, 4.606066807305976 despite several retries and waiting\n", + "Could not download 7.772967407611992, 4.606066807305976 despite several retries and waiting\n", + "Could not download 7.724900485984023, 4.577488744251992 despite several retries and waiting\n", + "Could not download 7.739872407386015, 4.577488744251992 despite several retries and waiting\n", + "Could not download 7.724900485984023, 4.592460665653984 despite several retries and waiting\n", + "Could not download 7.739872407386015, 4.592460665653984 despite several retries and waiting\n", + "Could not download 7.754844328788007, 4.592460665653984 despite several retries and waiting\n", + "Could not download 7.769816250189999, 4.592460665653984 despite several retries and waiting\n", + "Could not download 7.724900485984023, 4.6074325870559765 despite several retries and waiting\n", + "Could not download 7.739872407386015, 4.6074325870559765 despite several retries and waiting\n", + "Could not download 7.754844328788007, 4.6074325870559765 despite several retries and waiting\n", + "Could not download 7.769816250189999, 4.6074325870559765 despite several retries and waiting\n", + "Could not download 7.735016919137214, 4.572560505861917 despite several retries and waiting\n", + "Could not download 7.758157468948006, 4.756039090326016 despite several retries and waiting\n", + "Could not download 7.812351810281992, 4.733887108564023 despite several retries and waiting\n", + "Could not download 7.79737988888, 4.793774794171991 despite several retries and waiting\n", + "Could not download 7.827323731683984, 4.8237186369759755 despite several retries and waiting\n", + "Could not download 7.773978860634022, 4.605081113835977 despite several retries and waiting\n", + "Could not download 7.839901875710001, 4.907028441278008 despite several retries and waiting\n", + "Could not download 7.843275973094025, 5.1299048293139835 despite several retries and waiting\n", + "Could not download 7.878635412896016, 4.702326264971992 despite several retries and waiting\n", + "Could not download 7.9085792557, 4.702326264971992 despite several retries and waiting\n", + "Could not download 7.9085792557, 4.717298186373984 despite several retries and waiting\n", + "Could not download 7.878635412896016, 4.732270107775976 despite several retries and waiting\n", + "Could not download 7.872328893934022, 5.787084440111991 despite several retries and waiting\n", + "Could not download 7.919674841769999, 4.6938192515359765 despite several retries and waiting\n", + "Could not download 7.916264688568008, 4.689968792436016 despite several retries and waiting\n", + "Could not download 7.916264688568008, 4.764828399445976 despite several retries and waiting\n", + "Could not download 8.301023658063984, 4.233550498574024 despite several retries and waiting\n", + "Could not download 8.445723187251993, 4.603914315263984 despite several retries and waiting\n", + "Could not download 8.398237999484023, 5.033339678128008 despite several retries and waiting\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "ERROR:root:Error-could not download 8.445122201819999, 10.5898676009\n", + "Traceback (most recent call last):\n", + " File \"\", line 46, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "ERROR:root:Error-could not download 8.430150280418006, 10.604839522301992\n", + "Traceback (most recent call last):\n", + " File \"\", line 46, in download_images\n", + " im = imd.download_image(lat, lon, min_year, min_month, max_year, max_month)\n", + " File \"gdrive/MyDrive/geo/utils/planet_downloader.py\", line 95, in download_image\n", + " res = json.loads(result.text)\n", + " File \"/usr/lib/python3.7/json/__init__.py\", line 348, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 337, in decode\n", + " obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n", + " File \"/usr/lib/python3.7/json/decoder.py\", line 355, in raw_decode\n", + " raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n", + "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Could not download 8.442183483694023, 4.600277017325976 despite several retries and waiting\n", + "Could not download 8.449753561004023, 4.592374400183984 despite several retries and waiting\n", + "Could not download 8.449753561004023, 4.607346321585976 despite several retries and waiting\n", + "Could not download 9.167971645683984, 8.795682521465977 despite several retries and waiting\n", + "Could not download 9.182943567085976, 8.795682521465977 despite several retries and waiting\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xVOodZH2iqTZ" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/predicting-poverty-education-replication/scripts/feature_extract.ipynb b/predicting-poverty-education-replication/scripts/feature_extract.ipynb new file mode 100644 index 0000000..5878a9d --- /dev/null +++ b/predicting-poverty-education-replication/scripts/feature_extract.ipynb @@ -0,0 +1,744 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the images marked as valid per cluster, we pass them through the CNN and extract their feature vectors. the results are stored at a per-country basis. For example, all Malawi feature extractions will go into results/malawi_2016/cnn." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil\n", + "import numpy as np\n", + "import pandas as pd\n", + "from tqdm.notebook import tqdm\n", + "import pickle\n", + "\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "import numpy as np\n", + "import torchvision\n", + "from torchvision import datasets, models, transforms\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import copy" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "PROCESSED_DIR = os.path.join(BASE_DIR, 'data', 'processed')\n", + "RESULTS_DIR = os.path.join(BASE_DIR, 'results')\n", + "CNN_TRAIN_IMAGE_DIR = os.path.join(BASE_DIR, 'data', 'cnn_images')\n", + "CNN_DIR = os.path.join(BASE_DIR, 'models', 'trained_model.pt')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(RESULTS_DIR, exist_ok=True)\n", + "for country in ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']:\n", + " os.makedirs(os.path.join(RESULTS_DIR, country), exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Feature extract with CNN\n", + "If you have run this step before, you can skip it and run the commented out code in the next section to quick-start." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df_images = pd.read_csv(os.path.join(PROCESSED_DIR, 'image_download_actual.csv'))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_binis_train
04.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng1True
14.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng1True
24.285842272936016_6.238809056956016_4.31578611...4.2858426.2388094.3157866.2687534.3177170.123354ng1True
34.270870351534024_6.253780978358008_4.31578611...4.2708706.2537814.3157866.2687534.3177170.123354ng1True
44.345729958543984_6.253780978358008_4.31578611...4.3457306.2537814.3157866.2687534.3177170.123354ng1True
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 4.31578611574_6.223837135554024_4.31578611574_... 4.315786 6.223837 \n", + "1 4.330758037141992_6.223837135554024_4.31578611... 4.330758 6.223837 \n", + "2 4.285842272936016_6.238809056956016_4.31578611... 4.285842 6.238809 \n", + "3 4.270870351534024_6.253780978358008_4.31578611... 4.270870 6.253781 \n", + "4 4.345729958543984_6.253780978358008_4.31578611... 4.345730 6.253781 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \\\n", + "0 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "1 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "2 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "3 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "4 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "\n", + " is_train \n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_images.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using cpu as backend\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/serialization.py:493: SourceChangeWarning: source code of class 'torch.nn.modules.container.Sequential' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n", + " warnings.warn(msg, SourceChangeWarning)\n" + ] + } + ], + "source": [ + "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + "print(f'Using {device} as backend')\n", + "model = torch.load(CNN_DIR, map_location=device)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sequential(\n", + " (0): Linear(in_features=25088, out_features=4096, bias=True)\n", + " (1): ReLU(inplace=True)\n", + " (2): Dropout(p=0.5, inplace=False)\n", + " (3): Linear(in_features=4096, out_features=4096, bias=True)\n", + " (4): ReLU(inplace=True)\n", + " (5): Dropout(p=0.5, inplace=False)\n", + " (6): Linear(in_features=4096, out_features=3, bias=True)\n", + ")" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# rip off the final layers\n", + "model.classifier = model.classifier[:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sequential(\n", + " (0): Linear(in_features=25088, out_features=4096, bias=True)\n", + " (1): ReLU(inplace=True)\n", + " (2): Dropout(p=0.5, inplace=False)\n", + " (3): Linear(in_features=4096, out_features=4096, bias=True)\n", + ")" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1712e3d5767847a9b3fef1fe5f4ab51b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/154 [00:00\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"\", line 22, in __getitem__\n X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n File \"\", line 28, in filename_to_im_tensor\n im = plt.imread(file)[:,:,:3]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/pyplot.py\", line 2407, in imread\n return matplotlib.image.imread(fname, format)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/image.py\", line 1501, in imread\n with img_open(fname) as image:\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/PIL/ImageFile.py\", line 95, in __init__\n self.fp = open(fp, \"rb\")\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/valid/0/11.965055592105976_8.717694503334023_11.9201398279_8.76261026754.png'\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mimage_order\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mdataset\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimage_list\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0;31m# forward pass for this class\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 45\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataloader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 46\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/notebook.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;31m# return super(tqdm...) will not catch exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1177\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1179\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1180\u001b[0m \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0mnext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__next__\u001b[0m \u001b[0;31m# Python 2 compatibility\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 845\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 847\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# (https://bugs.python.org/issue2651), so we work around it.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKeyErrorMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: Caught FileNotFoundError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 178, in _worker_loop\n data = fetcher.fetch(index)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in fetch\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in \n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"\", line 22, in __getitem__\n X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n File \"\", line 28, in filename_to_im_tensor\n im = plt.imread(file)[:,:,:3]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/pyplot.py\", line 2407, in imread\n return matplotlib.image.imread(fname, format)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/matplotlib/image.py\", line 1501, in imread\n with img_open(fname) as image:\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/PIL/ImageFile.py\", line 95, in __init__\n self.fp = open(fp, \"rb\")\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/valid/0/11.965055592105976_8.717694503334023_11.9201398279_8.76261026754.png'\n" + ] + } + ], + "source": [ + "transformer = transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", + " ])\n", + "\n", + "# custom dataset for fast image loading and processing\n", + "# does not follow the usual style of folder -> folder for each class -> image\n", + "# we just want one folder with images\n", + "class ForwardPassDataset(torch.utils.data.Dataset):\n", + " def __init__(self, image_dir, transformer):\n", + " self.image_dir = image_dir\n", + " self.image_list = os.listdir(self.image_dir)\n", + " self.transformer = transformer\n", + "\n", + " def __len__(self):\n", + " return len(self.image_list)\n", + "\n", + " def __getitem__(self, index):\n", + " image_name = self.image_list[index]\n", + "\n", + " # Load image\n", + " X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n", + " \n", + " # dataloaders need to return a label, but for the forward pass we don't really care\n", + " return X, -1\n", + " \n", + " def filename_to_im_tensor(self, file):\n", + " im = plt.imread(file)[:,:,:3]\n", + " im = self.transformer(im)\n", + " return im\n", + "\n", + "model.eval() \n", + "classes = [0, 1, 2]\n", + "# shape of final array will be (num_validation_images, 4096)\n", + "# we also want to record the image each index represents\n", + "feats = np.zeros(((~df_images['is_train']).sum(), 4096))\n", + "image_order = []\n", + "i = 0\n", + "for c in classes:\n", + " # use the validation images to do the forward pass\n", + " dataset = ForwardPassDataset(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid', str(c)), transformer)\n", + " dataloader = torch.utils.data.DataLoader(dataset, batch_size=8, shuffle=False, num_workers=4)\n", + " image_order += dataset.image_list\n", + " # forward pass for this class\n", + " for inputs, _ in tqdm(dataloader):\n", + " inputs = inputs.to(device)\n", + " outputs = model(inputs)\n", + " feats[i:i+len(inputs),:] = outputs.cpu().detach().numpy()\n", + " i += len(inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.26415765, -0.28140783, -0.29993755, ..., 0.33739716,\n", + " -0.96456331, -0.95310527],\n", + " [ 0.55027246, -0.06091447, 0.11403629, ..., -0.08996978,\n", + " -0.62236136, -0.96085918],\n", + " [ 0.52193987, -0.29220241, -0.45371717, ..., 0.34175205,\n", + " -1.1439786 , -0.85960728],\n", + " ...,\n", + " [-0.50936353, 0.39209121, -0.29870456, ..., 0.0661362 ,\n", + " 0.43009469, -0.34069228],\n", + " [ 0.24428365, 0.07818466, -0.89307284, ..., 0.29522306,\n", + " -0.72958505, -1.24356151],\n", + " [-0.30123377, 0.6785413 , -0.19940855, ..., 0.14395328,\n", + " 0.52420121, -1.16047859]])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "feats" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_namefeat_index
010.513181862198008_39.768191057994024_10.52815...0
1-14.632534157196016_34.981995235794024_-14.662...1
2-14.526346764205977_35.593520078598004_-14.481...2
37.4290196173360155_7.26950147266_7.45896346014...3
4-10.405547698244352_34.14279535535209_-10.4038...4
\n", + "
" + ], + "text/plain": [ + " image_name feat_index\n", + "0 10.513181862198008_39.768191057994024_10.52815... 0\n", + "1 -14.632534157196016_34.981995235794024_-14.662... 1\n", + "2 -14.526346764205977_35.593520078598004_-14.481... 2\n", + "3 7.4290196173360155_7.26950147266_7.45896346014... 3\n", + "4 -10.405547698244352_34.14279535535209_-10.4038... 4" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "forward_pass_df = pd.DataFrame.from_dict({'image_name': image_order, 'feat_index': np.arange(len(image_order))})\n", + "forward_pass_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "df_consumption = pd.merge(left=df_images, right=forward_pass_df, on='image_name')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# have we maintained all validation images?\n", + "assert len(df_consumption) == (~df_images['is_train']).sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_binis_trainfeat_index
0-17.125093842803985_35.18726915719602_-17.0951...-17.12509435.187269-17.09515035.2172131.4232390.025206mw0False318
1-17.140065764205975_35.232184921401995_-17.095...-17.14006635.232185-17.09515035.2172131.4232390.025206mw0False1861
2-17.065206157196016_35.262128764205976_-17.095...-17.06520635.262129-17.09515035.2172131.4232390.025206mw0False836
3-17.07737907859801_35.069727235794026_-17.0923...-17.07737935.069727-17.09235135.1146431.2662040.000000mw0False18
4-17.137266764205975_35.08469915719602_-17.0923...-17.13726735.084699-17.09235135.1146431.2662040.000000mw0False1051
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 -17.125093842803985_35.18726915719602_-17.0951... -17.125094 35.187269 \n", + "1 -17.140065764205975_35.232184921401995_-17.095... -17.140066 35.232185 \n", + "2 -17.065206157196016_35.262128764205976_-17.095... -17.065206 35.262129 \n", + "3 -17.07737907859801_35.069727235794026_-17.0923... -17.077379 35.069727 \n", + "4 -17.137266764205975_35.08469915719602_-17.0923... -17.137267 35.084699 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \\\n", + "0 -17.095150 35.217213 1.423239 0.025206 mw 0 \n", + "1 -17.095150 35.217213 1.423239 0.025206 mw 0 \n", + "2 -17.095150 35.217213 1.423239 0.025206 mw 0 \n", + "3 -17.092351 35.114643 1.266204 0.000000 mw 0 \n", + "4 -17.092351 35.114643 1.266204 0.000000 mw 0 \n", + "\n", + " is_train feat_index \n", + "0 False 318 \n", + "1 False 1861 \n", + "2 False 836 \n", + "3 False 18 \n", + "4 False 1051 " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_consumption.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aggregate Features\n", + "For each country, we aggregate the image features per cluster and save them to results/country/cnn" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "country_abbrv = ['mw', 'eth', 'ng']\n", + "country_dir = ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']\n", + "\n", + "for ca, cd in zip(country_abbrv, country_dir):\n", + " df_c = df_consumption[df_consumption['country'] == ca]\n", + " group = df_c.groupby(['cluster_lat', 'cluster_lon'])\n", + " x = np.zeros((len(group), 4096))\n", + " cluster_list = [] # the corresponding clusters (lat, lon) to the x aggregate feature array\n", + " for i, g in enumerate(group):\n", + " lat, lon = g[0]\n", + " im_sub = df_consumption[(df_consumption['cluster_lat'] == lat) & (df_consumption['cluster_lon'] == lon)].reset_index(drop=True)\n", + " agg_feats = np.zeros((len(im_sub), 4096))\n", + " for j, d in im_sub.iterrows():\n", + " agg_feats[j,:] = feats[d.feat_index]\n", + " agg_feats = agg_feats.mean(axis=0) # averages the features across all images in the cluster\n", + "\n", + " x[i,:] = agg_feats\n", + " cluster_list.append([lat, lon])\n", + " # save to the correct directory\n", + " save_dir = os.path.join(RESULTS_DIR, cd, 'cnn')\n", + " os.makedirs(save_dir, exist_ok=True)\n", + " np.save(os.path.join(save_dir, 'cluster_feats.npy'), x)\n", + " pickle.dump(cluster_list, open(os.path.join(save_dir, 'cluster_order.pkl'), 'wb')) \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "testenv", + "language": "python", + "name": "testenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/scripts/predict_consumption.ipynb b/predicting-poverty-education-replication/scripts/predict_consumption.ipynb new file mode 100644 index 0000000..86f8a5a --- /dev/null +++ b/predicting-poverty-education-replication/scripts/predict_consumption.ipynb @@ -0,0 +1,462 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the cluster_feats saved in each country's results folder, we will finally predict the metric of interest (consumption per capita). There are many ways to evaluate our results, I do the following:
\n", + "1) randomized CV - use 5-fold cross validation randomly on all clusters, all countries
\n", + "2) randomized CV per country - use 5-fold cross validation within a country for all countries
\n", + "3) spatial CV per country - use 5-fold cross validation but folds consist of clusters that are geographically close
\n", + "4) cross-country CV - we have three countries, so hold one country out and perform cross validation
\n", + "\n", + "Jean et al use the 2nd evaluation method. One important point: in their code, they use pearson R and square it to get R^2. The more conventional way is shown here: https://en.wikipedia.org/wiki/Coefficient_of_determination. I use the latter method, as in my experience this is standard for reporting R^2. Jean et al's method will likely lead to a higher \"R^2\" than the conventional method, and doing so prevents a negative R^2 whereas the conventional method allows that possibility." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import pickle\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "\n", + "RANDOM_SEED = 7 # for reproducibility\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "RESULTS_DIR = os.path.join(BASE_DIR, 'results')\n", + "FIGURES_DIR = os.path.join(BASE_DIR, 'figures')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(BASE_DIR)\n", + "from utils import merge_on_lat_lon, assign_groups, run_randomized_cv, run_spatial_cv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Predict Consumption" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def load_country(country):\n", + " '''\n", + " Organizes the country's dataframe so that each index corresponds to the index in the cluster features\n", + " Returns the cluster features and the organized dataframe\n", + " '''\n", + " country_processed_dir = os.path.join(COUNTRIES_DIR, country, 'processed')\n", + " country_results_dir = os.path.join(RESULTS_DIR, country, 'cnn')\n", + " x = np.load(os.path.join(country_results_dir, 'cluster_feats.npy'))\n", + " cluster_list = pickle.load(open(os.path.join(country_results_dir, 'cluster_order.pkl'), 'rb'))\n", + " cluster_list = pd.DataFrame.from_records(cluster_list, columns=['cluster_lat', 'cluster_lon'])\n", + " cluster_list['feat_index'] = np.arange(len(cluster_list))\n", + " \n", + " df_clusters = pd.read_csv(os.path.join(country_processed_dir, 'clusters.csv'))\n", + " assert len(df_clusters) == len(cluster_list)\n", + "\n", + " df = merge_on_lat_lon(df_clusters, cluster_list, keys=['cluster_lat', 'cluster_lon'])\n", + " assert len(df) == len(df_clusters) == len(cluster_list)\n", + " df.sort_values('feat_index', ascending=True, inplace=True)\n", + " return x, df" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "x_mw, df_mw = load_country('malawi_2016')\n", + "x_eth, df_eth = load_country('ethiopia_2015')\n", + "x_ng, df_ng = load_country('nigeria_2015')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "y_mw = df_mw['cons_pc'].values\n", + "y_eth = df_eth['cons_pc'].values\n", + "y_ng = df_ng['cons_pc'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def test_fully_randomized_cv():\n", + " print(\"Testing fully randomized CV:\\n--------------\\n\")\n", + " x_all = np.concatenate([x_mw, x_eth, x_ng], axis=0)\n", + " y_all = np.concatenate([y_mw, y_eth, y_ng], axis=0)\n", + " r2_direct, _ = run_randomized_cv(x_all, y_all, random_seed=RANDOM_SEED, to_print=False)\n", + " r2_log, _ = run_randomized_cv(x_all, np.log(y_all), random_seed=RANDOM_SEED)\n", + " print(f\"For fully randomized cv: direct r2: {r2_direct}, log r2: {r2_log}\")\n", + " \n", + "def test_randomized_cv_per_country():\n", + " print(\"Testing per country randomized CV:\\n--------------\\n\")\n", + " xs = [x_mw, x_eth, x_ng]\n", + " ys = [y_mw, y_eth, y_ng]\n", + " countries = ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']\n", + " for x, y, c in zip(xs, ys, countries):\n", + " r2_direct, _ = run_randomized_cv(x, y, random_seed=RANDOM_SEED, to_print=False)\n", + " r2_log, _ = run_randomized_cv(x, np.log(y), random_seed=RANDOM_SEED)\n", + " print(f\"For {c}, direct r2: {r2_direct}, log r2: {r2_log}\")\n", + " \n", + "def test_spatial_cv_per_country():\n", + " print(\"Testing per country spatial CV:\\n--------------\\n\")\n", + " xs = [x_mw, x_eth, x_ng]\n", + " ys = [y_mw, y_eth, y_ng]\n", + " dfs = [df_mw, df_eth, df_ng]\n", + " countries = ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']\n", + " for x, y, df, c in zip(xs, ys, dfs, countries):\n", + " groups, _ = assign_groups(df, k=5, random_seed=RANDOM_SEED)\n", + " r2_direct, _ = run_spatial_cv(x, y, groups, random_seed=RANDOM_SEED)\n", + " r2_log, _ = run_spatial_cv(x, np.log(y), groups, random_seed=RANDOM_SEED)\n", + " print(f\"For {c}, direct r2: {r2_direct}, log r2: {r2_log}\")\n", + " \n", + "def test_cross_country_cv():\n", + " print(\"Testing cross country CV:\\n--------------\\n\")\n", + " x_all = np.concatenate([x_mw, x_eth, x_ng], axis=0)\n", + " y_all = np.concatenate([y_mw, y_eth, y_ng], axis=0)\n", + " groups = np.zeros_like(y_all)\n", + " groups[len(y_mw) : len(y_mw) + len(y_eth)] = 1 # ethiopia indices become 1\n", + " groups[len(y_mw) + len(y_eth):] = 2 # nigeria indices become 2\n", + " r2_direct, _ = run_spatial_cv(x_all, y_all, groups, random_seed=RANDOM_SEED, k_inner=10)\n", + " r2_log, _ = run_spatial_cv(x_all, np.log(y_all), groups, random_seed=RANDOM_SEED, k_inner=10)\n", + " print(f\"For cross country cv: direct r2: {r2_direct}, log r2: {r2_log}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing fully randomized CV:\n", + "--------------\n", + "\n", + "For fully randomized cv: direct r2: 0.3026856411592201, log r2: 0.44629388573117235\n" + ] + } + ], + "source": [ + "# this concatenates all countries and runs randomized CV\n", + "test_fully_randomized_cv()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing per country randomized CV:\n", + "--------------\n", + "\n", + "For malawi_2016, direct r2: 0.2563769526470949, log r2: 0.40946728194107446\n", + "For ethiopia_2015, direct r2: 0.15408096665923968, log r2: 0.13757502459231657\n", + "For nigeria_2015, direct r2: 0.19112920163918376, log r2: 0.34070324404134966\n" + ] + } + ], + "source": [ + "# this runs randomized CV per country; this is how Jean et al report their results\n", + "# we can see that the model does perform well, although how well it performs varies greatly\n", + "# in our three countries. It is difficult to make statements about why the model \n", + "# does better in certain countries (and why predicting the log doesn't do better in ethiopia)\n", + "# without more analysis and more countries\n", + "test_randomized_cv_per_country()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing per country spatial CV:\n", + "--------------\n", + "\n", + "For malawi_2016, direct r2: -0.040709767100400904, log r2: 0.15253299922530078\n", + "For ethiopia_2015, direct r2: 0.0876498448297943, log r2: -0.01924967612917705\n", + "For nigeria_2015, direct r2: -0.19857908515776138, log r2: -0.10348441015409007\n" + ] + } + ], + "source": [ + "# spatial CV provides very inconsistent results. this indicates that the model is \n", + "# greatly advantaged in randomized CV, most likely because it can train on one cluster and \n", + "# validate on a nearby cluster. this suggests there is still more to be desired for a truly generalizable model\n", + "test_spatial_cv_per_country()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing cross country CV:\n", + "--------------\n", + "\n", + "For cross country cv: direct r2: -1.0104939224653613, log r2: -3.1636548554218886\n" + ] + } + ], + "source": [ + "# the model does not generalize if trained on two countries to predict the third\n", + "# slight tweaks to this function can show how each country faired when held out\n", + "test_cross_country_cv()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plots" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_predictions(y, yhat, r2, country, max_y=None):\n", + " if max_y is not None:\n", + " yhat = yhat[y < max_y]\n", + " y = y[y < max_y]\n", + " fig = plt.figure(figsize=(8,5))\n", + " plt.scatter(y, yhat, alpha=0.6)\n", + " plt.plot(np.unique(y), np.poly1d(np.polyfit(y, yhat, 1))(np.unique(y)), color='g')\n", + " plt.text(15.5, 7, f'r^2={round(r2, 2)}', size=12)\n", + " plt.xlabel('Actual Consumption($/day)')\n", + " plt.ylabel('Predicted Consumption($/day)')\n", + " plt.title(f'{country} Results')\n", + " return fig" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "r2, yhat_mw = run_randomized_cv(x_mw, y_mw, random_seed=RANDOM_SEED, to_print=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plot_predictions(y_mw, yhat_mw, r2, 'Malawi', max_y=20)" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "fig.savefig(os.path.join(FIGURES_DIR, 'malawi_results.png'))" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.savefig('malawi_results.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "r2, yhat_eth = run_randomized_cv(x_eth, y_eth, random_seed=RANDOM_SEED, to_print=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plot_predictions(y_eth, yhat_eth, r2, 'Ethiopia', max_y=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "fig.savefig(os.path.join(FIGURES_DIR, 'ethiopia_results.png'))" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "r2, yhat_ng = run_randomized_cv(x_ng, y_ng, random_seed=RANDOM_SEED, to_print=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plot_predictions(y_ng, yhat_ng, r2, 'Nigeria', max_y=20)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [], + "source": [ + "fig.savefig(os.path.join(FIGURES_DIR, 'nigeria_results.png'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "predicting-poverty-replication", + "language": "python", + "name": "predicting-poverty-replication" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/predicting-poverty-education-replication/scripts/process_survey_data.ipynb b/predicting-poverty-education-replication/scripts/process_survey_data.ipynb new file mode 100644 index 0000000..242dd2a --- /dev/null +++ b/predicting-poverty-education-replication/scripts/process_survey_data.ipynb @@ -0,0 +1,1283 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "colab": { + "name": "process_survey_data.ipynb", + "provenance": [], + "collapsed_sections": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "QluoD5EBbpfs" + }, + "source": [ + "Make sure you download the 2016 Household LSMS survey data for Malawi, Ethiopia, and Nigeria from https://microdata.worldbank.org/index.php/catalog/lsms and put it in `../data/countries/`. Malawi's data should be named `malawi_2016/LSMS`, Ethiopia's should be named `ethiopia_2015/LSMS`, and Nigeria's should be named `nigeria_2015/LSMS`. Nightlights data should be downloaded from https://ngdc.noaa.gov/eog/viirs/download_dnb_composites.html using the annual composite from 2015 in tile 2 and tile 5." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Tmzdkl_Qbs5T", + "outputId": "b56bde99-06e3-4428-fb82-2ea94d627415" + }, + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Mounted at /content/gdrive\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "u7P0Nfidb4Nk", + "outputId": "bda6ae71-94a4-4a1a-8e2c-5299ff88fd83" + }, + "source": [ + "!pip install geoio" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting geoio\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/4b/26/2647daf5ef5cfb9327abb2709024810cd9b1916f7b334eee33fb81af9073/geoio-1.3.0-py3-none-any.whl (60kB)\n", + "\u001b[K |████████████████████████████████| 61kB 2.3MB/s \n", + "\u001b[?25hRequirement already satisfied: gdal in /usr/local/lib/python3.7/dist-packages (from geoio) (2.2.2)\n", + "Collecting tinytools\n", + " Downloading https://files.pythonhosted.org/packages/c3/e6/e335406a22be352c8b680ed5d4d28937ac911dbda9756625006e502bf787/tinytools-1.1.0-py3-none-any.whl\n", + "Requirement already satisfied: ephem in /usr/local/lib/python3.7/dist-packages (from geoio) (3.7.7.1)\n", + "Collecting tzwhere\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/3d/e9/18e4822f6e4640332b97c744378da427bc28d2399235520349bb17e06aa4/tzwhere-3.0.3.tar.gz (23.7MB)\n", + "\u001b[K |████████████████████████████████| 23.7MB 77.2MB/s \n", + "\u001b[?25hRequirement already satisfied: plotly in /usr/local/lib/python3.7/dist-packages (from geoio) (4.4.1)\n", + "Collecting xmltodict\n", + " Downloading https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl\n", + "Requirement already satisfied: pytz in /usr/local/lib/python3.7/dist-packages (from geoio) (2018.9)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from geoio) (1.19.5)\n", + "Requirement already satisfied: shapely in /usr/local/lib/python3.7/dist-packages (from tzwhere->geoio) (1.7.1)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from plotly->geoio) (1.15.0)\n", + "Requirement already satisfied: retrying>=1.3.3 in /usr/local/lib/python3.7/dist-packages (from plotly->geoio) (1.3.3)\n", + "Building wheels for collected packages: tzwhere\n", + " Building wheel for tzwhere (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for tzwhere: filename=tzwhere-3.0.3-cp37-none-any.whl size=23742602 sha256=63f1d0c4f692cdd75dddfdc4be8ae4685fe39ab26b8b374316052dc096d42839\n", + " Stored in directory: /root/.cache/pip/wheels/89/18/2f/01c958c82b1223d6fe763c6b2fadf45b4f6ce6e8a9fce7bbd5\n", + "Successfully built tzwhere\n", + "Installing collected packages: tinytools, tzwhere, xmltodict, geoio\n", + "Successfully installed geoio-1.3.0 tinytools-1.1.0 tzwhere-3.0.3 xmltodict-0.12.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "s_AAVuW-bpfw" + }, + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "import geoio" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "09AsPn0Ubpfy" + }, + "source": [ + "BASE_DIR = 'gdrive/MyDrive/geo'\n", + "NIGHTLIGHTS_DIRS = [os.path.join(BASE_DIR, 'data/nightlights/viirs_2015_00N060W.tif'),\n", + " os.path.join(BASE_DIR, 'data/nightlights/viirs_2015_75N060W.tif')]\n", + "\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "q6bYA-O7bpfy" + }, + "source": [ + "import sys\n", + "sys.path.append(BASE_DIR)\n", + "from utils import create_space" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "qnNhORkUbpfz" + }, + "source": [ + "'''\n", + "The goal of each of these functions is to output a dataframe with the following columns:\n", + "country, cluster_lat, cluster_lon, cons_pc\n", + "\n", + "Each row should represent one cluster by combining the household data\n", + "'''\n", + "\n", + "def process_malawi():\n", + " lsms_dir = os.path.join(COUNTRIES_DIR, 'malawi_2016', 'LSMS')\n", + " consumption_file = 'IHS4 Consumption Aggregate.csv'\n", + " consumption_ph_col = 'rexpagg' # per household\n", + " hhsize_col = 'hhsize' # people in household\n", + "\n", + " geovariables_file = 'HouseholdGeovariables_csv/HouseholdGeovariablesIHS4.csv'\n", + " lat_col = 'lat_modified'\n", + " lon_col = 'lon_modified'\n", + "\n", + " # purchasing power parity for malawi in 2016 (https://data.worldbank.org/indicator/PA.NUS.PRVT.PP?locations=MW)\n", + " ppp = 215.182\n", + " \n", + " for file in [consumption_file, geovariables_file]:\n", + " assert os.path.isfile(os.path.join(lsms_dir, file)), print(f'Could not find {file}')\n", + " \n", + " df = pd.read_csv(os.path.join(lsms_dir, consumption_file))\n", + " df['cons_ph'] = df[consumption_ph_col]\n", + " df['pph'] = df[hhsize_col]\n", + " df['cons_ph'] = df['cons_ph'] / ppp / 365\n", + " df = df[['case_id', 'cons_ph', 'pph']]\n", + "\n", + " df_geo = pd.read_csv(os.path.join(lsms_dir, geovariables_file))\n", + " df_cords = df_geo[['case_id', 'HHID', lat_col, lon_col]]\n", + " df_cords.rename(columns={lat_col: 'cluster_lat', lon_col: 'cluster_lon'}, inplace=True)\n", + " df_combined = pd.merge(df, df_cords, on='case_id')\n", + " df_combined.drop(['case_id', 'HHID'], axis=1, inplace=True)\n", + " df_combined.dropna(inplace=True) # can't use na values\n", + " \n", + " df_clusters = df_combined.groupby(['cluster_lat', 'cluster_lon']).sum().reset_index()\n", + " df_clusters['cons_pc'] = df_clusters['cons_ph'] / df_clusters['pph'] # divides total cluster income by people\n", + " df_clusters['country'] = 'mw'\n", + " return df_clusters[['country', 'cluster_lat', 'cluster_lon', 'cons_pc']]\n", + "\n", + "def process_ethiopia():\n", + " lsms_dir = os.path.join(COUNTRIES_DIR, 'ethiopia_2015', 'LSMS')\n", + " consumption_file = 'Consumption Aggregate/cons_agg_w3.csv'\n", + " consumption_pc_col = 'total_cons_ann' # per capita\n", + " hhsize_col = 'hh_size' # people in household\n", + "\n", + " geovariables_file = 'ETH_2015_ESS_v03_M_CSV/Geovariables/ETH_HouseholdGeovars_y3.csv'\n", + " lat_col = 'lat_dd_mod'\n", + " lon_col = 'lon_dd_mod'\n", + "\n", + " # purchasing power parity for ethiopia in 2015 (https://data.worldbank.org/indicator/PA.NUS.PRVT.PP?locations=ET)\n", + " ppp = 7.882\n", + " \n", + " for file in [consumption_file, geovariables_file]:\n", + " assert os.path.isfile(os.path.join(lsms_dir, file)), print(f'Could not find {file}')\n", + " \n", + " df = pd.read_csv(os.path.join(lsms_dir, consumption_file))\n", + " df['cons_ph'] = df[consumption_pc_col] * df[hhsize_col]\n", + " df['pph'] = df[hhsize_col]\n", + " df['cons_ph'] = df['cons_ph'] / ppp / 365\n", + " df = df[['household_id2', 'cons_ph', 'pph']]\n", + "\n", + " df_geo = pd.read_csv(os.path.join(lsms_dir, geovariables_file)\n", + " df_cords = df_geo[['household_id2', lat_col, lon_col]]\n", + " df_cords.rename(columns={lat_col: 'cluster_lat', lon_col: 'cluster_lon'}, inplace=True)\n", + " df_combined = pd.merge(df, df_cords, on='household_id2')\n", + " df_combined.drop(['household_id2'], axis=1, inplace=True)\n", + " df_combined.dropna(inplace=True) # can't use na values\n", + " \n", + " df_clusters = df_combined.groupby(['cluster_lat', 'cluster_lon']).sum().reset_index()\n", + " df_clusters['cons_pc'] = df_clusters['cons_ph'] / df_clusters['pph'] # divides total cluster income by people\n", + " df_clusters['country'] = 'eth'\n", + " return df_clusters[['country', 'cluster_lat', 'cluster_lon', 'cons_pc']]\n", + "\n", + "def process_nigeria():\n", + " lsms_dir = os.path.join(COUNTRIES_DIR, 'nigeria_2015', 'LSMS')\n", + " consumption_file = 'cons_agg_wave3_visit1.csv'\n", + " consumption_pc_col = 'totcons' # per capita\n", + " hhsize_col = 'hhsize' # people in household\n", + "\n", + " geovariables_file = 'nga_householdgeovars_y3.csv'\n", + " lat_col = 'LAT_DD_MOD'\n", + " lon_col = 'LON_DD_MOD'\n", + "\n", + " # purchasing power parity for nigeria in 2015 (https://data.worldbank.org/indicator/PA.NUS.PRVT.PP?locations=NG)\n", + " ppp = 95.255\n", + " \n", + " for file in [consumption_file, geovariables_file]:\n", + " assert os.path.isfile(os.path.join(lsms_dir, file)), print(f'Could not find {file}')\n", + " \n", + " df = pd.read_csv(os.path.join(lsms_dir, consumption_file))\n", + " df['cons_ph'] = df[consumption_pc_col] * df[hhsize_col]\n", + " df['pph'] = df[hhsize_col]\n", + " df['cons_ph'] = df['cons_ph'] / ppp / 365\n", + " df = df[['hhid', 'cons_ph', 'pph']]\n", + "\n", + " df_geo = pd.read_csv(os.path.join(lsms_dir, geovariables_file))\n", + " df_cords = df_geo[['hhid', lat_col, lon_col]]\n", + " df_cords.rename(columns={lat_col: 'cluster_lat', lon_col: 'cluster_lon'}, inplace=True)\n", + " df_combined = pd.merge(df, df_cords, on='hhid')\n", + " df_combined.drop(['hhid'], axis=1, inplace=True)\n", + " df_combined.dropna(inplace=True) # can't use na values\n", + " \n", + " df_clusters = df_combined.groupby(['cluster_lat', 'cluster_lon']).sum().reset_index()\n", + " df_clusters['cons_pc'] = df_clusters['cons_ph'] / df_clusters['pph'] # divides total cluster income by people\n", + " df_clusters['country'] = 'ng'\n", + " return df_clusters[['country', 'cluster_lat', 'cluster_lon', 'cons_pc']]" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SnENheh-bpgA", + "outputId": "0fb9e549-ff70-4e85-a63a-0f1bf724355d" + }, + "source": [ + "df_mw = process_malawi()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py:4308: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YLPmDweFbpgg", + "outputId": "61022e01-56cc-4dcc-bb80-5e9d830a2600" + }, + "source": [ + "df_eth = process_ethiopia()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py:4308: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BYqikODMbpgh", + "outputId": "7165dacd-b00e-474a-884f-e815cbdcbf7d" + }, + "source": [ + "df_ng = process_nigeria()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py:4308: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "z_0vdo9Sbpgj", + "outputId": "14120956-919e-4848-fdff-b92ef129e2c5" + }, + "source": [ + "df_mw.shape, df_eth.shape, df_ng.shape" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "((780, 4), (523, 4), (664, 4))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "5shtFwIEbpgm" + }, + "source": [ + "tifs = [geoio.GeoImage(ndir) for ndir in NIGHTLIGHTS_DIRS]" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "uqhnSwr1bpgo" + }, + "source": [ + "# loading both of these into memory requires A LOT of free memory (at least 4 gigs)\n", + "# using a swapfile of size 2 GB still did not fix my issues\n", + "# instead, I knew ahead of time the 0th tif is for Malawi, and the 1st tif is for Ethiopia and Nigeria\n", + "# I'll use this to only load one tif at a time\n", + "# thankfully, the countries did not span across two tifs\n", + "tif_array = np.squeeze(tifs[0].get_data())" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "C1Xqn-iKbpgo" + }, + "source": [ + "def add_nightlights(df, tif, tif_array):\n", + " ''' \n", + " This takes a dataframe with columns cluster_lat, cluster_lon and finds the average \n", + " nightlights in 2015 using a 10kmx10km box around the point\n", + " \n", + " I try all the nighlights tifs until a match is found, or none are left upon which an error is raised\n", + " '''\n", + " cluster_nightlights = []\n", + " for i,r in df.iterrows():\n", + " min_lat, min_lon, max_lat, max_lon = create_space(r.cluster_lat, r.cluster_lon)\n", + " \n", + " xminPixel, ymaxPixel = tif.proj_to_raster(min_lon, min_lat)\n", + " xmaxPixel, yminPixel = tif.proj_to_raster(max_lon, max_lat)\n", + " assert xminPixel < xmaxPixel, print(r.cluster_lat, r.cluster_lon)\n", + " assert yminPixel < ymaxPixel, print(r.cluster_lat, r.cluster_lon)\n", + " if xminPixel < 0 or xmaxPixel >= tif_array.shape[1]:\n", + " print(f\"no match for {r.cluster_lat}, {r.cluster_lon}\")\n", + " raise ValueError()\n", + " elif yminPixel < 0 or ymaxPixel >= tif_array.shape[0]:\n", + " print(f\"no match for {r.cluster_lat}, {r.cluster_lon}\")\n", + " raise ValueError()\n", + " xminPixel, yminPixel, xmaxPixel, ymaxPixel = int(xminPixel), int(yminPixel), int(xmaxPixel), int(ymaxPixel)\n", + " cluster_nightlights.append(tif_array[yminPixel:ymaxPixel,xminPixel:xmaxPixel].mean())\n", + " \n", + " df['nightlights'] = cluster_nightlights" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "llBn6PwlbphG" + }, + "source": [ + "add_nightlights(df_mw, tifs[0], tif_array)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rjw2-jPpbphK", + "outputId": "1aa3db94-f477-4bb9-c615-2bef35fb1c2e" + }, + "source": [ + "del tif_array\n", + "import gc\n", + "gc.collect()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "795" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-WlyCWQxbphS", + "outputId": "f62fd991-e5b6-4bed-9528-7890db4afeca" + }, + "source": [ + "import psutil\n", + "psutil.virtual_memory()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "svmem(total=13624659968, available=11927236608, percent=12.5, used=5066326016, free=247844864, active=1919000576, inactive=11074854912, buffers=100814848, cached=8209674240, shared=1175552, slab=318877696)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 25 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "_24EvyZibphT" + }, + "source": [ + "tif_array = np.squeeze(tifs[1].get_data())" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "YDxv2jnvbphT" + }, + "source": [ + "add_nightlights(df_eth, tifs[1], tif_array)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RiY3p31cbphU" + }, + "source": [ + "add_nightlights(df_ng, tifs[1], tif_array)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "id": "-iYX9cuMbphU", + "outputId": "6534303a-bb14-4366-9f39-9f432e04834e" + }, + "source": [ + "df_mw.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countrycluster_latcluster_loncons_pcnightlights
0mw-17.09515035.2172131.4232390.025206
1mw-17.09235135.1146431.2662040.000000
2mw-17.01669835.0796291.5668700.000000
3mw-16.97724335.2057061.6692450.008266
4mw-16.95638535.1689671.0898910.002295
\n", + "
" + ], + "text/plain": [ + " country cluster_lat cluster_lon cons_pc nightlights\n", + "0 mw -17.095150 35.217213 1.423239 0.025206\n", + "1 mw -17.092351 35.114643 1.266204 0.000000\n", + "2 mw -17.016698 35.079629 1.566870 0.000000\n", + "3 mw -16.977243 35.205706 1.669245 0.008266\n", + "4 mw -16.956385 35.168967 1.089891 0.002295" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "id": "u6DQZKTPbphX", + "outputId": "d48983ef-b560-45c5-d5f6-7ec1b38c01a5" + }, + "source": [ + "df_eth.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countrycluster_latcluster_loncons_pcnightlights
0eth3.45570139.51599414.8546340.0
1eth3.54993739.18423414.3120220.0
2eth3.86424339.10136612.4701450.0
3eth3.98293138.4913688.3365390.0
4eth4.04819441.9309284.7625260.0
\n", + "
" + ], + "text/plain": [ + " country cluster_lat cluster_lon cons_pc nightlights\n", + "0 eth 3.455701 39.515994 14.854634 0.0\n", + "1 eth 3.549937 39.184234 14.312022 0.0\n", + "2 eth 3.864243 39.101366 12.470145 0.0\n", + "3 eth 3.982931 38.491368 8.336539 0.0\n", + "4 eth 4.048194 41.930928 4.762526 0.0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 31 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "id": "wVlRj71GbphY", + "outputId": "c5203111-bd2b-4f55-9f07-f37b74bb01e9" + }, + "source": [ + "df_ng.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countrycluster_latcluster_loncons_pcnightlights
0ng4.3157866.2687534.3177170.123354
1ng4.3287196.3081724.8807110.013713
2ng4.3984277.1839628.76725838.470989
3ng4.4251927.16693510.77450440.519035
4ng4.6193777.6849465.1913330.000000
\n", + "
" + ], + "text/plain": [ + " country cluster_lat cluster_lon cons_pc nightlights\n", + "0 ng 4.315786 6.268753 4.317717 0.123354\n", + "1 ng 4.328719 6.308172 4.880711 0.013713\n", + "2 ng 4.398427 7.183962 8.767258 38.470989\n", + "3 ng 4.425192 7.166935 10.774504 40.519035\n", + "4 ng 4.619377 7.684946 5.191333 0.000000" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 32 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "guLp-gR3bphY", + "outputId": "da603f30-583d-44b0-fa9f-fb5e4f2f706d" + }, + "source": [ + "df_mw['nightlights'].mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.6038162894313969" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PbA7va6CbphZ", + "outputId": "71adfd2f-af0f-4b7e-e9c7-6e85c3d55d4a" + }, + "source": [ + "df_eth['nightlights'].mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.6727544504689029" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 34 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RRltkzEfbphZ", + "outputId": "212ed948-2b2d-4d0d-9a10-8accd1cff0ac" + }, + "source": [ + "df_ng['nightlights'].mean()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1.6584013095848769" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 35 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "id": "hlTR1aPEbpha", + "outputId": "7af5b849-bd5b-4b2c-f6f1-9e6e8205e85d" + }, + "source": [ + "df_mw.corr()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cluster_latcluster_loncons_pcnightlights
cluster_lat1.000000-0.702793-0.026563-0.083273
cluster_lon-0.7027931.000000-0.002947-0.033367
cons_pc-0.026563-0.0029471.0000000.384939
nightlights-0.083273-0.0333670.3849391.000000
\n", + "
" + ], + "text/plain": [ + " cluster_lat cluster_lon cons_pc nightlights\n", + "cluster_lat 1.000000 -0.702793 -0.026563 -0.083273\n", + "cluster_lon -0.702793 1.000000 -0.002947 -0.033367\n", + "cons_pc -0.026563 -0.002947 1.000000 0.384939\n", + "nightlights -0.083273 -0.033367 0.384939 1.000000" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 36 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "id": "RRgNzLNcbpha", + "outputId": "9083ad1e-0b07-4b8b-deab-1dba6b1b8437" + }, + "source": [ + "df_eth.corr()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cluster_latcluster_loncons_pcnightlights
cluster_lat1.0000000.157130-0.052673-0.006627
cluster_lon0.1571301.0000000.2118460.076039
cons_pc-0.0526730.2118461.0000000.343879
nightlights-0.0066270.0760390.3438791.000000
\n", + "
" + ], + "text/plain": [ + " cluster_lat cluster_lon cons_pc nightlights\n", + "cluster_lat 1.000000 0.157130 -0.052673 -0.006627\n", + "cluster_lon 0.157130 1.000000 0.211846 0.076039\n", + "cons_pc -0.052673 0.211846 1.000000 0.343879\n", + "nightlights -0.006627 0.076039 0.343879 1.000000" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 37 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "id": "uMgDYNdebpha", + "outputId": "d6ae08c0-5912-40e4-e56f-d24b951732ca" + }, + "source": [ + "df_ng.corr()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cluster_latcluster_loncons_pcnightlights
cluster_lat1.0000000.330910-0.376356-0.188281
cluster_lon0.3309101.000000-0.246189-0.196671
cons_pc-0.376356-0.2461891.0000000.264398
nightlights-0.188281-0.1966710.2643981.000000
\n", + "
" + ], + "text/plain": [ + " cluster_lat cluster_lon cons_pc nightlights\n", + "cluster_lat 1.000000 0.330910 -0.376356 -0.188281\n", + "cluster_lon 0.330910 1.000000 -0.246189 -0.196671\n", + "cons_pc -0.376356 -0.246189 1.000000 0.264398\n", + "nightlights -0.188281 -0.196671 0.264398 1.000000" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 39 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aVWtjMbhbphb" + }, + "source": [ + "for country in ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']:\n", + " os.makedirs(os.path.join(COUNTRIES_DIR, country, 'processed'), exist_ok=True)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fTsVoPIKbphb" + }, + "source": [ + "df_mw.to_csv(os.path.join(COUNTRIES_DIR, 'malawi_2016', 'processed/clusters.csv'), index=False)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "nbMXdSBRbphb" + }, + "source": [ + "df_eth.to_csv(os.path.join(COUNTRIES_DIR, 'ethiopia_2015', 'processed/clusters.csv'), index=False)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "T4CO_MvHbphb" + }, + "source": [ + "df_ng.to_csv(os.path.join(COUNTRIES_DIR, 'nigeria_2015', 'processed/clusters.csv'), index=False)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "AzQAGdaObphb" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/predicting-poverty-education-replication/scripts/train_cnn.ipynb b/predicting-poverty-education-replication/scripts/train_cnn.ipynb new file mode 100644 index 0000000..c87e48d --- /dev/null +++ b/predicting-poverty-education-replication/scripts/train_cnn.ipynb @@ -0,0 +1,1190 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil\n", + "import numpy as np\n", + "import pandas as pd\n", + "from tqdm.notebook import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "RANDOM_SEED = 7 # for reproducibility\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "PROCESSED_DIR = os.path.join(BASE_DIR, 'data', 'processed')\n", + "\n", + "# these relate to training the CNN to predict nightlights\n", + "CNN_TRAIN_IMAGE_DIR = os.path.join(BASE_DIR, 'data', 'cnn_images')\n", + "CNN_SAVE_DIR = os.path.join(BASE_DIR, 'models')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(CNN_TRAIN_IMAGE_DIR, exist_ok=True)\n", + "os.makedirs(CNN_SAVE_DIR, exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Preprocess\n", + "After doing this once, you can skip to the training if the script broke" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "actually downloaded: 25246, expected: 14500\n" + ] + } + ], + "source": [ + "df_download = pd.read_csv(os.path.join(PROCESSED_DIR, 'image_download_locs.csv'))\n", + "downloaded = os.listdir(os.path.join(COUNTRIES_DIR, 'malawi_2016', 'images')) + \\\n", + " os.listdir(os.path.join(COUNTRIES_DIR, 'ethiopia_2015', 'images')) + \\\n", + " os.listdir(os.path.join(COUNTRIES_DIR, 'nigeria_2015', 'images'))\n", + "\n", + "print(f\"actually downloaded: {len(downloaded)}, expected: {len(df_download)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_bin
04.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng1
14.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng1
24.285842272936016_6.238809056956016_4.31578611...4.2858426.2388094.3157866.2687534.3177170.123354ng1
34.270870351534024_6.253780978358008_4.31578611...4.2708706.2537814.3157866.2687534.3177170.123354ng1
44.345729958543984_6.253780978358008_4.31578611...4.3457306.2537814.3157866.2687534.3177170.123354ng1
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 4.31578611574_6.223837135554024_4.31578611574_... 4.315786 6.223837 \n", + "1 4.330758037141992_6.223837135554024_4.31578611... 4.330758 6.223837 \n", + "2 4.285842272936016_6.238809056956016_4.31578611... 4.285842 6.238809 \n", + "3 4.270870351534024_6.253780978358008_4.31578611... 4.270870 6.253781 \n", + "4 4.345729958543984_6.253780978358008_4.31578611... 4.345730 6.253781 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \n", + "0 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "1 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "2 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "3 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "4 4.315786 6.268753 4.317717 0.123354 ng 1 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_download.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df_download['row'] = np.arange(len(df_download))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "\"['-13.642146764205977_34.846897078598005_-13.597231_34.861869.png'\\n '-15.84688_35.071951921402_-15.84688_35.05698.png'\\n '-11.884834921401993_34.132379_-11.869863_34.132379.png' ...\\n '-11.305565235794024_33.48830884280398_-11.350481_33.458365.png'\\n '.DS_Store' '.DS_Store'] not found in axis\"", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0midx_not_download\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_download\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'image_name'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdownloaded\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'row'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mdf_download\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0midx_not_download\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36mdrop\u001b[0;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[1;32m 4313\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4314\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minplace\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4315\u001b[0;31m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4316\u001b[0m )\n\u001b[1;32m 4317\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mdrop\u001b[0;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[1;32m 4151\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4152\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4153\u001b[0;31m \u001b[0mobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_drop_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4154\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4155\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m_drop_axis\u001b[0;34m(self, labels, axis, level, errors)\u001b[0m\n\u001b[1;32m 4186\u001b[0m \u001b[0mnew_axis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4187\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4188\u001b[0;31m \u001b[0mnew_axis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4189\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0maxis_name\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnew_axis\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mdrop\u001b[0;34m(self, labels, errors)\u001b[0m\n\u001b[1;32m 5589\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5590\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0merrors\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m\"ignore\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5591\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{labels[mask]} not found in axis\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5592\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mmask\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5593\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: \"['-13.642146764205977_34.846897078598005_-13.597231_34.861869.png'\\n '-15.84688_35.071951921402_-15.84688_35.05698.png'\\n '-11.884834921401993_34.132379_-11.869863_34.132379.png' ...\\n '-11.305565235794024_33.48830884280398_-11.350481_33.458365.png'\\n '.DS_Store' '.DS_Store'] not found in axis\"" + ] + } + ], + "source": [ + "idx_not_download = df_download.set_index('image_name').drop(downloaded)['row'].values.tolist()\n", + "df_download.drop(idx_not_download, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "df_download.drop('row', axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.41379310344827586, 0.3586206896551724, 0.22758620689655173)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# the distribution\n", + "(df_download['nightlights_bin']==0).mean(), (df_download['nightlights_bin']==1).mean(), (df_download['nightlights_bin']==2).mean()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Split images into train/valid.\n", + "Each cluster will contribute 80% of images for training, and 20% for validation." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "df_download.reset_index(drop=True, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameimage_latimage_loncluster_latcluster_loncons_pcnightlightscountrynightlights_bin
04.31578611574_6.223837135554024_4.31578611574_...4.3157866.2238374.3157866.2687534.3177170.123354ng1
14.330758037141992_6.223837135554024_4.31578611...4.3307586.2238374.3157866.2687534.3177170.123354ng1
24.285842272936016_6.238809056956016_4.31578611...4.2858426.2388094.3157866.2687534.3177170.123354ng1
34.270870351534024_6.253780978358008_4.31578611...4.2708706.2537814.3157866.2687534.3177170.123354ng1
44.345729958543984_6.253780978358008_4.31578611...4.3457306.2537814.3157866.2687534.3177170.123354ng1
\n", + "
" + ], + "text/plain": [ + " image_name image_lat image_lon \\\n", + "0 4.31578611574_6.223837135554024_4.31578611574_... 4.315786 6.223837 \n", + "1 4.330758037141992_6.223837135554024_4.31578611... 4.330758 6.223837 \n", + "2 4.285842272936016_6.238809056956016_4.31578611... 4.285842 6.238809 \n", + "3 4.270870351534024_6.253780978358008_4.31578611... 4.270870 6.253781 \n", + "4 4.345729958543984_6.253780978358008_4.31578611... 4.345730 6.253781 \n", + "\n", + " cluster_lat cluster_lon cons_pc nightlights country nightlights_bin \n", + "0 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "1 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "2 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "3 4.315786 6.268753 4.317717 0.123354 ng 1 \n", + "4 4.315786 6.268753 4.317717 0.123354 ng 1 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_download.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "df_download['is_train'] = True" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/pandas/core/indexing.py:1637: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " self._setitem_single_block(indexer, value, name)\n" + ] + } + ], + "source": [ + "np.random.seed(RANDOM_SEED)\n", + "groups = df_download.groupby(['cluster_lat', 'cluster_lon'])\n", + "for _, g in groups:\n", + " n_ims = len(g)\n", + " n_train = int(0.8 * n_ims)\n", + " n_valid = n_ims - n_train\n", + " valid_choices = np.random.choice(np.arange(n_ims), replace=False, size=n_valid).tolist()\n", + " current_index = g.index\n", + " idx_valid = current_index[valid_choices]\n", + " df_download['is_train'].loc[idx_valid] = False" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7978620689655173" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_download['is_train'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# save this new dataframe\n", + "df_download.to_csv(os.path.join(PROCESSED_DIR, 'image_download_actual.csv'), index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'train'), exist_ok=False)\n", + "os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid'), exist_ok=False)\n", + "\n", + "labels = ['0', '1', '2']\n", + "for l in labels:\n", + " os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'train', l), exist_ok=False)\n", + " os.makedirs(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid', l), exist_ok=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "t = df_download[df_download['is_train']]\n", + "v = df_download[~df_download['is_train']]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(11569, 2931)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(t), len(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "copying train images\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c73db387267d48fc8812f72932669dda", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/11569 [00:00 10:\n", + " # fine tune whole model\n", + " for param in model_ft.parameters():\n", + " param.requires_grad = True\n", + " optimizer = optim.SGD(model_ft.parameters(), lr=1e-4, momentum=0.9)\n", + "\n", + " # Each epoch has a training and validation phase\n", + " for phase in ['train', 'valid']:\n", + " if phase == 'train':\n", + " model.train() # Set model to training mode\n", + " else:\n", + " model.eval() # Set model to evaluate mode\n", + "\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + "\n", + " # Iterate over data.\n", + " for inputs, labels in tqdm(dataloaders[phase]):\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # forward\n", + " # track history if only in train\n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, labels)\n", + "\n", + " _, preds = torch.max(outputs, 1)\n", + "\n", + " # backward + optimize only if in training phase\n", + " if phase == 'train':\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " # statistics\n", + " running_loss += loss.item() * inputs.size(0)\n", + " running_corrects += torch.sum(preds == labels.data)\n", + "\n", + " epoch_loss = running_loss / len(dataloaders[phase].dataset)\n", + " epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)\n", + "\n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + "\n", + " # deep copy the model\n", + " if phase == 'valid' and epoch_acc > best_acc:\n", + " best_acc = epoch_acc\n", + " best_model_wts = copy.deepcopy(model.state_dict())\n", + " if phase == 'valid':\n", + " val_acc_history.append(epoch_acc)\n", + " \n", + " print()\n", + "\n", + " time_elapsed = time.time() - since\n", + " print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))\n", + " print('Best val Acc: {:4f}'.format(best_acc))\n", + "\n", + " # load best model weights\n", + " model.load_state_dict(best_model_wts)\n", + " return model, val_acc_history" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0/19\n", + "----------\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "98513fb13ff84100b70ad72b4ebc3a18", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1447 [00:00\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/1/5.577058854163986_5.771977164594023_5.547115011360002_5.8168929288.png'\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Train and evaluate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, dataloaders, criterion, optimizer, num_epochs)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;31m# Iterate over data.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataloaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mphase\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 30\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/notebook.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;31m# return super(tqdm...) will not catch exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1177\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1179\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1180\u001b[0m \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0mnext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__next__\u001b[0m \u001b[0;31m# Python 2 compatibility\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 845\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 847\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# (https://bugs.python.org/issue2651), so we work around it.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKeyErrorMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: Caught FileNotFoundError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 178, in _worker_loop\n data = fetcher.fetch(index)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in fetch\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in \n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/1/5.577058854163986_5.771977164594023_5.547115011360002_5.8168929288.png'\n" + ] + } + ], + "source": [ + "# Setup the loss fxn\n", + "criterion = nn.CrossEntropyLoss()\n", + "\n", + "# Train and evaluate\n", + "model_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A model is already saved at this location\n" + ] + }, + { + "ename": "AssertionError", + "evalue": "None", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCNN_SAVE_DIR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'trained_model.pt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'A model is already saved at this location'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Saving model to {path}'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAssertionError\u001b[0m: None" + ] + } + ], + "source": [ + "path = os.path.join(CNN_SAVE_DIR, 'trained_model.pt')\n", + "assert not os.path.isfile(path), print('A model is already saved at this location')\n", + "print(f'Saving model to {path}')\n", + "torch.save(model_ft, path)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2fe8181ce2654062ba50450b26a2f647", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1447 [00:00\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/0/10.271252764598009_9.682578659135977_10.286224686_9.637662894930001.png'\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m# Iterate over data.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'train'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/notebook.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__iter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;31m# return super(tqdm...) will not catch exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1177\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1179\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1180\u001b[0m \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0mnext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__next__\u001b[0m \u001b[0;31m# Python 2 compatibility\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 845\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 847\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# (https://bugs.python.org/issue2651), so we work around it.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKeyErrorMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: Caught FileNotFoundError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 178, in _worker_loop\n data = fetcher.fetch(index)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in fetch\n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 44, in \n data = [self.dataset[idx] for idx in possibly_batched_index]\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 138, in __getitem__\n sample = self.loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 174, in default_loader\n return pil_loader(path)\n File \"/opt/anaconda3/envs/testenv/lib/python3.7/site-packages/torchvision/datasets/folder.py\", line 155, in pil_loader\n with open(path, 'rb') as f:\nFileNotFoundError: [Errno 2] No such file or directory: '/Users/TinotendaMatsika/Documents/predicting-poverty-education-replication/data/cnn_images/train/0/10.271252764598009_9.682578659135977_10.286224686_9.637662894930001.png'\n" + ] + } + ], + "source": [ + "# you can run below if you want to see the final accuracy on nightlights over the train set\n", + "model_ft.eval() # Set model to evaluate mode\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "running_loss = 0.0\n", + "running_corrects = 0\n", + "total = 0\n", + "\n", + "# Iterate over data.\n", + "for inputs, labels in tqdm(dataloaders_dict['train']):\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + "\n", + " # forward\n", + " # track history if only in train\n", + " with torch.set_grad_enabled(False):\n", + " outputs = model_ft(inputs)\n", + " loss = criterion(outputs, labels)\n", + "\n", + " _, preds = torch.max(outputs, 1)\n", + "\n", + " # statistics\n", + " running_loss += loss.item() * inputs.size(0)\n", + " running_corrects += torch.sum(preds == labels.data)\n", + " \n", + " total += len(preds)\n", + " \n", + "print(running_corrects.double()/total)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "testenv", + "language": "python", + "name": "testenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/README.md b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/README.md new file mode 100644 index 0000000..93abe9a --- /dev/null +++ b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/README.md @@ -0,0 +1,348 @@ +This converter can be useful for porting Caffe code and layers to PyTorch. Features: +* dump caffemodel weights to hdf5, npy, pt and json formats +* load Caffe models and use them from PyTorch +* mock PyCaffe API to allow for smooth porting of Caffe-using code (drop-in script for [OICR](https://github.com/ppengtang/oicr) for changing backend in train/eval to PyTorch is below): + * Net, Blob, SGDSolver +* wrapping Caffe's Python layers (see the OICR example) +* example of ROI pooling in PyTorch without manual CUDA code compilation (see the OICR example) + +The layer support isn't as complete as in https://github.com/marvis/pytorch-caffe. Currently it supports the following Caffe layers: +* convolution (num_output, kernel_size, stride, pad, dilation; constant and gaussian weight/bias fillers) +* inner_product (num_output; constant and gaussian weight/bias fillers) +* max / avg pooling (kernel_size, stride, pad) +* relu +* dropout (dropout_ratio) +* eltwise (prod, sum, max) +* softmax (axis) +* local response norm (local_size, alpha, beta) + +Dependencies: protobuf with Python bindings, including `protoc` binary in `PATH`. + +PRs to enable other layers or layer params are very welcome (see the definition of the `modules` dictionary in the code)! + +License is MIT. + +## Dump weights to PT or HDF5 +```shell +# prototxt and caffemodel from https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md + +# dumps to PT by default to VGG_ILSVRC_16_layers.caffemodel.pt +python -m caffemodel2pytorch VGG_ILSVRC_16_layers.caffemodel + +# dumps to HDF5 converted.h5 +python -m caffemodel2pytorch VGG_ILSVRC_16_layers.caffemodel -o converted.h5 +``` + +```python +# load dumped VGG16 in PyTorch +import collections, torch, torchvision, numpy, h5py +model = torchvision.models.vgg16() +model.features = torch.nn.Sequential(collections.OrderedDict(zip(['conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1', 'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2', 'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3', 'relu3_3', 'pool3', 'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3', 'relu4_3', 'pool4', 'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3', 'relu5_3', 'pool5'], model.features))) +model.classifier = torch.nn.Sequential(collections.OrderedDict(zip(['fc6', 'relu6', 'drop6', 'fc7', 'relu7', 'drop7', 'fc8'], model.classifier))) + +state_dict = h5py.File('converted.h5', 'r') # torch.load('VGG_ILSVRC_16_layers.caffemodel.pt') +model.load_state_dict({l : torch.from_numpy(numpy.array(v)).view_as(p) for k, v in state_dict.items() for l, p in model.named_parameters() if k in l}) +``` + +## Run Caffe models using PyTorch as backend +```python +import torch +import caffemodel2pytorch + +model = caffemodel2pytorch.Net( + prototxt = 'VGG_ILSVRC_16_layers_deploy.prototxt', + weights = 'VGG_ILSVRC_16_layers.caffemodel', + caffe_proto = 'https://raw.githubusercontent.com/BVLC/caffe/master/src/caffe/proto/caffe.proto' +) +model.cuda() +model.eval() +torch.set_grad_enabled(False) + +# make sure to have right procedure of image normalization and channel reordering +image = torch.autograd.Variable(torch.Tensor(8, 3, 224, 224).cuda()) + +# outputs dict of PyTorch Variables +# in this example the dict contains the only key "prob" +#output_dict = model(data = image) + +# you can remove unneeded layers: +del model.prob +del model.fc8 + +# a single input variable is interpreted as an input blob named "data" +# in this example the dict contains the only key "fc7" +output_dict = model(image) +``` + +## Imitate pycaffe interface to help in porting + +```python +import numpy as np +import caffemodel2pytorch as caffe + +caffe.set_mode_gpu() +caffe.set_device(0) + +# === LOADING AND USING THE NET IN EVAL MODE === + +net = caffe.Net('VGG_ILSVRC_16_layers_deploy.prototxt', caffe.TEST, weights = 'VGG_ILSVRC_16_layers.caffemodel') + +# outputs a dict of NumPy arrays, data layer is sidestepped +blobs_out = net.forward(data = np.zeros((8, 3, 224, 224), dtype = np.float32)) + +# access the last layer +layer = net.layers[-1] + +# converts and provides the output as NumPy array +numpy_array = net.blobs['conv1_1'].data + +# access the loss weights +loss_weights = net.blob_loss_weights + +# === BASIC OPTIMIZER === + +# this example uses paths from https://github.com/ppengtang/oicr + +# create an SGD solver, loads the net in train mode +# it knows about base_lr, weight_decay, momentum, lr_mult, decay_mult, iter_size, lr policy step, step_size, gamma +# it finds train.prototxt from the solver.prototxt's train_net or net parameters +solver = caffe.SGDSolver('oicr/models/VGG16/solver.prototxt') + +# load pretrained weights +solver.net.copy_from('oicr/data/imagenet_models/VGG16.v2.caffemodel') + +# runs one iteration of forward, backward, optimization; returns a float loss value +# data layer must be registered or inputs must be provided as keyword arguments +loss = solver.step(1) +``` + +## Drop-in script for OICR enabling PyTorch as backend for eval and training +Place `caffe_pytorch_oicr.py` and `caffemodel2pytorch.py` in the root `oicr` directory. To use the PyTorch backend in testing and in training, put a line `import caffe_pytorch_oicr` at the very top (before `import _init_paths`) in `tools/test_net.py` and `tools/train_net.py` respectively. It requires PyTorch and CuPy (for on-the-fly CUDA kernel compilation). + +```python +# caffe_pytorch_oicr.py + +import collections +import torch +import torch.nn.functional as F +import cupy +import caffemodel2pytorch + +caffemodel2pytorch.initialize('./caffe-oicr/src/caffe/proto/caffe.proto') # needs to be called explicitly for these porting scenarios to enable caffe.proto.caffe_pb2 variable +caffemodel2pytorch.set_mode_gpu() +caffemodel2pytorch.modules['GlobalSumPooling'] = lambda param: lambda pred: pred.sum(dim = 0, keepdim = True) +caffemodel2pytorch.modules['MulticlassCrossEntropyLoss'] = lambda param: lambda pred, labels, eps = 1e-6: F.binary_cross_entropy(pred.clamp(eps, 1 - eps), labels) +caffemodel2pytorch.modules['data'] = lambda param: __import__('roi_data_layer.layer').layer.RoIDataLayer() # wrapping a PyCaffe layer +caffemodel2pytorch.modules['OICRLayer'] = lambda param: OICRLayer # wrapping a PyTorch function +caffemodel2pytorch.modules['WeightedSoftmaxWithLoss'] = lambda param: WeightedSoftmaxWithLoss +caffemodel2pytorch.modules['ReLU'] = lambda param: torch.nn.ReLU(inplace = True) # wrapping a PyTorch module +caffemodel2pytorch.modules['ROIPooling'] = lambda param: lambda input, rois: RoiPooling(param['pooled_h'], param['pooled_w'], param['spatial_scale'])(input, rois) # wrapping a PyTorch autograd function + +def WeightedSoftmaxWithLoss(prob, labels_ic, cls_loss_weights, eps = 1e-12): + loss = -cls_loss_weights * F.log_softmax(prob, dim = -1).gather(-1, labels_ic.long().unsqueeze(-1)).squeeze(-1) + valid_sum = cls_loss_weights.gt(eps).float().sum() + return loss.sum() / (loss.numel() if valid_sum == 0 else valid_sum) + +def OICRLayer(boxes, cls_prob, im_labels, cfg_TRAIN_FG_THRESH = 0.5): + cls_prob = (cls_prob if cls_prob.size(-1) == im_labels.size(-1) else cls_prob[..., 1:]).clone() + boxes = boxes[..., 1:] + gt_boxes, gt_classes, gt_scores = [], [], [] + for i in im_labels.eq(1).nonzero()[:, 1]: + max_index = int(cls_prob[:, i].max(dim = 0)[1]) + gt_boxes.append(boxes[max_index]) + gt_classes.append(int(i) + 1) + gt_scores.append(float(cls_prob[max_index, i])) + cls_prob[max_index] = 0 + max_overlaps, gt_assignment = overlap(boxes, torch.stack(gt_boxes)).max(dim = 1) + return gt_assignment.new(gt_classes)[gt_assignment] * (max_overlaps > cfg_TRAIN_FG_THRESH).type_as(gt_assignment), max_overlaps.new(gt_scores)[gt_assignment] + +class RoiPooling(torch.autograd.Function): + CUDA_NUM_THREADS = 1024 + GET_BLOCKS = staticmethod(lambda N: (N + RoiPooling.CUDA_NUM_THREADS - 1) // RoiPooling.CUDA_NUM_THREADS) + Stream = collections.namedtuple('Stream', ['ptr']) + + kernel_forward = b''' + #define FLT_MAX 340282346638528859811704183484516925440.0f + typedef float Dtype; + #define CUDA_KERNEL_LOOP(i, n) for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); i += blockDim.x * gridDim.x) + extern "C" + __global__ void ROIPoolForward(const int nthreads, const Dtype* bottom_data, + const Dtype spatial_scale, const int channels, const int height, + const int width, const int pooled_height, const int pooled_width, + const Dtype* bottom_rois, Dtype* top_data, int* argmax_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + bottom_rois += n * 5; + int roi_batch_ind = bottom_rois[0]; + int roi_start_w = round(bottom_rois[1] * spatial_scale); + int roi_start_h = round(bottom_rois[2] * spatial_scale); + int roi_end_w = round(bottom_rois[3] * spatial_scale); + int roi_end_h = round(bottom_rois[4] * spatial_scale); + + // Force malformed ROIs to be 1x1 + int roi_width = max(roi_end_w - roi_start_w + 1, 1); + int roi_height = max(roi_end_h - roi_start_h + 1, 1); + Dtype bin_size_h = static_cast(roi_height) + / static_cast(pooled_height); + Dtype bin_size_w = static_cast(roi_width) + / static_cast(pooled_width); + + int hstart = static_cast(floor(static_cast(ph) + * bin_size_h)); + int wstart = static_cast(floor(static_cast(pw) + * bin_size_w)); + int hend = static_cast(ceil(static_cast(ph + 1) + * bin_size_h)); + int wend = static_cast(ceil(static_cast(pw + 1) + * bin_size_w)); + + // Add roi offsets and clip to input boundaries + hstart = min(max(hstart + roi_start_h, 0), height); + hend = min(max(hend + roi_start_h, 0), height); + wstart = min(max(wstart + roi_start_w, 0), width); + wend = min(max(wend + roi_start_w, 0), width); + bool is_empty = (hend <= hstart) || (wend <= wstart); + + // Define an empty pooling region to be zero + Dtype maxval = is_empty ? 0 : -FLT_MAX; + // If nothing is pooled, argmax = -1 causes nothing to be backprop'd + int maxidx = -1; + bottom_data += (roi_batch_ind * channels + c) * height * width; + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + int bottom_index = h * width + w; + if (bottom_data[bottom_index] > maxval) { + maxval = bottom_data[bottom_index]; + maxidx = bottom_index; + } + } + } + top_data[index] = maxval; + argmax_data[index] = maxidx; + } + } + ''' + + kernel_backward = b''' + typedef float Dtype; + #define CUDA_KERNEL_LOOP(i, n) for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); i += blockDim.x * gridDim.x) + extern "C" + __global__ void ROIPoolBackward(const int nthreads, const Dtype* top_diff, + const int* argmax_data, const int num_rois, const Dtype spatial_scale, + const int channels, const int height, const int width, + const int pooled_height, const int pooled_width, Dtype* bottom_diff, + const Dtype* bottom_rois) { + CUDA_KERNEL_LOOP(index, nthreads) { + // (n, c, h, w) coords in bottom data + int w = index % width; + int h = (index / width) % height; + int c = (index / width / height) % channels; + int n = index / width / height / channels; + + Dtype gradient = 0; + // Accumulate gradient over all ROIs that pooled this element + for (int roi_n = 0; roi_n < num_rois; ++roi_n) { + const Dtype* offset_bottom_rois = bottom_rois + roi_n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + // Skip if ROI's batch index doesn't match n + if (n != roi_batch_ind) { + continue; + } + + int roi_start_w = round(offset_bottom_rois[1] * spatial_scale); + int roi_start_h = round(offset_bottom_rois[2] * spatial_scale); + int roi_end_w = round(offset_bottom_rois[3] * spatial_scale); + int roi_end_h = round(offset_bottom_rois[4] * spatial_scale); + + // Skip if ROI doesn't include (h, w) + const bool in_roi = (w >= roi_start_w && w <= roi_end_w && + h >= roi_start_h && h <= roi_end_h); + if (!in_roi) { + continue; + } + + int offset = (roi_n * channels + c) * pooled_height * pooled_width; + const Dtype* offset_top_diff = top_diff + offset; + const int* offset_argmax_data = argmax_data + offset; + + // Compute feasible set of pooled units that could have pooled + // this bottom unit + + // Force malformed ROIs to be 1x1 + int roi_width = max(roi_end_w - roi_start_w + 1, 1); + int roi_height = max(roi_end_h - roi_start_h + 1, 1); + + Dtype bin_size_h = static_cast(roi_height) + / static_cast(pooled_height); + Dtype bin_size_w = static_cast(roi_width) + / static_cast(pooled_width); + + int phstart = floor(static_cast(h - roi_start_h) / bin_size_h); + int phend = ceil(static_cast(h - roi_start_h + 1) / bin_size_h); + int pwstart = floor(static_cast(w - roi_start_w) / bin_size_w); + int pwend = ceil(static_cast(w - roi_start_w + 1) / bin_size_w); + + phstart = min(max(phstart, 0), pooled_height); + phend = min(max(phend, 0), pooled_height); + pwstart = min(max(pwstart, 0), pooled_width); + pwend = min(max(pwend, 0), pooled_width); + + for (int ph = phstart; ph < phend; ++ph) { + for (int pw = pwstart; pw < pwend; ++pw) { + if (offset_argmax_data[ph * pooled_width + pw] == (h * width + w)) { + gradient += offset_top_diff[ph * pooled_width + pw]; + } + } + } + } + bottom_diff[index] = gradient; + } + } + ''' + cupy_init = cupy.array([]) + compiled_forward = cupy.cuda.compiler.compile_with_cache(kernel_forward).get_function('ROIPoolForward') + compiled_backward = cupy.cuda.compiler.compile_with_cache(kernel_backward).get_function('ROIPoolBackward') + + def __init__(self, pooled_height, pooled_width, spatial_scale): + self.pooled_height = pooled_height + self.pooled_width = pooled_width + self.spatial_scale = spatial_scale + + def forward(self, images, rois): + output = torch.cuda.FloatTensor(len(rois), images.size(1) * self.pooled_height * self.pooled_width) + self.argmax = torch.cuda.IntTensor(output.size()).fill_(-1) + self.input_size = images.size() + self.save_for_backward(rois) + RoiPooling.compiled_forward(grid = (RoiPooling.GET_BLOCKS(output.numel()), 1, 1), block = (RoiPooling.CUDA_NUM_THREADS, 1, 1), args=[ + output.numel(), images.data_ptr(), cupy.float32(self.spatial_scale), self.input_size[-3], self.input_size[-2], self.input_size[-1], + self.pooled_height, self.pooled_width, rois.data_ptr(), output.data_ptr(), self.argmax.data_ptr() + ], stream=RoiPooling.Stream(ptr=torch.cuda.current_stream().cuda_stream)) + return output + + def backward(self, grad_output): + rois, = self.saved_tensors + grad_input = torch.cuda.FloatTensor(*self.input_size).zero_() + RoiPooling.compiled_backward(grid = (RoiPooling.GET_BLOCKS(grad_input.numel()), 1, 1), block = (RoiPooling.CUDA_NUM_THREADS, 1, 1), args=[ + grad_input.numel(), grad_output.data_ptr(), self.argmax.data_ptr(), len(rois), cupy.float32(self.spatial_scale), self.input_size[-3], + self.input_size[-2], self.input_size[-1], self.pooled_height, self.pooled_width, grad_input.data_ptr(), rois.data_ptr() + ], stream=RoiPooling.Stream(ptr=torch.cuda.current_stream().cuda_stream)) + return grad_input, None + +def overlap(box1, box2): + b1, b2 = box1.t().contiguous(), box2.t().contiguous() + xx1 = torch.max(b1[0].unsqueeze(1), b2[0].unsqueeze(0)) + yy1 = torch.max(b1[1].unsqueeze(1), b2[1].unsqueeze(0)) + xx2 = torch.min(b1[2].unsqueeze(1), b2[2].unsqueeze(0)) + yy2 = torch.min(b1[3].unsqueeze(1), b2[3].unsqueeze(0)) + inter = area(x1 = xx1, y1 = yy1, x2 = xx2, y2 = yy2) + return inter / (area(b1.t()).unsqueeze(1) + area(b2.t()).unsqueeze(0) - inter) + +def area(boxes = None, x1 = None, y1 = None, x2 = None, y2 = None): + return (boxes[..., 3] - boxes[..., 1] + 1) * (boxes[..., 2] - boxes[..., 0] + 1) if boxes is not None else (x2 - x1 + 1).clamp(min = 0) * (y2 - y1 + 1).clamp(min = 0) +``` +**Note:** I've also had to replace `utils/bbox.pyx` by `utils/cython_bbox.pyx` and `utils/nms.pyx` by `utils/cython_nms.pyx` in `lib/setup.py` to deal with some `setup.py` issues. diff --git a/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/__init__.py b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/__init__.py new file mode 100644 index 0000000..e5fcb07 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/__init__.py @@ -0,0 +1 @@ +from .caffemodel2pytorch import * \ No newline at end of file diff --git a/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/caffemodel2pytorch.py b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/caffemodel2pytorch.py new file mode 100644 index 0000000..fd3584b --- /dev/null +++ b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/caffemodel2pytorch.py @@ -0,0 +1,400 @@ +import os +import sys +import time +import argparse +import tempfile +import subprocess +import collections +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import reduce + +from urllib.request import urlopen + +import google.protobuf.descriptor +import google.protobuf.descriptor_pool +import google.protobuf.symbol_database +import google.protobuf.text_format +from google.protobuf.descriptor import FieldDescriptor as FD + +TRAIN = 0 + +TEST = 1 + +caffe_pb2 = None + +def initialize(caffe_proto = 'https://raw.githubusercontent.com/BVLC/caffe/master/src/caffe/proto/caffe.proto', codegen_dir = tempfile.mkdtemp(), shadow_caffe = True): + global caffe_pb2 + if caffe_pb2 is None: + local_caffe_proto = os.path.join(codegen_dir, os.path.basename(caffe_proto)) + with open(local_caffe_proto, 'w') as f: + mybytes = urlopen(caffe_proto).read() + mystr = mybytes.decode('ascii', 'ignore') + f.write(mystr) + #f.write((urlopen if 'http' in caffe_proto else open)(caffe_proto).read()) + subprocess.check_call(['protoc', '--proto_path', os.path.dirname(local_caffe_proto), '--python_out', codegen_dir, local_caffe_proto]) + sys.path.insert(0, codegen_dir) + old_pool = google.protobuf.descriptor._message.default_pool + old_symdb = google.protobuf.symbol_database._DEFAULT + google.protobuf.descriptor._message.default_pool = google.protobuf.descriptor_pool.DescriptorPool() + google.protobuf.symbol_database._DEFAULT = google.protobuf.symbol_database.SymbolDatabase(pool = google.protobuf.descriptor._message.default_pool) + import caffe_pb2 as caffe_pb2 + google.protobuf.descriptor._message.default_pool = old_pool + google.protobuf.symbol_database._DEFAULT = old_symdb + sys.modules[__name__ + '.proto'] = sys.modules[__name__] + if shadow_caffe: + sys.modules['caffe'] = sys.modules[__name__] + sys.modules['caffe.proto'] = sys.modules[__name__] + return caffe_pb2 + + def set_mode_gpu(): + global convert_to_gpu_if_enabled + convert_to_gpu_if_enabled = lambda obj: obj.cuda() + + def set_device(gpu_id): + torch.cuda.set_device(gpu_id) + +class Net(nn.Module): + def __init__(self, prototxt, *args, **kwargs): + super(Net, self).__init__() + # to account for both constructors, see https://github.com/BVLC/caffe/blob/master/python/caffe/test/test_net.py#L145-L147 + caffe_proto = kwargs.pop('caffe_proto', None) + weights = kwargs.pop('weights', None) + phase = kwargs.pop('phase', None) + weights = weights or (args + (None, None))[0] + phase = phase or (args + (None, None))[1] + + self.net_param = initialize(caffe_proto).NetParameter() + google.protobuf.text_format.Parse(open(prototxt).read(), self.net_param) + + for layer in list(self.net_param.layer) + list(self.net_param.layers): + layer_type = layer.type if layer.type != 'Python' else layer.python_param.layer + if isinstance(layer_type, int): + layer_type = layer.LayerType.Name(layer_type) + module_constructor = ([v for k, v in modules.items() if k.replace('_', '').upper() in [layer_type.replace('_', '').upper(), layer.name.replace('_', '').upper()]] + [None])[0] + if module_constructor is not None: + param = to_dict(([v for f, v in layer.ListFields() if f.name.endswith('_param')] + [None])[0]) + caffe_input_variable_names = list(layer.bottom) + caffe_output_variable_names = list(layer.top) + caffe_loss_weight = (list(layer.loss_weight) or [1.0 if layer_type.upper().endswith('LOSS') else 0.0]) * len(layer.top) + caffe_propagate_down = list(getattr(layer, 'propagate_down', [])) or [True] * len(caffe_input_variable_names) + caffe_optimization_params = to_dict(layer.param) + param['inplace'] = len(caffe_input_variable_names) == 1 and caffe_input_variable_names == caffe_output_variable_names + module = module_constructor(param) + self.add_module(layer.name, module if isinstance(module, nn.Module) else CaffePythonLayerModule(module, caffe_input_variable_names, caffe_output_variable_names, param.get('param_str', '')) if type(module).__name__.endswith('Layer') else FunctionModule(module)) + module = getattr(self, layer.name) + module.caffe_layer_name = layer.name + module.caffe_layer_type = layer_type + module.caffe_input_variable_names = caffe_input_variable_names + module.caffe_output_variable_names = caffe_output_variable_names + module.caffe_loss_weight = caffe_loss_weight + module.caffe_propagate_down = caffe_propagate_down + module.caffe_optimization_params = caffe_optimization_params + for optim_param, p in zip(caffe_optimization_params, module.parameters()): + p.requires_grad = optim_param.get('lr_mult', 1) != 0 + else: + print('Skipping layer [{}, {}, {}]: not found in caffemodel2pytorch.modules dict'.format(layer.name, layer_type, layer.type)) + + if weights is not None: + self.copy_from(weights) + + self.blobs = collections.defaultdict(Blob) + self.blob_loss_weights = {name : loss_weight for module in self.children() for name, loss_weight in zip(module.caffe_output_variable_names, module.caffe_loss_weight)} + + self.train(phase != TEST) + convert_to_gpu_if_enabled(self) + + def forward(self, data = None, **variables): + if data is not None: + variables['data'] = data + numpy = not all(map(torch.is_tensor, variables.values())) + variables = {k : convert_to_gpu_if_enabled(torch.from_numpy(v.copy()) if numpy else v) for k, v in variables.items()} + + for module in [module for module in self.children() if not all(name in variables for name in module.caffe_output_variable_names)]: + for name in module.caffe_input_variable_names: + assert name in variables, 'Variable [{}] does not exist. Pass it as a keyword argument or provide a layer which produces it.'.format(name) + inputs = [variables[name] if propagate_down else variables[name].detach() for name, propagate_down in zip(module.caffe_input_variable_names, module.caffe_propagate_down)] + outputs = module(*inputs) + if not isinstance(outputs, tuple): + outputs = (outputs, ) + variables.update(dict(zip(module.caffe_output_variable_names, outputs))) + + self.blobs.update({k : Blob(data = v, numpy = numpy) for k, v in variables.items()}) + caffe_output_variable_names = set([name for module in self.children() for name in module.caffe_output_variable_names]) - set([name for module in self.children() for name in module.caffe_input_variable_names if name not in module.caffe_output_variable_names]) + return {k : v.detach().cpu().numpy() if numpy else v for k, v in variables.items() if k in caffe_output_variable_names} + + def copy_from(self, weights): + try: + import h5py, numpy + state_dict = self.state_dict() + for k, v in h5py.File(weights, 'r').items(): + if k in state_dict: + state_dict[k].resize_(v.shape).copy_(torch.from_numpy(numpy.array(v))) + print('caffemodel2pytorch: loaded model from [{}] in HDF5 format'.format(weights)) + except Exception as e: + print('caffemodel2pytorch: loading model from [{}] in HDF5 format failed [{}], falling back to caffemodel format'.format(weights, e)) + bytes_weights = open(weights, 'rb').read() + bytes_parsed = self.net_param.ParseFromString(bytes_weights) + if bytes_parsed != len(bytes_weights): + print('caffemodel2pytorch: loading model from [{}] in caffemodel format, WARNING: file length [{}] is not equal to number of parsed bytes [{}]'.format(weights, len(bytes_weights), bytes_parsed)) + for layer in list(self.net_param.layer) + list(self.net_param.layers): + module = getattr(self, layer.name, None) + if module is None: + continue + parameters = {name : convert_to_gpu_if_enabled(torch.FloatTensor(blob.data)).view(list(blob.shape.dim) if len(blob.shape.dim) > 0 else [blob.num, blob.channels, blob.height, blob.width]) for name, blob in zip(['weight', 'bias'], layer.blobs)} + if len(parameters) > 0: + module.set_parameters(**parameters) + print('caffemodel2pytorch: loaded model from [{}] in caffemodel format'.format(weights)) + + def save(self, weights): + import h5py + with h5py.File(weights, 'w') as h: + for k, v in self.state_dict().items(): + h[k] = v.cpu().numpy() + print('caffemodel2pytorch: saved model to [{}] in HDF5 format'.format(weights)) + + @property + def layers(self): + return list(self.children()) + +class Blob(object): + AssignmentAdapter = type('', (object, ), dict(shape = property(lambda self: self.contents.shape), __setitem__ = lambda self, indices, values: setattr(self, 'contents', values))) + + def __init__(self, data = None, diff = None, numpy = False): + self.data_ = data if data is not None else Blob.AssignmentAdapter() + self.diff_ = diff if diff is not None else Blob.AssignmentAdapter() + self.shape_ = None + self.numpy = numpy + + def reshape(self, *args): + self.shape_ = args + + def count(self, *axis): + return reduce(lambda x, y: x * y, self.shape_[slice(*(axis + [-1])[:2])]) + + @property + def data(self): + if self.numpy and isinstance(self.data_, torch.autograd.Variable): + self.data_ = self.data_.detach().cpu().numpy() + return self.data_ + + @property + def diff(self): + if self.numpy and isinstance(self.diff_, torch.autograd.Variable): + self.diff_ = self.diff_.detach().cpu().numpy() + return self.diff_ + + @property + def shape(self): + return self.shape_ if self.shape_ is not None else self.data_.shape + + @property + def num(self): + return self.shape[0] + + @property + def channels(self): + return self.shape[1] + + @property + def height(self): + return self.shape[2] + + @property + def width(self): + return self.shape[3] + +class Layer(torch.autograd.Function): + def __init__(self, caffe_python_layer = None, caffe_input_variable_names = None, caffe_output_variable_names = None, caffe_propagate_down = None): + self.caffe_python_layer = caffe_python_layer + self.caffe_input_variable_names = caffe_input_variable_names + self.caffe_output_variable_names = caffe_output_variable_names + self.caffe_propagate_down = caffe_propagate_down + + def forward(self, *inputs): + bottom = [Blob(data = v.cpu().numpy()) for v in inputs] + top = [Blob() for name in self.caffe_output_variable_names] + + #self.caffe_python_layer.reshape() + self.caffe_python_layer.setup(bottom, top) + self.caffe_python_layer.setup = lambda *args: None + + self.caffe_python_layer.forward(bottom, top) + outputs = tuple(convert_to_gpu_if_enabled(torch.from_numpy(v.data.contents.reshape(*v.shape))) for v in top) + self.save_for_backward(*(inputs + outputs)) + return outputs + + def backward(self, grad_outputs): + inputs, outputs = self.saved_tensors[:len(self.caffe_input_variable_names)], self.saved_tensors[len(self.caffe_input_variable_names):] + bottom = [Blob(data = v.cpu().numpy()) for v in inputs] + top = [Blob(data = output.cpu().numpy(), diff = grad_output.cpu().numpy()) for grad_output, output in zip(grad_outputs, outputs)] + self.caffe_python_layer.backward(top, self.caffe_propagate_down, bottom) + return tuple(convert_to_gpu_if_enabled(torch.from_numpy(blob.diff.contents.reshape(*v.reshape))) if propagate_down else None for v, propagate_down in zip(bottom, self.caffe_propagate_down)) + +class SGDSolver(object): + def __init__(self, solver_prototxt): + solver_param = initialize().SolverParameter() + google.protobuf.text_format.Parse(open(solver_prototxt).read(), solver_param) + solver_param = to_dict(solver_param) + self.net = Net(solver_param.get('train_net') or solver_param.get('net'), phase = TRAIN) + self.iter = 1 + self.iter_size = solver_param.get('iter_size', 1) + self.optimizer_params = dict(lr = solver_param.get('base_lr') / self.iter_size, momentum = solver_param.get('momentum', 0), weight_decay = solver_param.get('weight_decay', 0)) + self.lr_scheduler_params = dict(policy = solver_param.get('lr_policy'), step_size = solver_param.get('stepsize'), gamma = solver_param.get('gamma')) + self.optimizer, self.scheduler = None, None + + def init_optimizer_scheduler(self): + self.optimizer = torch.optim.SGD([dict(params = [param], lr = self.optimizer_params['lr'] * mult.get('lr_mult', 1), weight_decay = self.optimizer_params['weight_decay'] * mult.get('decay_mult', 1), momentum = self.optimizer_params['momentum']) for module in self.net.children() for param, mult in zip(module.parameters(), module.caffe_optimization_params + [{}, {}]) if param.requires_grad]) + self.scheduler = torch.optim.lr_scheduler.StepLR(self.optimizer, step_size = self.lr_scheduler_params['step_size'], gamma = self.lr_scheduler_params['gamma']) if self.lr_scheduler_params.get('policy') == 'step' else type('', (object, ), dict(step = lambda self: None))() + + def step(self, iterations = 1, **inputs): + loss_total = 0.0 + for i in range(iterations): + tic = time.time() + if self.optimizer is not None: + self.optimizer.zero_grad() + + loss_batch = 0 + losses_batch = collections.defaultdict(float) + for j in range(self.iter_size): + outputs = [kv for kv in self.net(**inputs).items() if self.net.blob_loss_weights[kv[0]] != 0] + loss = sum([self.net.blob_loss_weights[k] * v.sum() for k, v in outputs]) + loss_batch += float(loss) / self.iter_size + for k, v in outputs: + losses_batch[k] += float(v.sum()) / self.iter_size + if self.optimizer is None: + self.init_optimizer_scheduler() + self.optimizer.zero_grad() + loss.backward() + + loss_total += loss_batch + self.optimizer.step() + self.scheduler.step() + self.iter += 1 + + log_prefix = self.__module__ + '.' + type(self).__name__ + print('{}] Iteration {}, loss: {}'.format(log_prefix, self.iter, loss_batch)) + for i, (name, loss) in enumerate(sorted(losses_batch.items())): + print('{}] Train net output #{}: {} = {} (* {} = {} loss)'.format(log_prefix, i, name, loss, self.net.blob_loss_weights[name], self.net.blob_loss_weights[name] * loss)) + print('{}] Iteration {}, lr = {}, time = {}'.format(log_prefix, self.iter, self.optimizer_params['lr'], time.time() - tic)) + + return loss_total + +modules = dict( + Convolution = lambda param: Convolution(param), + InnerProduct = lambda param: InnerProduct(param), + Pooling = lambda param: [nn.MaxPool2d, nn.AvgPool2d][param['pool']](kernel_size = first_or(param, 'kernel_size', 1), stride = first_or(param, 'stride', 1), padding = first_or(param, 'pad', 0)), + Softmax = lambda param: nn.Softmax(dim = param.get('axis', -1)), + ReLU = lambda param: nn.ReLU(), + Dropout = lambda param: nn.Dropout(p = param['dropout_ratio']), + Eltwise = lambda param: [torch.mul, torch.add, torch.max][param.get('operation', 1)], + LRN = lambda param: nn.LocalResponseNorm(size = param['local_size'], alpha = param['alpha'], beta = param['beta']) +) + +class FunctionModule(nn.Module): + def __init__(self, forward): + super(FunctionModule, self).__init__() + self.forward_func = forward + + def forward(self, *inputs): + return self.forward_func(*inputs) + +class CaffePythonLayerModule(nn.Module): + def __init__(self, caffe_python_layer, caffe_input_variable_names, caffe_output_variable_names, param_str): + super(CaffePythonLayerModule, self).__init__() + caffe_python_layer.param_str = param_str + self.caffe_python_layer = caffe_python_layer + self.caffe_input_variable_names = caffe_input_variable_names + self.caffe_output_variable_names = caffe_output_variable_names + + def forward(self, *inputs): + return Layer(self.caffe_python_layer, self.caffe_input_variable_names, self.caffe_output_variable_names)(*inputs) + + def __getattr__(self, name): + return nn.Module.__getattr__(self, name) if name in dir(self) else getattr(self.caffe_python_layer, name) + +class Convolution(nn.Conv2d): + def __init__(self, param): + super(Convolution, self).__init__(first_or(param,'group',1), param['num_output'], kernel_size = first_or(param, 'kernel_size', 1), stride = first_or(param, 'stride', 1), padding = first_or(param, 'pad', 0), dilation = first_or(param, 'dilation', 1), groups = first_or(param, 'group', 1)) + self.weight, self.bias = nn.Parameter(), nn.Parameter() + self.weight_init, self.bias_init = param.get('weight_filler', {}), param.get('bias_filler', {}) + + def forward(self, x): + if self.weight.numel() == 0 and self.bias.numel() == 0: + requires_grad = [self.weight.requires_grad, self.bias.requires_grad] + super(Convolution, self).__init__(x.size(1), self.out_channels, kernel_size = self.kernel_size, stride = self.stride, padding = self.padding, dilation = self.dilation) + convert_to_gpu_if_enabled(self) + init_weight_bias(self, requires_grad = requires_grad) + return super(Convolution, self).forward(x) + + def set_parameters(self, weight = None, bias = None): + init_weight_bias(self, weight = weight, bias = bias.view(-1) if bias is not None else bias) + self.in_channels = self.weight.size(1) + +class InnerProduct(nn.Linear): + def __init__(self, param): + super(InnerProduct, self).__init__(1, param['num_output']) + self.weight, self.bias = nn.Parameter(), nn.Parameter() + self.weight_init, self.bias_init = param.get('weight_filler', {}), param.get('bias_filler', {}) + + def forward(self, x): + if self.weight.numel() == 0 and self.bias.numel() == 0: + requires_grad = [self.weight.requires_grad, self.bias.requires_grad] + super(InnerProduct, self).__init__(x.size(1), self.out_features) + convert_to_gpu_if_enabled(self) + init_weight_bias(self, requires_grad = requires_grad) + return super(InnerProduct, self).forward(x if x.size(-1) == self.in_features else x.view(len(x), -1)) + + def set_parameters(self, weight = None, bias = None): + init_weight_bias(self, weight = weight.view(weight.size(-2), weight.size(-1)) if weight is not None else None, bias = bias.view(-1) if bias is not None else None) + self.in_features = self.weight.size(1) + +def init_weight_bias(self, weight = None, bias = None, requires_grad = []): + if weight is not None: + self.weight = nn.Parameter(weight.type_as(self.weight), requires_grad = self.weight.requires_grad) + if bias is not None: + self.bias = nn.Parameter(bias.type_as(self.bias), requires_grad = self.bias.requires_grad) + for name, requires_grad in zip(['weight', 'bias'], requires_grad): + param, init = getattr(self, name), getattr(self, name + '_init') + if init.get('type') == 'gaussian': + nn.init.normal_(param, std = init['std']) + elif init.get('type') == 'constant': + nn.init.constant_(param, val = init['value']) + param.requires_grad = requires_grad + +def convert_to_gpu_if_enabled(obj): + return obj + +def first_or(param, key, default): + return param[key] if isinstance(param.get(key), int) else (param.get(key, []) + [default])[0] + +def to_dict(obj): + return list(map(to_dict, obj)) if isinstance(obj, collections.Iterable) else {} if obj is None else {f.name : converter(v) if f.label != FD.LABEL_REPEATED else list(map(converter, v)) for f, v in obj.ListFields() for converter in [{FD.TYPE_DOUBLE: float, FD.TYPE_SFIXED32: float, FD.TYPE_SFIXED64: float, FD.TYPE_SINT32: int, FD.TYPE_SINT64: int, FD.TYPE_FLOAT: float, FD.TYPE_ENUM: int, FD.TYPE_UINT32: int, FD.TYPE_INT64: int, FD.TYPE_UINT64: int, FD.TYPE_INT32: int, FD.TYPE_FIXED64: float, FD.TYPE_FIXED32: float, FD.TYPE_BOOL: bool, FD.TYPE_STRING: str, FD.TYPE_BYTES: lambda x: x.encode('string_escape'), FD.TYPE_MESSAGE: to_dict}[f.type]]} + +if __name__ == 'main': + parser = argparse.ArgumentParser() + parser.add_argument(metavar = 'model.caffemodel', dest = 'model_caffemodel', help = 'Path to model.caffemodel') + parser.add_argument('-o', dest = 'output_path', help = 'Path to converted model, supported file extensions are: h5, npy, npz, json, pt') + parser.add_argument('--caffe.proto', metavar = '--caffe.proto', dest = 'caffe_proto', help = 'Path to caffe.proto (typically located at CAFFE_ROOT/src/caffe/proto/caffe.proto)', default = 'https://raw.githubusercontent.com/BVLC/caffe/master/src/caffe/proto/caffe.proto') + args = parser.parse_args() + args.output_path = args.output_path or args.model_caffemodel + '.pt' + + net_param = initialize(args.caffe_proto).NetParameter() + net_param.ParseFromString(open(args.model_caffemodel, 'rb').read()) + blobs = {layer.name + '.' + name : dict(data = blob.data, shape = list(blob.shape.dim) if len(blob.shape.dim) > 0 else [blob.num, blob.channels, blob.height, blob.width]) for layer in list(net_param.layer) + list(net_param.layers) for name, blob in zip(['weight', 'bias'], layer.blobs)} + + if args.output_path.endswith('.json'): + import json + with open(args.output_path, 'w') as f: + json.dump(blobs, f) + elif args.output_path.endswith('.h5'): + import h5py, numpy + with h5py.File(args.output_path, 'w') as h: + h.update(**{k : numpy.array(blob['data'], dtype = numpy.float32).reshape(*blob['shape']) for k, blob in blobs.items()}) + elif args.output_path.endswith('.npy') or args.output_path.endswith('.npz'): + import numpy + (numpy.savez if args.output_path[-1] == 'z' else numpy.save)(args.output_path, **{k : numpy.array(blob['data'], dtype = numpy.float32).reshape(*blob['shape']) for k, blob in blobs.items()}) + elif args.output_path.endswith('.pt'): + torch.save({k : torch.FloatTensor(blob['data']).view(*blob['shape']) for k, blob in blobs.items()}, args.output_path) + diff --git a/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/original.py b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/original.py new file mode 100755 index 0000000..393b610 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/use_paper_model/caffemodel2pytorch/original.py @@ -0,0 +1,402 @@ +import os +import sys +import time +import argparse +import tempfile +import subprocess +import collections +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import reduce + +try: + from urllib.request import urlopen +except: + from urllib2 import urlopen # Python 2 support. + +import google.protobuf.descriptor +import google.protobuf.descriptor_pool +import google.protobuf.symbol_database +import google.protobuf.text_format +from google.protobuf.descriptor import FieldDescriptor as FD + +TRAIN = 0 + +TEST = 1 + +caffe_pb2 = None + +def initialize(caffe_proto = 'https://raw.githubusercontent.com/BVLC/caffe/master/src/caffe/proto/caffe.proto', codegen_dir = tempfile.mkdtemp(), shadow_caffe = True): + global caffe_pb2 + if caffe_pb2 is None: + local_caffe_proto = os.path.join(codegen_dir, os.path.basename(caffe_proto)) + with open(local_caffe_proto, 'w') as f: + mybytes = urlopen(caffe_proto).read() + mystr = mybytes.decode('ascii', 'ignore') + f.write(mystr) + #f.write((urlopen if 'http' in caffe_proto else open)(caffe_proto).read()) + subprocess.check_call(['protoc', '--proto_path', os.path.dirname(local_caffe_proto), '--python_out', codegen_dir, local_caffe_proto]) + sys.path.insert(0, codegen_dir) + old_pool = google.protobuf.descriptor._message.default_pool + old_symdb = google.protobuf.symbol_database._DEFAULT + google.protobuf.descriptor._message.default_pool = google.protobuf.descriptor_pool.DescriptorPool() + google.protobuf.symbol_database._DEFAULT = google.protobuf.symbol_database.SymbolDatabase(pool = google.protobuf.descriptor._message.default_pool) + import caffe_pb2 as caffe_pb2 + google.protobuf.descriptor._message.default_pool = old_pool + google.protobuf.symbol_database._DEFAULT = old_symdb + sys.modules[__name__ + '.proto'] = sys.modules[__name__] + if shadow_caffe: + sys.modules['caffe'] = sys.modules[__name__] + sys.modules['caffe.proto'] = sys.modules[__name__] + return caffe_pb2 + +def set_mode_gpu(): + global convert_to_gpu_if_enabled + convert_to_gpu_if_enabled = lambda obj: obj.cuda() + +def set_device(gpu_id): + torch.cuda.set_device(gpu_id) + +class Net(nn.Module): + def __init__(self, prototxt, *args, **kwargs): + super(Net, self).__init__() + # to account for both constructors, see https://github.com/BVLC/caffe/blob/master/python/caffe/test/test_net.py#L145-L147 + caffe_proto = kwargs.pop('caffe_proto', None) + weights = kwargs.pop('weights', None) + phase = kwargs.pop('phase', None) + weights = weights or (args + (None, None))[0] + phase = phase or (args + (None, None))[1] + + self.net_param = initialize(caffe_proto).NetParameter() + google.protobuf.text_format.Parse(open(prototxt).read(), self.net_param) + + for layer in list(self.net_param.layer) + list(self.net_param.layers): + layer_type = layer.type if layer.type != 'Python' else layer.python_param.layer + if isinstance(layer_type, int): + layer_type = layer.LayerType.Name(layer_type) + module_constructor = ([v for k, v in modules.items() if k.replace('_', '').upper() in [layer_type.replace('_', '').upper(), layer.name.replace('_', '').upper()]] + [None])[0] + if module_constructor is not None: + param = to_dict(([v for f, v in layer.ListFields() if f.name.endswith('_param')] + [None])[0]) + caffe_input_variable_names = list(layer.bottom) + caffe_output_variable_names = list(layer.top) + caffe_loss_weight = (list(layer.loss_weight) or [1.0 if layer_type.upper().endswith('LOSS') else 0.0]) * len(layer.top) + caffe_propagate_down = list(getattr(layer, 'propagate_down', [])) or [True] * len(caffe_input_variable_names) + caffe_optimization_params = to_dict(layer.param) + param['inplace'] = len(caffe_input_variable_names) == 1 and caffe_input_variable_names == caffe_output_variable_names + module = module_constructor(param) + self.add_module(layer.name, module if isinstance(module, nn.Module) else CaffePythonLayerModule(module, caffe_input_variable_names, caffe_output_variable_names, param.get('param_str', '')) if type(module).__name__.endswith('Layer') else FunctionModule(module)) + module = getattr(self, layer.name) + module.caffe_layer_name = layer.name + module.caffe_layer_type = layer_type + module.caffe_input_variable_names = caffe_input_variable_names + module.caffe_output_variable_names = caffe_output_variable_names + module.caffe_loss_weight = caffe_loss_weight + module.caffe_propagate_down = caffe_propagate_down + module.caffe_optimization_params = caffe_optimization_params + for optim_param, p in zip(caffe_optimization_params, module.parameters()): + p.requires_grad = optim_param.get('lr_mult', 1) != 0 + else: + print('Skipping layer [{}, {}, {}]: not found in caffemodel2pytorch.modules dict'.format(layer.name, layer_type, layer.type)) + + if weights is not None: + self.copy_from(weights) + + self.blobs = collections.defaultdict(Blob) + self.blob_loss_weights = {name : loss_weight for module in self.children() for name, loss_weight in zip(module.caffe_output_variable_names, module.caffe_loss_weight)} + + self.train(phase != TEST) + convert_to_gpu_if_enabled(self) + + def forward(self, data = None, **variables): + if data is not None: + variables['data'] = data + numpy = not all(map(torch.is_tensor, variables.values())) + variables = {k : convert_to_gpu_if_enabled(torch.from_numpy(v.copy()) if numpy else v) for k, v in variables.items()} + + for module in [module for module in self.children() if not all(name in variables for name in module.caffe_output_variable_names)]: + for name in module.caffe_input_variable_names: + assert name in variables, 'Variable [{}] does not exist. Pass it as a keyword argument or provide a layer which produces it.'.format(name) + inputs = [variables[name] if propagate_down else variables[name].detach() for name, propagate_down in zip(module.caffe_input_variable_names, module.caffe_propagate_down)] + outputs = module(*inputs) + if not isinstance(outputs, tuple): + outputs = (outputs, ) + variables.update(dict(zip(module.caffe_output_variable_names, outputs))) + + self.blobs.update({k : Blob(data = v, numpy = numpy) for k, v in variables.items()}) + caffe_output_variable_names = set([name for module in self.children() for name in module.caffe_output_variable_names]) - set([name for module in self.children() for name in module.caffe_input_variable_names if name not in module.caffe_output_variable_names]) + return {k : v.detach().cpu().numpy() if numpy else v for k, v in variables.items() if k in caffe_output_variable_names} + + def copy_from(self, weights): + try: + import h5py, numpy + state_dict = self.state_dict() + for k, v in h5py.File(weights, 'r').items(): + if k in state_dict: + state_dict[k].resize_(v.shape).copy_(torch.from_numpy(numpy.array(v))) + print('caffemodel2pytorch: loaded model from [{}] in HDF5 format'.format(weights)) + except Exception as e: + print('caffemodel2pytorch: loading model from [{}] in HDF5 format failed [{}], falling back to caffemodel format'.format(weights, e.message)) + bytes_weights = open(weights).read() + bytes_parsed = self.net_param.ParseFromString(bytes_weights) + if bytes_parsed != len(bytes_weights): + print('caffemodel2pytorch: loading model from [{}] in caffemodel format, WARNING: file length [{}] is not equal to number of parsed bytes [{}]'.format(weights, len(bytes_weights), bytes_parsed)) + for layer in list(self.net_param.layer) + list(self.net_param.layers): + module = getattr(self, layer.name, None) + if module is None: + continue + parameters = {name : convert_to_gpu_if_enabled(torch.FloatTensor(blob.data)).view(list(blob.shape.dim) if len(blob.shape.dim) > 0 else [blob.num, blob.channels, blob.height, blob.width]) for name, blob in zip(['weight', 'bias'], layer.blobs)} + if len(parameters) > 0: + module.set_parameters(**parameters) + print('caffemodel2pytorch: loaded model from [{}] in caffemodel format'.format(weights)) + + def save(self, weights): + import h5py + with h5py.File(weights, 'w') as h: + for k, v in self.state_dict().items(): + h[k] = v.cpu().numpy() + print('caffemodel2pytorch: saved model to [{}] in HDF5 format'.format(weights)) + + @property + def layers(self): + return list(self.children()) + +class Blob(object): + AssignmentAdapter = type('', (object, ), dict(shape = property(lambda self: self.contents.shape), __setitem__ = lambda self, indices, values: setattr(self, 'contents', values))) + + def __init__(self, data = None, diff = None, numpy = False): + self.data_ = data if data is not None else Blob.AssignmentAdapter() + self.diff_ = diff if diff is not None else Blob.AssignmentAdapter() + self.shape_ = None + self.numpy = numpy + + def reshape(self, *args): + self.shape_ = args + + def count(self, *axis): + return reduce(lambda x, y: x * y, self.shape_[slice(*(axis + [-1])[:2])]) + + @property + def data(self): + if self.numpy and isinstance(self.data_, torch.autograd.Variable): + self.data_ = self.data_.detach().cpu().numpy() + return self.data_ + + @property + def diff(self): + if self.numpy and isinstance(self.diff_, torch.autograd.Variable): + self.diff_ = self.diff_.detach().cpu().numpy() + return self.diff_ + + @property + def shape(self): + return self.shape_ if self.shape_ is not None else self.data_.shape + + @property + def num(self): + return self.shape[0] + + @property + def channels(self): + return self.shape[1] + + @property + def height(self): + return self.shape[2] + + @property + def width(self): + return self.shape[3] + +class Layer(torch.autograd.Function): + def __init__(self, caffe_python_layer = None, caffe_input_variable_names = None, caffe_output_variable_names = None, caffe_propagate_down = None): + self.caffe_python_layer = caffe_python_layer + self.caffe_input_variable_names = caffe_input_variable_names + self.caffe_output_variable_names = caffe_output_variable_names + self.caffe_propagate_down = caffe_propagate_down + + def forward(self, *inputs): + bottom = [Blob(data = v.cpu().numpy()) for v in inputs] + top = [Blob() for name in self.caffe_output_variable_names] + + #self.caffe_python_layer.reshape() + self.caffe_python_layer.setup(bottom, top) + self.caffe_python_layer.setup = lambda *args: None + + self.caffe_python_layer.forward(bottom, top) + outputs = tuple(convert_to_gpu_if_enabled(torch.from_numpy(v.data.contents.reshape(*v.shape))) for v in top) + self.save_for_backward(*(inputs + outputs)) + return outputs + + def backward(self, grad_outputs): + inputs, outputs = self.saved_tensors[:len(self.caffe_input_variable_names)], self.saved_tensors[len(self.caffe_input_variable_names):] + bottom = [Blob(data = v.cpu().numpy()) for v in inputs] + top = [Blob(data = output.cpu().numpy(), diff = grad_output.cpu().numpy()) for grad_output, output in zip(grad_outputs, outputs)] + self.caffe_python_layer.backward(top, self.caffe_propagate_down, bottom) + return tuple(convert_to_gpu_if_enabled(torch.from_numpy(blob.diff.contents.reshape(*v.reshape))) if propagate_down else None for v, propagate_down in zip(bottom, self.caffe_propagate_down)) + +class SGDSolver(object): + def __init__(self, solver_prototxt): + solver_param = initialize().SolverParameter() + google.protobuf.text_format.Parse(open(solver_prototxt).read(), solver_param) + solver_param = to_dict(solver_param) + self.net = Net(solver_param.get('train_net') or solver_param.get('net'), phase = TRAIN) + self.iter = 1 + self.iter_size = solver_param.get('iter_size', 1) + self.optimizer_params = dict(lr = solver_param.get('base_lr') / self.iter_size, momentum = solver_param.get('momentum', 0), weight_decay = solver_param.get('weight_decay', 0)) + self.lr_scheduler_params = dict(policy = solver_param.get('lr_policy'), step_size = solver_param.get('stepsize'), gamma = solver_param.get('gamma')) + self.optimizer, self.scheduler = None, None + + def init_optimizer_scheduler(self): + self.optimizer = torch.optim.SGD([dict(params = [param], lr = self.optimizer_params['lr'] * mult.get('lr_mult', 1), weight_decay = self.optimizer_params['weight_decay'] * mult.get('decay_mult', 1), momentum = self.optimizer_params['momentum']) for module in self.net.children() for param, mult in zip(module.parameters(), module.caffe_optimization_params + [{}, {}]) if param.requires_grad]) + self.scheduler = torch.optim.lr_scheduler.StepLR(self.optimizer, step_size = self.lr_scheduler_params['step_size'], gamma = self.lr_scheduler_params['gamma']) if self.lr_scheduler_params.get('policy') == 'step' else type('', (object, ), dict(step = lambda self: None))() + + def step(self, iterations = 1, **inputs): + loss_total = 0.0 + for i in range(iterations): + tic = time.time() + if self.optimizer is not None: + self.optimizer.zero_grad() + + loss_batch = 0 + losses_batch = collections.defaultdict(float) + for j in range(self.iter_size): + outputs = [kv for kv in self.net(**inputs).items() if self.net.blob_loss_weights[kv[0]] != 0] + loss = sum([self.net.blob_loss_weights[k] * v.sum() for k, v in outputs]) + loss_batch += float(loss) / self.iter_size + for k, v in outputs: + losses_batch[k] += float(v.sum()) / self.iter_size + if self.optimizer is None: + self.init_optimizer_scheduler() + self.optimizer.zero_grad() + loss.backward() + + loss_total += loss_batch + self.optimizer.step() + self.scheduler.step() + self.iter += 1 + + log_prefix = self.__module__ + '.' + type(self).__name__ + print('{}] Iteration {}, loss: {}'.format(log_prefix, self.iter, loss_batch)) + for i, (name, loss) in enumerate(sorted(losses_batch.items())): + print('{}] Train net output #{}: {} = {} (* {} = {} loss)'.format(log_prefix, i, name, loss, self.net.blob_loss_weights[name], self.net.blob_loss_weights[name] * loss)) + print('{}] Iteration {}, lr = {}, time = {}'.format(log_prefix, self.iter, self.optimizer_params['lr'], time.time() - tic)) + + return loss_total + +modules = dict( + Convolution = lambda param: Convolution(param), + InnerProduct = lambda param: InnerProduct(param), + Pooling = lambda param: [nn.MaxPool2d, nn.AvgPool2d][param['pool']](kernel_size = first_or(param, 'kernel_size', 1), stride = first_or(param, 'stride', 1), padding = first_or(param, 'pad', 0)), + Softmax = lambda param: nn.Softmax(dim = param.get('axis', -1)), + ReLU = lambda param: nn.ReLU(), + Dropout = lambda param: nn.Dropout(p = param['dropout_ratio']), + Eltwise = lambda param: [torch.mul, torch.add, torch.max][param.get('operation', 1)], + LRN = lambda param: nn.LocalResponseNorm(size = param['local_size'], alpha = param['alpha'], beta = param['beta']) +) + +class FunctionModule(nn.Module): + def __init__(self, forward): + super(FunctionModule, self).__init__() + self.forward_func = forward + + def forward(self, *inputs): + return self.forward_func(*inputs) + +class CaffePythonLayerModule(nn.Module): + def __init__(self, caffe_python_layer, caffe_input_variable_names, caffe_output_variable_names, param_str): + super(CaffePythonLayerModule, self).__init__() + caffe_python_layer.param_str = param_str + self.caffe_python_layer = caffe_python_layer + self.caffe_input_variable_names = caffe_input_variable_names + self.caffe_output_variable_names = caffe_output_variable_names + + def forward(self, *inputs): + return Layer(self.caffe_python_layer, self.caffe_input_variable_names, self.caffe_output_variable_names)(*inputs) + + def __getattr__(self, name): + return nn.Module.__getattr__(self, name) if name in dir(self) else getattr(self.caffe_python_layer, name) + +class Convolution(nn.Conv2d): + def __init__(self, param): + super(Convolution, self).__init__(first_or(param,'group',1), param['num_output'], kernel_size = first_or(param, 'kernel_size', 1), stride = first_or(param, 'stride', 1), padding = first_or(param, 'pad', 0), dilation = first_or(param, 'dilation', 1), groups = first_or(param, 'group', 1)) + self.weight, self.bias = nn.Parameter(), nn.Parameter() + self.weight_init, self.bias_init = param.get('weight_filler', {}), param.get('bias_filler', {}) + + def forward(self, x): + if self.weight.numel() == 0 and self.bias.numel() == 0: + requires_grad = [self.weight.requires_grad, self.bias.requires_grad] + super(Convolution, self).__init__(x.size(1), self.out_channels, kernel_size = self.kernel_size, stride = self.stride, padding = self.padding, dilation = self.dilation) + convert_to_gpu_if_enabled(self) + init_weight_bias(self, requires_grad = requires_grad) + return super(Convolution, self).forward(x) + + def set_parameters(self, weight = None, bias = None): + init_weight_bias(self, weight = weight, bias = bias.view(-1) if bias is not None else bias) + self.in_channels = self.weight.size(1) + +class InnerProduct(nn.Linear): + def __init__(self, param): + super(InnerProduct, self).__init__(1, param['num_output']) + self.weight, self.bias = nn.Parameter(), nn.Parameter() + self.weight_init, self.bias_init = param.get('weight_filler', {}), param.get('bias_filler', {}) + + def forward(self, x): + if self.weight.numel() == 0 and self.bias.numel() == 0: + requires_grad = [self.weight.requires_grad, self.bias.requires_grad] + super(InnerProduct, self).__init__(x.size(1), self.out_features) + convert_to_gpu_if_enabled(self) + init_weight_bias(self, requires_grad = requires_grad) + return super(InnerProduct, self).forward(x if x.size(-1) == self.in_features else x.view(len(x), -1)) + + def set_parameters(self, weight = None, bias = None): + init_weight_bias(self, weight = weight.view(weight.size(-2), weight.size(-1)) if weight is not None else None, bias = bias.view(-1) if bias is not None else None) + self.in_features = self.weight.size(1) + +def init_weight_bias(self, weight = None, bias = None, requires_grad = []): + if weight is not None: + self.weight = nn.Parameter(weight.type_as(self.weight), requires_grad = self.weight.requires_grad) + if bias is not None: + self.bias = nn.Parameter(bias.type_as(self.bias), requires_grad = self.bias.requires_grad) + for name, requires_grad in zip(['weight', 'bias'], requires_grad): + param, init = getattr(self, name), getattr(self, name + '_init') + if init.get('type') == 'gaussian': + nn.init.normal_(param, std = init['std']) + elif init.get('type') == 'constant': + nn.init.constant_(param, val = init['value']) + param.requires_grad = requires_grad + +def convert_to_gpu_if_enabled(obj): + return obj + +def first_or(param, key, default): + return param[key] if isinstance(param.get(key), int) else (param.get(key, []) + [default])[0] + +def to_dict(obj): + return list(map(to_dict, obj)) if isinstance(obj, collections.Iterable) else {} if obj is None else {f.name : converter(v) if f.label != FD.LABEL_REPEATED else list(map(converter, v)) for f, v in obj.ListFields() for converter in [{FD.TYPE_DOUBLE: float, FD.TYPE_SFIXED32: float, FD.TYPE_SFIXED64: float, FD.TYPE_SINT32: int, FD.TYPE_SINT64: int, FD.TYPE_FLOAT: float, FD.TYPE_ENUM: int, FD.TYPE_UINT32: int, FD.TYPE_INT64: int, FD.TYPE_UINT64: int, FD.TYPE_INT32: int, FD.TYPE_FIXED64: float, FD.TYPE_FIXED32: float, FD.TYPE_BOOL: bool, FD.TYPE_STRING: str, FD.TYPE_BYTES: lambda x: x.encode('string_escape'), FD.TYPE_MESSAGE: to_dict}[f.type]]} + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument(metavar = 'model.caffemodel', dest = 'model_caffemodel', help = 'Path to model.caffemodel') + parser.add_argument('-o', dest = 'output_path', help = 'Path to converted model, supported file extensions are: h5, npy, npz, json, pt') + parser.add_argument('--caffe.proto', metavar = '--caffe.proto', dest = 'caffe_proto', help = 'Path to caffe.proto (typically located at CAFFE_ROOT/src/caffe/proto/caffe.proto)', default = 'https://raw.githubusercontent.com/BVLC/caffe/master/src/caffe/proto/caffe.proto') + args = parser.parse_args() + args.output_path = args.output_path or args.model_caffemodel + '.pt' + + net_param = initialize(args.caffe_proto).NetParameter() + net_param.ParseFromString(open(args.model_caffemodel, 'rb').read()) + blobs = {layer.name + '.' + name : dict(data = blob.data, shape = list(blob.shape.dim) if len(blob.shape.dim) > 0 else [blob.num, blob.channels, blob.height, blob.width]) for layer in list(net_param.layer) + list(net_param.layers) for name, blob in zip(['weight', 'bias'], layer.blobs)} + + if args.output_path.endswith('.json'): + import json + with open(args.output_path, 'w') as f: + json.dump(blobs, f) + elif args.output_path.endswith('.h5'): + import h5py, numpy + with h5py.File(args.output_path, 'w') as h: + h.update(**{k : numpy.array(blob['data'], dtype = numpy.float32).reshape(*blob['shape']) for k, blob in blobs.items()}) + elif args.output_path.endswith('.npy') or args.output_path.endswith('.npz'): + import numpy + (numpy.savez if args.output_path[-1] == 'z' else numpy.save)(args.output_path, **{k : numpy.array(blob['data'], dtype = numpy.float32).reshape(*blob['shape']) for k, blob in blobs.items()}) + elif args.output_path.endswith('.pt'): + torch.save({k : torch.FloatTensor(blob['data']).view(*blob['shape']) for k, blob in blobs.items()}, args.output_path) diff --git a/predicting-poverty-education-replication/scripts/use_paper_model/forward_pass.ipynb b/predicting-poverty-education-replication/scripts/use_paper_model/forward_pass.ipynb new file mode 100644 index 0000000..b7e48ab --- /dev/null +++ b/predicting-poverty-education-replication/scripts/use_paper_model/forward_pass.ipynb @@ -0,0 +1,358 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This file uses a Python2 library from Github (https://github.com/vadimkantorov/caffemodel2pytorch) to convert Caffe models into PyTorch. The original model was trained with Caffe. Remarkably, you don't ever have to install caffe for it to work!\n", + "\n", + "I converted it to work on Python3." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "import numpy as np\n", + "import torchvision\n", + "from torchvision import datasets, models, transforms\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_DIR = '..'\n", + "COUNTRIES_DIR = os.path.join(BASE_DIR, 'data', 'countries')\n", + "PROCESSED_DIR = os.path.join(BASE_DIR, 'data', 'processed')\n", + "RESULTS_DIR = os.path.join(BASE_DIR, 'results')\n", + "CNN_TRAIN_IMAGE_DIR = os.path.join(BASE_DIR, 'data', 'cnn_images')" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from caffemodel2pytorch import *" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "caffemodel2pytorch: loading model from [predicting_poverty_trained.caffemodel] in HDF5 format failed [Unable to open file (file signature not found)], falling back to caffemodel format\n", + "caffemodel2pytorch: loaded model from [predicting_poverty_trained.caffemodel] in caffemodel format\n" + ] + } + ], + "source": [ + "model = Net(\n", + " prototxt = 'predicting_poverty_deploy.prototxt',\n", + " weights = 'predicting_poverty_trained.caffemodel',\n", + " caffe_proto = 'https://raw.githubusercontent.com/BVLC/caffe/master/src/caffe/proto/caffe.proto'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Net(\n", + " (conv1): Convolution(3, 64, kernel_size=(11, 11), stride=(4, 4))\n", + " (relu1): ReLU()\n", + " (norm1): LocalResponseNorm(5, alpha=0.0005000000237487257, beta=0.75, k=1.0)\n", + " (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (conv2): Convolution(64, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n", + " (relu2): ReLU()\n", + " (norm2): LocalResponseNorm(5, alpha=0.0005000000237487257, beta=0.75, k=1.0)\n", + " (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (conv3): Convolution(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (relu3): ReLU()\n", + " (conv4): Convolution(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (relu4): ReLU()\n", + " (conv5): Convolution(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (relu5): ReLU()\n", + " (pool5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (conv6): Convolution(256, 4096, kernel_size=(6, 6), stride=(6, 6))\n", + " (relu6): ReLU()\n", + " (conv7): Convolution(4096, 4096, kernel_size=(1, 1), stride=(1, 1))\n", + " (relu7): ReLU()\n", + " (conv8): Convolution(4096, 3, kernel_size=(1, 1), stride=(1, 1))\n", + " (pool6): AvgPool2d(kernel_size=2, stride=1, padding=0)\n", + " (prob): Softmax()\n", + ")" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# we strip the last layers, so the output is just what was at the conv7 layer\n", + "# the paper uses the data at this layer as the \"features\" for the image\n", + "del model.prob, model.pool6, model.conv8, model.relu7" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Net(\n", + " (conv1): Convolution(3, 64, kernel_size=(11, 11), stride=(4, 4))\n", + " (relu1): ReLU()\n", + " (norm1): LocalResponseNorm(5, alpha=0.0005000000237487257, beta=0.75, k=1.0)\n", + " (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (conv2): Convolution(64, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n", + " (relu2): ReLU()\n", + " (norm2): LocalResponseNorm(5, alpha=0.0005000000237487257, beta=0.75, k=1.0)\n", + " (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (conv3): Convolution(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (relu3): ReLU()\n", + " (conv4): Convolution(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (relu4): ReLU()\n", + " (conv5): Convolution(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (relu5): ReLU()\n", + " (pool5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (conv6): Convolution(256, 4096, kernel_size=(6, 6), stride=(6, 6))\n", + " (relu6): ReLU()\n", + " (conv7): Convolution(4096, 4096, kernel_size=(1, 1), stride=(1, 1))\n", + ")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + "model.to(device)\n", + "model.eval()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_images = pd.read_csv(os.path.join(PROCESSED_DIR, 'image_download_actual.csv'))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision import datasets, models, transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "transformer = transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", + " ])\n", + "\n", + "# custom dataset for fast image loading and processing\n", + "# does not follow the usual style of folder -> folder for each class -> image\n", + "# we just want one folder with images\n", + "class ForwardPassDataset(torch.utils.data.Dataset):\n", + " def __init__(self, image_dir, transformer):\n", + " self.image_dir = image_dir\n", + " self.image_list = os.listdir(self.image_dir)\n", + " self.transformer = transformer\n", + "\n", + " def __len__(self):\n", + " return len(self.image_list)\n", + "\n", + " def __getitem__(self, index):\n", + " image_name = self.image_list[index]\n", + "\n", + " # Load image\n", + " X = self.filename_to_im_tensor(self.image_dir + '/' + image_name)\n", + " \n", + " # dataloaders need to return a label, but for the forward pass we don't really care\n", + " return X, -1\n", + " \n", + " def filename_to_im_tensor(self, file):\n", + " im = plt.imread(file)[:,:,:3]\n", + " im = self.transformer(im)\n", + " return im\n", + "\n", + "model.eval() \n", + "classes = [0, 1, 2]\n", + "# shape of final array will be (num_validation_images, 4096)\n", + "# we also want to record the image each index represents\n", + "feats = np.zeros(((~df_images['is_train']).sum(), 4096))\n", + "image_order = []\n", + "i = 0\n", + "for c in classes:\n", + " # use the validation images to do the forward pass\n", + " dataset = ForwardPassDataset(os.path.join(CNN_TRAIN_IMAGE_DIR, 'valid', str(c)), transformer)\n", + " dataloader = torch.utils.data.DataLoader(dataset, batch_size=8, shuffle=False, num_workers=4)\n", + " image_order += dataset.image_list\n", + " # forward pass for this class\n", + " for inputs, _ in tqdm(dataloader):\n", + " inputs = inputs.to(device)\n", + " outputs = model(inputs)\n", + " feats[i:i+len(inputs),:] = outputs.cpu().detach().numpy()\n", + " i += len(inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "forward_pass_df = pd.DataFrame.from_dict({'image_name': image_order, 'feat_index': np.arange(len(image_order))})\n", + "forward_pass_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_consumption = pd.merge(left=df_images, right=forward_pass_df, on='image_name')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# have we maintained all validation images?\n", + "assert len(df_consumption) == (~df_images['is_train']).sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aggregate Features\n", + "For each country, we aggregate the image features per cluster and save them to results/country/cnn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "country_abbrv = ['mw', 'eth', 'ng']\n", + "country_dir = ['malawi_2016', 'ethiopia_2015', 'nigeria_2015']\n", + "\n", + "for ca, cd in zip(country_abbrv, country_dir):\n", + " df_c = df_consumption[df_consumption['country'] == ca]\n", + " group = df_c.groupby(['cluster_lat', 'cluster_lon'])\n", + " x = np.zeros((len(group), 4096))\n", + " cluster_list = [] # the corresponding clusters (lat, lon) to the x aggregate feature array\n", + " for i, g in enumerate(group):\n", + " lat, lon = g[0]\n", + " im_sub = df_consumption[(df_consumption['cluster_lat'] == lat) & (df_consumption['cluster_lon'] == lon)].reset_index(drop=True)\n", + " agg_feats = np.zeros((len(im_sub), 4096))\n", + " for j, d in im_sub.iterrows():\n", + " agg_feats[j,:] = feats[d.feat_index]\n", + " agg_feats = agg_feats.mean(axis=0) # averages the features across all images in the cluster\n", + "\n", + " x[i,:] = agg_feats\n", + " cluster_list.append([lat, lon])\n", + " # save to the correct directory\n", + " save_dir = os.path.join(RESULTS_DIR, cd, 'cnn')\n", + " os.makedirs(save_dir, exist_ok=True)\n", + " np.save(os.path.join(save_dir, 'cluster_feats.npy'), x)\n", + " pickle.dump(cluster_list, open(os.path.join(save_dir, 'cluster_order.pkl'), 'wb')) \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "name": "pytorch-gpu.1-4.m46", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/pytorch-gpu.1-4:m46" + }, + "kernelspec": { + "display_name": "predicting-poverty-replication", + "language": "python", + "name": "predicting-poverty-replication" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predicting-poverty-education-replication/scripts/use_paper_model/predicting_poverty_deploy.prototxt b/predicting-poverty-education-replication/scripts/use_paper_model/predicting_poverty_deploy.prototxt new file mode 100644 index 0000000..09e56d1 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/use_paper_model/predicting_poverty_deploy.prototxt @@ -0,0 +1,282 @@ +name: "POVERTY_PREDICT" +input: "data" +input_dim: 32 +input_dim: 3 +input_dim: 400 +input_dim: 400 + +layers { + bottom: "data" + top: "conv1" + name: "conv1" + type: CONVOLUTION + convolution_param { + num_output: 64 + kernel_size: 11 + stride: 4 + + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + + } + blobs_lr: 0 + blobs_lr: 0 +} + +layers { + bottom: "conv1" + top: "conv1" + name: "relu1" + type: RELU +} +layers { + bottom: "conv1" + top: "norm1" + name: "norm1" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0005 + beta: 0.75 + k: 2 + } +} +layers { + bottom: "norm1" + top: "pool1" + name: "pool1" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool1" + top: "conv2" + name: "conv2" + type: CONVOLUTION + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layers { + bottom: "conv2" + top: "conv2" + name: "relu2" + type: RELU +} +layers { + bottom: "conv2" + top: "norm2" + name: "norm2" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0005 + beta: 0.75 + k: 2 + } +} +layers { + bottom: "norm2" + top: "pool2" + name: "pool2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool2" + top: "conv3" + name: "conv3" + type: CONVOLUTION + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } + blobs_lr:0.1 + blobs_lr:1 +} +layers { + bottom: "conv3" + top: "conv3" + name: "relu3" + type: RELU +} +layers { + bottom: "conv3" + top: "conv4" + name: "conv4" + type: CONVOLUTION + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } + blobs_lr:0.1 + blobs_lr:1 +} +layers { + bottom: "conv4" + top: "conv4" + name: "relu4" + type: RELU +} +layers { + bottom: "conv4" + top: "conv5" + name: "conv5" + type: CONVOLUTION + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } + blobs_lr:0.1 + blobs_lr:1 +} +layers { + bottom: "conv5" + top: "conv5" + name: "relu5" + type: RELU +} +layers { + bottom: "conv5" + top: "pool5" + name: "pool5" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool5" + top: "conv6" + name: "conv6" + type: CONVOLUTION + convolution_param { + num_output: 4096 + pad: 0 + kernel_size: 6 + stride:6 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layers { + bottom: "conv6" + top: "conv6" + name: "relu6" + type: RELU +} +layers { + bottom: "conv6" + top: "conv7" + name: "conv7" + type: CONVOLUTION + convolution_param { + num_output: 4096 + pad: 0 + kernel_size: 1 + stride:1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layers { + bottom: "conv7" + top: "conv7" + name: "relu7" + type: RELU +} +layers { + bottom: "conv7" + top: "conv8" + name: "conv8" + type: CONVOLUTION + convolution_param { + num_output: 3 + pad: 0 + kernel_size: 1 + stride:1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layers { + bottom: "conv8" + top: "pool6" + name: "pool6" + type: POOLING + pooling_param { + pool: AVE + kernel_size:2 + stride: 1 + } +} + +layers { + bottom: "pool6" + top: "prob" + name: "prob" + type: SOFTMAX +} diff --git a/predicting-poverty-education-replication/scripts/utils/__init__.py b/predicting-poverty-education-replication/scripts/utils/__init__.py new file mode 100644 index 0000000..342d8b0 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/utils/__init__.py @@ -0,0 +1,4 @@ +from .utils import * +from .google_downloader import * +from .planet_downloader import * +from .ridge_training import * diff --git a/predicting-poverty-education-replication/scripts/utils/__pycache__/__init__.cpython-37.pyc b/predicting-poverty-education-replication/scripts/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..29c8079 Binary files /dev/null and b/predicting-poverty-education-replication/scripts/utils/__pycache__/__init__.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/scripts/utils/__pycache__/google_downloader.cpython-37.pyc b/predicting-poverty-education-replication/scripts/utils/__pycache__/google_downloader.cpython-37.pyc new file mode 100644 index 0000000..4990eea Binary files /dev/null and b/predicting-poverty-education-replication/scripts/utils/__pycache__/google_downloader.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/scripts/utils/__pycache__/planet_downloader.cpython-37.pyc b/predicting-poverty-education-replication/scripts/utils/__pycache__/planet_downloader.cpython-37.pyc new file mode 100644 index 0000000..897d6b6 Binary files /dev/null and b/predicting-poverty-education-replication/scripts/utils/__pycache__/planet_downloader.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/scripts/utils/__pycache__/ridge_training.cpython-37.pyc b/predicting-poverty-education-replication/scripts/utils/__pycache__/ridge_training.cpython-37.pyc new file mode 100644 index 0000000..447a99a Binary files /dev/null and b/predicting-poverty-education-replication/scripts/utils/__pycache__/ridge_training.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/scripts/utils/__pycache__/utils.cpython-37.pyc b/predicting-poverty-education-replication/scripts/utils/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000..16a6c43 Binary files /dev/null and b/predicting-poverty-education-replication/scripts/utils/__pycache__/utils.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/scripts/utils/google_downloader.py b/predicting-poverty-education-replication/scripts/utils/google_downloader.py new file mode 100644 index 0000000..48b318a --- /dev/null +++ b/predicting-poverty-education-replication/scripts/utils/google_downloader.py @@ -0,0 +1,18 @@ +''' +Very simple download interface to download images from Google's Static Maps API +''' + +class GoogleDownloader: + def __init__(self, access_token): + self.access_token = access_token + self.url = 'https://maps.googleapis.com/maps/api/staticmap?center={},{}&zoom={}&size=400x400&maptype=satellite&key={}' + + def download(self, lat, long, zoom): + res = requests.get(self.url.format(lat, long, zoom, self.access_token)) + # server needs to make image available, takes a few seconds + if res.status_code == 403: + return 'RETRY' + assert res.status_code < 400, print(f'Error - failed to download {lat}, {long}, {zoom}') + image = plt.imread(BytesIO(res.content)) + return image + \ No newline at end of file diff --git a/predicting-poverty-education-replication/scripts/utils/planet_downloader.py b/predicting-poverty-education-replication/scripts/utils/planet_downloader.py new file mode 100644 index 0000000..909cc12 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/utils/planet_downloader.py @@ -0,0 +1,172 @@ +''' +More complex interface than Google's to download images from Planet. Unlike Google, Planet allows us to query images at a certain time. However, Planet's API is not great and there are a variety of issues ranging from a little annoying to fairly serious. This interface simplifies the use from a user's perspective. +''' + +import math +import requests +import matplotlib.pyplot as plt +from requests.auth import HTTPBasicAuth +import os +import json +from io import BytesIO +from shapely.geometry import Polygon + + +class PlanetDownloader: + def __init__(self, api_key, item_type='PSScene3Band'): + self.api_key = api_key + self.item_type = item_type + + def create_cords(lat, lon, zoom): + xtile, ytile = deg_to_tile(lat, lon, zoom) + + coords = [tilexy_to_deg(xtile, ytile, zoom, a, b) for a,b in [(0,0), (0,255), (255,255), (255,0)]] + return [[b,a] for a,b in coords] + + def download_image(self, lat, lon, min_year, min_month, max_year, max_month, zoom=14, cloud_max=0.05): + ''' + Use this method to download an image at a lat, lon in some time range + If multiple images are available, the latest is downloaded + + I would not increase zoom + cloud_max is the maximum cloud filter, defaulting to 5% + ''' + assert 0 <= cloud_max <= 1.0 + if min_month < 10: + min_month = '0' + str(min_month) + + if max_month < 10: + max_month = '0' + str(max_month) + + cords = PlanetDownloader.create_cords(lat, lon, zoom) + geo_json_geometry = { + "type": "Polygon", + "coordinates": [ + cords + ], + + } + + # filter for items the overlap with our chosen geometry + geometry_filter = { + "type": "GeometryFilter", + "field_name": "geometry", + "config": geo_json_geometry, + } + + # filter images acquired in a certain date range + date_range_filter = { + "type": "DateRangeFilter", + "field_name": "acquired", + "config": { + "gte": "{}-{}-01T00:00:00.000Z".format(min_year, min_month), + "lte": "{}-{}-01T00:00:00.000Z".format(max_year, max_month) + } + } + + # filter any images which are more than 50% clouds + cloud_cover_filter = { + "type": "RangeFilter", + "field_name": "cloud_cover", + "config": { + "lte": cloud_max + } + } + + # create a filter that combines our geo and date filters + # could also use an "OrFilter" + reservoir = { + "type": "AndFilter", + "config": [geometry_filter, date_range_filter, cloud_cover_filter] + } + + # Search API request object + search_endpoint_request = { + "item_types": [self.item_type], + "filter": reservoir + } + + result = \ + requests.post( + 'https://api.planet.com/data/v1/quick-search', + auth=HTTPBasicAuth(self.api_key, ''), + json=search_endpoint_request) + + res = json.loads(result.text) + + x, y = deg_to_tile(lat, lon, zoom) + item_id = None + + if len(res['features']) == 0: + # print('No image found, try widening your search or using a different satellite') + return None + else: + # planet for some reason will return results that don't even contain the requested geometry -_- + # this will look for the LATEST (closest to the max time) match that actually contains our geometry + polya = Polygon(cords) + b_cords = [tilexy_to_deg(x,y,zoom,a,b) for a,b in [(0,0), (1,0), (1,1), (0,1)]] + polyb = Polygon([(b,a) for (a,b) in b_cords]) + + for idx in range(len(res['features']) - 1, -1, -1): + polyc = Polygon(res['features'][idx]['geometry']['coordinates'][0]) + + if polyc.contains(polya) and polyc.contains(polyb): + item_id = res['features'][idx]['id'] + break + + if item_id is None: + # print('No good images found') + return None + + url = 'https://tiles0.planet.com/data/v1/{}/{}/{}/{}/{}.png?api_key={}'.format(self.item_type, item_id, zoom, x, y, self.api_key) + + res = requests.get(url) + if res.status_code >= 400: + # print('download error') + return None + + return plt.imread(BytesIO(res.content)) + + +""" +Important geoconversion functions +""" + +def tilexy_to_deg(xtile, ytile, zoom, x, y): + """Converts a specific location on a tile (x,y) to geocoordinates.""" + decimal_x = xtile + x / 256 + decimal_y = ytile + y / 256 + n = 2.0 ** zoom + lon_deg = decimal_x / n * 360.0 - 180.0 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * decimal_y / n))) + lat_deg = math.degrees(lat_rad) + return (lat_deg, lon_deg) + +def deg_to_tilexy(lat_deg, lon_deg, zoom): + """Converts geocoordinates to an x,y position on a tile.""" + lat_rad = math.radians(lat_deg) + n = 2.0 ** zoom + x = ((lon_deg + 180.0) / 360.0 * n) + y = ((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) + / math.pi) / 2.0 * n) + return (int((x % 1) * 256), int((y % 1) * 256)) + +def tile_to_deg(xtile, ytile, zoom): + """Returns the coordinates of the northwest corner of a Slippy Map + x,y tile""" + n = 2.0 ** zoom + lon_deg = xtile / n * 360.0 - 180.0 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n))) + lat_deg = math.degrees(lat_rad) + return (lat_deg, lon_deg) + +def deg_to_tile(lat_deg, lon_deg, zoom): + """Converts coordinates into the nearest x,y Slippy Map tile""" + lat_rad = math.radians(lat_deg) + n = 2.0 ** zoom + xtile = int((lon_deg + 180.0) / 360.0 * n) + ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) + / math.pi) / 2.0 * n) + return (xtile, ytile) + + diff --git a/predicting-poverty-education-replication/scripts/utils/ridge_training.py b/predicting-poverty-education-replication/scripts/utils/ridge_training.py new file mode 100644 index 0000000..1818681 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/utils/ridge_training.py @@ -0,0 +1,153 @@ +# This is based on code from the Jean et al Github that is modified to work with Python3 and our metrics + +import numpy as np +import pandas as pd +import random +from scipy import stats +from sklearn.preprocessing import StandardScaler +from sklearn.model_selection import KFold +import sklearn.linear_model as linear_model +import matplotlib.pyplot as plt +import sklearn.metrics as metrics +from sklearn.cluster import KMeans + +def run_randomized_cv(X, y, k=5, k_inner=5, random_seed=7, points=10, + alpha_low=1, alpha_high=5, to_print=False): + """ + Run randomized CV on given X and y + Returns r2, yhat + """ + np.random.seed(random_seed) + alphas = np.logspace(alpha_low, alpha_high, points) + r2s = [] + y_hat = np.zeros_like(y) + kf = KFold(n_splits=k, shuffle=True) + fold = 0 + for train_idx, test_idx in kf.split(X): + if to_print: + print(f"fold: {fold}", end='\r') + r2, y_p = evaluate_fold(X, y, train_idx, test_idx, k_inner, alphas, to_print) + r2s.append(r2) + y_hat[test_idx] = y_p + fold += 1 + return np.mean(r2s), y_hat + + +def scale_features(X_train, X_test): + """ + Scales features using StandardScaler. + """ + X_scaler = StandardScaler(with_mean=True, with_std=False) + X_train = X_scaler.fit_transform(X_train) + X_test = X_scaler.transform(X_test) + return X_train, X_test + + +def train_and_predict_ridge(alpha, X_train, y_train, X_test): + """ + Trains ridge model and predicts test set. + """ + ridge = linear_model.Ridge(alpha) + ridge.fit(X_train, y_train) + y_hat = ridge.predict(X_test) + return y_hat + +def find_best_alpha(X, y, k_inner, alphas, to_print=False): + """ + Finds the best alpha in an inner fully randomized CV loop. + """ + kf = KFold(n_splits=k_inner, shuffle=True) + best_alpha = 0 + best_r2 = 0 + for idx, alpha in enumerate(alphas): + y_hat = np.zeros_like(y) + for train_idx, test_idx in kf.split(X): + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + X_train, X_test = scale_features(X_train, X_test) + y_hat[test_idx] = train_and_predict_ridge(alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y, y_hat) + if r2 > best_r2: + best_alpha = alpha + best_r2 = r2 + if to_print: + print(best_alpha) + return best_alpha + + +def evaluate_fold(X, y, train_idx, test_idx, k_inner, alphas, to_print=False): + """ + Evaluates one fold of outer CV. + """ + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + best_alpha = find_best_alpha(X_train, y_train, k_inner, alphas, to_print) + X_train, X_test = scale_features(X_train, X_test) + y_test_hat = train_and_predict_ridge(best_alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y_test, y_test_hat) + return r2, y_test_hat + + +def run_spatial_cv(X, y, groups, k_inner=5, random_seed=7, points=10, + alpha_low=1, alpha_high=5, to_print=False): + """ + Run randomized CV on given X and y + Returns r2, yhat + """ + np.random.seed(random_seed) + alphas = np.logspace(alpha_low, alpha_high, points) + k = int(groups.max() + 1) + r2s = [] + y_hat = np.zeros_like(y) + fold = 0 + for i in range(k): + train_idx = groups != i + test_idx = groups == i + if to_print: + print(f"fold: {fold}", end='\r') + r2, y_p = evaluate_fold(X, y, train_idx, test_idx, k_inner, alphas) + # could use this function to do inner-fold spatial validation + # r2, y_p = evaluate_spatial_fold(X, y, groups, train_idx, test_idx, alphas) + r2s.append(r2) + y_hat[test_idx] = y_p + fold += 1 + return np.mean(r2s), y_hat + +def evaluate_spatial_fold(X, y, groups, train_idx, test_idx, alphas): + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + groups_train = groups[train_idx] + best_alpha = find_best_alpha_spatial(X_train, y_train, groups_train, alphas) + X_train, X_test = scale_features(X_train, X_test) + y_test_hat = train_and_predict_ridge(best_alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y_test, y_test_hat) + return r2, y_test_hat + +def find_best_alpha_spatial(X, y, groups, alphas): + """ + Finds the best alpha in an inner spatial CV loop. + """ + gs = np.unique(groups) + best_alpha = 0 + best_r2 = 0 + for alpha in alphas: + y_hat = np.zeros_like(y) + for g in gs: + # hold out each g in the inner spatial loop while choosing the best alpha + train_idx = groups != g + test_idx = groups == g + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + X_train, X_test = scale_features(X_train, X_test) + y_hat[test_idx] = train_and_predict_ridge(alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y, y_hat) + if r2 > best_r2: + best_alpha = alpha + best_r2 = r2 + return best_alpha + +def assign_groups(df, k, random_seed=7): + ''' Assign clusters in df (columns cluster_lat, cluster_lon) into k groups, also returns cluster centers''' + np.random.seed(random_seed) + km = KMeans(k) + return km.fit_predict(df[['cluster_lat', 'cluster_lon']]), km.cluster_centers_ diff --git a/predicting-poverty-education-replication/scripts/utils/utils.py b/predicting-poverty-education-replication/scripts/utils/utils.py new file mode 100644 index 0000000..22308e1 --- /dev/null +++ b/predicting-poverty-education-replication/scripts/utils/utils.py @@ -0,0 +1,32 @@ +''' +Handful of utility functions used throughout the repo +''' + +import math +import pandas as pd + +def merge_on_lat_lon(df1, df2, keys=['cluster_lat', 'cluster_lon'], how='inner'): + """ + Allows two dataframes to be merged on lat/lon + Necessary because pandas has trouble merging on floats (understandably so) + """ + df1 = df1.copy() + df2 = df2.copy() + + # must use ints for merging, as floats induce errors + df1['merge_lat'] = (10000 * df1[keys[0]]).astype(int) + df1['merge_lon'] = (10000 * df1[keys[1]]).astype(int) + + df2['merge_lat'] = (10000 * df2[keys[0]]).astype(int) + df2['merge_lon'] = (10000 * df2[keys[1]]).astype(int) + + df2.drop(keys, axis=1, inplace=True) + merged = pd.merge(df1, df2, on=['merge_lat', 'merge_lon'], how=how) + merged.drop(['merge_lat', 'merge_lon'], axis=1, inplace=True) + return merged + +def create_space(lat, lon, s=10): + """Creates a s km x s km square centered on (lat, lon)""" + v = (180/math.pi)*(500/6378137)*s # roughly 0.045 for s=10 + return lat - v, lon - v, lat + v, lon + v + \ No newline at end of file diff --git a/predicting-poverty-education-replication/utils/__init__.py b/predicting-poverty-education-replication/utils/__init__.py new file mode 100644 index 0000000..342d8b0 --- /dev/null +++ b/predicting-poverty-education-replication/utils/__init__.py @@ -0,0 +1,4 @@ +from .utils import * +from .google_downloader import * +from .planet_downloader import * +from .ridge_training import * diff --git a/predicting-poverty-education-replication/utils/__pycache__/__init__.cpython-37.pyc b/predicting-poverty-education-replication/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..29c8079 Binary files /dev/null and b/predicting-poverty-education-replication/utils/__pycache__/__init__.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/utils/__pycache__/google_downloader.cpython-37.pyc b/predicting-poverty-education-replication/utils/__pycache__/google_downloader.cpython-37.pyc new file mode 100644 index 0000000..4990eea Binary files /dev/null and b/predicting-poverty-education-replication/utils/__pycache__/google_downloader.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/utils/__pycache__/planet_downloader.cpython-37.pyc b/predicting-poverty-education-replication/utils/__pycache__/planet_downloader.cpython-37.pyc new file mode 100644 index 0000000..897d6b6 Binary files /dev/null and b/predicting-poverty-education-replication/utils/__pycache__/planet_downloader.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/utils/__pycache__/ridge_training.cpython-37.pyc b/predicting-poverty-education-replication/utils/__pycache__/ridge_training.cpython-37.pyc new file mode 100644 index 0000000..447a99a Binary files /dev/null and b/predicting-poverty-education-replication/utils/__pycache__/ridge_training.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/utils/__pycache__/utils.cpython-37.pyc b/predicting-poverty-education-replication/utils/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000..16a6c43 Binary files /dev/null and b/predicting-poverty-education-replication/utils/__pycache__/utils.cpython-37.pyc differ diff --git a/predicting-poverty-education-replication/utils/google_downloader.py b/predicting-poverty-education-replication/utils/google_downloader.py new file mode 100644 index 0000000..48b318a --- /dev/null +++ b/predicting-poverty-education-replication/utils/google_downloader.py @@ -0,0 +1,18 @@ +''' +Very simple download interface to download images from Google's Static Maps API +''' + +class GoogleDownloader: + def __init__(self, access_token): + self.access_token = access_token + self.url = 'https://maps.googleapis.com/maps/api/staticmap?center={},{}&zoom={}&size=400x400&maptype=satellite&key={}' + + def download(self, lat, long, zoom): + res = requests.get(self.url.format(lat, long, zoom, self.access_token)) + # server needs to make image available, takes a few seconds + if res.status_code == 403: + return 'RETRY' + assert res.status_code < 400, print(f'Error - failed to download {lat}, {long}, {zoom}') + image = plt.imread(BytesIO(res.content)) + return image + \ No newline at end of file diff --git a/predicting-poverty-education-replication/utils/planet_downloader.py b/predicting-poverty-education-replication/utils/planet_downloader.py new file mode 100644 index 0000000..909cc12 --- /dev/null +++ b/predicting-poverty-education-replication/utils/planet_downloader.py @@ -0,0 +1,172 @@ +''' +More complex interface than Google's to download images from Planet. Unlike Google, Planet allows us to query images at a certain time. However, Planet's API is not great and there are a variety of issues ranging from a little annoying to fairly serious. This interface simplifies the use from a user's perspective. +''' + +import math +import requests +import matplotlib.pyplot as plt +from requests.auth import HTTPBasicAuth +import os +import json +from io import BytesIO +from shapely.geometry import Polygon + + +class PlanetDownloader: + def __init__(self, api_key, item_type='PSScene3Band'): + self.api_key = api_key + self.item_type = item_type + + def create_cords(lat, lon, zoom): + xtile, ytile = deg_to_tile(lat, lon, zoom) + + coords = [tilexy_to_deg(xtile, ytile, zoom, a, b) for a,b in [(0,0), (0,255), (255,255), (255,0)]] + return [[b,a] for a,b in coords] + + def download_image(self, lat, lon, min_year, min_month, max_year, max_month, zoom=14, cloud_max=0.05): + ''' + Use this method to download an image at a lat, lon in some time range + If multiple images are available, the latest is downloaded + + I would not increase zoom + cloud_max is the maximum cloud filter, defaulting to 5% + ''' + assert 0 <= cloud_max <= 1.0 + if min_month < 10: + min_month = '0' + str(min_month) + + if max_month < 10: + max_month = '0' + str(max_month) + + cords = PlanetDownloader.create_cords(lat, lon, zoom) + geo_json_geometry = { + "type": "Polygon", + "coordinates": [ + cords + ], + + } + + # filter for items the overlap with our chosen geometry + geometry_filter = { + "type": "GeometryFilter", + "field_name": "geometry", + "config": geo_json_geometry, + } + + # filter images acquired in a certain date range + date_range_filter = { + "type": "DateRangeFilter", + "field_name": "acquired", + "config": { + "gte": "{}-{}-01T00:00:00.000Z".format(min_year, min_month), + "lte": "{}-{}-01T00:00:00.000Z".format(max_year, max_month) + } + } + + # filter any images which are more than 50% clouds + cloud_cover_filter = { + "type": "RangeFilter", + "field_name": "cloud_cover", + "config": { + "lte": cloud_max + } + } + + # create a filter that combines our geo and date filters + # could also use an "OrFilter" + reservoir = { + "type": "AndFilter", + "config": [geometry_filter, date_range_filter, cloud_cover_filter] + } + + # Search API request object + search_endpoint_request = { + "item_types": [self.item_type], + "filter": reservoir + } + + result = \ + requests.post( + 'https://api.planet.com/data/v1/quick-search', + auth=HTTPBasicAuth(self.api_key, ''), + json=search_endpoint_request) + + res = json.loads(result.text) + + x, y = deg_to_tile(lat, lon, zoom) + item_id = None + + if len(res['features']) == 0: + # print('No image found, try widening your search or using a different satellite') + return None + else: + # planet for some reason will return results that don't even contain the requested geometry -_- + # this will look for the LATEST (closest to the max time) match that actually contains our geometry + polya = Polygon(cords) + b_cords = [tilexy_to_deg(x,y,zoom,a,b) for a,b in [(0,0), (1,0), (1,1), (0,1)]] + polyb = Polygon([(b,a) for (a,b) in b_cords]) + + for idx in range(len(res['features']) - 1, -1, -1): + polyc = Polygon(res['features'][idx]['geometry']['coordinates'][0]) + + if polyc.contains(polya) and polyc.contains(polyb): + item_id = res['features'][idx]['id'] + break + + if item_id is None: + # print('No good images found') + return None + + url = 'https://tiles0.planet.com/data/v1/{}/{}/{}/{}/{}.png?api_key={}'.format(self.item_type, item_id, zoom, x, y, self.api_key) + + res = requests.get(url) + if res.status_code >= 400: + # print('download error') + return None + + return plt.imread(BytesIO(res.content)) + + +""" +Important geoconversion functions +""" + +def tilexy_to_deg(xtile, ytile, zoom, x, y): + """Converts a specific location on a tile (x,y) to geocoordinates.""" + decimal_x = xtile + x / 256 + decimal_y = ytile + y / 256 + n = 2.0 ** zoom + lon_deg = decimal_x / n * 360.0 - 180.0 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * decimal_y / n))) + lat_deg = math.degrees(lat_rad) + return (lat_deg, lon_deg) + +def deg_to_tilexy(lat_deg, lon_deg, zoom): + """Converts geocoordinates to an x,y position on a tile.""" + lat_rad = math.radians(lat_deg) + n = 2.0 ** zoom + x = ((lon_deg + 180.0) / 360.0 * n) + y = ((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) + / math.pi) / 2.0 * n) + return (int((x % 1) * 256), int((y % 1) * 256)) + +def tile_to_deg(xtile, ytile, zoom): + """Returns the coordinates of the northwest corner of a Slippy Map + x,y tile""" + n = 2.0 ** zoom + lon_deg = xtile / n * 360.0 - 180.0 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n))) + lat_deg = math.degrees(lat_rad) + return (lat_deg, lon_deg) + +def deg_to_tile(lat_deg, lon_deg, zoom): + """Converts coordinates into the nearest x,y Slippy Map tile""" + lat_rad = math.radians(lat_deg) + n = 2.0 ** zoom + xtile = int((lon_deg + 180.0) / 360.0 * n) + ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) + / math.pi) / 2.0 * n) + return (xtile, ytile) + + diff --git a/predicting-poverty-education-replication/utils/ridge_training.py b/predicting-poverty-education-replication/utils/ridge_training.py new file mode 100644 index 0000000..1818681 --- /dev/null +++ b/predicting-poverty-education-replication/utils/ridge_training.py @@ -0,0 +1,153 @@ +# This is based on code from the Jean et al Github that is modified to work with Python3 and our metrics + +import numpy as np +import pandas as pd +import random +from scipy import stats +from sklearn.preprocessing import StandardScaler +from sklearn.model_selection import KFold +import sklearn.linear_model as linear_model +import matplotlib.pyplot as plt +import sklearn.metrics as metrics +from sklearn.cluster import KMeans + +def run_randomized_cv(X, y, k=5, k_inner=5, random_seed=7, points=10, + alpha_low=1, alpha_high=5, to_print=False): + """ + Run randomized CV on given X and y + Returns r2, yhat + """ + np.random.seed(random_seed) + alphas = np.logspace(alpha_low, alpha_high, points) + r2s = [] + y_hat = np.zeros_like(y) + kf = KFold(n_splits=k, shuffle=True) + fold = 0 + for train_idx, test_idx in kf.split(X): + if to_print: + print(f"fold: {fold}", end='\r') + r2, y_p = evaluate_fold(X, y, train_idx, test_idx, k_inner, alphas, to_print) + r2s.append(r2) + y_hat[test_idx] = y_p + fold += 1 + return np.mean(r2s), y_hat + + +def scale_features(X_train, X_test): + """ + Scales features using StandardScaler. + """ + X_scaler = StandardScaler(with_mean=True, with_std=False) + X_train = X_scaler.fit_transform(X_train) + X_test = X_scaler.transform(X_test) + return X_train, X_test + + +def train_and_predict_ridge(alpha, X_train, y_train, X_test): + """ + Trains ridge model and predicts test set. + """ + ridge = linear_model.Ridge(alpha) + ridge.fit(X_train, y_train) + y_hat = ridge.predict(X_test) + return y_hat + +def find_best_alpha(X, y, k_inner, alphas, to_print=False): + """ + Finds the best alpha in an inner fully randomized CV loop. + """ + kf = KFold(n_splits=k_inner, shuffle=True) + best_alpha = 0 + best_r2 = 0 + for idx, alpha in enumerate(alphas): + y_hat = np.zeros_like(y) + for train_idx, test_idx in kf.split(X): + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + X_train, X_test = scale_features(X_train, X_test) + y_hat[test_idx] = train_and_predict_ridge(alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y, y_hat) + if r2 > best_r2: + best_alpha = alpha + best_r2 = r2 + if to_print: + print(best_alpha) + return best_alpha + + +def evaluate_fold(X, y, train_idx, test_idx, k_inner, alphas, to_print=False): + """ + Evaluates one fold of outer CV. + """ + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + best_alpha = find_best_alpha(X_train, y_train, k_inner, alphas, to_print) + X_train, X_test = scale_features(X_train, X_test) + y_test_hat = train_and_predict_ridge(best_alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y_test, y_test_hat) + return r2, y_test_hat + + +def run_spatial_cv(X, y, groups, k_inner=5, random_seed=7, points=10, + alpha_low=1, alpha_high=5, to_print=False): + """ + Run randomized CV on given X and y + Returns r2, yhat + """ + np.random.seed(random_seed) + alphas = np.logspace(alpha_low, alpha_high, points) + k = int(groups.max() + 1) + r2s = [] + y_hat = np.zeros_like(y) + fold = 0 + for i in range(k): + train_idx = groups != i + test_idx = groups == i + if to_print: + print(f"fold: {fold}", end='\r') + r2, y_p = evaluate_fold(X, y, train_idx, test_idx, k_inner, alphas) + # could use this function to do inner-fold spatial validation + # r2, y_p = evaluate_spatial_fold(X, y, groups, train_idx, test_idx, alphas) + r2s.append(r2) + y_hat[test_idx] = y_p + fold += 1 + return np.mean(r2s), y_hat + +def evaluate_spatial_fold(X, y, groups, train_idx, test_idx, alphas): + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + groups_train = groups[train_idx] + best_alpha = find_best_alpha_spatial(X_train, y_train, groups_train, alphas) + X_train, X_test = scale_features(X_train, X_test) + y_test_hat = train_and_predict_ridge(best_alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y_test, y_test_hat) + return r2, y_test_hat + +def find_best_alpha_spatial(X, y, groups, alphas): + """ + Finds the best alpha in an inner spatial CV loop. + """ + gs = np.unique(groups) + best_alpha = 0 + best_r2 = 0 + for alpha in alphas: + y_hat = np.zeros_like(y) + for g in gs: + # hold out each g in the inner spatial loop while choosing the best alpha + train_idx = groups != g + test_idx = groups == g + X_train, X_test = X[train_idx], X[test_idx] + y_train, y_test = y[train_idx], y[test_idx] + X_train, X_test = scale_features(X_train, X_test) + y_hat[test_idx] = train_and_predict_ridge(alpha, X_train, y_train, X_test) + r2 = metrics.r2_score(y, y_hat) + if r2 > best_r2: + best_alpha = alpha + best_r2 = r2 + return best_alpha + +def assign_groups(df, k, random_seed=7): + ''' Assign clusters in df (columns cluster_lat, cluster_lon) into k groups, also returns cluster centers''' + np.random.seed(random_seed) + km = KMeans(k) + return km.fit_predict(df[['cluster_lat', 'cluster_lon']]), km.cluster_centers_ diff --git a/predicting-poverty-education-replication/utils/utils.py b/predicting-poverty-education-replication/utils/utils.py new file mode 100644 index 0000000..22308e1 --- /dev/null +++ b/predicting-poverty-education-replication/utils/utils.py @@ -0,0 +1,32 @@ +''' +Handful of utility functions used throughout the repo +''' + +import math +import pandas as pd + +def merge_on_lat_lon(df1, df2, keys=['cluster_lat', 'cluster_lon'], how='inner'): + """ + Allows two dataframes to be merged on lat/lon + Necessary because pandas has trouble merging on floats (understandably so) + """ + df1 = df1.copy() + df2 = df2.copy() + + # must use ints for merging, as floats induce errors + df1['merge_lat'] = (10000 * df1[keys[0]]).astype(int) + df1['merge_lon'] = (10000 * df1[keys[1]]).astype(int) + + df2['merge_lat'] = (10000 * df2[keys[0]]).astype(int) + df2['merge_lon'] = (10000 * df2[keys[1]]).astype(int) + + df2.drop(keys, axis=1, inplace=True) + merged = pd.merge(df1, df2, on=['merge_lat', 'merge_lon'], how=how) + merged.drop(['merge_lat', 'merge_lon'], axis=1, inplace=True) + return merged + +def create_space(lat, lon, s=10): + """Creates a s km x s km square centered on (lat, lon)""" + v = (180/math.pi)*(500/6378137)*s # roughly 0.045 for s=10 + return lat - v, lon - v, lat + v, lon + v + \ No newline at end of file