diff --git a/Notebooks/APs.ipynb b/Notebooks/APs.ipynb new file mode 100644 index 0000000..1145dd7 --- /dev/null +++ b/Notebooks/APs.ipynb @@ -0,0 +1,230 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "triskele_path = Path('../triskele/python/')\n", + "sys.path.append(str(triskele_path.resolve()))\n", + "import triskele" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Specific Utils\n", + "\n", + "def DFC_filter(raster):\n", + " raster[raster > 1e4] = raster[raster < 1e4].max()\n", + "\n", + "def show(im, im_size=1, save=None):\n", + " plt.figure(figsize=(16*im_size,3*im_size))\n", + " plt.imshow(im)\n", + " plt.colorbar()\n", + " \n", + " if save is not None:\n", + " plt.savefig(save, bbox_inches='tight', pad_inches=1)\n", + " \n", + " plt.show()\n", + "\n", + "def mshow(Xs, titles=None, im_size=1, save=None):\n", + " s = len(Xs)\n", + "\n", + " plt.figure(figsize=(16*im_size,3*im_size*s))\n", + "\n", + " for i in range(s):\n", + " plt.subplot(s,1,i+1)\n", + " plt.imshow(Xs[i])\n", + " \n", + " if titles is not None:\n", + " plt.title(titles[i])\n", + " \n", + " plt.colorbar()\n", + " \n", + " if save is not None:\n", + " plt.savefig(save, bbox_inches='tight', pad_inches=1)\n", + " \n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layers_files = [\n", + " '../Data/phase1_rasters/DEM+B_C123/UH17_GEM051_TR.tif',\n", + " '../Data/phase1_rasters/DEM_C123_3msr/UH17_GEG051_TR.tif',\n", + " '../Data/phase1_rasters/DEM_C123_TLI/UH17_GEG05_TR.tif',\n", + " '../Data/phase1_rasters/DSM_C12/UH17c_GEF051_TR.tif',\n", + " '../Data/phase1_rasters/Intensity_C1/UH17_GI1F051_TR.tif',\n", + " '../Data/phase1_rasters/Intensity_C2/UH17_GI2F051_TR.tif',\n", + " '../Data/phase1_rasters/Intensity_C3/UH17_GI3F051_TR.tif',\n", + " #'../Data/ground_truth/2018_IEEE_GRSS_DFC_GT_TR.tif'\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define dataset dependent raster filtering" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def DFC_filter(raster):\n", + " ## Remove extrem values\n", + " #raster[raster == raster.max()] = raster[raster != raster.max()].max()\n", + " raster[raster > 1e4] = raster[raster < 1e4].max()\n", + " #raster[raster == np.finfo(raster.dtype).max] = raster[raster != raster.max()].max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load rasters data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layers = list()\n", + "\n", + "for file in layers_files:\n", + " print('Loading {}'.format(file))\n", + " layer = triskele.read(file)\n", + " DFC_filter(layer)\n", + " layers.append(layer)\n", + "\n", + "layers_stack = np.stack(layers, axis=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Display rasters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(layers_stack.shape[2]):\n", + " plt.figure(figsize=(16*2,3*2))\n", + " plt.imshow(layers_stack[:,:,i])\n", + " plt.colorbar()\n", + " plt.title(layers_files[i])\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Attributes filter with TRISKELE !" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "area = np.array([10, 100, 1e3, 1e4, 1e5])\n", + "sd = np.array([0.5,0.9,0.99,0.999,0.9999])#,1e4,1e5,5e5])\n", + "moi = np.array([0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.99])\n", + "\n", + "t = triskele.Triskele(layers_stack[:,:,0], verbose=False)\n", + "attributes_min = t.filter(tree='min-tree',\n", + " area=area,\n", + " #standard_deviation=sd,\n", + " #moment_of_inertia=moi\n", + " )\n", + "attributes_max = t.filter(tree='max-tree',\n", + " area=area,\n", + " #standard_deviation=sd,\n", + " #moment_of_inertia=moi\n", + " )\n", + "\n", + "attributes_min_lbl = ['origin']\n", + "attributes_min_lbl.extend(['Thickening area {}'.format(x) for x in area])\n", + "attributes_max_lbl = ['origin']\n", + "attributes_max_lbl.extend(['Thinning area {}'.format(x) for x in area])\n", + "\n", + "attributes_min.shape, attributes_max.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "attributes = np.dstack((attributes_min[:,:,:0:-1], attributes_max))\n", + "attributes_lbl = attributes_min_lbl[:0:-1]\n", + "attributes_lbl.extend(attributes_max_lbl)\n", + "\n", + "attributes.shape, attributes_lbl" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "figs = list()\n", + "\n", + "attributes[0,0,:] = 255 # J'ai honte...\n", + "\n", + "for i in range(attributes.shape[-1]):\n", + " figs.append(attributes[:,:,i])\n", + "\n", + "mshow(figs, attributes_lbl, 2)" + ] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Notebooks/Attribute Profiles Classifier.ipynb b/Notebooks/Attribute Profiles Classifier.ipynb index 8b020e1..f344cf6 100644 --- a/Notebooks/Attribute Profiles Classifier.ipynb +++ b/Notebooks/Attribute Profiles Classifier.ipynb @@ -16,6 +16,19 @@ "import triskele" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def show(im):\n", + " plt.figure(figsize=(16*2,3*2))\n", + " plt.imshow(im)\n", + " plt.colorbar()\n", + " plt.show()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -271,19 +284,6 @@ " " ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def show(im):\n", - " plt.figure(figsize=(16*2,3*2))\n", - " plt.imshow(im)\n", - " plt.colorbar()\n", - " plt.show()" - ] - }, { "cell_type": "code", "execution_count": null, @@ -295,12 +295,10 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "labels.shape" + "## Scores" ] }, { @@ -309,90 +307,37 @@ "metadata": {}, "outputs": [], "source": [ - "np.arange(238400).reshape(-1, 4768)" + "scores(actual=labels.reshape(-1), prediction=cv_labels.reshape(-1))" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "with open('../Res/classifier_0.pkl', 'wb') as f:\n", - " pickle.dump(rfc, f)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Yp = Y.copy()\n", + "#### Labels\n", "\n", - "Yp[training == False] = rfc.predict(X[training == False])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(16*2,3*2))\n", - "plt.imshow(Y.reshape(labels.shape))\n", - "plt.colorbar()\n", - "plt.show()\n", "\n", - "plt.figure(figsize=(16*2,3*2))\n", - "plt.imshow(Yp.reshape(labels.shape))\n", - "plt.colorbar()\n", - "plt.show()\n", - "\n", - "plt.figure(figsize=(16*2,3*2))\n", - "plt.imshow(Yp.reshape(labels.shape).astype(np.float) - labels)\n", - "plt.colorbar()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class cvg:\n", - " def __init__(self, attributes, ground_truth, order_dim=0, n_test=2): \n", - " self._tests_left = n_test\n", - " \n", - " if attributes.shape[0] != ground_truth.shape[0] or \\\n", - " attributes.shape[1] != ground_truth.shape[1] :\n", - " raise ValueError('attributes and ground_truth must have the same 2D shape')\n", - " \n", - " def __iter__(self):\n", - " return self\n", - " \n", - " def __next__(self):\n", - " if self._tests_left == 0:\n", - " raise StopIteration\n", - " \n", - " train_filter = np.arange(attributes.shape) < (Y.size * .50)\n", - "\n", - " Xtrain = 42\n", - " Xtest = 432\n", - " Ytrain = 12\n", - " Ytest = 123\n", - " \n", - " return (Xtrain, Xtest, Ytrain, Ytest)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cvg(attributes, labels[:,:-1])" + " 0 – Unclassified\n", + " 1 – Healthy grass\n", + " 2 – Stressed grass\n", + " 3 – Artificial turf\n", + " 4 – Evergreen trees\n", + " 5 – Deciduous trees\n", + " 6 – Bare earth\n", + " 7 – Water\n", + " 8 – Residential buildings\n", + " 9 – Non-residential buildings\n", + " 10 – Roads\n", + " 11 – Sidewalks\n", + " 12 – Crosswalks\n", + " 13 – Major thoroughfares\n", + " 14 – Highways\n", + " 15 – Railways\n", + " 16 – Paved parking lots\n", + " 17 – Unpaved parking lots\n", + " 18 – Cars\n", + " 19 – Trains\n", + " 20 – Stadium seats\n" ] } ],