wko-on-cloud-n/research/research.ipynb

1637 lines
847 KiB
Plaintext
Raw Normal View History

2022-02-15 01:06:55 +01:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import shutil\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"from pandas_path import path # noqa\n",
"from pathlib import Path\n",
"from PIL import Image\n",
"import pytorch_lightning as pl\n",
"import torch"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"<a id=\"explore-the-data\"></a>\n",
"\n",
"### Explore the data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"DATA_DIR = Path(\"data\")\n",
"TRAIN_FEATURES = DATA_DIR / \"train_features\"\n",
"TRAIN_LABELS = DATA_DIR / \"train_labels\"\n",
"\n",
"assert TRAIN_FEATURES.exists()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The training data consists of 11,748 \"chips\". Each chip is imagery of a specific area captured at a specific point in time. There are four images associated with each chip in the competition data. Each image within a chip captures light from a different range of wavelengths, or \"band\". For example, the B02 band for each chip shows the strengh of visible blue light, which has a wavelength around 492 nanometers (nm). The bands provided are:\n",
"\n",
"\n",
"<table border=\"1\" class=\"table\" style=\"width:70%; margin-left:auto; margin-right:auto\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>Band</th>\n",
" <th>Description</th>\n",
" <th>Center wavelength</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>B02</td>\n",
" <td>Blue visible light</td>\n",
" <td>497 nm</td>\n",
" </tr>\n",
" <tr>\n",
" <td>B03</td>\n",
" <td>Green visible light</td>\n",
" <td>560 nm</td>\n",
" </tr>\n",
" <tr>\n",
" <td>B04</td>\n",
" <td>Red visible light</td>\n",
" <td>665 nm</td>\n",
" </tr>\n",
" <tr>\n",
" <td>B08</td>\n",
" <td>Near infrared light</td>\n",
" <td>835 nm</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"BANDS = [\"B02\", \"B03\", \"B04\", \"B08\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Metadata"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's start by looking at the metadata for the train and test sets, to understand what the images in this competition capture."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>chip_id</th>\n",
" <th>location</th>\n",
" <th>datetime</th>\n",
" <th>cloudpath</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>adwp</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29T08:20:47Z</td>\n",
" <td>az://./train_features/adwp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>adwu</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29T08:20:47Z</td>\n",
" <td>az://./train_features/adwu</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>adwz</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29T08:20:47Z</td>\n",
" <td>az://./train_features/adwz</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>adxp</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29T08:20:47Z</td>\n",
" <td>az://./train_features/adxp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>aeaj</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29T08:20:47Z</td>\n",
" <td>az://./train_features/aeaj</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" chip_id location datetime cloudpath\n",
"0 adwp Chifunfu 2020-04-29T08:20:47Z az://./train_features/adwp\n",
"1 adwu Chifunfu 2020-04-29T08:20:47Z az://./train_features/adwu\n",
"2 adwz Chifunfu 2020-04-29T08:20:47Z az://./train_features/adwz\n",
"3 adxp Chifunfu 2020-04-29T08:20:47Z az://./train_features/adxp\n",
"4 aeaj Chifunfu 2020-04-29T08:20:47Z az://./train_features/aeaj"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_meta = pd.read_csv(DATA_DIR / \"On_Cloud_N_Cloud_Cover_Detection_Challenge_-_train_metadata.csv.csv\")\n",
"train_meta.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"chip_id 11748\n",
"location 81\n",
"datetime 91\n",
"dtype: int64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# how many different chip ids, locations, and datetimes are there?\n",
"train_meta[[\"chip_id\", \"location\", \"datetime\"]].nunique()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"train_location_counts = (\n",
" train_meta.groupby(\"location\")[\"chip_id\"].nunique().sort_values(ascending=False)\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"n = 50\n",
"plt.figure(figsize=(20, 8))\n",
"train_location_counts.head(n).plot(kind=\"bar\", color=\"lightgray\")\n",
"plt.xticks(rotation=90)\n",
"plt.xlabel(\"Location\")\n",
"plt.ylabel(\"Number of Chips\")\n",
"plt.title(f\"Number of Train Chips by Location (Top {n})\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The train and test images are from all over the world! Location names can be countries (eg. Eswatini), cities (eg. Lusaka), or broader regions of a country (eg. Australia - Central). [Sentinel-2](https://sentinel.esa.int/web/sentinel/missions/sentinel-2/observation-scenario) flies over the part of the Earth between 56° South and 82.8° North, between Cape Horn and slightly north of Greenland, so our observations are all between these two latitudes. The chips are mostly in Africa and South America, with some in Australia too.\n",
"\n",
"We also have a timestamp for each chip. What is the time range in the data?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>chip_count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year-month</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>April-2019</th>\n",
" <td>220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>April-2020</th>\n",
" <td>995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>August-2019</th>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>August-2020</th>\n",
" <td>1576</td>\n",
" </tr>\n",
" <tr>\n",
" <th>December-2019</th>\n",
" <td>159</td>\n",
" </tr>\n",
" <tr>\n",
" <th>February-2019</th>\n",
" <td>335</td>\n",
" </tr>\n",
" <tr>\n",
" <th>January-2020</th>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>July-2020</th>\n",
" <td>690</td>\n",
" </tr>\n",
" <tr>\n",
" <th>June-2020</th>\n",
" <td>555</td>\n",
" </tr>\n",
" <tr>\n",
" <th>March-2018</th>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>March-2020</th>\n",
" <td>334</td>\n",
" </tr>\n",
" <tr>\n",
" <th>May-2020</th>\n",
" <td>491</td>\n",
" </tr>\n",
" <tr>\n",
" <th>November-2018</th>\n",
" <td>143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>November-2019</th>\n",
" <td>150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>October-2018</th>\n",
" <td>159</td>\n",
" </tr>\n",
" <tr>\n",
" <th>September-2019</th>\n",
" <td>142</td>\n",
" </tr>\n",
" <tr>\n",
" <th>September-2020</th>\n",
" <td>5760</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" chip_count\n",
"year-month \n",
"April-2019 220\n",
"April-2020 995\n",
"August-2019 9\n",
"August-2020 1576\n",
"December-2019 159\n",
"February-2019 335\n",
"January-2020 6\n",
"July-2020 690\n",
"June-2020 555\n",
"March-2018 24\n",
"March-2020 334\n",
"May-2020 491\n",
"November-2018 143\n",
"November-2019 150\n",
"October-2018 159\n",
"September-2019 142\n",
"September-2020 5760"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_meta[\"datetime\"] = pd.to_datetime(train_meta[\"datetime\"])\n",
"train_meta[\"year\"] = train_meta.datetime.dt.year\n",
"train_meta[\"year-month\"] = train_meta.datetime.dt.strftime('%B-%Y')\n",
"\n",
"train_meta.groupby(\"year-month\")[[\"chip_id\"]].nunique().sort_index().rename(\n",
" columns={\"chip_id\": \"chip_count\"}\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Timestamp('2018-03-07 08:46:02+0000', tz='UTC'),\n",
" Timestamp('2020-09-14 08:28:49+0000', tz='UTC'))"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_meta[\"datetime\"].min(), train_meta[\"datetime\"].max()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>chip_count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>location</th>\n",
" <th>datetime</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>South America - Brazil</th>\n",
" <th>2020-09-06 15:02:37+00:00</th>\n",
" <td>261</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Port Gentil</th>\n",
" <th>2020-09-08 09:50:58+00:00</th>\n",
" <td>223</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Uganda</th>\n",
" <th>2019-04-25 08:29:37+00:00</th>\n",
" <td>220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Australia - Central</th>\n",
" <th>2020-08-11 01:24:00+00:00</th>\n",
" <td>209</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Malabo</th>\n",
" <th>2020-09-06 10:00:03+00:00</th>\n",
" <td>206</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Jimma</th>\n",
" <th>2020-05-31 08:07:58+00:00</th>\n",
" <td>201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chifunfu</th>\n",
" <th>2020-04-29 08:20:47+00:00</th>\n",
" <td>197</td>\n",
" </tr>\n",
" <tr>\n",
" <th>South America - Suriname</th>\n",
" <th>2020-06-03 14:11:18+00:00</th>\n",
" <td>197</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Isiro</th>\n",
" <th>2020-08-28 08:39:29+00:00</th>\n",
" <td>197</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Pibor</th>\n",
" <th>2020-08-17 08:18:22+00:00</th>\n",
" <td>197</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" chip_count\n",
"location datetime \n",
"South America - Brazil 2020-09-06 15:02:37+00:00 261\n",
"Port Gentil 2020-09-08 09:50:58+00:00 223\n",
"Uganda 2019-04-25 08:29:37+00:00 220\n",
"Australia - Central 2020-08-11 01:24:00+00:00 209\n",
"Malabo 2020-09-06 10:00:03+00:00 206\n",
"Jimma 2020-05-31 08:07:58+00:00 201\n",
"Chifunfu 2020-04-29 08:20:47+00:00 197\n",
"South America - Suriname 2020-06-03 14:11:18+00:00 197\n",
"Isiro 2020-08-28 08:39:29+00:00 197\n",
"Pibor 2020-08-17 08:18:22+00:00 197"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chips_per_locationtime = (\n",
" train_meta.groupby([\"location\", \"datetime\"])[[\"chip_id\"]]\n",
" .nunique()\n",
" .sort_values(by=\"chip_id\", ascending=False)\n",
" .rename(columns={\"chip_id\": \"chip_count\"})\n",
")\n",
"chips_per_locationtime.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>chip_id</th>\n",
" <th>location</th>\n",
" <th>datetime</th>\n",
" <th>cloudpath</th>\n",
" <th>year</th>\n",
" <th>year-month</th>\n",
" <th>B02_path</th>\n",
" <th>B03_path</th>\n",
" <th>B04_path</th>\n",
" <th>B08_path</th>\n",
" <th>label_path</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>adwp</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29 08:20:47+00:00</td>\n",
" <td>az://./train_features/adwp</td>\n",
" <td>2020</td>\n",
" <td>April-2020</td>\n",
" <td>data\\train_features\\adwp\\B02.tif</td>\n",
" <td>data\\train_features\\adwp\\B03.tif</td>\n",
" <td>data\\train_features\\adwp\\B04.tif</td>\n",
" <td>data\\train_features\\adwp\\B08.tif</td>\n",
" <td>data\\train_labels\\adwp.tif</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>adwu</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29 08:20:47+00:00</td>\n",
" <td>az://./train_features/adwu</td>\n",
" <td>2020</td>\n",
" <td>April-2020</td>\n",
" <td>data\\train_features\\adwu\\B02.tif</td>\n",
" <td>data\\train_features\\adwu\\B03.tif</td>\n",
" <td>data\\train_features\\adwu\\B04.tif</td>\n",
" <td>data\\train_features\\adwu\\B08.tif</td>\n",
" <td>data\\train_labels\\adwu.tif</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>adwz</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29 08:20:47+00:00</td>\n",
" <td>az://./train_features/adwz</td>\n",
" <td>2020</td>\n",
" <td>April-2020</td>\n",
" <td>data\\train_features\\adwz\\B02.tif</td>\n",
" <td>data\\train_features\\adwz\\B03.tif</td>\n",
" <td>data\\train_features\\adwz\\B04.tif</td>\n",
" <td>data\\train_features\\adwz\\B08.tif</td>\n",
" <td>data\\train_labels\\adwz.tif</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>adxp</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29 08:20:47+00:00</td>\n",
" <td>az://./train_features/adxp</td>\n",
" <td>2020</td>\n",
" <td>April-2020</td>\n",
" <td>data\\train_features\\adxp\\B02.tif</td>\n",
" <td>data\\train_features\\adxp\\B03.tif</td>\n",
" <td>data\\train_features\\adxp\\B04.tif</td>\n",
" <td>data\\train_features\\adxp\\B08.tif</td>\n",
" <td>data\\train_labels\\adxp.tif</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>aeaj</td>\n",
" <td>Chifunfu</td>\n",
" <td>2020-04-29 08:20:47+00:00</td>\n",
" <td>az://./train_features/aeaj</td>\n",
" <td>2020</td>\n",
" <td>April-2020</td>\n",
" <td>data\\train_features\\aeaj\\B02.tif</td>\n",
" <td>data\\train_features\\aeaj\\B03.tif</td>\n",
" <td>data\\train_features\\aeaj\\B04.tif</td>\n",
" <td>data\\train_features\\aeaj\\B08.tif</td>\n",
" <td>data\\train_labels\\aeaj.tif</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" chip_id location datetime cloudpath \\\n",
"0 adwp Chifunfu 2020-04-29 08:20:47+00:00 az://./train_features/adwp \n",
"1 adwu Chifunfu 2020-04-29 08:20:47+00:00 az://./train_features/adwu \n",
"2 adwz Chifunfu 2020-04-29 08:20:47+00:00 az://./train_features/adwz \n",
"3 adxp Chifunfu 2020-04-29 08:20:47+00:00 az://./train_features/adxp \n",
"4 aeaj Chifunfu 2020-04-29 08:20:47+00:00 az://./train_features/aeaj \n",
"\n",
" year year-month B02_path \\\n",
"0 2020 April-2020 data\\train_features\\adwp\\B02.tif \n",
"1 2020 April-2020 data\\train_features\\adwu\\B02.tif \n",
"2 2020 April-2020 data\\train_features\\adwz\\B02.tif \n",
"3 2020 April-2020 data\\train_features\\adxp\\B02.tif \n",
"4 2020 April-2020 data\\train_features\\aeaj\\B02.tif \n",
"\n",
" B03_path B04_path \\\n",
"0 data\\train_features\\adwp\\B03.tif data\\train_features\\adwp\\B04.tif \n",
"1 data\\train_features\\adwu\\B03.tif data\\train_features\\adwu\\B04.tif \n",
"2 data\\train_features\\adwz\\B03.tif data\\train_features\\adwz\\B04.tif \n",
"3 data\\train_features\\adxp\\B03.tif data\\train_features\\adxp\\B04.tif \n",
"4 data\\train_features\\aeaj\\B03.tif data\\train_features\\aeaj\\B04.tif \n",
"\n",
" B08_path label_path \n",
"0 data\\train_features\\adwp\\B08.tif data\\train_labels\\adwp.tif \n",
"1 data\\train_features\\adwu\\B08.tif data\\train_labels\\adwu.tif \n",
"2 data\\train_features\\adwz\\B08.tif data\\train_labels\\adwz.tif \n",
"3 data\\train_features\\adxp\\B08.tif data\\train_labels\\adxp.tif \n",
"4 data\\train_features\\aeaj\\B08.tif data\\train_labels\\aeaj.tif "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def add_paths(df, feature_dir, label_dir=None, bands=BANDS):\n",
" \"\"\"\n",
" Given dataframe with a column for chip_id, returns a dataframe with a column\n",
" added indicating the path to each band's TIF image as \"{band}_path\", eg \"B02_path\".\n",
" A column is also added to the dataframe with paths to the label TIF, if the\n",
" path to the labels directory is provided.\n",
" \"\"\"\n",
" for band in bands:\n",
" df[f\"{band}_path\"] = feature_dir / df[\"chip_id\"] / f\"{band}.tif\"\n",
" # make sure a random sample of paths exist\n",
" assert df.sample(n=40, random_state=5)[f\"{band}_path\"].path.exists().all()\n",
" if label_dir is not None:\n",
" df[\"label_path\"] = label_dir / (df[\"chip_id\"] + \".tif\")\n",
" # make sure a random sample of paths exist\n",
" assert df.sample(n=40, random_state=5)[\"label_path\"].path.exists().all()\n",
"\n",
" return df\n",
"\n",
"\n",
"train_meta = add_paths(train_meta, TRAIN_FEATURES, TRAIN_LABELS)\n",
"train_meta.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 11748 entries, 0 to 11747\n",
"Data columns (total 11 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 chip_id 11748 non-null object \n",
" 1 location 11748 non-null object \n",
" 2 datetime 11748 non-null datetime64[ns, UTC]\n",
" 3 cloudpath 11748 non-null object \n",
" 4 year 11748 non-null int64 \n",
" 5 year-month 11748 non-null object \n",
" 6 B02_path 11748 non-null object \n",
" 7 B03_path 11748 non-null object \n",
" 8 B04_path 11748 non-null object \n",
" 9 B08_path 11748 non-null object \n",
" 10 label_path 11748 non-null object \n",
"dtypes: datetime64[ns, UTC](1), int64(1), object(9)\n",
"memory usage: 1009.7+ KB\n"
]
}
],
"source": [
"train_meta.info()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"import rasterio"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"chip_id pbyl\n",
"location Lodwar\n",
"datetime 2020-09-08 08:09:15+00:00\n",
"cloudpath az://./train_features/pbyl\n",
"year 2020\n",
"year-month September-2020\n",
"B02_path data\\train_features\\pbyl\\B02.tif\n",
"B03_path data\\train_features\\pbyl\\B03.tif\n",
"B04_path data\\train_features\\pbyl\\B04.tif\n",
"B08_path data\\train_features\\pbyl\\B08.tif\n",
"label_path data\\train_labels\\pbyl.tif\n",
"Name: 6571, dtype: object"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example_chip = train_meta[train_meta[\"chip_id\"] == \"pbyl\"].iloc[0]\n",
"example_chip"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'driver': 'GTiff',\n",
" 'dtype': 'uint16',\n",
" 'nodata': 0.0,\n",
" 'width': 512,\n",
" 'height': 512,\n",
" 'count': 1,\n",
" 'crs': CRS.from_epsg(32636),\n",
" 'transform': Affine(10.0, 0.0, 771935.0,\n",
" 0.0, -10.0, 331300.0)}"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = rasterio.open(example_chip[\"B04_path\"])\n",
"chip_metadata = img.meta\n",
"img_array = img.read(1)\n",
"\n",
"chip_metadata"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that the features are single-band images, with a shape of 512 x 512. The pixel values for each image measure the strength of light reflected back to the satellite for the specific set of wavelengths in that band. The array below shows the strength of red visible light, with wavelengts around 665 nm.\n",
"\n",
"We can also see that there are no missing values in the image. This should be the case for all of the provided competition feature data."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Image array shape: (512, 512)\n"
]
},
{
"data": {
"text/plain": [
"array([[ 519, 532, 556, ..., 3662, 3564, 3544],\n",
" [ 549, 539, 562, ..., 3604, 3520, 3518],\n",
" [ 572, 524, 506, ..., 3514, 3488, 3518],\n",
" ...,\n",
" [1216, 2062, 2898, ..., 4050, 3610, 3328],\n",
" [1632, 1932, 2588, ..., 4108, 3918, 3736],\n",
" [1766, 2040, 2272, ..., 4152, 4028, 3824]], dtype=uint16)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# what does the image array look like?\n",
"print(\"Image array shape:\", img_array.shape)\n",
"img_array"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(img_array)\n",
"plt.title(f\"B04 band for chip id {example_chip.chip_id}\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"#### Coordinates\n",
"\n",
"Using the metadata returned by `rasterio`, we can also get longitude and latitude coordinates."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Longitude: 35.46935026347422, latitude: 2.9714117132510944\n"
]
}
],
"source": [
"# longitude/latitude of image's center\n",
"lon, lat = img.lnglat()\n",
"bounds = img.bounds\n",
"print(f\"Longitude: {lon}, latitude: {lat}\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BoundingBox(left=771935.0, bottom=326180.0, right=777055.0, top=331300.0)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bounds"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have the longitude and latitude of the center of the image, but the bounding box values look very different. That's because the bounding box is given in whatever coordinate reference system the image is projected in, rather than traditional longitude and latiude. We can see which system with the `crs` value from the metadata.\n",
"\n",
"We can convert the bounding box to longitude and latitude using `pyproj`."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"import pyproj"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"def lat_long_bounds(filepath):\n",
" \"\"\"Given the path to a GeoTIFF, returns the image bounds in latitude and\n",
" longitude coordinates.\n",
"\n",
" Returns points as a tuple of (left, bottom, right, top)\n",
" \"\"\"\n",
" with rasterio.open(filepath) as im:\n",
" bounds = im.bounds\n",
" meta = im.meta\n",
" # create a converter starting with the current projection\n",
" current_crs = pyproj.CRS(meta[\"crs\"])\n",
" crs_transform = pyproj.Transformer.from_crs(current_crs, current_crs.geodetic_crs)\n",
"\n",
" # returns left, bottom, right, top\n",
" return crs_transform.transform_bounds(*bounds)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Image coordinates (lat, long):\n",
"Start: (2.948221298028172, 35.44628398518643)\n",
"End: (2.9946024439490517, 35.492417498478574)\n"
]
}
],
"source": [
"left, bottom, right, top = lat_long_bounds(example_chip[\"B04_path\"])\n",
"print(\n",
" f\"Image coordinates (lat, long):\\nStart: ({left}, {bottom})\"\n",
" f\"\\nEnd: ({right}, {top})\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Derived Projected CRS: EPSG:32636>\n",
"Name: WGS 84 / UTM zone 36N\n",
"Axis Info [cartesian]:\n",
"- [east]: Easting (metre)\n",
"- [north]: Northing (metre)\n",
"Area of Use:\n",
"- undefined\n",
"Coordinate Operation:\n",
"- name: UTM zone 36N\n",
"- method: Transverse Mercator\n",
"Datum: World Geodetic System 1984\n",
"- Ellipsoid: WGS 84\n",
"- Prime Meridian: Greenwich"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"current_crs = pyproj.CRS(img.meta[\"crs\"])\n",
"current_crs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### True color image"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can make a composite image from the three visible bands (blue, green, and red) to visualize a high-quality, true color image. To show the true color image, we'll use the `rioxarray` and `xrspatial` packages designed for Sentinel-2 satellite data."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"import rioxarray\n",
"import xrspatial.multispectral as ms"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"def true_color_img(chip_id, data_dir=TRAIN_FEATURES):\n",
" \"\"\"Given the path to the directory of Sentinel-2 chip feature images,\n",
" plots the true color image\"\"\"\n",
" chip_dir = data_dir / chip_id\n",
" red = rioxarray.open_rasterio(chip_dir / \"B04.tif\").squeeze()\n",
" green = rioxarray.open_rasterio(chip_dir / \"B03.tif\").squeeze()\n",
" blue = rioxarray.open_rasterio(chip_dir / \"B02.tif\").squeeze()\n",
"\n",
" return ms.true_color(r=red, g=green, b=blue)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block !important;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt,\n",
".xr-attrs dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.DataArray (y: 512, x: 512)&gt;\n",
"[262144 values with dtype=uint16]\n",
"Coordinates:\n",
" band int32 1\n",
" * x (x) float64 7.719e+05 7.72e+05 7.72e+05 ... 7.77e+05 7.77e+05\n",
" * y (y) float64 3.313e+05 3.313e+05 ... 3.262e+05 3.262e+05\n",
" spatial_ref int32 0\n",
"Attributes:\n",
" _FillValue: 0.0\n",
" scale_factor: 1.0\n",
" add_offset: 0.0</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.DataArray</div><div class='xr-array-name'></div><ul class='xr-dim-list'><li><span class='xr-has-index'>y</span>: 512</li><li><span class='xr-has-index'>x</span>: 512</li></ul></div><ul class='xr-sections'><li class='xr-section-item'><div class='xr-array-wrap'><input id='section-bb5d9dc7-e5d2-4f26-bc1d-5b594776cde6' class='xr-array-in' type='checkbox' checked><label for='section-bb5d9dc7-e5d2-4f26-bc1d-5b594776cde6' title='Show/hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-array-preview xr-preview'><span>...</span></div><div class='xr-array-data'><pre>[262144 values with dtype=uint16]</pre></div></div></li><li class='xr-section-item'><input id='section-c73f619d-20e5-4fce-a585-dd7d69f880a9' class='xr-section-summary-in' type='checkbox' checked><label for='section-c73f619d-20e5-4fce-a585-dd7d69f880a9' class='xr-section-summary' >Coordinates: <span>(4)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>band</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>int32</div><div class='xr-var-preview xr-preview'>1</div><input id='attrs-f907bfcf-6624-4f53-ac4e-52f5fc1fbafa' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-f907bfcf-6624-4f53-ac4e-52f5fc1fbafa' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-09172001-cb97-4c06-ba75-bf6293339774' class='xr-var-data-in' type='checkbox'><label for='data-09172001-cb97-4c06-ba75-bf6293339774' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array(1)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>x</span></div><div class='xr-var-dims'>(x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>7.719e+05 7.72e+05 ... 7.77e+05</div><input id='attrs-435a778c-f70e-45ec-b36e-f7e65c1e0fe3' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-435a778c-f70e-45ec-b36e-f7e65c1e0fe3' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-d4371807-8662-4639-b493-f64b88fd30ad' class='xr-var-data-in' type='checkbox'><label for='data-d4371807-8662-4639-b493-f64b88fd30ad' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([771940., 771950., 771960., ..., 777030., 777040., 777050.])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>y</span></div><div class='xr-var-dims'>(y)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>3.313e+05 3.313e+05 ... 3.262e+05</div><input id='attrs-384ce37b-e8f8-4c9d-98a6-e9283ddff206' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-384ce37b-e8f8-4c9d-98a6-e9283ddff206' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-1ca78b2c-135a-4ed8-af2d-6f99cf7bf009' class='xr-var-data-in' type='checkbox'><label for='data-1ca78b2c-135a-4ed8-af2d-6f99cf7bf009' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([331295., 331285., 331275., ..., 326205., 326195., 326185.])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>spatial_ref</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>int32</div><div
],
"text/plain": [
"<xarray.DataArray (y: 512, x: 512)>\n",
"[262144 values with dtype=uint16]\n",
"Coordinates:\n",
" band int32 1\n",
" * x (x) float64 7.719e+05 7.72e+05 7.72e+05 ... 7.77e+05 7.77e+05\n",
" * y (y) float64 3.313e+05 3.313e+05 ... 3.262e+05 3.262e+05\n",
" spatial_ref int32 0\n",
"Attributes:\n",
" _FillValue: 0.0\n",
" scale_factor: 1.0\n",
" add_offset: 0.0"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_dir = TRAIN_FEATURES\n",
"chip_id = example_chip.chip_id\n",
"chip_dir = data_dir / chip_id\n",
"red = rioxarray.open_rasterio(chip_dir / \"B04.tif\").squeeze()\n",
"green = rioxarray.open_rasterio(chip_dir / \"B03.tif\").squeeze()\n",
"blue = rioxarray.open_rasterio(chip_dir / \"B02.tif\").squeeze()\n",
"red"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'True color image for chip id pbyl')"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(5, 5))\n",
"im = true_color_img(example_chip.chip_id)\n",
"ax.imshow(im)\n",
"plt.title(f\"True color image for chip id {example_chip.chip_id}\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"def display_random_chip(random_state):\n",
" fig, ax = plt.subplots(1, 2, figsize=(8, 4))\n",
" random_chip = train_meta.sample(random_state=random_state).iloc[0]\n",
"\n",
" ax[0].imshow(true_color_img(random_chip.chip_id))\n",
" ax[0].set_title(f\"Chip {random_chip.chip_id}\\n(Location: {random_chip.location})\")\n",
" label_im = Image.open(random_chip.label_path)\n",
" ax[1].imshow(label_im)\n",
" ax[1].set_title(f\"Chip {random_chip.chip_id} label\")\n",
"\n",
" plt.tight_layout()\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 576x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"display_random_chip(1)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 576x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"display_random_chip(9)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 576x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"display_random_chip(40)"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}