Skip to content

Instantly share code, notes, and snippets.

@jpolchlo
Created May 12, 2021 18:18
Show Gist options
  • Select an option

  • Save jpolchlo/03afa893ed6260a237dc3ab42d010091 to your computer and use it in GitHub Desktop.

Select an option

Save jpolchlo/03afa893ed6260a237dc3ab42d010091 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Spectrum extract.ipynb",
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"0079bb97fce04be8a8af6a768a9e3dd6": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_e1091e15bdc5470b9786a4990972361f",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_1aefc905708441c8bfeacc722b691a80",
"IPY_MODEL_c964c4fe2aac465bacde3576da00a2a0"
]
}
},
"e1091e15bdc5470b9786a4990972361f": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"1aefc905708441c8bfeacc722b691a80": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_cd5b675527ae44c194fdc3025bd34e55",
"_dom_classes": [],
"description": "100%",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 500,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 500,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_03cbc1c1fc0c4fcf968ebcc57b2edd73"
}
},
"c964c4fe2aac465bacde3576da00a2a0": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_b05f58c9e17b4316978742e42320aab3",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 500/500 [02:13<00:00, 3.75it/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_12ebeef3be7d4f92acb4477af8b096e0"
}
},
"cd5b675527ae44c194fdc3025bd34e55": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "initial",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"03cbc1c1fc0c4fcf968ebcc57b2edd73": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"b05f58c9e17b4316978742e42320aab3": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"12ebeef3be7d4f92acb4477af8b096e0": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
}
}
}
},
"cells": [
{
"cell_type": "code",
"metadata": {
"id": "FFO-c-p_lifv"
},
"source": [
"!pip install --upgrade 'git+https://github.com/azavea/nasa-hyperspectral.git@feature/mif-decorrelation#egg=hyperspectral&subdirectory=src/hyperspectral'\n",
"!pip install rasterio"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qTM6TpHFltun",
"outputId": "498cc807-be74-4623-8a77-3b1b4dc34f59"
},
"source": [
"from google.colab import drive\n",
"drive.mount(\"~/data\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Mounted at /root/data\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "-JBZfaLKSfRm"
},
"source": [
"import math\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import rasterio as rio\n",
"import torch as torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"from tqdm.autonotebook import tqdm\n",
"\n",
"from hyperspectral.spectra import SpectralLibrary, Spectrum"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "rBP4ZQj3i6y2",
"outputId": "1f497608-e393-467f-8c67-2bd45cc9ed1e"
},
"source": [
"loaded = np.load('/root/data/MyDrive/Hyperspectral/tpa_extract.npz')\n",
"extract = loaded['extract']\n",
"active = loaded['active']\n",
"dirty = loaded['dirty']\n",
"r,c,_ = extract.shape\n",
"r,c"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(89, 85)"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Mk_x1wokmkWC",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "22453d68-83f2-40a6-a89b-c5c72aef29bb"
},
"source": [
"samples = extract.reshape((r*c,-1))\n",
"magnitudes = np.linalg.norm(samples, ord=2, axis=1)\n",
"samples = samples / magnitudes[:, None]\n",
"n_samples, p = samples.shape\n",
"n_samples, p"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(7565, 154)"
]
},
"metadata": {
"tags": []
},
"execution_count": 17
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZSDh8fz3mNny"
},
"source": [
"def whitening_matrix(m):\n",
" old_shape = m.shape\n",
" m = m.reshape(-1, old_shape[-1])\n",
" mean = np.mean(m, axis=0)\n",
" cov = np.cov(m - mean, rowvar=False)\n",
" w, v = np.linalg.eig(cov)\n",
" W = np.matmul(np.matmul(v, np.diag(1 / np.sqrt(1e-6 + w))), v.T)\n",
" return W, mean"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "eRuQBFQtmcS7"
},
"source": [
"W, mean = whitening_matrix(samples)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "nJRo5kIJmfhr"
},
"source": [
"centered_pixels = samples - mean"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "szEKVyeXobjQ",
"outputId": "22540415-1a18-4289-f527-9788c7d0c203"
},
"source": [
"# get the computation device\n",
"def get_device():\n",
" if torch.cuda.is_available():\n",
" return 'cuda'\n",
" else:\n",
" return 'cpu'\n",
"\n",
"device = torch.device(get_device())\n",
"device"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"device(type='cpu')"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "jZfGJNzKqyZL"
},
"source": [
"class Extract(torch.nn.Module):\n",
" \n",
" def __init__(self, W, bias, target):\n",
" super(Extract, self).__init__()\n",
"\n",
" self.W = torch.from_numpy(W.astype(np.float)).unsqueeze(2)\n",
" #_W = torch.nn.parameter.Parameter(_W)\n",
" #self.register_parameter('W', _W)\n",
"\n",
" _bias = torch.from_numpy(np.array(bias).astype(np.float)).reshape(1)\n",
" _bias = torch.nn.parameter.Parameter(_bias)\n",
" self.register_parameter('bias', _bias)\n",
"\n",
" _target = torch.from_numpy(target.astype(np.float)).reshape((1,-1,1))\n",
" _target = torch.nn.parameter.Parameter(_target)\n",
" self.register_parameter('target', _target)\n",
"\n",
" self.relu = torch.nn.ReLU()\n",
"\n",
" def forward(self, x):\n",
" x = F.conv1d(x, self.W)\n",
" y = F.conv1d(self.target, self.W)\n",
" x = F.conv1d(x, y, self.bias)\n",
" x = self.relu(x)\n",
" return x"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "rE_sP4DRygJN",
"outputId": "cd1c2bb5-161b-4ba2-c3a1-0e442f01ad82"
},
"source": [
"clear_pixels = centered_pixels[np.logical_not(dirty.flatten())]\n",
"signal_pixels = centered_pixels[active.flatten()]\n",
"clear_to_signal_ratio = len(clear_pixels) // len(signal_pixels)\n",
"clear_to_signal_ratio"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"578"
]
},
"metadata": {
"tags": []
},
"execution_count": 20
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "MK8xQZ0JyrwM"
},
"source": [
"ps = torch.from_numpy(np.vstack([clear_pixels] + [signal_pixels] * clear_to_signal_ratio).astype(np.float)).unsqueeze(2).to(device)\n",
"#v = torch.from_numpy(np.vstack([signal_pixels] * clear_to_signal_ratio)).unsqueeze(2).to(device)\n",
"\n",
"ls = torch.from_numpy(np.concatenate([np.zeros((clear_pixels.shape[0], 1)), np.ones((v.shape[0], 1))], 0)).unsqueeze(2).to(device)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "myTyQpDvWLkm",
"outputId": "5d3c0d2b-7007-4f3e-a8d1-215401541f0e"
},
"source": [
"ps.shape, ls.shape"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(torch.Size([13875, 154, 1]), torch.Size([13875, 1, 1]))"
]
},
"metadata": {
"tags": []
},
"execution_count": 38
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "yIs4U9eKrta8"
},
"source": [
"model = Extract(W, 0, signal_pixels[0]).to(device)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "fbzQ1xM4rx4w"
},
"source": [
"for parameter in model.parameters():\n",
" parameter.requires_grad = True\n",
"\n",
"obj = torch.nn.BCEWithLogitsLoss().to(device)\n",
"opt = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68,
"referenced_widgets": [
"0079bb97fce04be8a8af6a768a9e3dd6",
"e1091e15bdc5470b9786a4990972361f",
"1aefc905708441c8bfeacc722b691a80",
"c964c4fe2aac465bacde3576da00a2a0",
"cd5b675527ae44c194fdc3025bd34e55",
"03cbc1c1fc0c4fcf968ebcc57b2edd73",
"b05f58c9e17b4316978742e42320aab3",
"12ebeef3be7d4f92acb4477af8b096e0"
]
},
"id": "qrOfHBPfr_Mf",
"outputId": "63e77a46-8605-4422-c665-7869ea2d2ec5"
},
"source": [
"for i in tqdm(range(0,500)):\n",
" opt.zero_grad()\n",
" pred = model(ps)\n",
" loss = obj(pred, ls)\n",
" loss.backward()\n",
" opt.step()"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0079bb97fce04be8a8af6a768a9e3dd6",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=500.0), HTML(value='')))"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "HCPLsfjssdIo"
},
"source": [
"inferred_target = model.target.cpu().detach().numpy()[0,:,0]\n",
"bias = model.bias.cpu().item()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "fJKDej9Aehz7",
"outputId": "bd515f89-5b1e-4951-c615-5393c61192b9"
},
"source": [
"bias"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"-0.09793223340386742"
]
},
"metadata": {
"tags": []
},
"execution_count": 62
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 284
},
"id": "K8q31OLoecUw",
"outputId": "2ff60586-7e56-4dd1-e225-c111c4d1d2f2"
},
"source": [
"#for s in signal_pixels:\n",
"# plt.plot(s + mean)\n",
"plt.plot(inferred_target + mean, \"k\")\n",
"plt.plot(samples[100])"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fc0cde07950>]"
]
},
"metadata": {
"tags": []
},
"execution_count": 72
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "MZb7SIUwiES9"
},
"source": [
"np.savez('/root/data/MyDrive/Hyperspectral/tpa_spectrum.npz', target=inferred_target + mean)"
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment