{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Converting model outputs to vector format using the Python API\n", "\n", "To use segmentation masks in a geospatial application, one often needs to convert to a vector format. This is a non-trivial task in many cases and a lot of science goes into finding the best way to convert a pixel mask to vector-formatted outputs, but we've provided a basic implementation in `solaris` for users to build from.\n", "\n", "Let's begin with an image showing some predicted building footprints:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import solaris as sol\n", "import os\n", "import skimage\n", "import matplotlib.pyplot as plt\n", "\n", "mask_image = skimage.io.imread(os.path.join(sol.data.data_dir, 'sample_fbc_from_df2px.tif'))\n", "\n", "f, ax = plt.subplots(figsize=(10, 8))\n", "plt.imshow(mask_image)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(900, 900, 3)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask_image.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This image has the value 255 in the first channel anywhere a building footprint is predicted, 255 in the second channel where an edge is predicted, and 255 in the third channel anywhere two buildings are very near one another:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "f, axarr = plt.subplots(3, 1, figsize=(8, 24))\n", "\n", "axarr[0].imshow(mask_image[:, :, 0], cmap='gray')\n", "axarr[0].set_title('footprints', fontsize=16)\n", "axarr[1].imshow(mask_image[:, :, 1], cmap='gray')\n", "axarr[1].set_title('edges', fontsize=16)\n", "axarr[2].imshow(mask_image[:, :, 2], cmap='gray')\n", "axarr[2].set_title('contacts', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we'll work with just the first channel for the simplest case of going from footprints to polygons. We'll use the `solaris.vector.mask.mask_to_poly_geojson()` function. This function has a number of arguments for customizing function:\n", "\n", "- pred_arr: The prediction array (in this case, `mask_image`)\n", "- channel_scaling: Scaling factors to use if using a multi-channel mask; see the next example.\n", "- reference_im: A georeferenced image that has the same extent as `mask_image` to use for georeferencing polygons. This is optional.\n", "- output_path: The path to the file to save. If not provided, the geometries are returned in a geopandas `GeoDataFrame`, but no file is saved.\n", "- output_type: Should the saved file be a `'csv'` or a `'geojson'`?\n", "- min_area: Use this argument to set a minimum area for geometries to be retained. This can be useful to eliminate speckling or very small, erroneous predictions.\n", "- bg_threshold: The value to set to separate background from foreground pixels in the mask. In this example, we'll use `1` because anything >0 is foreground.\n", "- simplify: A boolean to indicate whether or not you'd like to use the Douglas-Peucker algorithm to simplify geometries. This can _dramatically_ accelerate processing of geometries later, and can also make your geometries look nicer!\n", "- tolerance: The tolerance parameter for the Douglas-Peucker simplification algorithm. Only has an effect if `simplify=True`.\n", "\n", "Let's convert the first channel of the above mask to georegistered polygons." ] }, { "cell_type": "code", "execution_count": 4, "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", "
geometryvalue
0POLYGON ((542 0, 542 1, 545 1, 545 2, 546 2, 5...255.0
1POLYGON ((202 52, 202 53, 201 53, 190 53, 190 ...255.0
2POLYGON ((339 54, 339 72, 340 72, 340 78, 352 ...255.0
3POLYGON ((548 55, 548 56, 547 56, 542 56, 542 ...255.0
4POLYGON ((261 59, 261 60, 260 60, 248 60, 248 ...255.0
\n", "
" ], "text/plain": [ " geometry value\n", "0 POLYGON ((542 0, 542 1, 545 1, 545 2, 546 2, 5... 255.0\n", "1 POLYGON ((202 52, 202 53, 201 53, 190 53, 190 ... 255.0\n", "2 POLYGON ((339 54, 339 72, 340 72, 340 78, 352 ... 255.0\n", "3 POLYGON ((548 55, 548 56, 547 56, 542 56, 542 ... 255.0\n", "4 POLYGON ((261 59, 261 60, 260 60, 248 60, 248 ... 255.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geoms = sol.vector.mask.mask_to_poly_geojson(mask_image[:, :, 0])\n", "geoms.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's the output! We'll use a shapely convenience function to visualize them:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from shapely.ops import cascaded_union\n", "cascaded_union(geoms['geometry'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And there the geometries are! Just like the input mask (flipped vertically because they count up instead of down; if you georeference your outputs, this won't matter.)\n", "\n", "What if we want to use some complicated logic around a multi-channel mask to generate predictions? For example, what if we want to predict where edges and contact points are, then subtract those values to make sure we separate buildings well (a common challenge for building footprint extraction algorithms!) To do so, we'll use the `channel_scaling` argument, which allows you to specify the following operation:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$mask(x, y) = \\sum_{c}^{ } mask[x, y, c]\\times channel\\_scaling[c]$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Where c is the channel index. So, in this example, let's say we want to subtract the edges and contact layers from the footprint - we will set `channel_scaling=[1, -1, -1]`:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geoms = sol.vector.mask.mask_to_poly_geojson(mask_image, channel_scaling=[1, -1, -1])\n", "cascaded_union(geoms['geometry'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Though not readily apparent in this particular example, this can be extremely useful with imperfect predictions." ] } ], "metadata": { "kernelspec": { "display_name": "solaris", "language": "python", "name": "solaris" }, "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.6.7" } }, "nbformat": 4, "nbformat_minor": 4 }