/ColdSpots

Identifying Remote Communities at Scale: A Machine Learning Analysis of Global Satellite Imagery

Primary LanguagePython

Cold Spots

This repository contains all code necessary to reproduce cold spot results.

Clone the repository along with all submodules:

git clone --recursive https://github.com/ArnholdInstitute/ColdSpots.git

Installation

virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

Tensorbox

Build the C++ auxilary functions:

cd TensorBox/utils && make && cd ../../

If you want to run on a GPU, you'll also need to pip install tensorflow-gpu.

Inference

Below is an example of how to get the bounding boxes for each building within an image:

import pdb, json, cv2, numpy as np
from scipy.misc import imread
from TensorBox.predict import TensorBox

# Read in image (RGB format)
img = imread('data/liberia_sample_940.jpg')

# Reconstruct the model
description = json.load(open('weights/tensorbox/description.json'))
model = TensorBox('weights/tensorbox/' + description['weights'])

# Infer buildings
result = model.predict_image(img, description['threshold'])

orig = img.copy()

# Plot the boxes on the original image
for box in result.values[:, :4].round().astype(int):
    cv2.rectangle(img, tuple(box[:2]), tuple(box[2:4]), (0,0,255))

space = np.zeros([orig.shape[0], 5, 3])
cv2.imwrite('with_annotated_buildings.jpg', np.concatenate([orig, space, img], axis=1))

Imgur

Evaluating models

In order to evaluate the models provided in this repo, you'll need to create a JSON file describing your validation data. The JSON file must have the following structure:

[
  {
    "rects": [
      {
        "y1": <float>,
        "x2": <float>,
        "x1": <float>,
        "y2": <float>
      },
      ...
    ],
    "image_path": <path to file>
  },
  ...
]

Each entry in the array must have a field called image_path which is the relative path (from the JSON file) to the image. rects contains the top left (x1, y1) coordinate and the bottom right (x2, y2) coordinate for the bounding box of each building in the provided satellite image.

You can then evaluate a model by running the following command:

./evaluate.py --test_boxes <path to JSON file>  --model <model>

Where model can be {tensorbox, faster-rcnn, yolo}