Towards-Realtime-MOT/visualise_embeddings.ipynb

2167 lines
7.6 MiB
Plaintext
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 13:12:50 +02: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 13:12:50 +02:00
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
2023-04-13 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02:00
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
2023-04-13 13:12:50 +02:00
"from ipywidgets import __version__\n",
"assert __version__ == \"7.7.2\"\n",
"\n",
2023-04-13 13:12:50 +02:00
"# import time\n",
"# for i in tqdm(range(10)):\n",
"# time.sleep(1)"
]
},
{
"cell_type": "code",
2023-04-13 13:12:50 +02:00
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 13:12:50 +02: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 13:12:50 +02:00
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
2023-04-13 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02: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 13:12:50 +02:00
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"from scipy import spatial"
]
},
{
"cell_type": "code",
2023-04-13 13:12:50 +02: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",
"# resize and pad from https://stackoverflow.com/a/44724368 (alkasm)\n",
2023-04-13 13:12:50 +02:00
"def resizeAndPad(img, size, padColor=0):\n",
" \n",
2023-04-13 13:12:50 +02:00
" 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": 68,
2023-04-13 13:12:50 +02:00
"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": 87,
2023-04-13 13:12:50 +02:00
"metadata": {},
"outputs": [],
"source": [
"\n",
"bgcolors = [\n",
" ('MOT16', [255, 0, 0]),\n",
" ('CaltechPedestrians', [0, 255, 0]),\n",
" ('PRW', [0, 0, 255]),\n",
" ('CUHK-SYSU', [255, 255, 0]),\n",
" ('CityScapes', [0, 255, 255]),\n",
"]\n",
"\n",
"def draw_grid(grid_size, items_to_draw: list[GridPosition], colored=True):\n",
2023-04-13 13:12:50 +02:00
" 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",
" if colored:\n",
" try:\n",
" color_idx = [k[0] in point['frame_embedding'].img_filename for k in bgcolors].index(True)\n",
" color = bgcolors[color_idx][1]\n",
" except ValueError:\n",
" color = [0,0,0]\n",
" else:\n",
" color = [0,0,0]\n",
" \n",
2023-04-13 13:12:50 +02:00
" img = cv2.imread(point['frame_embedding'].img_filename)\n",
" img = resizeAndPad(img, (grid_size, grid_size), color)\n",
2023-04-13 13:12:50 +02:00
" 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": 76,
"metadata": {},
"outputs": [],
"source": [
2023-04-13 13:12:50 +02: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",
"execution_count": 88,
"metadata": {},
"outputs": [
2023-04-13 13:12:50 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"22500 items. Sort\n"
]
},
{
"data": {
2023-04-13 13:12:50 +02:00
"image/png": "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
"text/plain": [
2023-04-13 13:12:50 +02:00
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
2023-04-13 13:12:50 +02:00
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
2023-04-13 13:12:50 +02:00
"grid_points = projection_to_grid(150, pca_embeddings, frame_embeddings)\n",
"# print(['CUHK-SYSU' in p['frame_embedding'].img_filename for p in grid_points])\n",
"canvas = draw_grid(60, grid_points, False)\n",
"show_and_save(canvas, os.path.join(result_path, 'pca_plain.png'))\n",
"\n",
"canvas = draw_grid(60, grid_points, True)\n",
"for i, k in enumerate(bgcolors):\n",
" dataset, color = k\n",
" cv2.putText(canvas, dataset, (100, 100*i+100), cv2.FONT_HERSHEY_DUPLEX, 2, color, 2)\n",
"show_and_save(canvas, os.path.join(result_path, 'pca_color.png'))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Large versions are saved [without colors](OUT/embedding_test/pca_plain.png) and [with colors](OUT/embedding_test/pca_color.png). [Note, these are _big_ image files]"
]
},
{
2023-04-13 13:12:50 +02:00
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
2023-04-13 13:12:50 +02: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",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2023-04-13 13:12:50 +02:00
"22500 items. Sort\n"
]
2023-04-13 13:12:50 +02:00
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2023-04-13 13:12:50 +02:00
"grid_points = projection_to_grid(150, umap_embeddings, frame_embeddings)\n",
"canvas = draw_grid(60, grid_points, False)\n",
"show_and_save(canvas, os.path.join(result_path, 'umap_plain.png'))\n",
"\n",
"canvas = draw_grid(60, grid_points, True)\n",
"for i, k in enumerate(bgcolors):\n",
" dataset, color = k\n",
" cv2.putText(canvas, dataset, (100, 100*i+100), cv2.FONT_HERSHEY_DUPLEX, 2, color, 2)\n",
"show_and_save(canvas, os.path.join(result_path, 'umap_color.png'))"
]
},
2023-04-13 13:12:50 +02:00
{
"attachments": {},
"cell_type": "markdown",
2023-04-13 13:12:50 +02:00
"metadata": {},
"source": [
"Large versions are saved [without colors](OUT/embedding_test/umap_plain.png) and [with colors](OUT/embedding_test/umap_color.png). [Note, these are _big_ image files]"
]
2023-04-13 13:12:50 +02:00
},
{
"cell_type": "markdown",
"metadata": {},
"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
}