stylegan3/Stylegan3.ipynb

3015 lines
13 MiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"id": "7b2af5f0-e633-450d-86de-4ce7e6e4c7c2",
"metadata": {},
"source": [
"# To do\n",
"\n",
"* Way to explore/browse dataset\n",
"* ~~Interpolate images using their w~~\n",
"* ~~Generate images with different w~~\n",
"* find directions for particular categories (see [Learn Directions](https://towardsdatascience.com/stylegan-v2-notes-on-training-and-latent-space-exploration-e51cf96584b3) )\n",
" * do this for rue/avenue/boulevard, and arrondisement\n",
" * run PCA on the points and colour them by category (arrondisement/street type)\n",
" * try t-SNE instead of PCA"
]
},
{
"cell_type": "markdown",
"id": "51f5fba8-3371-420c-8aff-16044aa12789",
"metadata": {
"tags": []
},
"source": [
"# Select the network"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "cb59de49-aa65-4a3f-8f0c-412ff8580a27",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from tqdm.notebook import trange, tqdm\n",
"import json\n",
"import os\n",
"import tabulate\n",
"from PIL import Image\n",
"import gen_images\n",
"import numpy as np\n",
"import io\n",
"import ipywidgets as widgets\n",
"import datetime\n",
"import matplotlib.pyplot as plt\n",
"# %matplotlib widget\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "075abcd1-e8c8-47f6-b2e3-22e4817b0e38",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"you are here: /scratch\n"
]
}
],
"source": [
"print(\"you are here:\", os.getcwd())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d92def3d-3004-4f9a-a0ef-f18447712b38",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 60,
"id": "281457c9-e969-495f-9d50-4f1c31e82035",
"metadata": {},
"outputs": [],
"source": [
"%run ThisPlaceDoesExist.ipynb"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "668602ea-6712-4f4f-bbc9-4a9a37f9da70",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
"<thead>\n",
"<tr><th>idx </th><th>nr </th><th>dataset </th><th>conditional </th><th style=\"text-align: right;\"> resolution</th><th style=\"text-align: right;\"> gamma</th><th>duration </th><th style=\"text-align: right;\"> iterations</th><th style=\"text-align: right;\"> last_fid</th></tr>\n",
"</thead>\n",
"<tbody>\n",
"<tr><td>0 </td><td>00001</td><td>paris3 </td><td>True </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 8.2</td><td>3 days, 10:34:26 </td><td style=\"text-align: right;\"> 2600</td><td style=\"text-align: right;\"> 502.277 </td></tr>\n",
"<tr><td>1 </td><td>00002</td><td>paris3 </td><td>True </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 2 </td><td>5 days, 3:43:08 </td><td style=\"text-align: right;\"> 6560</td><td style=\"text-align: right;\"> 190.346 </td></tr>\n",
"<tr><td>2 </td><td>00003</td><td>paris3 </td><td>True </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 2 </td><td>18 days, 13:01:50</td><td style=\"text-align: right;\"> 25000</td><td style=\"text-align: right;\"> 42.9661</td></tr>\n",
"<tr><td>3 </td><td>00004</td><td>paris3 </td><td>False </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 2 </td><td>15 days, 16:13:20</td><td style=\"text-align: right;\"> 22800</td><td style=\"text-align: right;\"> 15.6691</td></tr>\n",
"<tr><td>4 </td><td>00009</td><td>paris3-1024.zip </td><td>False </td><td style=\"text-align: right;\"> 1024</td><td style=\"text-align: right;\"> 32 </td><td>0:00:00 </td><td style=\"text-align: right;\"> 0</td><td style=\"text-align: right;\"> 549.99 </td></tr>\n",
"<tr><td>5 </td><td>00010</td><td>paris3-1024.zip </td><td>False </td><td style=\"text-align: right;\"> 1024</td><td style=\"text-align: right;\"> 32 </td><td>50 days, 3:15:24 </td><td style=\"text-align: right;\"> 15200</td><td style=\"text-align: right;\"> 33.2466</td></tr>\n",
"<tr><td>6 </td><td>00011</td><td>paris3-1024.zip </td><td>False </td><td style=\"text-align: right;\"> 1024</td><td style=\"text-align: right;\"> 10 </td><td>5 days, 18:48:04 </td><td style=\"text-align: right;\"> 1760</td><td style=\"text-align: right;\"> 200.356 </td></tr>\n",
"<tr><td>7 </td><td>00014</td><td>paris3-cropped-256</td><td>False </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 8 </td><td>2 days, 20:08:22 </td><td style=\"text-align: right;\"> 4160</td><td style=\"text-align: right;\"> 20.1699</td></tr>\n",
"<tr><td>8 </td><td>00016</td><td>paris3-cropped-256</td><td>False </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 8 </td><td>7 days, 20:55:54 </td><td style=\"text-align: right;\"> 11520</td><td style=\"text-align: right;\"> 16.5185</td></tr>\n",
"</tbody>\n",
"</table>"
],
"text/plain": [
"'<table>\\n<thead>\\n<tr><th>idx </th><th>nr </th><th>dataset </th><th>conditional </th><th style=\"text-align: right;\"> resolution</th><th style=\"text-align: right;\"> gamma</th><th>duration </th><th style=\"text-align: right;\"> iterations</th><th style=\"text-align: right;\"> last_fid</th></tr>\\n</thead>\\n<tbody>\\n<tr><td>0 </td><td>00001</td><td>paris3 </td><td>True </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 8.2</td><td>3 days, 10:34:26 </td><td style=\"text-align: right;\"> 2600</td><td style=\"text-align: right;\"> 502.277 </td></tr>\\n<tr><td>1 </td><td>00002</td><td>paris3 </td><td>True </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 2 </td><td>5 days, 3:43:08 </td><td style=\"text-align: right;\"> 6560</td><td style=\"text-align: right;\"> 190.346 </td></tr>\\n<tr><td>2 </td><td>00003</td><td>paris3 </td><td>True </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 2 </td><td>18 days, 13:01:50</td><td style=\"text-align: right;\"> 25000</td><td style=\"text-align: right;\"> 42.9661</td></tr>\\n<tr><td>3 </td><td>00004</td><td>paris3 </td><td>False </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 2 </td><td>15 days, 16:13:20</td><td style=\"text-align: right;\"> 22800</td><td style=\"text-align: right;\"> 15.6691</td></tr>\\n<tr><td>4 </td><td>00009</td><td>paris3-1024.zip </td><td>False </td><td style=\"text-align: right;\"> 1024</td><td style=\"text-align: right;\"> 32 </td><td>0:00:00 </td><td style=\"text-align: right;\"> 0</td><td style=\"text-align: right;\"> 549.99 </td></tr>\\n<tr><td>5 </td><td>00010</td><td>paris3-1024.zip </td><td>False </td><td style=\"text-align: right;\"> 1024</td><td style=\"text-align: right;\"> 32 </td><td>50 days, 3:15:24 </td><td style=\"text-align: right;\"> 15200</td><td style=\"text-align: right;\"> 33.2466</td></tr>\\n<tr><td>6 </td><td>00011</td><td>paris3-1024.zip </td><td>False </td><td style=\"text-align: right;\"> 1024</td><td style=\"text-align: right;\"> 10 </td><td>5 days, 18:48:04 </td><td style=\"text-align: right;\"> 1760</td><td style=\"text-align: right;\"> 200.356 </td></tr>\\n<tr><td>7 </td><td>00014</td><td>paris3-cropped-256</td><td>False </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 8 </td><td>2 days, 20:08:22 </td><td style=\"text-align: right;\"> 4160</td><td style=\"text-align: right;\"> 20.1699</td></tr>\\n<tr><td>8 </td><td>00016</td><td>paris3-cropped-256</td><td>False </td><td style=\"text-align: right;\"> 256</td><td style=\"text-align: right;\"> 8 </td><td>7 days, 20:55:54 </td><td style=\"text-align: right;\"> 11520</td><td style=\"text-align: right;\"> 16.5185</td></tr>\\n</tbody>\\n</table>'"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"\n",
"tabulate.tabulate([{\"idx\": i, **run.get_summary()} for i, run in enumerate(runs)], tablefmt='html', headers=\"keys\", colalign=(\"left\",\"left\"))"
]
},
{
"cell_type": "markdown",
"id": "d6c1da91-882b-4963-b908-50edef54265e",
"metadata": {},
"source": [
"Pick a run from above, and assign it to `run`."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "e0be04fd-ccd3-4bd0-8823-679f3fe26f45",
"metadata": {},
"outputs": [],
"source": [
"\n",
"# print(runs[2].id)\n",
"# display(runs[2].snapshots[-1].get_preview_img(4,1))\n",
"# print(runs[3].id)\n",
"# display(runs[3].snapshots[-15].get_preview_img(4,1))\n",
"# display(runs[3].snapshots[-5].get_preview_img(4,1))\n",
"# display(ruatns[3].snapshots[-1].get_preview_img(4,1))\n",
"# print(runs[5].id)\n",
"# display(runs[5].snapshots[-1].get_preview_img(4,1))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "55879946-0418-4e81-9de9-aea491d61f16",
"metadata": {},
"outputs": [],
"source": [
"# print(runs[5].id)\n",
"# print(runs[5].snapshots[-1].pkl_path)\n",
"# print(runs[5].training_options[\"training_set_kwargs\"]['path'])\n",
"\n",
"# # display(runs[5].snapshots[5].get_preview_img(2, 1))\n",
"# # display(runs[5].snapshots[10].get_preview_img(2, 1))\n",
"# # runs[5].snapshots[-1].get_preview_img(2, 1)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "50f8ae21-ae43-4b07-b3ed-34c1d941e52c",
"metadata": {},
"outputs": [],
"source": [
"# print(runs[6].id)\n",
"# runs[6].snapshots[-1].get_preview_img(2, 1)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "9d067a55-8f55-4709-b1e6-fa20a97ec194",
"metadata": {},
"outputs": [],
"source": [
"# set variables based on selected network\n",
"# run_data = [r for r in runs if r['run'] == run][0]\n",
"# print(f\"Picked run {run_data['run']}/{snapshot}\")\n",
"# snapshot_pkl = os.path.join(\"training-runs\", run, snapshot)"
]
},
{
"cell_type": "markdown",
"id": "1bcf6ea7-4548-42e2-8c43-f0c41d9fbb81",
"metadata": {},
"source": [
"## pick a snapshot"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "135353a2-f621-4634-b3b5-d768688c8513",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Picked snapshot 22800 from 00004-stylegan3-r--gpus1-batch32-gamma2\n"
]
}
],
"source": [
"snapshot = runs[3].snapshots[-1]\n",
"\n",
"print(f\"Picked snapshot {snapshot.iteration} from {snapshot.run.id}\")"
]
},
{
"cell_type": "markdown",
"id": "09d6bc27-4dae-40f9-9862-983f75ea848f",
"metadata": {},
"source": [
"# Generate some quick random images using network (deprecated)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e23af7b5-567c-4748-a65a-96235eb2a59b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<module 'gen_images' from '/scratch/gen_images.py'>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# rerun this cell after changes to gen_images.py file\n",
"import importlib\n",
"importlib.reload(gen_images)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "21b82834-a866-4058-9631-bd691b8c215f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading networks from \"training-runs/00004-stylegan3-r--gpus1-batch32-gamma2/network-snapshot-022800.pkl\"...\n",
"warn: --class=lbl ignored when running on an unconditional network\n",
"Generating image for seed 0 (0/3) ...\n",
"Setting up PyTorch plugin \"bias_act_plugin\"... Done.\n",
"Setting up PyTorch plugin \"filtered_lrelu_plugin\"... Done.\n",
"out/00004-stylegan3-r--gpus1-batch32-gamma2/022800--seed0000-trunc0.5.png\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generating image for seed 1 (1/3) ...\n",
"out/00004-stylegan3-r--gpus1-batch32-gamma2/022800--seed0001-trunc0.5.png\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generating image for seed 2 (2/3) ...\n",
"out/00004-stylegan3-r--gpus1-batch32-gamma2/022800--seed0002-trunc0.5.png\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nFT9Z7Sl13keCO53xy+cfPO9lQNQyCBAAiACM0VSpklKliXZsi17rXboP71mlmdW97S9xqv/zPyY5bY9q2e5LXfLLatbWaJIiRZFghEgQORYhSqgcrr5xC/t+M6PfW4BfckFFAqFe885395veJ7nfV74k2/+fxljKlGCCwIgpeKcB8Q0ScqyNsaWZXHt2pWHHn60qW2/P3jr7be892trh/b295NUPfjAQ2mavvvuOURot9vT6eTkqeNpmpVlcenSZQDe1No5c+TIsWPHT9y8cW17+3aSZEjQe3P33XdTSjGEa9duIAKlQAAH/W6v1+Wcb27eFpKniZJCGNOkqfLeEkIIIhJsGu2cY4x759I045wba7XWjDEpJAGCAZ1zWmvvnZSKcxYQvfMhBEJI/AMAEBCllEopALDGWGsRkTHmvPM+EEKC95RSLmQIwXvHGOWCI4am0SEgA16UTbc7yLIWpawoyuFodO+9945Gw3antbu3VxRlu9WyzqpE9brd4f6w3WpPp0VTG0JYXdcnTpygwEMISareeP11bXS/300z1e20G13neVbX9Xg8894bY73zvV57dXV5Z2d7NBpyzoyxQHB/f2/j0OEQAsGABNM02bx9c39/76677gZKvHc+eMG5lEpKSYAEH6y1XHDv/Gw244IDgYDBWssYE0IYbYSQlFFjNGcCgCIiAABQIEAI+uAJIZQCIiEECSEhBERCKSUEnLfBewB68KMZZTxRibXWOa+kss4yxtvttjGmaRpE7PUGP/jB99ZW10+cOMN58uorL7fy/JVX3zh/4YNev6+kAEowIKPCh/DMM099+tOfmozHxtZnz729trHyl3/x3S9/+UuHjx8aT6d5mlmtm7oZj8atvIUYEHEw6HU6rXfPvjsYLLZauXM+SZL9vT0ulQSgiKQsK2etMSYgAgABEgJhTBjT5HlOAYAQSikQQgggkhC8954QJEAIIcYYY4x1lhDivQshWGvzPONMDEd7AdE5h4jGWi48IWiMsdYyyoBCwEAQAgIg8cE75wiQpmkIkUoK56z3zhgoihnnjBBklGZZVlVV8F5IqZSazqaCi16vO51OnbMA1FpDKU3TBAlqrQlhlFLggBgCIiFABQBQQog1ZqY1AeCMcy4IQcYY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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for z, img, filename in gen_images.generate_images(\n",
" snapshot.pkl_path,\n",
" gen_images.parse_range(\"0-2\"),\n",
" \"out\",\n",
" truncation_psi=.5,\n",
" class_idx=0\n",
"):\n",
" print(filename)\n",
" display(img)\n",
" img.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "fa108dfd-5f91-4c7e-a489-96adba41744a",
"metadata": {},
"source": [
"# Load generation network"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "5c222012-4309-428c-ae55-ec1b6fecfbbf",
"metadata": {},
"outputs": [],
"source": [
"device = torch.device('cuda')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "dfd92a04-cfe3-4124-b08d-d353551ed397",
"metadata": {},
"outputs": [],
"source": [
"psi=2.0\n",
"# all_seeds = gen_images.parse_range(\"0-2\")\n",
"all_seeds = list(range(0, 3))\n",
"class_idx = 0"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "9e5ba0a7-a909-4726-b90f-74d429ab9e8f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0, 1, 2]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_seeds"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "6f6ac121-a70b-4a00-a65b-012fcad41562",
"metadata": {},
"outputs": [],
"source": [
"G = snapshot.load_generator(device)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "7bde610e-7ee9-4bfa-96ef-e480e2bb7d4a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"warn: --class=lbl ignored when running on an unconditional network\n"
]
}
],
"source": [
"# Labels.\n",
"label = torch.zeros([1, G.c_dim], device=device)\n",
"if G.c_dim != 0:\n",
" if class_idx is None:\n",
" raise click.ClickException('Must specify class label with --class when using a conditional network')\n",
" label[:, class_idx] = 1\n",
"else:\n",
" if class_idx is not None:\n",
" print ('warn: --class=lbl ignored when running on an unconditional network')"
]
},
{
"cell_type": "markdown",
"id": "669c4366-cd3d-41e1-a25b-58040fdb4429",
"metadata": {},
"source": [
"## Interpolation tests"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "fe5e2c95-572f-42e6-bdb0-7b0d8c4087ff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"interpolating images\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "010161f8347740999a8c7c9067bb8a68",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"/scratch/out/interpolation_test.mp4\n"
]
}
],
"source": [
"print(\"interpolating images\")\n",
"def interpolation_test_gen():\n",
" for idx, img in interpolate(G,device, None, [0,1,2,0],None,'w',psi,label,100,'const','out/test','slerp',None, None):\n",
" yield img\n",
"generator_to_video(tqdm(interpolation_test_gen()), out_filename='out/interpolation_test.mp4', fps=10, frame_size=(256,256), quality=8)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "6d6fb9d6-215c-43e4-b199-90f6cca2411f",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1b520868d50547b99358bd31d79f3c6d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Video(value=b'\\x00\\x00\\x00 ftypisom\\x00\\x00\\x02\\x00isomiso2avc1mp41\\x00\\x00\\x00\\x08free\\x00=\\x08\\x7fmdat\\x00\\x…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"video_to_widget('out/interpolation_test.mp4')"
]
},
{
"cell_type": "markdown",
"id": "247194de-37cd-4c11-a3ad-c270a52e8f23",
"metadata": {},
"source": [
"### random seeds to zs to ws"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "fe33e5cd-659e-4e2a-92e8-22bc4a8677ac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of w torch.Size([1, 16, 512])\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nGT9WY9t2ZEeCJrZmvZ0zvHpDjGQzOSQkjKrM1UpqaVEoZ/1C7r+XgMNNFDoXyCg66XQeimhNTVKmVmUmAySEXd29zPsaU1m/WD7eLDQl2QEA+Hu956917Lhs+/7DP/v/4//2z/85h/+p//p//nV19/4EIL31jnvnPf+fL6IwLosxlgiQ4hEZKx11grIbrcjomVdh2HY7XahaVJKnz5+Til++fwpLjMRllJYRERyLuu6/vU/+2e7w6Ftg/fmeDqC0P/yv/xbEP6n//Sv/v7vfx1j6rreGhPj+vBw9/nzl2++/eabb96Gpmmb5jJeRISQjHFEeDqdXj08WOeeHh8B0Xv/3/7rb/78z/9xLkkE2zYA0vt377/55utc8n/53/728ctj8OH+/t6H8OXLl2VZAWme5qYJa1xDcP/kH/+T4/F0Pp0ql5zL6Xz6Z//8r/f7QWpNOQHSm7dfH48na+yH9+9Ox6OzxnnnnCPCZVlubu6atj2ezs65pgkpJWOMMeY//sf/PI3T/f1drexDWJf1q6++ss7M0/Tx0+f7+7s///N/xJUvl/EnP/3248cvp9PZkDkcdinFVw8P8zz//f/+6/v7u8vlMk8TswxDn1Jq2xYR7u5vfvVnv/xP//E/XMZLqeX2ZhdCqIURKYRwf3/vnP/86fPT09M333zlnX98eix5FWBrqB/60IRlWUupfT+EpjFkAMA5fzlf5nnZ7ffC8vT0TGSss4QIiAgAiCDCIsLc911o/Pl8cs4dDvtxutRSEJEI13W9XC7eubbt2rbtuq7WGlNa1xUEvv32Jyzw4cNnAEOE//W//sb7ttTShAYRj6cT1/qnf/onZGwpNafy/sOnX//611zr3f3dL3/5i//uv/uL8/kCIMuy/v73f3h+frq/v0PE169fi8i6rl3XOes+ffwwDH3fdymm4+mEgM57EYwx933/6vUbQLBENM+zCCMi11pqjTGthqyzp+O5Vl7mxVlnnUMAAUDElNKyzLvdrtayrvH1mzf393f9sLPWGkPeOWOMsZYIAYBZRLjk4pwzxrAIAKzrCoAAOM/zYbcbx+l4PLZtx8xrzrkkRMw5AwCSPnWppSAZARHmKsBcrbUA8OnTp4eHh3man5+fSylEJIKIxMLOWv1mQwYJkUgAREQErLWlVDIECE3TcC2VmbkyV2YWYQBARBC5fguXkkvJIFJLqbU0jbfWGmMAhIisMyKCCCw15STCxrgQPAAgERlTSl2XlZC+++1vU8n73ZBz6vshhLAua85pmsbL+RjX6Kw9Hstv/+G3TdN2XZti/PD+Q0qpaRrv6XQ8Gmucs1Xq5y+f7h9uybLz1GB3d3sXmgCMKaWU8uOXR2ZmlrZp4roiIAI470BqqQUAQCSlmFMhMiIAALVW53zTtN4HY+yXL48iIAAlF0REQgAAAGHR53MZJx983w8AknPOKQMIIgIQMyMCERljnHM553meY4zrGvt+sMamXFLKMc73D3dt24zT7Kwdp0vfDcGHdV2Op+ObN2/juh6Px75r97sdEeWc/8N/+Pdcy93d/avXr1LKIsK1cq1IJMxoSO9AtWWapmWZ4rrb7fZ3d7ePj0+n46lpWkM2NE3bNss8W0Q0RNY6IgIQYS651IqIWGoBAWPIOWesBQFmrlxL3n7VWkXkdDouy7zf7/eHg3e+CQ0RGUNEBCKIXBkEwFpLRDHGECyiOGsvlyWnbK2dpom5cq0pJT1vy7Iwc9M0peSmaVik1OLIIKB+4NPp1Hf9OI7ff//94XBgZkQstQZjBQiRCICIiKiWQoaICBFFuNaKCGQM54KIzOKcrSVzrczCwrUyM28nHwRAAISZU4pcKyPGuBKhd845S0TMTETWWhax1uiVa9smhObDhw/PT89EdD6dL5fRGtv1nQ/h9v6ua5t9yXd3h3WdEfWusbVEBh6fHo/Ho7WuaQMzMzMAHA5759yyzG3f3t7cPD49D/u2bc3HTz8Mu75tO4O2bVokmpc5xiQiMUZmbtsWAGJcjSFEsdbElMig9z7nsixrShmQRIDIWmtTyiA47HbTOItg03bCLABEuIUiEUYWFiJk5mVZb24OzHUcz4gkwqVWqDXnXCsDgjFEBDHGnFOthQgNkQiIQC0VAIQhBP/5y2Mk6vv+dHpumq5pGudc0zQfP36axksu7J1Fop/+9GfOGefNd9/9dprH4BtrbNO2PgSulUUa64iIuQIYYw3XsqxrSmm/Pzzc3z8/Hz9//lIYXAjTNIUQbCnFOvvNN1+3XVe5CkPKyXsvIrVUYwyAXn4UAEQAgVorAhprSi16yASklAICzIKERPodiEgAggAiQkQiUnLWKFK5juO4BXIBQmSRlFLwvmmaz1++NCGU7S6SnkkAIKJaeRzHp8ennEqpRfQXa3LSPyRqQjPWAkIpBQDwGtCFWUSsMcKMiLWUEDwL51JEmFmYudbKIhoUAQAQWDilVLmUJZdSgvfOOz3uIkKERAgszlpAAADvPSFO08QijfeGzJs3b/QAhSZ4b0VqyTnGZRgaABGpxhgWPj4/AxhrjCEcL5e+7zUi5JyXZWbhYWifnr5cLlPXu/3hdl2WdUmNb2up4zhpGgMQEHHOaF4XqaWKnt6YInO9ub0lomma1nUFQSIDQIiEQKXm43Ra1yiCzjlr3fZwr48CAPTJEBHXWkqNMeaUSqnWWmZA0BhVS8lcA3PVdMFc9cnXWi+XEQBKydO8vHn96rDfL8vyfDzmnPq+y6U66+7v7qwz1tAaI6KZpqlt23ke7+/v3rx524SGuf6n//yfQHC32+Wcu64L3gPozUQitNZUYGtNrfV0Ovb9cHNzQ8acziOgfHn8fHN7Z5l5mqaf/+LnXT8s8zJNM7PGvMrCUEHvtAAgoFw/mw/ee38+nQCw7Vpnbdd3zltDBrdfL89KWISZ+2Hoh+F0OZeSrSXn3OVy4cohBD151phSKnMRppLzUus0TV99/UYvGBERkgB8+fKFuaaUxvFCZKy1hozGEsLtNZVSmqbx3iNAqfXlIIuIljiGqHJFoMLVe78slFISEWZmrrlUjbvGmCqCgMKccywlg4C1xnlnrzUeouhDF5GUY9M03odxGtum/fbbb3/zm+9STgDQ9u26rjHGW3vTNLZr21JLKbmW3PVdqbmU1LVtSmk3HGi/N8ZcLhdjzDD08zKVkrq+7YcuxeUn3/5JKSzAcckxVmedsFhray0iDAh6kTWZSaoxxeB9zmkcL0j8+s2rJoTn42maZ2bp2j6ElnBLkgCQczqdTiE0bdsDLJoB8Hr6QUDrOmutIco1T+NFhLuus8YBEJIQkDFWWHLJOefKNQQ/z1RKIYPMPI4jGQMiXOvz83PTNDc3B5H65cvT6Xhq+85b17Qh53Q4HGr9bhh65/00Tw+v7o/Hp7Zrck4//8XPS+H/9pt/OJ2Oj49f2rY1f/arr7/+KueUUjKGnLMIbAwhQCl1HC85ZyTz9VdfHW5vUkp911gWPh6Pr1+/vX94NU0jC+x2++PxOQTf94OIpFRAEBGttdZaza37/W5e5nEcSy5v3rzqum4Yds77nIpWIwDA2iqJMNemaR4eHg43h1SyiNTKfddP06xncZ7nEAIAEIKwzPPkvRvHsZZirdPs4ZxDQkIaxzEEb4y51ufgQ1jjqoU7AAoAaB9AJABcq4i8XEdm5lrFSq3VGOTKImKtzTnpj2MWTXEAUnIWYQFBxFIKiACgfkARTTYAIIhgDOZcEcFaYwxZQzGuIuCdFWu8D8G7tgkxpYeHe0RJeT0en7039/c3Xdf0fTdN0939HQAw11LyOF66rkOEZV1C8N9++/XDq/v3798DV2NMKUWYDZomtITal1YABuBaa8lJyzhjTK7srH14eOi6vnJ1jrwPXx6flnkVBkOubTtnvUb3nKNwHYau73tDxvngnPPeO68VMohwLTXlnFNOMS3rWktOafXBaRVHSNonexfIWK4cY1zXdb/fd10bY2SuICJScyoidbcb5mVeltl59/bNm/u7uw8fP8/LTIY
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nFT9yY8mWZIfCMryFlX9Nlt8jSUza2UVyeKQRLNJotHAzPQA03/jAAPMqTEXXnlozI2XnkuRDbI5TdaSlREZ4RHubmbfpsvbRPog+nnUWGZEBtI93OxTfU+eyG97+P/8f/0/zqfT//Q//b83210IgdmVUltrm81wOp1bk1pq8MH7gAgi0pqktFyv12EzEFHJJcTgvOuH4eH+IYQwDJvnz5/Ppxd2XGtV+1dynuf5H//FX8R+6Ieu711KqWT5n//n/08Xw7fffPv99981Ue8jEwHoZtOfz5c//KM/fPPmYbvbhRCu46UWCd7X2mKIf/vbvz3s9yGE//Sf/tNvfvObh4eH//Sf/vM/+LN/cH+/R+RSymY7fP74+eHxodbyN3/9tx8/fgKFh8cH5/zlcsm5iOiSkoj0fX8+H//kj/9YVZ+enkrOivD09PRHf/xHf/gHv2qtquo0z4+Pr5YlIdLHn386H08PD/fee3asqvM83d3dhxjHcQYERIwxdF334cOH//Af/mNO5f7ubhwnADgc7mIXt7tNjGEcx6++ej8MsYvx+fnl1evHZU4//PDjNC1PT0+I+PrV6xDC+XySJvvDnpnneVZo9/f3T0/PPrivvn7VWgnRI5BW7PvOOTfPc85ZFVqrpZQQIhG0WnfbXcoLOyx5VtD7+4cm8vT0PM9L3w99v3HOOecBQET3u32t7XodmT2AqioSIYJ9iYiIIKKKsKOHh3smOl9OIgKgtVVQzTlN09jFuNvtttttreV6HXMuqurY/+pXvyb2v//9j8fj+d3796fT8XfffZ+WtDvsEbBV6fvBe/ftr3/16eOn73/3fRO9XkYiurt/fHi4e3x1//133wNo3w/TlMbxev9wD6B91+32+3mecs5d7I4vz/M89V0nql3X7ff7VuXDTz+/vJzevnv3+s2bu8OdI6Kc81dffRW6rtVWW5vnRVUBoNaCQAqqoACqCqKqqrW2Js1512oTESQCBFBFQgBAACL88qX2ayoAQEy1VdWmQogoIsuy7LZbIrLnLiIqstkOL8cjIeaUaq1IJKIIBCBELFIvl/N4vV4v12Ho7U20JgCAgKpKhK1WInLeM3OpBezHAlAFVVHVEMM8LfYuvXfOuZSzd05EmoiC2ru0jwCgAJpLrq222kopIQYfvHMOEVQAEYkQAJhRAYgIEQkphth1PSIT8+OrV8ycckIEkVZKIoSUlt22c45FWmtNQc7nc4z90A+EcD4dQ4zB+7nO43gVFWYahm6erwgaY2CmJjhdl6HfqOo0zfbpEEFVEMF7RhQRzXlp0iPiskwAcn9/z8zn82WZFxF1zhMxAAGQSBuv4zROzD6EyMwiAiBqqwAAEQiJHdtbKzVP4yQipWQfPAAQkoIAQGu1Nm6tqgozIyqAMDMRnU6XGCOAjtPYWrk7HPK7/OOPP55Pp91uh0TzPL179weOuevikpauG8ZpVFEffN8H514/PDzsD/u/+q9/9du/+912s2mt7vf7w+HgvV8WJEIidN5RImZC0WVZpMlmu3337m3X9fcPDzmnaZ4cM18u13fv3r56/Xaep2lagn+apgkRiEhv67eJICIRqSogbDabzTA8PT/Py9xv+i7G/X7Xdx0RExMgwK1cKKioimjXdff390vOtVYFD4D2MwUfRFopNcauNQGEnBITLvNyvV4B3jCRAhAz1uacm6fjNF1VdV4W5xgRmRkA7MXbV2sNAUIIiAgAanvDNqKIiDjmWiuoqmirzTlXSmZmURWV1loTQSRiam39M0vJtVZUdOwYkZlt0SsKIiAhEeaSvfebzXC9jrXW3X6/3Wwu5/PCRERNalrm3W7TdTF4HmWaxmu92/ZDdI7G8fL4+FqkAcAw9EQ4TfN2u2HmKsU5t9tttrvN6fjy9VdfE1LKudVWszIFVXDOiVQRq9BNpYlKqw0Rc8ldjM7x6XSsLX39zfsQ4svLcRwnEe26vusGIiZiQhRQIrhcLkSu7wbmxcqHlQJV0NsXIjGzSDsdjwC62Q4+BABEVCJyziNQrTWXknPebIYQQkqJEETbssyqWnKOIbw8vwxD38Xw/v3b5+eXz0+fu65HRIUGINvNtu/7WuubN28+ffrcd11apsvlMi/T46v73/zmN6XKy/PTy8vL58+fz+fzP/pH/3C72Zwv1TmKwZfg2DGKQoWUl3ZqxLzdbu4f7pe0HPZ7BwDX8epDePXq8XqND498d3f/008/DUP38PCQc5UmIuun9d4j4rIs2+0m5dREQOHrr7/a7Xd938fQpZRVrFSorTb7e9fF3f6w3e5wmZd5bFWCD+fzpbXGTNM0sWMmKjn3Qz9No/e+tVZKUQVEBAXH3JhF5OXlxXtnVRYQAbCLnX27W40HUQUA5vVoUlWwWg0qsv5gpRQkEpVcCiLVWlXX085+j7V89rKJqLWmqgBaa0ZEkUYIxGS/0zGpNiYIwbfWYvSl1JwTMW42m/1+H2MYNpvz6bTdbpyj1srL8XmzGQgheH93f3h5OfrgQgilZGlyvV66vks5IWjw7tWbx1/96ttPnz4xu1JKa01ViJ19dgRtraiKSGut1lJaawAQQhBV59xutzscDl3XTfOVyX369DktydZwF4cQoooqaMqLSh367u5wR+yIeNhsYghIQESA9lJVFXLO8zTP87zMswYmRMfUWmV2RIwAwUd2TlVKzvMyxy5uNpt5nppUUCJCkVZq3mx6VR3Hq3Ou7/tf/2r7cP/w6fNndni9HN+8eZ3SVVqz7ff27etU8jTnbwi9dznn63hprYQQHl891lJPp9MPP/zwZ3/2p6Vk710IIQYfgm9NCBFASy11WQBpHK8pJSZyTdoyz96HnBOA7rZbJqeqd3f7UgoAqkCrQuyYyTlnfUvXdz/99OM8TX3fv3v3NsZIzLW2UgoA1FathVDV1ppz7v7+YUnpxw8/dv0QY5fSMgybaZprKaWUZZlBIaWl77sQwjJPl8vZe19rFRUAsBrP1ACw1tb3nSp45w/7AwL44G112h64NS320FABRGTtYxQQVQFak1qr894a2RCDlTlAbCKllFrbMPSHw77k3FottcYYnPOgej1fck7LsjjH3rvbDsFSS9/3TVopGkKwbz1N07Isb968bq21Vud52qRBlXb7zd3d/nC467oOCfquOxFJa10Xnp9PiISE4zjVkv/8z/4013K9Xo/H0+U8IqCIECGRB1z3c5MqrbVWW6utVkQKwTvnQojLksBhq+23v/273/zBb46n49PTEzETOkQgsnNeS8m1FtHW9/3d/f12u3fskMj6HOuBfzkJiDab/uHh3hZDrWW8Xq7Xc1pmZudDYHbehxj6UhISpyVdL5e7u7vD3eHTp08q0lrNOeW8hNA555hRRHNaGnPXhbdv34hW5/D5+fPPP38ep+tud6i1IYK0ykTeM0DsupiWBVRCcNfLOcT4/v27V68el2XOeXFuYCZ27J1jkooEAIiUUqolt1ZrLfMyuVrrNE13d/F4POacQ+yu1ysiMHMIgYiZXGvifai1ibTL5cJMyzzN83i5XgCwtTbNU4xdqyIiolJrFRFEEmmI8PD4sMzphx9+//bdu5zLMPTzNIvYnDQdjy8ppb7vvfPeB12nKzs9hAgBkJAUgYj49kpiDLv97u7uzjkWWb+j9Wmqtvrtba1tz60lUxHbDwoIjhkAZC3w1qqJHV42TX748cf7+3tAJKL9fp9SUpHdbhvCPRHlnJa0tFpFW20FCZm4LNU5IsTSqg++77rnp+dSsqpeL5e+72srr+7eOIfD0Hvvck6tNZsNiDCl+f7+AIDTOG23w/39XQgeEJn486cnAI1d9N6pNuuta6ut1taqtGqb3zkXQvDes/PBB2td+757ejp+/vR8Pl1Lle22V1UAUZEmrZZSSm5Sg/fDZthsN8xUarHJ6Zdm9pevX2Y8qwLes6KUl5eUltpajJFCBCQFJGREmOdZVO7uDvv94ePHTzHmvh/C4sfxYviK99E5BrCjFYk8gEzT1Tl99fphmjIzAygTvXr
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# modify a value on a single axis in w\n",
"\n",
"axis = 10\n",
"zs = seeds_to_zs(G, [10])\n",
"ws = zs_to_ws(G, device, label, psi, zs)\n",
"print(\"Size of w\", ws[0].size())\n",
"orig = ws[0][0][0][axis]\n",
"for i in range(-5,5,2):\n",
" ws[0][0][0][0] = orig + i\n",
" img = w_to_img(G, device, \"const\", ws[0])\n",
" display(img)"
]
},
{
"cell_type": "markdown",
"id": "fbe72b14-109e-4bb6-8dae-33c8e21bda18",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "f67309c9-fab0-48bc-b65c-28975a214be6",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "20568609-453f-40f3-9470-25e9e3b7eb51",
"metadata": {},
"source": [
"# Project an image to the latent space"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "9efa5fe5-afbb-4713-bf42-9fc50a5a14af",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 59,
"id": "758f679a-479e-442c-ab83-ae0c83c662c8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Traceback (most recent call last):\n",
" File \"pbaylies_projector.py\", line 29, in <module>\n",
" image_mean = torch.tensor([0.48145466, 0.4578275, 0.40821073]).cuda()\n",
"RuntimeError: CUDA error: out of memory\n",
"CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.\n",
"For debugging consider passing CUDA_LAUNCH_BLOCKING=1.\n",
"\n"
]
},
{
"ename": "IndexError",
"evalue": "list index out of range",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_1/754981865.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mproject_img\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mruns\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msnapshots\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'downloads/paris3-1024/01-AvenuedeL_Opera5022.JPG'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/tmp/ipykernel_1/640926550.py\u001b[0m in \u001b[0;36mproject_img\u001b[0;34m(snapshot, image_filename, steps, replace_if_exists)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mlossess_and_distances\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0moperator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitemgetter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlines\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstartswith\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"step\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstderr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mloss\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlossess_and_distances\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;31m# TODO: get loss and dist from somewhere? (currently not using it much)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mIndexError\u001b[0m: list index out of range"
]
}
],
"source": [
"project_img_to_z(runs[5].snapshots[-1], 'downloads/paris3-1024/01-AvenuedeL_Opera5022.JPG')"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "5c1e4221-d46c-4528-8e5f-3441ed75e68a",
"metadata": {},
"outputs": [],
"source": [
"image_filename = \"datasets/paris3/00002/img00002019.png\"\n",
"#project_img(snapshot_pkl, image_filename)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "804e1b23-eece-4b50-91d9-f2063df70826",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'run_data' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_1/1907269631.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m images_to_project = [\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;34mf\"datasets/{run_data['dataset']}/00000/img00000004.png\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34mf\"datasets/{run_data['dataset']}/00000/img00000044.png\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34mf\"datasets/{run_data['dataset']}/00000/img00000773.png\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34mf\"datasets/{run_data['dataset']}/00001/img00001000.png\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'run_data' is not defined"
]
}
],
"source": [
"images_to_project = [\n",
" f\"datasets/{run_data['dataset']}/00000/img00000004.png\",\n",
" f\"datasets/{run_data['dataset']}/00000/img00000044.png\",\n",
" f\"datasets/{run_data['dataset']}/00000/img00000773.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001000.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001020.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001070.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001054.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001141.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001198.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001300.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001415.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001469.png\",\n",
" f\"datasets/{run_data['dataset']}/00001/img00001477.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002070.png\",\n",
" f\"datasets/{run_data['dataset']}/00003/img00003001.png\",\n",
" f\"datasets/{run_data['dataset']}/00003/img00003139.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002006.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002016.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002192.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002203.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002209.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002211.png\",\n",
" f\"datasets/{run_data['dataset']}/00002/img00002225.png\",\n",
"]\n",
"\n",
"#[a for a in tqdm.tqdm(images_to_project)]\n",
"\n",
"projections = [project_img_to_z(snapshot_pkl, img) for img in tqdm(images_to_project, miniters=1)]"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "4d761cae-c8b3-4c98-8fba-aab120bed73c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "f752643e-d592-4964-918a-7eb3ce4533aa",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 63,
"id": "3a792e00-3f3a-4d68-b037-213b8855190c",
"metadata": {},
"outputs": [],
"source": [
"# alternatively, we can load earlier projections from disk\n",
"projection_folder = \"out/projections/00004/downloads/paris3-256/paris3/\"\n",
"projections = get_projections_in_dir(projection_folder)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "ef581025-9998-486b-b91d-06893788c305",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"random set of projected images\n",
"07-RueSaintDominique4388\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"08-RuelaBoétie40084\n"
]
},
{
"data": {
"image/png": "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r77kwEvWt7bW1tYs2CRNS5XyYDhI07Raq1qwhDLueUIU2mhjDFjQWiupEEKYELz7cI3RLsBba9MswxhbC4TgMAy+Q2wAgMcee2x1dbVarfq+TylptZqEBqPh0FhDCA6CoFopB+U6IMji2FjbaI0DKwNokBnkwmiltZZSgKWM02abr6+v79u37+zZF9fW10/feus9D9zfarcffeAbCwuLr3jpSx586OEzzz67tHq1tzX64Z/4kf/2u//tF/79L73t+996ZfHK97751OrGciFxrVZ98sknxycmzzz9ZK8/OHb44MTE5CMP3o8wIQD94eihBx981zvfXi5FaysrNd9L0mRhYXHv3j39UcK5p5Q2xh48dFALce8/3xNFXrVczVV21yteftcrXv7Zz/zTd735e++//973v//9n/nM5z796U9dvbp07PgNmxtXL1669PTjj7/lLd99zz337N23b/+efQuLi295/Rv/8R8/+tbvfWsmRx71wlIY57JWr+ZJ7jFqCbZGI4QxMhpAaxOGgZTZ7koEQojbiMYYF8kBrDFGa+UWT7XacP/hYob7TneQubPeuISSEEopJmAQNla6KOJ2B2PMRRoXD3zfN8YURaGUopQihIyxRmvKqEfYbtjAWS4p9QjRnJJqpX72+edfc/drv/nUEzecfkmSpbfcfMvR48ce+caDf/EXf7610X3ZK1/+n37tP77yla888+zZbz7+2E+95yf/7G8/0O8Njp84/uA936hWqi976R3/+I+fmJmZ/dmf+em/+Ou/IgBxnHDfK5crP/5jP/rFr96rlVhd7WRZGgQ8F4mxRshisDl0UfBrX/zce378xxHGAfMZYx/4wAc+//nP53mxubX54Dfuee8v/tINN98EAF/4whe+/OWvXHf86Pr22qUXzw+HW29505vOPHvm+7/nu2r1WtIbpllSLzeFEBas0QZhJIUQQhSF8H1e5LnWmlFGMLHGGmMIIfTYsaP9QZ9RggAQRtVaTWvNmFculYfDQb1ep4yVK2WtVRCGtVq9XKlQxgJrlNIoibM8F0p5jAVh4B6IAVMql0ajYae7PTbWDqLQWuueqDst4NtDOkIIAUYuOcDuMY+GwyzPxsbbCKEwCv0gAIQY9zChPAxK5dL8/v3ra+vM49z3v/ilL509+zyhzGiNMHHno0tE3NJx54PVau92b2J8QkmlQQMB5NIRQAgjgpE7kTFyeYcVQnIulFJKKkusxYAACCa+55fCyGOeUVpr2+31R2lOMFZKuWdpjFFKnb9wEWE8MT7uBX4z4BggLJWZx6nnAUJSKUxJqVIejIasyMuV8mg0UlopqamhhBKCCdoptzD69kJhN5TBtZLL2N0ba6zd+Zc1BhMclUpSqv5g4HmexzkxRmntUi1rjbUYIWMMstgQSzHG1hqEsLVWKpUkCSIsK/IkTYUojDUYY6l0mvUOHz3COI+iqFypDLNsbt++5eWrq5vbBNkkzZnHk7zo9Ht75qbGxtt+mvqca6O11lophJHVRhnlh+H03FxSiCTLc6Xn9s+322Nrq6vjU5OY4izNms1GVhRrGxuXLl8mBIdR5HkcYSSVyovC5TvD4XBiaiovckqpC65pnKRZVm80RqORMVoZ4/IPTCj3WRRFQojt7e2Z2RkLFhPseew7h4d6vU4pZYxJKfv9URK
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"05-RueClaudeBernard2894\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"12-RuedesPyrénées5921\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"04-RueSaintAntoine5372\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"14-RuedelaTombeIssoire4704\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"13-AvenuedeGobelins4740\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"15-RuedeVouillé4552\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"19-AvenuedeFlandre2306\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"05-RueClaudeBernard2871\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=522x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print(\"random set of projected images\")\n",
"for projection in np.random.choice(projections, 10, replace=False):\n",
" img1 = Image.open(projection.img_path)\n",
" img2 = Image.open(projection.target_img_path)\n",
" ## Create image widgets. You can use layout of ipywidgets only with widgets.\n",
" ## Set image variable, image format and dimension.\n",
" \n",
" print(projection.id)\n",
" display(image_grid([img1, img2]))\n",
" \n",
" # wi1 = widgets.Image(value=img1, format='png', width=run_data['resolution'], height=run_data['resolution'])\n",
" # wi2 = widgets.Image(value=img2, format='png', width=run_data['resolution'], height=run_data['resolution'])\n",
" # wi3 = widgets.Label(projection['src'])\n",
" ## Side by side thanks to HBox widgets\n",
" # sidebyside = widgets.HBox([wi0, wi1, wi2, wi3])\n",
" ## Finally, show.\n",
" # display(sidebyside)"
]
},
{
"cell_type": "markdown",
"id": "a91c2352-ad7d-4a64-b8a0-4321371b48c1",
"metadata": {},
"source": [
"## load projected ws of projected images"
]
},
{
"cell_type": "markdown",
"id": "4180ca54-995e-4dfe-8271-c4f2d7da4e9d",
"metadata": {},
"source": [
"Load `z` from saved npz files, and map them to the `w` space for (potentially) less entangled interpolation"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "053ef3fa-d66b-42ba-9735-fbbea3b89adc",
"metadata": {},
"outputs": [],
"source": [
"ws = []\n",
"for projection in projections:\n",
" ws.append(projection.load_w())"
]
},
{
"cell_type": "markdown",
"id": "27336821-6de4-49f7-93c5-0d0b1446c542",
"metadata": {},
"source": [
"## interpolate the projected images in `w`"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a4421742-0784-410a-8e72-3d83d47e8e6a",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "82a5038f-c8d3-4a3f-b7b6-06e6b9a31555",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 39,
"id": "2d648f2a-295a-4496-876d-3f518fe8ee02",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d9c44dffa3f74fe88c3d871bde20c350",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/420 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"/scratch/out/test.mp4\n"
]
}
],
"source": [
"steps = 30\n",
"\n",
"interpolated_ws = slerp_interpolate(ws[0:15], steps)\n",
"\n",
"def ws_to_img_generator(G, device, ws):\n",
" for w in ws:\n",
" img = w_to_img(G, device, 'const', w)\n",
" yield img\n",
"\n",
"generator_to_video(tqdm(ws_to_img_generator(G, device, interpolated_ws), total=len(interpolated_ws)), 'out/test.mp4', fps=20, frame_size=(256,256), quality=8)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "e2d85ac0-4882-49fd-9827-549da67b1c3e",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "660378e00b3544bd886a385b014a949d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Video(value=b'\\x00\\x00\\x00 ftypisom\\x00\\x00\\x02\\x00isomiso2avc1mp41\\x00\\x00\\x00\\x08free\\x00b\\xf0cmdat\\x00\\x00\\…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"video_to_widget('out/test.mp4')"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "11c64c2a-9869-4298-b9f3-d7d174c38239",
"metadata": {},
"outputs": [],
"source": [
"# steps = 30\n",
"\n",
"# interpolated_ws = slerp_interpolate(ws, steps)\n",
"\n",
"\n",
"\n",
"# for idx in range(0, len(interpolated_ws), steps):\n",
"# imgs = []\n",
"# for i in range(steps):\n",
"# w = interpolated_ws[idx+i]\n",
"# img = w_to_img(G, device, 'const', w)\n",
"# # wi = img_to_widget(img)\n",
"# imgs.append(img)\n",
"# display(image_grid(imgs))\n",
" # wi1 = widgets.Image(value=img1, format='png', width=run_data['resolution'], height=run_data['resolution'])\n",
"# zs = torch.from_numpy(np.stack([np.load(projection['npz']) for projection in projections])).to(device)\n",
"\n",
"# ws = G.mapping(z=zs, c=label, truncation_psi=psi)\n",
"# _ = G.synthesis(ws[:1]) # warm up\n",
"# ws = ws.reshape(grid_h, grid_w, num_keyframes, *ws.shape[1:])\n"
]
},
{
"cell_type": "markdown",
"id": "ab4e9749-ac11-4555-811b-a715053a9047",
"metadata": {},
"source": [
"# modify Ws on a particular axis"
]
},
{
"cell_type": "markdown",
"id": "4298e078-1df5-4822-b2ad-dced6b7bf982",
"metadata": {},
"source": [
"The shape of `w` is determined as such:\n",
" \n",
"> StyleGAN uses a mapping network (eight fully connected layers) to convert the input noise (z) to an intermediate latent vector (w). Both are of size 512, but the intermediate vector is replicated for each style layer. For a network trained on 1024 size images, this intermediate vector will then be of shape (512, 18), for 512 size it will be (512, 16). (from [here](https://towardsdatascience.com/stylegan-v2-notes-on-training-and-latent-space-exploration-e51cf96584b3))\n",
"\n",
"This quote is about StyleGAN v2. For StyleGAN3 it is actually 16,512 for a 256px image dataset."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bfd1c789-f5b9-45d7-b8cd-fe3ebde9bfb3",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 58,
"id": "7a87dd01-b69b-47ed-b112-90eb2ac707ab",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of w (1, 16, 512)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "aa62a4ceb5e545928f91c3a6edc33a8d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"/scratch/out/test_modified_on_axis_100_layer_15.mp4\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "31088a84de154ffcaf83cbd996cc6519",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"/scratch/out/test_modified_on_axis_100_layer_1.mp4\n"
]
}
],
"source": [
"axis = 100 # 0, 511\n",
"layer = 15 # 0, 15\n",
"\n",
"print(\"Size of w\", ws[0].shape)\n",
"\n",
"\n",
"def modified_on_axis_generator(G, device, w, axis, layer):\n",
" orig = w[0][layer][axis].copy()\n",
" for i in range(-500,500,5):\n",
" w[0][layer][axis] = orig + i\n",
" yield w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\"))\n",
" # reset orig\n",
" w[0][layer][axis] = orig\n",
" # display(image_grid(imgs))\n",
"\n",
"generator_to_video(tqdm(modified_on_axis_generator(G, device, ws[0], axis, 1)), 'out/test_modified_on_axis_100_layer_1.mp4', fps=20, frame_size=(256,256), quality=8)\n",
"generator_to_video(tqdm(modified_on_axis_generator(G, device, ws[0], axis, 15)), 'out/test_modified_on_axis_100_layer_15.mp4', fps=20, frame_size=(256,256), quality=8)"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "90f4f3e2-ed4a-4d42-a220-3089b3c75134",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0b78c9ce3c6e46ada40cd661d578b804",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Video(value=b'\\x00\\x00\\x00 ftypisom\\x00\\x00\\x02\\x00isomiso2avc1mp41\\x00\\x00\\x00\\x08free\\x00\\x1a\\xc8\\xa7mdat\\x0…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cf242ef6a1fa45ada3cc01638062dc0c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Video(value=b'\\x00\\x00\\x00 ftypisom\\x00\\x00\\x02\\x00isomiso2avc1mp41\\x00\\x00\\x00\\x08free\\x00\\x0fPvmdat\\x00\\x00\\…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(\n",
" video_to_widget('out/test_modified_on_axis_100_layer_1.mp4'),\n",
" video_to_widget('out/test_modified_on_axis_100_layer_15.mp4')\n",
") "
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "0e514cf0-887f-4dd2-bb03-5fd25f069ad7",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "aca97237f01549748900f3629799074b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"/scratch/out/test_modified_on_axes_0-200_layer_13.mp4\n"
]
}
],
"source": [
"axes = range(0, 200, 20)\n",
"layer = 13\n",
"\n",
"\n",
"def modified_on_axes_generator(G, device, w, axes, layer):\n",
" for axis in axes:\n",
" orig = w[0][layer][axis].copy()\n",
" imgs = []\n",
" # print(axis)\n",
" offsets = list(reversed(range(-200,0,10)))\n",
" offsets.extend(range(-200,200,10))\n",
" offsets.extend(reversed(range(0,200,10)))\n",
" for i in offsets:\n",
" w[0][layer][axis] = orig + i\n",
" yield w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\"))\n",
" #reset orig\n",
" w[0][layer][axis] = orig\n",
"\n",
"generator_to_video(tqdm(modified_on_axes_generator(G, device, ws[0], axes, 13)), 'out/test_modified_on_axes_0-200_layer_13.mp4', fps=20, frame_size=(256,256), quality=8)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "3ac599e0-921f-4fb4-a60f-57262c60dae7",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a9b1c92ebf6149c99d0b505f50ca2593",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Video(value=b'\\x00\\x00\\x00 ftypisom\\x00\\x00\\x02\\x00isomiso2avc1mp41\\x00\\x00\\x00\\x08free\\x00o\\xb6emdat\\x00\\x00\\…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"video_to_widget('out/test_modified_on_axes_0-200_layer_13.mp4')"
]
},
{
"cell_type": "markdown",
"id": "0a7ffa0f-874b-4ac7-aa3a-f6045cfb4219",
"metadata": {},
"source": [
"### Interactive modifications"
]
},
{
"cell_type": "markdown",
"id": "3b4f7550-4d87-4984-bb9b-cbc502c14274",
"metadata": {},
"source": [
"# put img in output widget as to limit flicker on clearing the output with pre-set height\n",
"out = widgets.Output(layout={'border': '1px solid black', 'height': f\"{run_data['resolution']*2+10}px\"})\n",
"\n",
"@widgets.interact(img_idx=(0,13), layer=(0, 15), axis=(0, 511), diff=(-200,200))\n",
"def modify_axis(img_idx,layer, axis, diff):\n",
" w = ws[img_idx].copy()\n",
" img1 = w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\"))\n",
" w[0][layer][axis] = orig + diff\n",
" img2 = w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\"))\n",
" \n",
" with out:\n",
" out.clear_output()\n",
" # out.clear_output()\n",
" display(img1)\n",
" display(img2)\n",
"out"
]
},
{
"cell_type": "markdown",
"id": "58983a1d-59a9-4253-b363-c832f4ae7dcb",
"metadata": {},
"source": [
"## create clusters for arrondisement"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "d5a0e8e7-bdcc-472e-ba09-f99f4ae3aa52",
"metadata": {},
"outputs": [],
"source": [
"arrondisement_idxs = {}\n",
"for idx, p in enumerate(projections):\n",
" if p.arrondisement not in arrondisement_idxs:\n",
" arrondisement_idxs[p.arrondisement] = []\n",
" arrondisement_idxs[p.arrondisement].append(idx)\n",
"\n",
" \n",
"arrondisement_centers = {}\n",
"for arrondisement in arrondisement_idxs:\n",
" idxs = arrondisement_idxs[arrondisement]\n",
" arrondisement_centers[arrondisement] = np.average(np.array(ws)[idxs], axis=0)\n",
"\n",
"ws_avg = np.average(np.array(ws), axis=0)\n",
"arrondisement_diffs = {nr: center - ws_avg for nr, center in arrondisement_centers.items()}\n"
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "11abc74a-d095-4b5f-8dea-525d8a2a4de4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(w_to_img(G, device, \"const\", torch.from_numpy(ws_avg).to(\"cuda\")))"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "e7e11d85-6499-4f45-9dcc-4a413e23c89f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"11\n"
]
},
{
"ename": "NameError",
"evalue": "name 'arrondisement_diff' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_1/3983068317.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdiff\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marrondisement_diffs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw_to_img\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdevice\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"const\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_numpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mws_avg\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0marrondisement_diff\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"cuda\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'arrondisement_diff' is not defined"
]
}
],
"source": [
"for nr, diff in arrondisement_diffs.items():\n",
" print(nr)\n",
" display(w_to_img(G, device, \"const\", torch.from_numpy(ws_avg+arrondisement_diff[nr]*2).to(\"cuda\")))"
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "897841c4-c966-4ed2-8aba-1aa726f73245",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"3\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"4\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"6\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"7\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"8\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"9\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"11\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"12\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"13\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"14\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"15\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"16\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"17\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"18\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"19\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"20\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nHT9WbCl2XUeiK09/8OZzx3z5pyVNRcKMwFiIgUOskRNLUU7wuGQFGF3t+1o2RF+sB32ix/17lA/2JalVrjdJEWpSZEURWKiAAIgAGIoFKoKVZXzzeGOZ/zHPS0/rP/cKqjtW4FEVebNe/5h7zV837e+zX74vW8AAuc8IiIi5xwAEKMQAgAQwDmntY4xcsYQwFnLhWDAGAPGOQBoY+bzxenpyfUbN4qiHI0nf/ndv9zb35tOp0fHx4CQ93IueAh+PBoDAGOglF4sF8PB0Fp7cnI8X8y3trY5F8vFot8fpFnatjZLkzzP67pxzsUYOWdCiKZpAdBZxzjjXITgGWPHR8e3n7v105/85OMff905PzufjcejxWIxnUx7vf7h4eFytcqyjHPe1A0wUEpJKegfISTnnDHgQkgphJBSSiEFZxwAACDG2NrGO6+1Hg2HT58+9d4BY/P5YjweG5P89u/83vMvvHDl6uWT46P1ejXd2ooY6TYZAIYYQhBS6STN8lRrzRlIKaQQABBCDCGEEHwIwXtEUEr2B30l1WKx9N7lWZ6kaUQUQnjv775/lwFcuXrVe6+1jggPHj544cUXBOMYA+NMK/XwwcPlYmmMYZxnadrr97XWQgjBBX1xzkMI9FQR48WdAmMYY0QMITDGOOeCc8aZEFIp7ZxDxBACAHLGQvCIiIhSyhgjAmOMxRgZ44gxhCAE994LKRHRey+EsM69886766Kaz+chxP39/RiD954+XAgxnUz29vaM0W1rYwyccyEkPRtjEq1VjCgE18YIIQDRe++8jyGGGOhhllXZNm1RVsvlsijLpm7W66Kqq9VqRQ+ZM/7SSy9UZfHGT964cfPar/zqFyUiMAAERKQtAACMLosx1tqWAavr2mgNnAfvETGGwDkHxhkCMGDAOGMMGCAygBgjPYiyLAEYF7yq6tOz09Vqtbe31+/1nXc729tlUT9+/Mza1mg1nW7NZvOfv/vearUe9AdCiMlkPJmMh8Ohc1Zro5RSSmVJoo0p1kWSyRgiY8xaOxgMDi4fJEmSZqn33lkLADFiDAgAUorxeIyIQsosy4ajEWdMKck5p9fpu68YW4uIiDHGGEJ03gUf0jQdjkZSCgAGCIxx55z3ThvDGHDOEXDQH2it7965t1zMzs/PHz95ijGGEGKMknPGmHPOh6CT1BhDq38yGRujE2PSLEuSRBsthNRJEhEB8ejp0yeHT+bzOQAMBv3p1vZgNBoMh1LKEPz56Xmv1x8OB4KL0+Pj4IMUwraWAXJgPrCr167VO7VWSioFiBFjDBExRgzoQwiMcc4Yk1IolVBkCSG0rcUYhZRGSCFFjDH44L1z1llwVVXHELwPjAFjjAsuhaBfQ4xSyhghxiiE9N5zzrIs44Lb1vrgGWNKKmCgpJxMJienZ0KI27efO7i0zzi31rVNW5ZV0zRVXT86PDTGxBAZAyEEY4zekTEm7/U451maamM4Y8B4lhslJec8RmzapqmbPMt88E3TbG9NQwjO+SRNEmPovZ6enRVFKaVAxEv7++ez07ZtJSAyzjnjwCGEGCMyBgBAr5Azzjn3IbRtq5TCzRdjDGJEDgwYACACMIYAAIAxhhiVUs654WCwu7fbtq0xJu5HrdXB5cvWWiFk01qlNAWJ6XQaYpyMx1maI0Capts7O0qqprWL+WK9WjHOJ5Nxr5f38p7zbrlcbm1t5VmGiErJtm2quhoMBnmee+c5RS8hYowhhCzPev2+NlpKFWPEGAEA2OYXulsA2Cz/EGMIwVpb141t7Wq5LMsqBL+1tZXneQgREbTSUirGGEbM8mx7Z9skJu/1xpMtIQV9uuCcAgsXIgI0TeOdb5q6rqqnT44wRuuscxYQGWPG6OFomKbZerV69vQZAAyGQ611U7cPHx5yzvcuXZJSFkWxt7PHOQ8hxhjX6zVjjHMRvOecMcaD9yggTdMYY9s01lkMESm+UXDb/I9ivFQqSRKlVJIYACaEYJwDIudcKckg4ZwzxkLEEAL9GGutddY7a9uWSoA61oxxBIgRGWNJahDQOcc510I754GBFEJrfevmjZ3t7bKu8iznnPkQxuOhlBKAxYhFUS4WixiiUgoBvQ9NXRdFWdV1CDHE4J0HwDRNB4N+lmVZlo7H48lk0u/3R+NRlqVCSEQs1uuqqqWU3vvFYrFerxlnnPM8z6218/m8bdut6fTV9BUhuFwul5T4Y4zAIEmSGKFb4gCcc865Yl1OEEJ8eA8wxhhFfwDOGCAAgxAp5MB8Ps/zXq/fXy4Wp6dnWivG2GQytdYyxs9Oz6q6llJgjJwLo/VkPDYmbZpmOBrduHFdSrler5WUSkoEGI/Hw+Egy/KmadbrtbU2zzIlpW3bJDFGa86Z915KiQAYo/eeM66UAu8R0VkbQ/jwlcMHX7Q0qAwAzhhXSivV6/Xo7uq6LstCK+Wc895zzhEBENq21caMx+O9vb1ev18UxXq97vd69JO89xT2QghcCM6Fc9YYE2P0zjV1jYjOubZtm6Zer1bLxWIxX2ptXn71ta2tLWMM56xpGu89F8I6xznf2d012gyGgxiRFp9znjGGiBgBOFB+DsBiDM654ANjjAFDClSbm0REjBgxOnTBByGo7gW6tRjCpoqjF8yFkEIIzmlvc8M0Z4BKCiERkAETQgopY4ze+xBC27T0VKmukFIiYAyRcz6ZjHo2d9631pZlWdd127Y++DzLuRBpZgCh1+ulacq5QMSmadq2ZcAi4nq9XiyWbdu2rZ3Pl3VdW2tDDIhojMnzLE3Tfq83mU5Ho9FoOBwNh9euX0/TxGhNJRAAzOfzN9988979+3VVj0YDmaQpbQBnbcTIuUCMMTIAcNY1saFQiohpmn54yXgfAIBzRERgQK8BEDDGGGOIoWmaPO8LIUJEAIgRnG2tdd6HEOxisayqCjFevXLFWSeFarpU2FprJ5OJMWa5XJ6cnJ6enNInZlkqBJdSMMbapmmbRggeghdChxC01iGEtmmWi0UMoSpLOxx456SUPnjO2MXuZZsMsLmZbnXg5hdEDDFSyGSMcc56vTzGSGFMKWmMSbNUa52mKeOsbVvnXJqlVBknSYKI2mgpZdu2QkprreAiy/KyLOuq4pxrbZqmiQgmSXv9/sHlKxijta1UyjtflqV1LkmS4WiU5z3g3BgtOAdgzrm6qhgwnqZ53lsXxwDAhaCbklIppbwPaZrlec87R9dGa7qrciNu7pVxoEIOADFGxNhFB8EFxk1BiL5tW1oDAJT7Y4xRSkHBmzGmjZFRMc6lFEpJWg+cMR9CjLEqy/VqGWPMskzRWvQ+S9PpZBxj9CFY55xzddNY23rvQ/TrYgUYGedGG6WUlFIIORjkV68ecC4QwVrbtrZt27pp6rquq7osy3VRnJ2dv/3Oz9vWImKeZ0pprdVg0J+Mx+PJJMtSznhZVkab1XJ1ePhYnh4fU3ekleaS29YyzhgwKaVUKlUZYyzGEEKQQnLBqSxjjHnvnYtK6Rijdz7GSMsHEYGxLM2TJMvzfDQc11VTZlWWZc7ZrekWpdHpZDKdbtm2NcZgBM5FkiTBR8YEAJNCKKkAWVVWMWIIYTFfbm9v11VT19Xp6ZlWMng/Ho+kFNZabozWmnNukkQqJYQEACGF0qquGyE4E5xalM2ih//Rv16sf2AAgvPubQM456SQHim2NXWNUsqqqqy11EAjxsGgv1yu0jQzxkgprW0Z51LKJEliRIqLCDgcDre3t52z1rndvb0QfFVVIQSlFCUx531V1WmWKaWF4Nba8/ncaO1dwhhrmqbX6yVpOjufCaXyPKcKWEoFGLlgUqqfvvHTs9Oz4Wg0GU/6g36v1+v1+rC5F0RKkAiIwICqNc45IHqqM0KgPQOIm29HoCaXyl3oakXvL6oBpEdBH8IpTXBGQIXWejQeZXnWtg3trhCQMbBtUxRrAOBcaKPzPFdK1nUppMjzvGkb76LkrG6qdeGpmpVSCi5CjEJIrbWUUhuVZkMlt5IkUVpTjLOtrZumadqqrJa
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for arrondisement in sorted(arrondisement_centers.keys()):\n",
" w = arrondisement_centers[arrondisement]\n",
" print(arrondisement)\n",
" display(w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\")))"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "0988d48a-b6fa-4349-818d-78e6304636d5",
"metadata": {},
"outputs": [],
"source": [
"street_idxs = {}\n",
"for idx, p in enumerate(projections):\n",
" if p.street_type not in street_idxs:\n",
" street_idxs[p.street_type] = []\n",
" street_idxs[p.street_type].append(idx)\n",
"\n",
" \n",
"street_centers = {}\n",
"for street_type in street_idxs:\n",
" idxs = street_idxs[street_type]\n",
" street_centers[street_type] = np.average(np.array(ws)[idxs], axis=0)\n"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "35db3cda-82f8-40cb-9021-13f4223bc520",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"StreetType.RUE\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nGT9aZRl13UmiJ35zm+MOXKegMRMEABJgKQokiKpLlFkdVdXSapeZUtVbi+Xf9qr/raXXf+8XK1eXiV3225Xl2oiNZRISSyJpESKxCgCIIFEIoFEIsfIyJjfeIczH//Y9wVQq18ugoFIRLz77j3n7G9/+9vfxq+9/AOEkA8BBRQCiuMIY8Qo00Y75xhjxhjOGWPcOYcQCiFgTLx3UkrG+e1bt9c31tM8Y0xcu/ae0mZjY/P119947NHHLl++7Jx/9913b926zYV49plPrq6uGmP29nbffvtKp+iISDRN8/TTT6+srr7+s5/VdU0ImU5n2qjnnnuu2+0hhH76059qZQaDgbV2PB499YmnTp48ubu7895714bD4bDfy7JUCHZwuE8JydIUhZDGSQghiuIoEs55pVXTNM55zjnGqGma4EMcxyKKnHeM0uCD9z6ggBDCi5fznjGmpNJaIxQoZXESe++991EURVFECeGcX79+ff9gvyiKzRObOzu7aZ5jTA8PDzc3TtR1c+v2HUzodDp96KGHNjdPaq1fffW12Wy2vLSsjS7LanNz48mnnsAIN0314ksvBR/SNLXGPPLIIydPncIYv/H6G7t7e5SQRso4jj732c9iQjtF8e61a+9efbfT7Uyns7XVleeee9Z7d+vWzRsffnDh/PkoFndv33788cfKcr6ysrKz/eDWrduEUCUlpcQ770P7QosX/ugrTAnFBFNKj78ghFDKOGMYkyiKhBDwTYwxIYQxxhgj7Qsj/NEvQwhhghlllFJjDbylNRphzCgLIWCCEUKcc61VCIgxVtcVYzxOkx/+4Puf+czzaZoTyr71H7799W9+Y3dnh1J64cKl+bys61rKZjAYNnVTN/XR0ZFSOk2TX/mVLx8dHBadfPv+/dt37y6vrPzgBz+oa/mbv/Eby8srd+/eHQz61trRaPS1r331X//+v2acc+89JxTuCsFEa1XbGj5VCIExppRWShNCgg+EUkqR9wFjLLjQRsOuQIu7GULAGAXkCSHw+bMsxYRQSggl2CLrrNbKeeecIwQTQpyzjFHvnffOOq21UkpijFAIlBCEglIyhAD3nBKMgkcheOeapsmyJASfxIkxOooiRinBhGBina1GZUBICJFlmfc+BOS9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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"StreetType.AVENUE\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"StreetType.BOULEVARD\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for street_type in street_centers:\n",
" w = street_centers[street_type]\n",
" print(street_type)\n",
" display(w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\")))"
]
},
{
"cell_type": "markdown",
"id": "ff41f76c-70c2-4ae6-87fa-096d6a04fbd0",
"metadata": {},
"source": [
"## find clusters in ws"
]
},
{
"cell_type": "code",
"execution_count": 154,
"id": "612ba08c-3791-4c2d-b3fa-59a92246c76e",
"metadata": {},
"outputs": [],
"source": [
"flat_ws = [w.flatten() for w in ws]"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "6e7edbbd-7d74-48ee-80e2-a9487d450a1d",
"metadata": {},
"outputs": [],
"source": [
"# from sklearn.cluster import OPTICS, cluster_optics_dbscan\n",
"# import matplotlib.gridspec as gridspec\n",
"\n",
"# clust = OPTICS(min_samples=50, xi=0.05, min_cluster_size=0.05)\n",
"\n",
"# # Run the fit\n",
"# clust.fit(flat_ws)\n"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "cd05db0c-8308-4d75-8155-e33f254a7e40",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3 µs, sys: 0 ns, total: 3 µs\n",
"Wall time: 6.44 µs\n"
]
}
],
"source": [
"%time\n",
"from sklearn.cluster import KMeans\n",
"\n",
"k_means = KMeans(init=\"k-means++\", n_clusters=10, n_init=10)\n",
"k_means.fit(flat_ws)\n",
"\n",
"k_means_cluster_centers = [center.reshape(ws[0].shape) for center in k_means.cluster_centers_]\n"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "7cc381e1-ea7b-453e-bfc2-b40415a0f474",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k means clusters\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print(\"k means clusters\")\n",
"for center_w in k_means_cluster_centers:\n",
" display(w_to_img(G, device, \"const\", torch.from_numpy(center_w).to(\"cuda\")))"
]
},
{
"cell_type": "code",
"execution_count": 154,
"id": "b3cb8abe-5708-4e4a-af76-afceeb8ab134",
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"# # OPTICS\n",
"# colors = [\"g.\", \"r.\", \"b.\", \"y.\", \"c.\"]\n",
"# for klass, color in zip(range(0, 5), colors):\n",
"# Xk = X[clust.labels_ == klass]\n",
"# ax2.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)\n",
"# ax2.plot(X[clust.labels_ == -1, 0], X[clust.labels_ == -1, 1], \"k+\", alpha=0.1)\n",
"# ax2.set_title(\"Automatic Clustering\\nOPTICS\")\n",
"\n",
"# # DBSCAN at 0.5\n",
"# colors = [\"g\", \"greenyellow\", \"olive\", \"r\", \"b\", \"c\"]\n",
"# for klass, color in zip(range(0, 6), colors):\n",
"# Xk = X[labels_050 == klass]\n",
"# ax3.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3, marker=\".\")\n",
"# ax3.plot(X[labels_050 == -1, 0], X[labels_050 == -1, 1], \"k+\", alpha=0.1)\n",
"# ax3.set_title(\"Clustering at 0.5 epsilon cut\\nDBSCAN\")\n",
"\n",
"# # DBSCAN at 2.\n",
"# colors = [\"g.\", \"m.\", \"y.\", \"c.\"]\n",
"# for klass, color in zip(range(0, 4), colors):\n",
"# Xk = X[labels_200 == klass]\n",
"# ax4.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)\n",
"# ax4.plot(X[labels_200 == -1, 0], X[labels_200 == -1, 1], \"k+\", alpha=0.1)\n",
"# ax4.set_title(\"Clustering at 2.0 epsilon cut\\nDBSCAN\")\n",
"\n",
"# plt.tight_layout()\n",
"# plt.show()"
]
},
{
"cell_type": "markdown",
"id": "81e7f63d-cc4b-4f06-85db-a11d88a84493",
"metadata": {},
"source": [
"# PCA"
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "f32f987e-11ee-44f4-8891-6ff92ab1ea25",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.pipeline import Pipeline\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "5e734acf-3502-491e-b957-97d4c30a4cf2",
"metadata": {},
"source": [
"Preprocess the data\n",
"\n",
"1. Flatten `w`s\n",
"2. Standardise data over the axes\n",
"3. PCA\n",
"\n",
"Then we can get any 2D point of the PCA-axes and reverse the steps above\n",
"\n",
"1. inverse_transform pca\n",
"2. inverse transform standardization\n",
"3. unflatten (using `resize()`) bach to original shape"
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "47cf1bce-56a8-4764-a57c-b2066b54b584",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 16, 512)\n"
]
}
],
"source": [
"# todo standardise data\n",
"# see also: https://towardsdatascience.com/pca-using-python-scikit-learn-e653f8989e60\n",
"# Standardizing the features\n",
"w_shape = ws[0].shape\n",
"print(w_shape)\n",
"flat_ws = [w.flatten() for w in ws]\n",
"scaler = StandardScaler()\n",
"standardized_ws = scaler.fit_transform(flat_ws)\n",
"\n",
"# test reversal of transformation: print(flat_ws[0], scaler.inverse_transform(standardized_ws[0]))"
]
},
{
"cell_type": "code",
"execution_count": 102,
"id": "f26e2e37-e30b-4249-a347-29f29744858f",
"metadata": {},
"outputs": [],
"source": [
"pca = PCA(n_components=200)"
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "813b3f80-0b1c-4c32-b685-fba98a1fd72d",
"metadata": {},
"outputs": [],
"source": [
"# not sure if this is valid, but let's see what happens\n",
"principalComponents = pca.fit_transform(standardized_ws)"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "aa110d8f-594c-454b-9322-58ff299571c8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1.61154972e+00, 3.31606657e-02, 4.47464615e+00, ...,\n",
" 1.94088140e-01, 4.78075869e+00, 8.02469521e-01],\n",
" [-2.56667542e+00, -3.51671605e+01, 1.56012990e+01, ...,\n",
" -9.45038641e-01, 2.07813188e+00, -9.21029695e-02],\n",
" [-2.39633159e+01, 1.48184863e+01, 2.25411644e+01, ...,\n",
" 3.72232960e+00, -5.20663485e+00, 4.49771847e+00],\n",
" ...,\n",
" [-1.67646213e-01, -8.22765505e+00, 2.09605350e+00, ...,\n",
" 7.08278019e-01, -2.01915810e+00, -4.33537491e+00],\n",
" [-2.52184294e+01, 1.94189453e+01, 6.88460403e+00, ...,\n",
" -1.08684533e-02, -3.41931834e+00, 6.66559655e-01],\n",
" [ 5.90393462e+00, 1.54345160e+01, -1.01523026e+00, ...,\n",
" -1.71276984e+00, -3.23904415e+00, 1.87072751e+00]])"
]
},
"execution_count": 104,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"principalComponents"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "2eeae35d-16a6-4df1-b170-e75804bc79ef",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"difference between a w and and it's transformation as principle component\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAEAAElEQVR4nJz915MlW3cfiK21tklzXNl2996+/n4f8AEgQYJmCAbJmVFIoQgx5k3zIFHSv6RX6UUxD6MXxURIAc4MjUBqSAGiSIDAh8+b69tUdVUdm2a7tfSwM8851d0XRCg7uurUOXkyd+69zG/Zjf+n//P/cTqdVVW5WMyn04k1RinlvNvtts45BBSRlBIRhRCISAR2u7Zp2xA8IgIAkWLmmFKMaTZfuN59/sWXu537+c9+Vlel1vpnP/u5Mdpa++jRQ2NtWRS3d3d3t3fBBwD4vb/1e+cX50T0Z3/6Z4g4mU5iSo8fP6nKYrVaff7rX8/n89/67d/q+n61XHVd9/zZcxZZLpcfffThZFJXdfn9733v9OzknScP5rMaEXxwIgAAgKSVjjECiNbaGgPAMUYRQSKllCKFiCLCIswiAgiAhIpIa22MsdYopUQYABEBh4OYpWmazWbTtF1ZlmVRIAoiGK1DSE3bpiQ+8NX13U9+/ON/+t//D0Sqa/vF4uQf/ef/cD6f/4t/8S+F5eLiYjKZnJyegvDnn3/+6WefnZ+fv3z5UpH6/PPP67ruuvb21c1n3//sN3/zN7744osn77xz8+r2X/yzf26sLavq/OKiKApO6aOPPlwu74zRRtOnn3603W0QMCU5PT231vwX/8U/rOpakSqs/cXPf/4Hf/AHs/ns0ePH5+fnZ2dnp6cnVVkSEeXZIMxrmn+CAAtzYubELEiIQMwiIswCwgLStk3TNMxJa2OMJiJttNZaESICc8qE0Tu/WW+Xq5V3nogmk4kxNsQYQxThEHyKUWstwHVdWVsorZVSbduXZXl7t+TEn3zy6WbbFkX59OnTv/jhn1eVff/9p7d3dwL4J//hT4uibpv2xYvniNT1/fXV9cnJ6fsffPD4nUeTulJKXV1d/+gvfvz82TOlqHf++vp6OpsXRamNsdvd7uXLl2VpLi7Oq7JMHPu+3243za4hRdPpdDabLeaL09P5crk0xj56dCEAnNi53hgbUwKAzAm7pvVl8bd+7/eWyx0hPn/xfLPerDdbo3XiWJQlIsxnc+9DjAkAt7tdYn716nqxWJBW2832wcOHq9WqsPbZ8+cA8PLqarXeJJHNehVCfPXq+r/8n/2X77z77r/9N//vH//kJ+fnZ9///mfT2XQymU6n06oqALgojIgklpRYRIzRJ4v5+fm5MRYJlSKtNREpUiISYvTON03T9733gZkBQGlVFsVkMqnr2hhtjAEAEWFOzvmUmIguLy/Xq+XzFy8AUClEAKXVbDrzPvR9zykpUkVhZ/PZ++8/3Wy289n0f/tP/neffvZpYa1S9N/8X/4bRPzhn//5X/vd39VaffX1148ePyZSP/zhDwkppoRIq9V613ZlVa23mxjjdrshpbQtLi4uLi4vqrpOKW2323oyAYC+79t2O51Nu77brDfzxQmzdF3X9h0zG2Oqqvzoo4/+wT/4B2cXF9PpVGtljFaKiAgBRYCZgQUAYaD+4WDmFGOIUWtNpACQ8peEmBOIiHBKKbONUgCYiMhoozT1XfTOxxSb3e7lyxd3d3fMgohaGyLyIXgfYvCcUmIWZmOMsSZLpRhTjKkoy7bpAGSz2fqQlNI/+vGPv/3667//9/+z3rkQQlXXTdP+6Z/8+W63ffb8WYpJRFarVUppOp397/8P/8RNqqquf/wXP/x//N//YD6fTadTAOi6PsVkrNUPHj5smubi/PT0dD6bTkXYuf7m5oYn9eLkhIisLeqqIqK+77U2Whsfgve+67rNZq2U7vu+73vnvDam63qtbWLarPv1ZjubTdfrzW63Q8SqKq6vr0XkxYuXrnchhBjjo0ePz8/PXrx4rhS9/8H7/93/7b/7/PNfn52d//SnP7XGzOazvutBYL1cMXNh7e///t/7J//kfwMAv/1bP/i//rf/7dX19TvvvlNVlTFKhGMMhTUiEIIHEUKwZXF6cnpychJi9N4DiDaaUyqKggG8933vdk2z3WzbtkmJATIBoDXWud57V1VVWRZVVXVdyykJQIwRgYwxs/ls0TZ5tULw1pjJpNbaEyERAkuz222329u7O2EubPny5cv3nz61xtRV9f4HH3zyySeXlxff+95nn3/+uTXm1dX10/feM0qnFL//2ad/9Ed/1PX9pJ6WZVUYa4wx2jDHvu+/+fabn/7spw8ePtxutj/4wW/e3d59+83X77//vvchhOic32y2IuSrpDU2u10wTmttja4n9YMHl7P5wliTOCaOiUERIdJAvqQAwXvHzFrrrAEUKbLGWCMiIghwUBFa69lsypx88FprUirG2Pd930OeBGstEfrOJ06PHj88Ozvtey8i89mcSHkfvPch+K5rQwzCnFKy1iqtAAkBe+cKW9zdLWOMSlG/3RFp58LNzau+74RZhIXTdrt59ep6s9nsttuiLAEQkbRW8/liMqmRgIiMMVVVTWezxXze9y7EpLQmIr1c3lmrT05Pz87OJnWpFMUYJ5P61c3NdrdVisrSGmO01iB2vjAIGFPixPP57ORkHmNCpN71KaaYeDab933ourDZ9gJJJG23u5OTkxD8yckCQMqy7Lt+PpuH4FzvF4t5VVVZ3KYkjx49AuAPP/xoebecTqfa6O1mO5vN3nv6nncucQKRpmmVUtfXr5jFWrtardbrdV0VhEiEdV0prVzvBMTaoizLsiwBhACN0QBijBGRFGPjHDOHEGIIAoxEVqks/EQEQJg5pijCwiycOCU1noBIpKjvuxBCVVWICCJaaxHZ7XYhhMSCoLRWbdtySnVdX1xc/tG//aOL84vz8/N/9+/+/eXl5cnJyW63Ozs7A4D1evXJpx8/efLko08+dn3/zjvv/KN/9I9++MMfdl1/9fLqyZNHiFSW9XZ7M6lrreny8vzhw0fPvn326NGj+XxWlOXZ+VnXtcxCSEqpjPFEkveBCJUi731ZFjHFtm1qrAEkgzpmBmARERmEPqcECDEGERGWDHERAJAyyWUciAhIsN1sbu9uQwja6MJaJALMLCKE0PddTKnvXUpijHE+eB/y8LQ2AqiUKoqiqsoQgjEmpogIGZFWVc2crC0WJ4uiKB9cPvjqm2fGFB9++NFPfvwXJydzH5zzznnvnPvse9/7xc9/8evPP59MJoh0c3sHgO89fRqZJSbB7m61brpulmbamNi2u6axxk6mM/3ppx+3bVNYa422xiqFIKC1XswXVVURKaM1MzMnAHB9q7WpqgkR+eAJZbPddl2ntUatBVLXdcGnqpp+9fVzAEFEyV9OKYSwmM+Lsihs0fe9CCTm5d3q7m45nc2Z4ac/+dl6vX733ScIUJTFbD6bzWa//tWv5vPZxcX5s2fPHz169Or6+ovPv3j3vfd+/OMfN01jrFkuV1nFU1bMRIoUESVOIhJTEhEiFSSmlPKqK6VJ0WKxcM4551jEB6cIQ4gCgoDa6Koqp9PJZDKx1hprY2JtDDO7vmeWfK+yLK21zJwhg9amqur5PK1Wa3ZBREIIiBkjyHQyeXV1s16tvfeud+89fa+u68l0oo0+Pz+/vLx8/PiJNnqxmE8eP9rtmgcPH7739OlXX3/zzdfffP83vl9VEyL17Nnzqq4fPLg4PT29vLy8uLys62pxcpIZvev7rnNN23ofjPNFkZiD914RaqWZExJppQlRawXAlDkAQABAMtuDACBYAGBgEAAAYfHBB++VUlpbawpATDHFlKcUUuKUkoDElDKyMlorRZNJNZ1ORWS92TZN13WubVofYmGLlHixmAwCKMYQqG27EMJkOknMyIwozjmtTQgxhtQ0y/V627swmQAibNZrY7CeVClGJMXM2017t7xLMXkfUmKtVd/71WpZFjZ4VxbFarWKIVRFqRSJCCIKQNd12nuvlAIQpbLhQQCgOpVSEgFCqup6Np0613dtO53NtLbOOe89Ik5ns8Vi8ez58/VqHWNKiW1RAVDfd67v27a1xoQYM4ECyGff+3S73RVFwcy/+uWvyrJMMd3dLj/+5OPlcnV9ff348eMHlw+Q6On
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# inversing, how to\n",
"in_ws = pca.transform(scaler.transform([flat_ws[0]]))\n",
"out_w = scaler.inverse_transform(pca.inverse_transform(in_ws[0])).reshape(w_shape)\n",
"# print(\n",
"# in_ws,\n",
"# # standardized_ws[0],\n",
"# pca.inverse_transform(in_ws[0]),\n",
"# scaler.inverse_transform(pca.inverse_transform(in_ws[0])),\n",
"# out_w\n",
"# )\n",
"# print(out_w.shape)\n",
"# print(pca.transform(scaler.transform([out_w.flatten()])))\n",
"\n",
"print(\"difference between a w and and it's transformation as principle component\")\n",
"display(w_to_img(G, device, \"const\", torch.from_numpy(flat_ws[0].reshape(w_shape)).to(\"cuda\")))\n",
"display(w_to_img(G, device, \"const\", torch.from_numpy(out_w).to(\"cuda\")))\n"
]
},
{
"cell_type": "code",
"execution_count": 106,
"id": "1712678f-3bd9-4eaf-9cee-442aa5a6bd87",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.03719539, 0.03083506, 0.02502103, 0.02392811, 0.01832833,\n",
" 0.01664506, 0.01436675, 0.0128155 , 0.0113901 , 0.01018435,\n",
" 0.00893113, 0.00839184, 0.00830136, 0.00733185, 0.0071629 ,\n",
" 0.00709925, 0.00684545, 0.00646671, 0.00586685, 0.00570798,\n",
" 0.00548803, 0.00529359, 0.00515314, 0.00482574, 0.00468961,\n",
" 0.00460188, 0.0044443 , 0.00424957, 0.00411777, 0.00388916,\n",
" 0.00375024, 0.00372458, 0.00352066, 0.00349229, 0.00342873,\n",
" 0.00338586, 0.00327643, 0.0032402 , 0.00315235, 0.00306244,\n",
" 0.00301184, 0.00295148, 0.00283491, 0.00279611, 0.00264463,\n",
" 0.00261954, 0.00253977, 0.00248575, 0.00245711, 0.00242337,\n",
" 0.00238702, 0.00233425, 0.00232051, 0.0022772 , 0.00226395,\n",
" 0.0022173 , 0.00217148, 0.00214981, 0.00212702, 0.00209847,\n",
" 0.00207502, 0.002037 , 0.00202758, 0.00200343, 0.00196619,\n",
" 0.00191755, 0.00189991, 0.00184876, 0.00184063, 0.00182143,\n",
" 0.00180289, 0.00178724, 0.00177503, 0.00175602, 0.00174498,\n",
" 0.0017251 , 0.00171772, 0.00170503, 0.00167998, 0.00166922,\n",
" 0.00165378, 0.00163315, 0.00162352, 0.00160393, 0.00159042,\n",
" 0.00157854, 0.00157469, 0.0015523 , 0.00153437, 0.00152306,\n",
" 0.00151376, 0.00149581, 0.00147976, 0.00147736, 0.00146386,\n",
" 0.00144843, 0.00144123, 0.00141827, 0.00141202, 0.00140769,\n",
" 0.00139562, 0.00138907, 0.00138305, 0.00137331, 0.00136423,\n",
" 0.00135134, 0.00134088, 0.00133683, 0.00132733, 0.00131227,\n",
" 0.00130235, 0.00129866, 0.0012914 , 0.0012807 , 0.00127436,\n",
" 0.00126488, 0.00126267, 0.0012544 , 0.00124938, 0.00124523,\n",
" 0.00123922, 0.00123378, 0.001229 , 0.00121797, 0.0012156 ,\n",
" 0.00120613, 0.00120481, 0.00119854, 0.00119352, 0.00119081,\n",
" 0.00118408, 0.00117777, 0.00116976, 0.00116667, 0.0011639 ,\n",
" 0.00115719, 0.00114168, 0.00113964, 0.00113488, 0.00113222,\n",
" 0.00112772, 0.00112263, 0.00111752, 0.00111242, 0.00110615,\n",
" 0.00110498, 0.00109987, 0.00109112, 0.00108757, 0.00108484,\n",
" 0.00108193, 0.00107626, 0.00107193, 0.00106148, 0.0010544 ,\n",
" 0.0010526 , 0.00105167, 0.00104751, 0.00104082, 0.00103592,\n",
" 0.0010335 , 0.00102875, 0.00102273, 0.00102157, 0.0010153 ,\n",
" 0.0010098 , 0.00100661, 0.00100271, 0.00100007, 0.00099672,\n",
" 0.00099161, 0.00098602, 0.0009802 , 0.00097786, 0.00097214,\n",
" 0.00096767, 0.00096097, 0.00095992, 0.00095713, 0.00095247,\n",
" 0.00094635, 0.00093872, 0.00093745, 0.00093701, 0.00092747,\n",
" 0.00092438, 0.00092211, 0.00091813, 0.00091706, 0.0009097 ,\n",
" 0.00090215, 0.00090001, 0.00089257, 0.00088849, 0.00088753,\n",
" 0.00088435, 0.00088031, 0.00086721, 0.00086319, 0.00085784])"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Variance that is captured per axis of PCA\n",
"pca.explained_variance_ratio_"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "5f124133-90b6-484a-b86b-221e6f566143",
"metadata": {},
"outputs": [],
"source": [
"arrondisement_avg_ws = arrondisement_centers.values()\n",
"arrondisement_avg_ws_flat = [w.flatten() for w in arrondisement_avg_ws]\n",
"arrondisement_avg_w_scaled = scaler.transform(arrondisement_avg_ws_flat)\n",
"arrondisement_avg_components = pca.transform(arrondisement_avg_w_scaled)\n",
"arrondisement_x = arrondisement_avg_components[:,0]\n",
"arrondisement_y = arrondisement_avg_components[:,1]"
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "1b7d0eca-6ee9-41f2-b0a5-35807d05d0cd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1600x1600 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize = (8,8), dpi=200)\n",
"ax = fig.add_subplot(1,1,1) \n",
"ax.set_xlabel('Principal Component 1', fontsize = 15)\n",
"ax.set_ylabel('Principal Component 2', fontsize = 15)\n",
"ax.set_title('2 component PCA', fontsize = 20)\n",
"# targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']\n",
"# colors = ['r', 'g', 'b']\n",
"# for target, color in zip(targets,colors):\n",
"# indicesToKeep = finalDf['target'] == target\n",
"\n",
"x,y = principalComponents[:,0], principalComponents[:,1]\n",
"\n",
"c = [float(p.arrondisement) / 20 for p in projections]\n",
"ax.scatter(x, y, c=c, cmap='inferno')\n",
"\n",
"ax.scatter(arrondisement_x, arrondisement_y, marker='+', linewidths=1, s=100)\n",
"# ax.legend(targets)\n",
"ax.grid()"
]
},
{
"cell_type": "code",
"execution_count": 109,
"id": "c20852ae-86fc-42b5-a355-eb022121c6c3",
"metadata": {},
"outputs": [],
"source": [
"# TODO\n",
"# each point in the graph can be calculated back to the closest W by reversing the PCA\n",
"# see https://github.com/mGalarnyk/Python_Tutorials/blob/master/Sklearn/PCA/PCA_Image_Reconstruction_and_such.ipynb\n",
"# this might give us a better sense of how the graph represents the data"
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "abbdbe5c-305c-4a4d-943b-75854402ca52",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "920eaade27034fefba964bd84647473e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"interactive(children=(FloatSlider(value=0.0, description='com1', max=111.50354634596117, min=-42.9155692698718…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<function __main__.interactive_render(com1, com2, com3, com4)>"
]
},
"execution_count": 110,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# interact(f, Median_Size=widgets.IntSlider(min=1,max=21,step=2,value=1));\n",
"from ipywidgets import interact\n",
"def interactive_render(com1, com2, com3, com4):\n",
" components = np.zeros(pca.n_components)\n",
" components[0] = com1\n",
" components[1] = com2\n",
" components[2] = com3\n",
" components[3] = com4\n",
" print(com1, com2, com3, com4)\n",
" \n",
" w = scaler.inverse_transform(pca.inverse_transform(components)).reshape(w_shape)\n",
" display(w_to_img(G, device, \"const\", torch.from_numpy(w).to(\"cuda\")).resize((512,512)))\n",
"\n",
"interact(interactive_render,\n",
" com1=widgets.FloatSlider(min=min(principalComponents[:,0]),max=max(principalComponents[:,0]),step=2,value=0),\n",
" com2=widgets.FloatSlider(min=min(principalComponents[:,1]),max=max(principalComponents[:,1]),step=2,value=0),\n",
" com3=widgets.FloatSlider(min=min(principalComponents[:,2]),max=max(principalComponents[:,2]),step=2,value=0),\n",
" com4=widgets.FloatSlider(min=min(principalComponents[:,3]),max=max(principalComponents[:,3]),step=2,value=0, continuous_update = False))"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "5ad1d713-f88f-4aee-b3b4-9c2f947c30a9",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bdbe952804f04f0798547b49000377d7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(FloatSlider(value=0.0, description='#0', max=111.50354634596117, min=-42.915569269871845, step=…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8774b2a08c294e19a8c43c1d3c911666",
"version_major": 2,
"version_minor": 0
},
"image/png": "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
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
" <img src='data:image/png;base64,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
" </div>\n",
" "
],
"text/plain": [
"Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib widget\n",
"from ipywidgets import *\n",
"from PIL import Image #got overwritten by ipywidgets import\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# x = np.linspace(0, 2 * np.pi)\n",
"# fig = plt.figure()\n",
"# ax = fig.add_subplot(1, 1, 1)\n",
"# line, = ax.plot(x, np.sin(x))\n",
"\n",
"zs = seeds_to_zs(G, [0,1000, 2000, 3000])\n",
"example_ws = zs_to_ws(G, device, None, 1, zs)\n",
"\n",
"fig = plt.figure(figsize=(10, 7))\n",
" \n",
"# setting values to rows and column variables\n",
"rows = 2\n",
"columns = 2\n",
"\n",
"def update(**coms):\n",
" components = np.zeros(pca.n_components)\n",
" # components[0] = com1\n",
" for com in coms:\n",
" components[int(com[3:])] = coms[com]\n",
" # TODO :not only pca, but also normaliser should inverse transform\n",
" w = scaler.inverse_transform(pca.inverse_transform(components)).reshape(w_shape)\n",
" for j, example_w in enumerate(example_ws):\n",
" fig.add_subplot(rows, columns, j+1)\n",
" img = w_to_img(G, device, \"const\", example_w + torch.from_numpy(w).to(\"cuda\")) #.resize((512,512))\n",
" plt.imshow(img)\n",
" \n",
" # line.set_ydata(np.sin(w * x))\n",
" # fig.canvas.draw_idle()\n",
"\n",
"widget_args = {}\n",
"for i in range(pca.n_components):\n",
" widget_args[f\"com{i}\"] = widgets.FloatSlider(\n",
" min=min(principalComponents[:,i]),\n",
" max=max(principalComponents[:,i]),\n",
" step=2,\n",
" value=0,\n",
" description=f\"#{i}\"\n",
" )\n",
"\n",
"\n",
"# for component in \n",
"# args = {\n",
"# \"com1\": widgets.FloatSlider(min=min(principalComponents[:,0]),max=max(principalComponents[:,0]),step=2,value=0),\n",
"# \"com2\": widgets.FloatSlider(min=min(principalComponents[:,1]),max=max(principalComponents[:,1]),step=2,value=0)\n",
"# }\n",
"\n",
"a = VBox(list(widget_args.values()), layout=Layout(height='250px', overflow_y='auto'))\n",
"display(a)\n",
"\n",
"interactive_output(update, widget_args);\n"
]
},
{
"cell_type": "markdown",
"id": "5428c6b3-1d69-4c71-aebd-1889dacfc184",
"metadata": {},
"source": [
"\n",
"## GANSpace-like PCA\n",
"\n",
"[GANSpace](https://github.com/harskish/ganspace) has a different approach to PCA. Instead of projecting images, it maps a bunch of randomly picked $z$ to $w$ and runs a PCA on that. Approximate the approach here"
]
},
{
"cell_type": "code",
"execution_count": 253,
"id": "17600aec-a91c-4b7e-8de3-e353752653dc",
"metadata": {},
"outputs": [],
"source": [
"seeds = range(0,20000)\n",
"latent_zs = seeds_to_zs(G, seeds)\n",
"latent_ws = [w.cpu() for w in zs_to_ws(G, device, None, 1, latent_zs)]"
]
},
{
"cell_type": "code",
"execution_count": 254,
"id": "cb1f1132-b45f-4aa7-8eac-7b5050457051",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torch.Size([1, 16, 512])\n",
"(8192,) [-0.2765468 -0.10210045 0.723061 ... -0.0810022 -0.6487312\n",
" -0.28810868]\n"
]
}
],
"source": [
"w_shape = latent_ws[0].shape\n",
"print(w_shape)\n",
"flat_latent_ws = [np.array(w.flatten()) for w in latent_ws]\n",
"print(flat_latent_ws[0].shape, (flat_latent_ws[0]))\n",
"for i, w in enumerate(flat_latent_ws):\n",
" if w.shape != flat_latent_ws[0].shape:\n",
" print(i, w.shape)\n"
]
},
{
"cell_type": "code",
"execution_count": 255,
"id": "b902dad8-dd92-4111-93a6-019a8d1440fd",
"metadata": {},
"outputs": [],
"source": [
"pipe = Pipeline([\n",
" ('scale', StandardScaler()),\n",
" ('reduce_dims', PCA(n_components=200)),\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 256,
"id": "1b560460-ca8e-4f2f-a97b-24030ea35195",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-13.46145201, 10.9578397 , -9.01645383, ..., -4.26652838,\n",
" 0.54254983, 0.67415027],\n",
" [-20.62894525, 14.07739525, 8.04529328, ..., 3.79106632,\n",
" -2.85699847, -2.89242468],\n",
" [ 7.04371089, 6.57044117, -4.06409529, ..., 3.01764698,\n",
" 0.52163567, 1.73529972],\n",
" ...,\n",
" [ -7.08758567, -0.56364632, -1.80573682, ..., -0.0240149 ,\n",
" 2.03519639, 4.05465535],\n",
" [ 4.10067465, 2.15865921, 7.07302713, ..., 0.17858016,\n",
" -2.75948972, 0.85801461],\n",
" [ 1.78903144, 6.70584062, -10.78917191, ..., -0.49335522,\n",
" -0.1568574 , -2.15811906]])"
]
},
"execution_count": 256,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pipe.fit_transform(flat_latent_ws)"
]
},
{
"cell_type": "code",
"execution_count": 257,
"id": "c22785bd-9c1f-4cdb-a304-10e99cb7739a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.01386597, 0.0132396 , 0.01223125, 0.01159524, 0.01096552,\n",
" 0.01052631, 0.01043808, 0.01015916, 0.00994854, 0.00946204,\n",
" 0.00914045, 0.00900616, 0.00866137, 0.00858 , 0.00849454,\n",
" 0.00836783, 0.00800156, 0.00789864, 0.00782796, 0.00761313,\n",
" 0.00753595, 0.00740414, 0.00729987, 0.00721204, 0.0071075 ,\n",
" 0.00702033, 0.00691903, 0.0068254 , 0.00674271, 0.00666371,\n",
" 0.00661757, 0.00650555, 0.00644614, 0.00637392, 0.00632288,\n",
" 0.00626642, 0.00617692, 0.00612639, 0.006077 , 0.00596563,\n",
" 0.00585294, 0.00582016, 0.00574776, 0.00571392, 0.00565867,\n",
" 0.0056296 , 0.00554828, 0.00549612, 0.00541355, 0.00538062,\n",
" 0.00535851, 0.00527297, 0.00522266, 0.00512659, 0.00508391,\n",
" 0.00503549, 0.00501872, 0.00495656, 0.00486777, 0.00481696,\n",
" 0.00478395, 0.00475394, 0.00467766, 0.00466604, 0.00460612,\n",
" 0.00455931, 0.00450144, 0.00446277, 0.00444565, 0.0044097 ,\n",
" 0.00437425, 0.00433994, 0.00430129, 0.00427034, 0.00424376,\n",
" 0.00421057, 0.00414938, 0.00411421, 0.00406747, 0.00399768,\n",
" 0.00395569, 0.00394551, 0.00391071, 0.00387016, 0.00384194,\n",
" 0.00381035, 0.00380695, 0.00373522, 0.00369872, 0.00367988,\n",
" 0.00365705, 0.00363659, 0.00360854, 0.00357532, 0.0035427 ,\n",
" 0.00354016, 0.00348509, 0.00346777, 0.00342003, 0.00336639,\n",
" 0.0033247 , 0.00329531, 0.00328408, 0.0032313 , 0.00321499,\n",
" 0.00318191, 0.00318035, 0.00313959, 0.00312017, 0.0030763 ,\n",
" 0.00305458, 0.00302704, 0.00302095, 0.0029833 , 0.00297705,\n",
" 0.0029571 , 0.00289552, 0.00283763, 0.00282829, 0.00280339,\n",
" 0.00279487, 0.00276068, 0.00275809, 0.00274047, 0.00270539,\n",
" 0.00269067, 0.002655 , 0.00263413, 0.00262213, 0.00259036,\n",
" 0.00257166, 0.00255584, 0.00252172, 0.00251626, 0.00247392,\n",
" 0.00245628, 0.00243044, 0.00241176, 0.00240298, 0.00238527,\n",
" 0.00236558, 0.00235809, 0.00231985, 0.00230674, 0.0022845 ,\n",
" 0.00226735, 0.00225602, 0.00223097, 0.00220342, 0.00217895,\n",
" 0.00216093, 0.00214178, 0.00213071, 0.00209729, 0.00209028,\n",
" 0.00206574, 0.00204086, 0.00202574, 0.00200196, 0.00197883,\n",
" 0.00197373, 0.00195984, 0.00192752, 0.00191487, 0.00190642,\n",
" 0.00188085, 0.00187579, 0.00185825, 0.00184192, 0.00183504,\n",
" 0.00180692, 0.00179856, 0.00178695, 0.00177481, 0.00176761,\n",
" 0.00174372, 0.00171722, 0.00170804, 0.00169209, 0.00167504,\n",
" 0.00165395, 0.00165158, 0.00164359, 0.00162815, 0.00162487,\n",
" 0.00160078, 0.00157909, 0.00156454, 0.00154808, 0.00154272,\n",
" 0.0015278 , 0.00150206, 0.00148701, 0.0014591 , 0.00144501,\n",
" 0.00144335, 0.00142898, 0.00141929, 0.00140767, 0.00138854])"
]
},
"execution_count": 257,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pca = pipe.named_steps['reduce_dims']\n",
"pca.components_\n",
"pca.explained_variance_ratio_"
]
},
{
"cell_type": "markdown",
"id": "e8c6cf98-e9d9-40aa-a857-7bf5e0aa762e",
"metadata": {},
"source": [
"Now use this to do $w' = w + Vx$ for which $w'$ is the modified image, $w$ is the weight for an input image you want to modify, $V$ are the components, $x_k$ are the component values, all starting at 0."
]
},
{
"cell_type": "code",
"execution_count": 258,
"id": "95c1e523-69d4-4489-adee-435e488daaa8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 16, 512)\n"
]
}
],
"source": [
"w_shape = ws[0].shape\n",
"print(w_shape)\n",
"flat_ws = [w.flatten() for w in ws]\n",
"principal_components = pipe.transform(flat_ws)"
]
},
{
"cell_type": "code",
"execution_count": 259,
"id": "d8b79b60-d49f-4bb2-af49-bfec46d78178",
"metadata": {},
"outputs": [],
"source": [
"arrondisement_avg_ws = arrondisement_centers.values()\n",
"arrondisement_avg_ws_flat = [w.flatten() for w in arrondisement_avg_ws]\n",
"arrondisement_avg_components = pipe.transform(arrondisement_avg_w_scaled)\n",
"arrondisement_x = arrondisement_avg_components[:,0]\n",
"arrondisement_y = arrondisement_avg_components[:,1]"
]
},
{
"cell_type": "code",
"execution_count": 260,
"id": "3c0838f8-f108-4247-831b-cc4b2f6a6db2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 2400x2400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"fig = plt.figure(figsize = (8,8), dpi=300)\n",
"ax = fig.add_subplot(1,1,1) \n",
"ax.set_xlabel('Principal Component 1', fontsize = 15)\n",
"ax.set_ylabel('Principal Component 2', fontsize = 15)\n",
"ax.set_title('2 component PCA', fontsize = 20)\n",
"# targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']\n",
"# colors = ['r', 'g', 'b']\n",
"# for target, color in zip(targets,colors):\n",
"# indicesToKeep = finalDf['target'] == target\n",
"\n",
"x,y = principal_components[:,0], principal_components[:,1]\n",
"\n",
"c = [float(p.arrondisement) / 20 for p in projections]\n",
"ax.scatter(x, y, c=c, cmap='inferno')\n",
"\n",
"ax.scatter(arrondisement_x, arrondisement_y, marker='+', linewidths=1, s=100)\n",
"# ax.legend(targets)\n",
"ax.grid()"
]
},
{
"cell_type": "code",
"execution_count": 262,
"id": "9dd8ea1b-6afa-46d7-9dd5-f7fc747045ee",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f52e5c4dd481474f8838193b3b4b20b4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(FloatSlider(value=0.0, description='#0', max=15.163285441357617, min=-29.08003241024723, step=2…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "808525d83023490698979e2d8629cf35",
"version_major": 2,
"version_minor": 0
},
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAK8CAYAAAB8y5WxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9d5Bt2X3Y937X2nnvk093n443zdw4OWBmEGYQmQWAohgkKlDRrrJIlwzZz2TZFkvvVZmSSrb4bOqV/KosPZISJYoWRZoUCRIYDIABMIMwCBPvnRvmps7h5J33Xu+Pfe4FIILEhUUC7eH6TE3VvV3d557u02ev/VvrF4RSSqFpmqZpmqZpmqZp2neU/E4/AU3TNE3TNE3TNE3TdICuaZqmaZqmaZqmaYeCDtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga5qmaZqmaZqmadohoAN0TdM0TdM0TdM0TTsEdICuaZqmaZqmaZqmaYeADtA1TdM0TdM0TdM07RDQAbqmaZqmaZqmaZqmHQI6QNc0TdM0TdM0TdO0Q0AH6JqmaZqmaZqmaZp2COgAXdM0TdM0TdM0TdMOAR2ga4fGP/2n/5Rjx47hui6PP/44n/vc577TT0nTNE37U06vTZqmadq3kw7QtUPhV3/1V/nQhz7Ez/7sz/LFL36RBx54gO/5nu9hZ2fnO/3UNE3TtD+l9NqkaZqmfbsJpZT6Tj8JTXv88cd5y1vewi/8wi8AUJYla2tr/NRP/RQ//dM//R1+dpqmadqfRnpt0jRN077dzO/0E9C0NE154YUX+Jmf+ZnbH5NS8r73vY/nnnvuG35NkiQkSXL772VZcnBwQLfbRQjxJ/6cNU37k6WUYjwes7y8jJQ62Uv79vtW1ya9Lmnam5tel7RvFx2ga99xe3t7FEVBr9f7uo/3ej3Onz//Db/m537u5/j7f//vfzuenqZp30E3btxgdXX1O/00tD+FvtW1Sa9Lmvang16XtD9pOkDX/m/pZ37mZ/jQhz50++/D4ZAjR47wOx/5hygVY1k2g+GQLCs5unKOv/43/ytMo8tT73uYjfV1Xjt/laWFOQLP4OiRozz44AMMh2Oe/ujv8+f/0o8DBrYt2dm4xr/65X/FU+96H/fddw+u49BoNAGIk5TJeMrvffgjfOELX+LEiWWSdERvscf3fP/30WzV6S22uXnzEparOHZ0DSFBoDjWO4kQ86RqgIWPQgIZUMz+bCCFD6qFwgclQYCgRIgh/fgm/eEBWZYihUJKQXVAI8jzgjCK8FwbxxMU6YRpOGI0HrK7N2JnM2alt8pkFNJqzfHFz3+RZ55+ht3dA3b2FEkCdQ/mFgS9xTbNZoMsTiiLnCSOiaIpILhxI6PRqvFf/ld/jlany+/81sf5xDNf4r4HF2i1m9y4sU1BTGvO5trNhIODjFoNjp9wue+Bc5w9fYZXX77Cxz76HGEE+3uQxJCH8J7v7fErv/RLHIQbuF5AkRfkRU5RFuR5Tl5kZFlKliakeYZCYEoD03CwbRfLtDENC8MwkbOTK6WgLEoKVaJKgVICFGxvbnH1+lXqgc/dp+7C931KlWEYAqUKsiJlOh0RxlOiyZTLF14jmiYMhkNee/U8H/yhH6Ne7/LCl16ht7jCh3/3k3zu86/xQz/4Fn74h7+bf/Ev/z1FEXP3XUs4nodpOJSl4OWXL/DG1Rv8w5/7Oe4//Tj/9jf+A1/5yoscO36C0XiPGzcuMuwPMC0TQxqsHTmC4/lMwwjbMnFsmySMKPKcubkenc48hmEiBGRZQVlCnCT0+31Gkwl5nDEcjVi/uclkMiWKMopCMp0m7O4MmOs1OHX6CCtHujz66H1YlsVnP/cFvus9b2N384BPfvIFiiJGyJwHH3yA/eE+v/27T/Pjf+UpBCZCGLQ7bcIw5ty5B2i35xiNYz727Gf4rd/+MPffdy9/66//OAfbO0wHEW+8foW3PPIW3vn2H+DzX/gyf+2v/Df8wv/nf6bdafJ3/uuf4sKL6wDU6/Vv34VF0/4T/GHr0rVrL1FvOIyzAYEdYGCQkJBmGdE0xHFdVFmSZfnsPSwQUpDEMb5f49rVa1x4/RIXLlyi1ezy8ssXOHX6DEIJgnqdMs/44Ac/yKuvXeCXf+lfYRgGtmvjez5PvfNtfO/3fDcf/v2P8MlPfAaQSAm9xTn++l/6myQk/Mav/yrb2/soFEWZI6XiZ3/6v2Onv8u/+Be/SBDUKcqCZrPBIw8+zFxnns984dPs7e0TxhGddpPH3vIA9aZLu9nGNx0ykePiAyaCqpJSoahaH6WAQ7UaJpQUCEykkoAiUylJkVKUBapU1c9DCPIsI00TSlV9zDQMQJDlGaVSSCHJ84yiLEAIRuMRKIVpmGRFju+5tFttirwgimJsx0IISZrljIZj4jjG8R32DnY5f/41TNvm8qVrUHqI0ubypTcwDJNeb4G3PvEop06f5PLlS7zwxS9x9dp1bMviwYfv421ve4J2q80zzzzL/++X/yVFWXLPuXMszs3z7ne/hySO+N/+2S/y+qU3eOzxt7C7s8mP/4UfYWF+jn/2v/1/uXTpGhKJKgt2t7c5dWqZ7/qet7G6ssT65jZxbjHqj3ny7W/hyrWL/Pr/+e/oztVpdANqDZ+77j5Ob7HH8889T6fV5mCvzyefeYHBLgQdEAIC32YaKibTjLWjdUajGM9VFHnOfffeC6XBB37wgzSbHcJJSLvV4uiRFW5eu8mR5TVanRYvvniBf/y
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
" <img src='data:image/png;base64,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
" </div>\n",
" "
],
"text/plain": [
"Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib widget\n",
"from ipywidgets import *\n",
"from PIL import Image #got overwritten by ipywidgets import\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# x = np.linspace(0, 2 * np.pi)\n",
"# fig = plt.figure()\n",
"# ax = fig.add_subplot(1, 1, 1)\n",
"# line, = ax.plot(x, np.sin(x))\n",
"\n",
"zs = seeds_to_zs(G, [0,1000, 2000, 3000])\n",
"example_ws = zs_to_ws(G, device, None, 1, zs)\n",
"\n",
"fig = plt.figure(figsize=(10, 7))\n",
" \n",
"# setting values to rows and column variables\n",
"rows = 2\n",
"columns = 2\n",
"pca = pipe.named_steps['reduce_dims']\n",
"\n",
"def update(**coms):\n",
" components = np.zeros(pca.n_components)\n",
" # components[0] = com1\n",
" for com in coms:\n",
" components[int(com[3:])] = coms[com]\n",
" w = pipe.inverse_transform(components).reshape(w_shape)\n",
" for j, example_w in enumerate(example_ws):\n",
" fig.add_subplot(rows, columns, j+1)\n",
" img = w_to_img(G, device, \"const\", example_w + torch.from_numpy(w).to(\"cuda\")) #.resize((512,512))\n",
" plt.imshow(img)\n",
" \n",
" # line.set_ydata(np.sin(w * x))\n",
" # fig.canvas.draw_idle()\n",
"\n",
"widget_args = {}\n",
"for i in range(pca.n_components):\n",
" widget_args[f\"com{i}\"] = widgets.FloatSlider(\n",
" min=min(principal_components[:,i]),\n",
" max=max(principal_components[:,i]),\n",
" step=2,\n",
" value=0,\n",
" description=f\"#{i}\"\n",
" )\n",
"\n",
"\n",
"# for component in \n",
"# args = {\n",
"# \"com1\": widgets.FloatSlider(min=min(principalComponents[:,0]),max=max(principalComponents[:,0]),step=2,value=0),\n",
"# \"com2\": widgets.FloatSlider(min=min(principalComponents[:,1]),max=max(principalComponents[:,1]),step=2,value=0)\n",
"# }\n",
"\n",
"a = VBox(list(widget_args.values()), layout=Layout(height='250px', overflow_y='auto'))\n",
"display(a)\n",
"\n",
"interactive_output(update, widget_args);\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b8e55466-d013-4ea6-92d9-d4dc09e36056",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "66cd3b55-02bf-4d73-8a0b-06ada3017ee9",
"metadata": {},
"source": [
"# t-SNE"
]
},
{
"cell_type": "markdown",
"id": "df100bd9-6ee0-4a88-bc66-94dc6384a45d",
"metadata": {},
"source": [
"t-SNE is an alternative way to visualise multidimensional data in a non-linear fassion (as opposed to PCA). Unfortunately, it seems for now unable to find _any_ clusters in the data."
]
},
{
"cell_type": "code",
"execution_count": 138,
"id": "371d278d-5655-4ba3-a658-e102d4c2da95",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 16, 512)\n"
]
}
],
"source": [
"from sklearn.manifold import TSNE\n",
"\n",
"w_shape = ws[0].shape\n",
"print(w_shape)\n",
"# like PCA we flatten the data\n",
"flat_ws = [w.flatten() for w in ws]\n",
"tsne = TSNE(n_components=2, learning_rate=2500, #learning_rate='auto',\n",
" init='random', perplexity=3, n_iter=13000)\n",
"tsned_ws = tsne.fit_transform(flat_ws)\n"
]
},
{
"cell_type": "code",
"execution_count": 139,
"id": "e493a611-0695-4174-8631-b0172333f1b5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACCoAAAfwCAYAAAAJAinZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAC4jAAAuIwF4pT92AAEAAElEQVR4nOzdd5hkVZk/8O/p7onMECWKgAoqoqKyYgJBxTWga47701XX7JrXNaxxTevqquu6yprXrOgawZwVFcSE5JyDgIRhYnef3x+3ccd2pqpD1a0On8/z9KNV99R535quvjP0/d5zSq01AAAAAAAAAABtGBp0AwAAAAAAAADA4iGoAAAAAAAAAAC0RlABAAAAAAAAAGiNoAIAAAAAAAAA0BpBBQAAAAAAAACgNYIKAAAAAAAAAEBrBBUAAAAAAAAAgNYIKgAAAAAAAAAArRFUAAAAAAAAAABaI6gAAAAAAAAAALRGUAEAAAAAAAAAaI2gAgAAAAAAAADQGkEFAAAAAAAAAKA1ggoAAAAAAAAAQGsEFQAAAAAAAACA1ggqAAAAAAAAAACtEVQAAAAAAAAAAFojqAAAAAAAAAAAtEZQAQAAAAAAAABojaACAAAAAAAAANAaQQUAAAAAAAAAoDWCCgAAAAAAAABAawQVAAAAAAAAAIDWCCoAAAAAAAAAAK0RVAAAAAAAAAAAWiOoAAAAAAAAAAC0RlABAAAAAAAAAGiNoAIAAAAAAAAA0BpBBQAAAAAAAACgNYIKAAAAAAAAAEBrRgbdAAAAAAAA/6eUskeSPZLslmSbJMuT1CQ3bPZ1bZLzaq3XDapPAACYqVJrHXQPAACwqJVSliS5TZLbJTlg4n/3TLL9xNd2ScaSrE9ydZJLkpyb5HdJTkhyXK11Y9t9AwAwe6WU5UmOSHLvJPdI8+/B1dOY4uo0/zY8N8lv0/z78Je11qt63CoAAPSMoAIAALSslDKU5E5J7pPkvkkOTbJyFlOuTfKtJP+T5Gu11tFZNwkAQF+VUu6U5PlJHpnpBROm6twkxyX5RpJv1lr/0ItJSyk/SHLYFId/sNb69F7U7WYKfd271vqDWcz/uiSvnenr++jaWuv2g24CAGC6bP0AAAAtKKWMpAklPDbJQ5Ps2MPpVyZ52MTXuaWUf03yoVrrWA9rAADQA6WU2yR5R5IH9rnUzSe+/jZJLaWcmORTtdZ39rnu5p5cSvm3WuuZLdYEAGAeGBp0AwAAsJCVUg4opXwgyWVp7mZ7SnobUpjs5kn+O8nxE3fpAQBzTCnl8FJK7fB1+KB77KUu7/V1g+6vLaWUoVLKq9Js39XvkMJflE/yV0n+vuW6I0ne0HJNAADmAUEFAADor4ckeVqSnVque+ckPyulPLPlugAATFJKWZXk2DQX7ZcMuJ22PaaUcsdBNwEAwNwiqAAAAAvXsiRHlVJeP+hGAAAWq1LKtkm+l+T+g+5lQEqSNw+6CQAA5paRQTcAAAD8mbEkJyc5Ncm5Sa5MckOS5WlWZdg9ySFJbj2NOV9TSllba31rj3sFAKCDUspwks8lucs0XnZGkm8nOWni67Ik1ye5NklNsiLNvwtvmmS/JLdLcnCarR2W96r3HntgKeXQWuuPB90IAABzg6ACAAAM3mlJvprk60l+UWtd2+0FpZTdkzwjyfMytW0l3lJKOanWeuysOgUAYDpemamtpDCa5INJPlBr/VWXsZuSXJcm1PqTG58spSxNcq8kD07ysCR7z6DffnpLmsDtQnVGkrcNoO6GAdQEAJg1QQUAABiMa5J8NMnHp/DL6L9Qa700yetLKW9P8q4kT+vykpLkg6WU29Zar5luPQAApqeUsl+SV09h6E+SPLPWesps6tVaNyb5TpLvlFJelOTQJE9K8vgkK2czd4/cs5RyZK31mEE30ieX1lo/OOgmAADmi6FBNwAAAIvMWUmemeSmtdYXzSSksLla6w211qcn+bs020Z0snuSl82mHgAAU/a6JEu6jPl8kiNmG1KYrDZ+VGt9WpotIl6c5IJe1pihN5VSyqCbAABg8AQVAACgHWck+X9JblNrff9UtneYjlrrx9JsA9HN80op2/ayNgAAf66UsmuSx3QZdlySx9Za+7p0f631mlrrO5PcMskL+1lrCg5M8rgB9wAAwBwgqAAAAP11eZLnJDmg1vrJWmu3VQ9mrNb6viQf6zJsm3T/pTkAALPzuHTedndDkqfWWsdb6ie11tFa63daKPXNLsf/pZRiS2IAgEVOUAEAAPqo1vqRWuv7aq2jLZV8ZZJuqzU8rIU+AAAWs/t1OX5MrfX0Vjpp37uTXNbh+L5J/r6lXgAAmKMEFQAAYAGptV6c5NNdhh1aSvHfAgAA/XO3Lsc/10oXg7E2yRu6jHlNKWVFG80AADA3+eUkAAAsPF/rcnzbJHu30QjQW6WUpaWU25VSHlhKeWwp5cmllEeXUo4opexVSimD7hFgsSul7Jhkpy7DfttGLwP0gSTndDi+R5J/aKkXAADmIHuBAQDAwvOjKYy5RZJz+93IIEzcnXdwkrsmuUOSfZLcLE1AY2WSkuT6ia9rkpyZ5NSJr5/WWi8YQM/7JrlXmrsv953oefsk20z0e0OS65Kcn+SsJMcn+XGt9eS2e52JUsqtkhyZ5KAkt02ye5rvx5I034Or0lyw+XmSL9Zaz+9BzZEk903z53rHJLdO82e6bZKxibrnTNT9TpJja63rZ1u3H0op+yd5bJIHJzkwnf9b/o+llG8l+UKSL9VaN7XQYlellD3TfC/ukWS/JDdPcxFvmzTv54Y0P5MXJDk7yYlJfpzk123u3z5TpZRVSR6Q5LAkt0tyyyTbpXl/G/J/P7+nJTkuzZLvFw+m2y2buLB6jyT3THKbNN+j3dK8hxVp3scNSS5N87PzmzTfo5/UWjcOoOUpmwjw3CXJg9L8DO2f5vO3XZKa/3tfZ6c5v34vyc9qrXUgDbMQ3HQKYy7texcDVGvdVEp5bZKPdxj28lLK+2ut17bVFwAAc0fx31wAALDwlFI2JFnaYcijaq1faKuffiulDCd5eJLHp7lYuHIW052W5JtpLpj/sAftbVEpZYckT0/y/5LcfobTnJlmq4/31Vo77QU9K6WU87L1VTj+p9b65C28Zkma78dL0gRGpmo8ybeSvKrWeuL0Ok1KKbsleVmaP9ebTOOl1yT5ryT/Vmu9brp1p9DXR5P83VYOn19r3WcLr7ljmqWzj0wTWJmuS5O8Mcl/11rHZvD6WZkIDT0lyRPTfQn0rbk4yWeTvLfWenavepuslPKDNCGDLflhrfXwrbzu9klemuQxSZZNo2RNczH8LbXW707jdT1VSlmW5uf0CUnuk2R4BtNck+R/k/xHrfV3vevu/5RSnpzkIx2G3LzWet4WXrdtkmcleV6SPadZ9oIk705zfl07zddO7uMH2frnqx+2+pntt1LK65K8ts2atdY5t5JMKeXuaUJJnSyvtW5oo59em8Jn+t611h9MbDX22zQBrq15Y6311W32NYv5X5fOn++B/ewBAMxHtn4AAICF6couxxfEnsCllJFSyj+kuQv26CSPyOxCCklzJ/ELkvyglHJaKeUlpZTtZjnnn5RSVpRS3pDm7uq3ZuYhhaS5M/01Sc4tpfxHL/ucjVLK3dLcbf0/mV5IIWn+O/UBSY4vpfxnKaVT4GbzmiMTFxDOTvLCTC+kkDSrLfxzkpNLKfeZ5mt7qpQyPPEZOSHNKgozvQi3e5rwxYmllNv0qr9uJvp/UZLzJurPNKSQNHclvzjJ6aWUj5VS9uhBi7NWStm+lPL+NBfgnpjphRSS5nt63yTfKaV8sZSya6977Fi8lCUT36Nz0wQA7peZhRSS5mfnqUl+M/Fe5sTWQqWUJ6ZZ+eGtmX5IIUn2SvL2JKeUUu7Xy95YFKby8zTdv6fmnYkVcf65y7AXllJ2aaMfAADmFkEFAABYmLpdrJ+TS9xPRynl0DQXCf8zW7/bf7ZuneZC1b17MVkp5ZAkJyV5VZLVvZhzwvIkz09yainlwT2cd9pKKS9M8tM0WzzMxlCavau/ObH6RKeae6XZ8uS1mX1
"text/plain": [
"<Figure size 2400x2400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"fig = plt.figure(figsize = (8,8), dpi=300)\n",
"ax = fig.add_subplot(1,1,1) \n",
"ax.set_title('2 component t-SNE', fontsize = 20)\n",
"\n",
"x,y = tsned_ws[:,0], tsned_ws[:,1]\n",
"\n",
"c = [float(p.arrondisement) / 20 for p in projections]\n",
"ax.scatter(x, y, c=c, cmap='inferno')\n",
"\n",
"# ax.scatter(tsne_arrondisement_x, tsne_arrondisement_y, marker='+', linewidths=1, s=100)\n",
"# ax.legend(targets)\n",
"ax.grid()"
]
},
{
"cell_type": "markdown",
"id": "26a6aa1e-930e-42db-bf09-d5b5bba746ab",
"metadata": {},
"source": [
"# Dataset\n",
"\n",
"some code related to loading (and later) projecting the dataset"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cbee669f-0a93-42ac-bebc-281c304fb96e",
"metadata": {},
"outputs": [],
"source": [
"# see build_dataset_labels.py for parsing the paths\n",
"# then use this data to project the images with the code above"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "paris-stylegan3",
"language": "python",
"name": "paris-stylegan3"
},
"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.8.10"
},
"toc-autonumbering": true,
"toc-showcode": false,
"toc-showmarkdowntxt": false
},
"nbformat": 4,
"nbformat_minor": 5
}