Towards-Realtime-MOT/visualise_embeddings.ipynb

2108 lines
6.9 MiB
Text
Raw Normal View History

{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visualise embeddings of the JDE model\n",
"\n",
"This notebook embeds images from the training data using the JDE model. It then collects all embeddings and projects them using different techniques (e.g. UMAP, PCA). These projections are plotted; try to hover the plot to see the source detection.\n",
"\n",
"In a second step these images are drawn onto a canvas using the projected points."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import glob\n",
"import pickle\n",
"from typing import TypedDict\n",
"from tqdm.auto import tqdm\n",
"\n",
"import os\n",
"import numpy as np\n",
"\n",
"import logging\n",
"import argparse\n",
"logger = logging.getLogger(__name__)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2023-04-13 11:12:50 +00:00
"2023-04-06 16:09:23 [WARNING]: Matplotlib created a temporary config/cache directory at /tmp/matplotlib-i8r80tk_ because the default path (/.config/matplotlib) is not a writable directory; it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.\n",
"2023-04-06 16:09:23 [INFO]: generated new fontManager\n"
]
}
],
"source": [
"from track import eval_seq\n",
"\n",
"from utils.parse_config import parse_model_cfg\n",
"from utils.utils import mkdir_if_missing\n",
"import utils.datasets as datasets\n",
"from utils.log import logger as trmlog # we need to override this...\n",
"\n",
"\n",
"trmlog.setLevel(logging.INFO)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import umap # should provide better results than t-SNE\n",
"\n"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
2023-04-13 11:12:50 +00:00
"<style>\n",
" .bk-notebook-logo {\n",
" display: block;\n",
" width: 20px;\n",
" height: 20px;\n",
" background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAOkSURBVDiNjZRtaJVlGMd/1/08zzln5zjP1LWcU9N0NkN8m2CYjpgQYQXqSs0I84OLIC0hkEKoPtiH3gmKoiJDU7QpLgoLjLIQCpEsNJ1vqUOdO7ppbuec5+V+rj4ctwzd8IIbbi6u+8f1539dt3A78eXC7QizUF7gyV1fD1Yqg4JWz84yffhm0qkFqBogB9rM8tZdtwVsPUhWhGcFJngGeWrPzHm5oaMmkfEg1usvLFyc8jLRqDOMru7AyC8saQr7GG7f5fvDeH7Ej8CM66nIF+8yngt6HWaKh7k49Soy9nXurCi1o3qUbS3zWfrYeQDTB/Qj6kX6Ybhw4B+bOYoLKCC9H3Nu/leUTZ1JdRWkkn2ldcCamzrcf47KKXdAJllSlxAOkRgyHsGC/zRday5Qld9DyoM4/q/rUoy/CXh3jzOu3bHUVZeU+DEn8FInkPBFlu3+nW3Nw0mk6vCDiWg8CeJaxEwuHS3+z5RgY+YBR6V1Z1nxSOfoaPa4LASWxxdNp+VWTk7+4vzaou8v8PN+xo+KY2xsw6une2frhw05CTYOmQvsEhjhWjn0bmXPjpE1+kplmmkP3suftwTubK9Vq22qKmrBhpY4jvd5afdRA3wGjFAgcnTK2s4hY0/GPNIb0nErGMCRxWOOX64Z8RAC4oCXdklmEvcL8o0BfkNK4lUg9HTl+oPlQxdNo3Mg4Nv175e/1LDGzZen30MEjRUtmXSfiTVu1kK8W4txyV6BMKlbgk3lMwYCiusNy9fVfvvwMxv8Ynl6vxoByANLTWplvuj/nF9m2+PDtt1eiHPBr1oIfhCChQMBw6Aw0UulqTKZdfVvfG7VcfIqLG9bcldL/+pdWTLxLUy8Qq38heUIjh4XlzZxzQm19lLFlr8vdQ97rjZVOLf8nclzckbcD4wxXMidpX30sFd37Fv/GtwwhzhxGVAprjbg0gCAEeIgwCZyTV2Z1REEW8O4py0wsjeloKoMr6iCY6dP92H6Vw/oTyICIthibxjm/DfN9lVz8IqtqKYLUXfoKVMVQVVJOElGjrnnUt9T9wbgp8AyYKaGlqingHZU/uG2NTZSVqwHQTWkx9hxjkpWDaCg6Ckj5qebgBVbT3V3NNXMSiWSDdGV3hrtzla7J+duwPOToIg42ChPQOQjspnSlp1V+Gjdged7+8UN5CRAV7a5EdFNwCjEaBR27b3W890TE7g24NAP/mMDXRWrGoFPQI9ls/MWO2dWFAar/xcOIImbbpA3zgAAAABJRU5ErkJggg==);\n",
" }\n",
" </style>\n",
" <div>\n",
" <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-notebook-logo\"></a>\n",
" <span id=\"p1001\">Loading BokehJS ...</span>\n",
" </div>\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2023-04-13 11:12:50 +00:00
"application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n // Clean up Bokeh references\n if (id != null && id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim();\n if (id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.o
"application/vnd.bokehjs_load.v0+json": ""
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# import matplotlib.pyplot as plt\n",
"\n",
"from bokeh.io import curdoc, output_notebook\n",
"from bokeh.models import ColumnDataSource\n",
"from bokeh.layouts import column, row, gridplot\n",
"from bokeh.plotting import figure, show\n",
"from bokeh.models import (PanTool,\n",
" ResetTool,\n",
" HoverTool, WheelZoomTool, BoxZoomTool)\n",
"\n",
"# load bokeh\n",
"output_notebook()\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# p1 = figure(plot_width=250, plot_height=250)\n",
"# r1 = p1.circle([1,2,3],[3,2,1], size=20)\n",
"\n",
"# t = show(p1, notebook_handle=True)"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"img_seqs = [\n",
" \"MOT16/test/MOT16-01/\",\n",
" \"MOT16/test/MOT16-03/\",\n",
" \"MOT16/test/MOT16-06/\",\n",
" \"MOT16/test/MOT16-07/\",\n",
" \"MOT16/test/MOT16-08/\",\n",
" \"MOT16/test/MOT16-12/\",\n",
" \"MOT16/test/MOT16-14/\",\n",
2023-04-13 11:12:50 +00:00
" \"MOT16/train/MOT16-02/\",\n",
" \"MOT16/train/MOT16-04/\",\n",
" \"MOT16/train/MOT16-05/\",\n",
" \"MOT16/train/MOT16-09/\",\n",
" \"MOT16/train/MOT16-10/\",\n",
" \"MOT16/train/MOT16-11/\",\n",
" \"MOT16/train/MOT16-13/\",\n",
" \"CaltechPedestrians/data/images/\",\n",
" \"PRW/images/\",\n",
" \"CUHK-SYSU/images/\",\n",
" \"CityScapes/leftImg8bit/test/*\",\n",
" \"CityScapes/leftImg8bit/train/*\",\n",
" \"CityScapes/leftImg8bit/val/*\",\n",
"]"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# Data types\n",
"\n",
"from dataclasses import dataclass\n",
"from pathlib import Path\n",
"\n",
"\n",
"Tlwh = list[float, float, float, float] #top left width height\n",
"Embedding = np.array\n",
"TrackerFrameEmbedding = list[Tlwh, Embedding]\n",
"\n",
"@dataclass\n",
"class FrameEmbedding():\n",
" pcl_filename: str\n",
" tlwh: Tlwh\n",
" embedding: Embedding\n",
" umap: Embedding = None\n",
" pca: Embedding = None\n",
" \n",
" @classmethod\n",
" def from_tracker_embedding(cls, pcl_filename: str | Path, tfe: TrackerFrameEmbedding):\n",
" return cls(pcl_filename=pcl_filename, tlwh=tfe[0], embedding=tfe[1])\n",
" \n",
" @property\n",
" def img_filename(self):\n",
" return self.pcl_filename[:-4] + '.jpg'\n",
" \n"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# load options; quick'n'dirty copy from track.py (as the Namespace object is used in the multitracker)\n",
"\n",
"parser = argparse.ArgumentParser(prog='visualise_embeddings.py')\n",
"parser.add_argument('--cfg', type=str, default='cfg/yolov3_1088x608.cfg', help='cfg file path')\n",
"parser.add_argument('--weights', type=str, default='jde.1088x608.uncertainty.pt', help='path to weights file')\n",
"parser.add_argument('--iou-thres', type=float, default=0.5, help='iou threshold required to qualify as detected')\n",
"parser.add_argument('--conf-thres', type=float, default=0.5, help='object confidence threshold')\n",
"parser.add_argument('--nms-thres', type=float, default=0.4, help='iou threshold for non-maximum suppression')\n",
"parser.add_argument('--min-box-area', type=float, default=200, help='filter out tiny boxes')\n",
"parser.add_argument('--track-buffer', type=int, default=30, help='tracking buffer')\n",
"parser.add_argument('--dataset-dir', type=str, default=\"/datasets\", help='Path to directory with datasets')\n",
"parser.add_argument('--experiment-name', type=str, default=\"embedding_test\", help=\"name to prefix output directory with\")\n",
"parser.add_argument('--output-dir', type=str, default=\"./OUT\", help=\"directory for results\")\n",
" \n",
"# we're running in notebook, so default to empty\n",
"opt = parser.parse_args([])\n",
"\n",
"logger.setLevel(logging.INFO)\n",
"result_path = os.path.join(opt.output_dir, opt.experiment_name)\n",
"mkdir_if_missing(result_path)\n",
"data_type = 'mot'\n",
"\n",
"# Read config\n",
"cfg_dict = parse_model_cfg(opt.cfg)\n",
"# set img_size in opt, so it is passed on to JDETracker\n",
"opt.img_size = [int(cfg_dict[0]['width']), int(cfg_dict[0]['height'])]\n"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
2023-04-13 11:12:50 +00:00
"from ipywidgets import __version__\n",
"assert __version__ == \"7.7.2\"\n",
"\n",
2023-04-13 11:12:50 +00:00
"# import time\n",
"# for i in tqdm(range(10)):\n",
"# time.sleep(1)"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "fbe592aeef6b4187b74d98c022740535",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/6 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:16:49 [INFO]: start seq: /datasets/CaltechPedestrians/data/images/\n",
"2023-04-07 05:16:50 [WARNING]: No ini file for /datasets/CaltechPedestrians/data/images/. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2ad8b161df134bcdb43dece558128264",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/258509 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:40:47 [INFO]: start seq: /datasets/PRW/images/\n",
"2023-04-07 05:40:47 [WARNING]: No ini file for /datasets/PRW/images/. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "daa9b25785fa4db08ff34b87bc0a76dc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/11816 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:43:57 [INFO]: start seq: /datasets/CUHK-SYSU/images/\n",
"2023-04-07 05:43:57 [WARNING]: No ini file for /datasets/CUHK-SYSU/images/. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bdf681fe5f24436194064c107d752025",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/18184 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:45:52 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/test/berlin\n",
"2023-04-07 05:45:52 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/test/berlin. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1f0a89ce0c024e58b782ff8222751d89",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/544 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:46:19 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/test/bonn\n",
"2023-04-07 05:46:19 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/test/bonn. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7e3b736b25154557873321c6037fd42c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/46 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:46:22 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/test/bielefeld\n",
"2023-04-07 05:46:22 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/test/bielefeld. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f1a6765e87c642aba8ad3422b71d2051",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/181 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:46:32 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/test/munich\n",
"2023-04-07 05:46:32 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/test/munich. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "484b26c576ae45a684581647dc68b717",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/398 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:46:51 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/test/leverkusen\n",
"2023-04-07 05:46:51 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/test/leverkusen. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "666255a38fd446b9b193eabab7777388",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/58 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:46:55 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/test/mainz\n",
"2023-04-07 05:46:55 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/test/mainz. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "62407ccf716b4d36a4c845b9a107bf03",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/298 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:47:10 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/strasbourg\n",
"2023-04-07 05:47:10 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/strasbourg. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7fcda6850c6f42858e1d2b26b7ff772e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/365 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:47:29 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/weimar\n",
"2023-04-07 05:47:29 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/weimar. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bad486408c104e7a86d6868cd6fbeb53",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/142 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:47:37 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/ulm\n",
"2023-04-07 05:47:37 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/ulm. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6f4c845acf2c41eca0f1e5918ae01457",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/95 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:47:42 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/dusseldorf\n",
"2023-04-07 05:47:42 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/dusseldorf. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "fdac09a4f7304b1db167954c7e51f698",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/221 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:47:53 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/aachen\n",
"2023-04-07 05:47:53 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/aachen. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "99b5a4a0f1e24e6e80f142443fcbd839",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/174 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:02 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/tubingen\n",
"2023-04-07 05:48:02 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/tubingen. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8aba1d10bf3a47618644919cbe029bec",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/144 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:09 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/bochum\n",
"2023-04-07 05:48:09 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/bochum. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b2bf5daf1b094d3b8d995a638645924f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/96 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:15 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/monchengladbach\n",
"2023-04-07 05:48:15 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/monchengladbach. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bca3e39498ae4dc9bdff844a12f355ce",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/94 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:20 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/hanover\n",
"2023-04-07 05:48:20 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/hanover. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "52f03f81edc2416d9cab65326cb1cebb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/196 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:30 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/stuttgart\n",
"2023-04-07 05:48:30 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/stuttgart. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d72f4d8a85a54dfa9f9290a45e385190",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/196 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:41 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/bremen\n",
"2023-04-07 05:48:41 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/bremen. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c158a646fd434227afe6cc5af933fc1f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/316 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:48:56 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/jena\n",
"2023-04-07 05:48:56 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/jena. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5ff2e1d7e60442fb9279e04468317f08",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/119 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:03 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/hamburg\n",
"2023-04-07 05:49:03 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/hamburg. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8e5c7738a9b2469ea205b1b6b416b24e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/248 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:16 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/darmstadt\n",
"2023-04-07 05:49:16 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/darmstadt. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7fb9bb5ddede44b7bafb7929f2616956",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/85 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:21 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/zurich\n",
"2023-04-07 05:49:21 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/zurich. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8124ae02e5354d9187ddbd6a2c4b2ff4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/122 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:27 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/krefeld\n",
"2023-04-07 05:49:27 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/krefeld. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8904845c79034924945aab1e1aa47ccf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/99 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:33 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/cologne\n",
"2023-04-07 05:49:33 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/cologne. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "20b4b8a31c9346849db48cea23ac5dbf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/154 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:41 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/train/erfurt\n",
"2023-04-07 05:49:41 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/train/erfurt. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a99491fa239d460eadb8d6b6335d5044",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/109 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:49:47 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/val/frankfurt\n",
"2023-04-07 05:49:47 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/val/frankfurt. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6d285bf5027e40d6848f82ffab9e1a0d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/267 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:50:00 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/val/munster\n",
"2023-04-07 05:50:00 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/val/munster. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9ba428c85a8f4f40ac6838d1e6698625",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/174 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-04-07 05:50:09 [INFO]: start seq: /datasets/CityScapes/leftImg8bit/val/lindau\n",
"2023-04-07 05:50:09 [WARNING]: No ini file for /datasets/CityScapes/leftImg8bit/val/lindau. Note, these are only for MOT\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3c9dac13400840ee8cba32e9f2a7b326",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/59 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
" # run tracking on all img_seqs\n",
"\n",
"for pattern in tqdm(img_seqs):\n",
" for seq in glob.glob(os.path.join(opt.dataset_dir, pattern)):\n",
" logger.info('start seq: {}'.format(seq))\n",
" if os.path.exists(os.path.join(seq, 'img1')):\n",
" seq_dir = os.path.join(seq, 'img1')\n",
" else:\n",
" seq_dir = seq\n",
" dataloader = datasets.LoadImages(seq_dir, opt.img_size)\n",
" # result_filename = os.path.join(result_path, '{}.txt'.format(seq))\n",
" try:\n",
" meta_info = open(os.path.join(seq, 'seqinfo.ini')).read() \n",
" frame_rate = int(meta_info[meta_info.find('frameRate')+10:meta_info.find('\\nseqLength')])\n",
" except FileNotFoundError as e:\n",
" logger.warning(f\"No ini file for {seq}. Note, these are only for MOT\")\n",
" frame_rate = 25\n",
" p = str(Path(seq).relative_to(opt.dataset_dir))\n",
" nf, ta, tc = eval_seq(opt, dataloader, data_type, None,\n",
" save_dir=os.path.join(result_path, p), save_figures=True, save_img=False, show_image=False, frame_rate=frame_rate)\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"result_path = os.path.join(opt.output_dir, opt.experiment_name)\n",
"transformed_embedding_pcl = os.path.join(result_path, 'transformed_embeddings.pcl')\n",
"orig_embedding_pcl = os.path.join(result_path, 'orig_embeddings.pcl')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Load all pre-calculated embeddings from disk and project them. Save this collection of embeddings and their projections for easier working at a later stages."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bb5214947bff4a508dab53f59b3269e6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/20 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9b811d86c5bd47d09c8246cc061bbb27",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "14cb0741d2994b5ababb27d3425ac380",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e14e32488c3c4a1dbd145305527989bb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7b052d84f1c4456b8c98821e5d781f15",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "149203cb330d410db136976afc7db87d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a095931ec0d24b18afc56b6890da3ccf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f24d30a079f845ffa96414444f88479e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "402b6117fa0349199e790b5e65ce1af1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2c543e3319a04234b00b1b0fe9476c62",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6bc2611061e1440cb925c80b7669b99e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4d46e63c14244eb3b3ad53da008e963e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e2e32c0911d847229fc16b343602aa51",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0adccb52bd5740ce8cc229704237aee7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a7e2f4ee2b62423f842194cbf8648758",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "29903e9a0b464cc2b3433ebc0ecebfdc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3ca9208801e94db19c3f4de237bcdb53",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9e49b94b1a4d43d4a4a6e1ce85438218",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b56424e56f6d4056a23822530380be13",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "65247fa441404c25a87bdcbae962c42e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "416b00ee819a4e8a895fbe44adb74698",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "134df80696ce4da48ad573b6a997afe6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "366c5280c0a648d78078e5199a369456",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "145e1cb273e645bc8b50ebc182e92406",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d38eb86b45ab42f38461ef986c9b77d7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4f8d40650c0c48a8a29748f759d89f9c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4e83bcfacd6b495ab74d9d6fe9e4caf1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3713c29e36d749be8148e9797f5e1100",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0e5d545213774e3a8095c96ffb7e503c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6f13d3016f904ab8a732a9f3ca3de89b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1bfb0adf537546a6ab523d855520e476",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e064c93e40de48fb85e413c16f79165e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e9a26107046e4ba7b7facd6e455e4397",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4990c6b5a14d4006b5f51c46ab8bcacb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4d833f54ecde4792a443fb0b1b7fe3f8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b2d9109c5987406fa9d2a4c58fae705f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b5fa2e7c5cee4befb2466c472001576a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f7447c0a0a0c448390f21c4b4c0c3b55",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
2023-04-13 11:12:50 +00:00
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "85427dae328f4612af77a54828d31d73",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "6b9f043c1b0947569218000f0eb0a42e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "81587afb2cbe42c591df0622b34cacfe",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "b74676e4f3e04ee4b92034d458f425b4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "14faf83633e04fc9aba2f72edf4d8bed",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "1638f354911243fd9a798630b9844e07",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 11:12:50 +00:00
"model_id": "f47e96fd925d4b51ad760e94266478e0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2023-04-13 11:12:50 +00:00
"2023-04-07 05:56:57 [INFO]: loaded 587540 embeddings\n",
"2023-04-07 05:56:57 [INFO]: saved all loaded embeddings embeddings\n",
"2023-04-07 05:57:06 [INFO]: transform using UMAP\n",
"OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n",
"2023-04-07 06:30:42 [INFO]: transform using PCA\n",
"2023-04-07 06:30:48 [INFO]: saved transformed embeddings\n"
]
}
],
"source": [
"from sklearn import decomposition\n",
"\n",
"frame_embeddings: list[FrameEmbedding] = []\n",
"\n",
2023-04-13 11:12:50 +00:00
"if os.path.exists(transformed_embedding_pcl):\n",
" with open(transformed_embedding_pcl, 'rb') as fp:\n",
" frame_embeddings = pickle.load(fp)\n",
" logger.info(f'loaded {len(frame_embeddings)} embeddings')\n",
"else:\n",
2023-04-13 11:12:50 +00:00
" if os.path.exists(orig_embedding_pcl):\n",
" with open(orig_embedding_pcl, 'rb') as fp:\n",
" frame_embeddings = pickle.load(fp)\n",
" logger.info(f'loaded {len(frame_embeddings)} embeddings')\n",
" else:\n",
" for pattern in tqdm(img_seqs):\n",
" for seq_path in glob.glob(os.path.join(result_path, pattern)):\n",
" for i, frame_path in tqdm(enumerate(glob.iglob(f\"{seq_path}/*-*.pcl\"))):\n",
" # if i%2 == 1:\n",
" # # TODO skip 50% for now\n",
" # continue\n",
" with open(frame_path, 'rb') as fp:\n",
" tracker_embedding = pickle.load(fp)\n",
" fe = FrameEmbedding.from_tracker_embedding(frame_path, tracker_embedding)\n",
" frame_embeddings.append(fe)\n",
"\n",
" logger.info(f'loaded {len(frame_embeddings)} embeddings')\n",
"\n",
" with open(orig_embedding_pcl, 'wb') as fp:\n",
" logger.info(f'saved all loaded embeddings embeddings')\n",
" pickle.dump(frame_embeddings, fp)\n",
"\n",
" \n",
" logger.info(f'transform using UMAP')\n",
" reducer = umap.UMAP(n_components=2)\n",
" umap_embeddings = reducer.fit_transform([e.embedding for e in frame_embeddings])\n",
" for i, e in enumerate(umap_embeddings):\n",
" frame_embeddings[i].umap = e\n",
" \n",
" logger.info(f'transform using PCA')\n",
" pca = decomposition.PCA(n_components=2)\n",
" pca_embeddings = pca.fit_transform([e.embedding for e in frame_embeddings])\n",
" for i, e in enumerate(pca_embeddings):\n",
" frame_embeddings[i].pca = e\n",
"\n",
2023-04-13 11:12:50 +00:00
" with open(transformed_embedding_pcl, 'wb') as fp:\n",
" logger.info(f'saved transformed embeddings')\n",
" pickle.dump(frame_embeddings, fp)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"\n",
"# print(embeddings)\n",
"umap_embeddings = np.array([e.umap for e in frame_embeddings])\n",
"pca_embeddings = np.array([e.pca for e in frame_embeddings])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"\n",
"import base64\n",
"import cv2\n",
"\n",
"\n",
"def b64_image_files(frame_embeddings: list[FrameEmbedding]):\n",
" urls = []\n",
" for i, fe in enumerate(frame_embeddings):\n",
" im = cv2.imread(fe.img_filename)\n",
" pic_width = int(im.shape[1] * .3)\n",
" pic_height = int(im.shape[0] * .3)\n",
" new_dimension = (pic_width, pic_height)\n",
" try:\n",
" im = cv2.resize(im, new_dimension)\n",
" _, byte_data = cv2.imencode('.png', im) \n",
" except Exception as e:\n",
" print(i, fe.img_filename, e)\n",
" \n",
" url = 'data:image/png;base64,' + base64.b64encode(byte_data).decode('utf-8')\n",
" urls.append(url)\n",
" return urls"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
" \n",
"# source = ColumnDataSource(data={'x': embeddings[:, 0], 'y': embeddings[:, 1], 'b64': b64_image_files(frame_embeddings), 'fn': [e.img_filename for e in frame_embeddings] })\n",
"source = ColumnDataSource(data={\n",
" 'x': umap_embeddings[:, 0], 'y': umap_embeddings[:, 1], \n",
" 'pca_x': pca_embeddings[:, 0], 'pca_y': pca_embeddings[:, 1],\n",
" 'fn': [e.img_filename for e in frame_embeddings]\n",
" })\n"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"# thanks to https://github.com/jni/blob-explorer/blob/bd9fa676a2a23317e2ea84bdf48b19e71b9e75d4/picker.py#L24\n",
"# who uses base64 encoding, but in VScode we can just use the _path_ to the file\n",
"tooltip = \"\"\"\n",
" <img height=100 src='@fn'>\n",
" \"\"\"\n",
" \n",
"tools1 = [BoxZoomTool(), PanTool(), WheelZoomTool(), ResetTool(), HoverTool(tooltips=tooltip)]\n",
"tools2 = [BoxZoomTool(), PanTool(), WheelZoomTool(), ResetTool(), HoverTool(tooltips=tooltip)]\n"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
"\n",
"p_umap = figure(width=800, height=800, title='UMAP projection', \n",
" tools=tools1\n",
" )\n",
"r_umap = p_umap.circle(source=source, size=10, color=\"navy\", alpha=0.5)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [],
"source": [
"p_pca = figure(width=800, height=800, title='PCA projection', \n",
" tools=tools2\n",
" )\n",
"r_pca = p_pca.circle('pca_x', 'pca_y', source=source, size=10, color=\"red\", alpha=0.5)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div class=\"bk-root\" id=\"aadf5ca0-8b62-40e4-9063-92b32f7a3f1e\" data-root-id=\"3453\"></div>\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"f0e85271-f463-45ad-a119-343d8d173388\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"3452\"},{\"id\":\"3450\"}]},\"id\":\"3453\",\"type\":\"Column\"},{\"attributes\":{\"below\":[{\"id\":\"3375\"}],\"center\":[{\"id\":\"3378\"},{\"id\":\"3382\"}],\"height\":800,\"left\":[{\"id\":\"3379\"}],\"renderers\":[{\"id\":\"3394\"}],\"title\":{\"id\":\"3365\"},\"toolbar\":{\"id\":\"3384\"},\"toolbar_location\":null,\"width\":800,\"x_range\":{\"id\":\"3367\"},\"x_scale\":{\"id\":\"3371\"},\"y_range\":{\"id\":\"3369\"},\"y_scale\":{\"id\":\"3373\"}},\"id\":\"3364\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"3408\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"3405\",\"type\":\"LinearScale\"},{\"attributes\":{\"toolbar\":{\"id\":\"3451\"},\"toolbar_location\":\"above\"},\"id\":\"3452\",\"type\":\"ToolbarBox\"},{\"attributes\":{},\"id\":\"3401\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"3433\"},\"group\":null,\"major_label_policy\":{\"id\":\"3434\"},\"ticker\":{\"id\":\"3376\"}},\"id\":\"3375\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"navy\"},\"hatch_alpha\":{\"value\":0.5},\"hatch_color\":{\"value\":\"navy\"},\"line_alpha\":{\"value\":0.5},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10}},\"id\":\"3391\",\"type\":\"Circle\"},{\"attributes\":{\"children\":[[{\"id\":\"3364\"},0,0],[{\"id\":\"3396\"},0,1]]},\"id\":\"3450\",\"type\":\"GridBox\"},{\"attributes\":{},\"id\":\"3376\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.5},\"hatch_color\":{\"value\":\"red\"},\"line_alpha\":{\"value\":0.5},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":10},\"x\":{\"field\":\"pca_x\"},\"y\":{\"field\":\"pca_y\"}},\"id\":\"3423\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2363\"},\"glyph\":{\"id\":\"3391\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"3393\"},\"nonselection_glyph\":{\"id\":\"3392\"},\"view\":{\"id\":\"3395\"}},\"id\":\"3394\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"3441\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"3369\",\"type\":\"DataRange1d\"},{\"attributes\":{\"source\":{\"id\":\"2363\"}},\"id\":\"3395\",\"type\":\"CDSView\"},{\"attributes\":{\"tools\":[{\"id\":\"3354\"},{\"id\":\"3355\"},{\"id\":\"3356\"},{\"id\":\"3357\"},{\"id\":\"3358\"}]},\"id\":\"3384\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"3442\",\"type\":\"AllLabels\"},{\"attributes\":{\"data\":{\"fn\":[\"./OUT/embedding_test/MOT16/test/MOT16-01/00340-5.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00034-3.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00170-1.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00267-2.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00267-4.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00103-5.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00368-4.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00296-5.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00335-7.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00204-8.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00229-10.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00108-9.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00331-10.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00118-1.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00268-2.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00368-10.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00109-8.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00374-3.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00236-1.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00447-3.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00169-9.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/00103-4.jpg\",\"./OUT/embedding_test/MOT16/test/MOT16-01/000
"application/vnd.bokehjs_exec.v0+json": ""
},
"metadata": {
"application/vnd.bokehjs_exec.v0+json": {
"id": "3453"
}
},
"output_type": "display_data"
}
],
"source": [
"handle = show(gridplot([[p_umap, p_pca]]), notebook_handle=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Stage 2 Generate a grid images out of the projections\n",
"\n",
"Now that there are individual points, we can perheaps better make sense of patterns if we see all points at once. As this is virtually impossible, we can try rendering a grid, with images on it. For each field on the grid, try to find the point closest to the center, and draw that image."
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"from scipy import spatial"
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"\n",
"class GridPosition(TypedDict):\n",
" pos: tuple[int,int]\n",
" distance: float\n",
" frame_embedding: FrameEmbedding"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"import cv2\n",
"def resizeAndPad(img, size, padColor=0):\n",
"\n",
" h, w = img.shape[:2]\n",
" sh, sw = size\n",
"\n",
" # interpolation method\n",
" if h > sh or w > sw: # shrinking image\n",
" interp = cv2.INTER_AREA\n",
" else: # stretching image\n",
" interp = cv2.INTER_CUBIC\n",
"\n",
" # aspect ratio of image\n",
" aspect = w/h # if on Python 2, you might need to cast as a float: float(w)/h\n",
"\n",
" # compute scaling and pad sizing\n",
" if aspect > 1: # horizontal image\n",
" new_w = sw\n",
" new_h = np.round(new_w/aspect).astype(int)\n",
" pad_vert = (sh-new_h)/2\n",
" pad_top, pad_bot = np.floor(pad_vert).astype(int), np.ceil(pad_vert).astype(int)\n",
" pad_left, pad_right = 0, 0\n",
" elif aspect < 1: # vertical image\n",
" new_h = sh\n",
" new_w = np.round(new_h*aspect).astype(int)\n",
" pad_horz = (sw-new_w)/2\n",
" pad_left, pad_right = np.floor(pad_horz).astype(int), np.ceil(pad_horz).astype(int)\n",
" pad_top, pad_bot = 0, 0\n",
" else: # square image\n",
" new_h, new_w = sh, sw\n",
" pad_left, pad_right, pad_top, pad_bot = 0, 0, 0, 0\n",
"\n",
" # set pad color\n",
" if len(img.shape) == 3 and not isinstance(padColor, (list, tuple, np.ndarray)): # color image but only one color provided\n",
" padColor = [padColor]*3\n",
"\n",
" # scale and pad\n",
" scaled_img = cv2.resize(img, (new_w, new_h), interpolation=interp)\n",
" scaled_img = cv2.copyMakeBorder(scaled_img, pad_top, pad_bot, pad_left, pad_right, borderType=cv2.BORDER_CONSTANT, value=padColor)\n",
"\n",
" return scaled_img"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"def projection_to_grid(grid_items, points, frame_embeddings: list[FrameEmbedding]):\n",
" # create a KDTree for fast searching of nearest points\n",
" spatial_tree = spatial.KDTree(points)\n",
"\n",
" min_x = min(points[:,0])\n",
" max_x = max(points[:,0])\n",
" min_y = min(points[:,1])\n",
" max_y = max(points[:,1])\n",
"\n",
" #initialize empty\n",
" # grid = [None]*(grid_items * grid_items)\n",
" grid: list[GridPosition] = []\n",
"\n",
"\n",
" # find the points closest to the grid centroids\n",
" for ix in range(grid_items):\n",
" embedding_x = (ix+0.5) / grid_items * (max_x - min_x) + min_x\n",
"\n",
" for iy in range(grid_items):\n",
" embedding_y = (iy+0.5) / grid_items * (max_y - min_y) + min_y\n",
"\n",
" distance, index = spatial_tree.query([embedding_x, embedding_y])\n",
" # print(distance, frame_embeddings[index].img_filename)\n",
" grid_index = ix * grid_items + iy\n",
" gp = GridPosition(pos=(ix, iy), distance=distance, frame_embedding=frame_embeddings[index])\n",
" grid.append(gp)\n",
"\n",
"\n",
" print(f'{len(grid)} items. Sort')\n",
" grid.sort(key=lambda k: k['distance']) \n",
" \n",
" # remove duplicate closest points based on distance\n",
" drawn_embeddings = set()\n",
" items_to_draw: list[GridPosition] = []\n",
" for point in grid:\n",
" if point['frame_embedding'].img_filename not in drawn_embeddings:\n",
" drawn_embeddings.add(point['frame_embedding'].img_filename)\n",
" items_to_draw.append(point)\n",
"\n",
" return items_to_draw"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"def draw_grid(grid_size, items_to_draw: list[GridPosition]):\n",
" grid_items = max([max(p['pos']) for p in items_to_draw])+1\n",
" canvas = np.zeros((grid_size * grid_items, grid_size*grid_items, 3), np.uint8)\n",
" for point in items_to_draw:\n",
" img = cv2.imread(point['frame_embedding'].img_filename)\n",
" img = resizeAndPad(img, (grid_size, grid_size), 0)\n",
" iy = point['pos'][1]\n",
" ix = point['pos'][0]\n",
"\n",
" y = grid_size*iy\n",
" x = grid_size*ix\n",
" canvas[x:x+grid_size,y:y+grid_size] = img\n",
" return canvas"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
2023-04-13 11:12:50 +00:00
"from matplotlib import pyplot as plt\n",
"from PIL import Image\n",
"\n",
"def show_and_save(cv_img, fn):\n",
" # Convert for consumption by matplotlib or Pillow\n",
" image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)\n",
"\n",
" # Converts from one colour space to the other. this is needed as RGB\n",
" # is not the default colour space for OpenCV\n",
" plt.imshow(image)\n",
" plt.show()\n",
" im = Image.fromarray(image)\n",
" # im = im.resize((1500,1500))\n",
" im.save(fn)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"PCA reduces dimensions in a linear fasion. Thus this should stay truer to the values as they are embedded."
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 67,
"metadata": {},
"outputs": [
2023-04-13 11:12:50 +00:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"22500 items. Sort\n"
]
},
{
"data": {
2023-04-13 11:12:50 +00:00
"image/png": "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
"text/plain": [
2023-04-13 11:12:50 +00:00
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
2023-04-13 11:12:50 +00:00
"output_type": "display_data"
}
],
"source": [
"\n",
2023-04-13 11:12:50 +00:00
"grid_points = projection_to_grid(150, pca_embeddings, frame_embeddings)\n",
"canvas = draw_grid(60, grid_points)\n",
"show_and_save(canvas, os.path.join(result_path, 'pca.png'))"
]
},
{
2023-04-13 11:12:50 +00:00
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
2023-04-13 11:12:50 +00:00
"UMAP is a clustering algorithm ,which tries to confirm to local and global structures. Being similar to T-SNE it is a visualisation/exploratory method, and thus it shoul not be interpreted too strict."
]
},
{
"cell_type": "code",
2023-04-13 11:12:50 +00:00
"execution_count": 65,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2023-04-13 11:12:50 +00:00
"22500 items. Sort\n"
]
2023-04-13 11:12:50 +00:00
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2023-04-13 11:12:50 +00:00
"grid_points = projection_to_grid(150, umap_embeddings, frame_embeddings)\n",
"canvas = draw_grid(60, grid_points)\n",
"show_and_save(canvas, os.path.join(result_path, 'umap.png'))"
]
},
2023-04-13 11:12:50 +00:00
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "trm",
"language": "python",
"name": "trm"
},
"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.10.8"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "dc02836f3be4f05ab358b62045dee0ee510294e31b25a582b38257a3269c0c99"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}