{ "cells": [ { "cell_type": "code", "execution_count": 47, "id": "d1489f9f-328c-4812-9cdb-0a2dee44ae88", "metadata": {}, "outputs": [], "source": [ "import cv2\n", "import argparse\n", "import logging\n", "import os\n", "from tqdm.auto import tqdm\n", "from pathlib import Path\n", "\n", "import numpy as np\n", "from tracker.multitracker import JDETracker\n", "from utils.timer import Timer\n", "\n", "import matplotlib.pyplot as plt\n", "from tracker.basetrack import TrackState\n", "import torch\n", "import pickle\n", "\n", "from utils import visualization as vis" ] }, { "cell_type": "code", "execution_count": 48, "id": "edec1b34-64ad-4610-856a-68d886a45142", "metadata": {}, "outputs": [], "source": [ "logger = logging.getLogger(__name__)" ] }, { "cell_type": "code", "execution_count": 49, "id": "010bf567-8845-46d4-8500-883efce2d010", "metadata": {}, "outputs": [], "source": [ "# path of video to use. Replace with integer to use /dev/video device\n", "# that is, the webcam.\n", "video_path = Path('OUT/embedding_test/V003.seq')\n", "projector_pcl = Path('OUT/embedding_test/reducer_pca.pcl')" ] }, { "cell_type": "code", "execution_count": 50, "id": "8a413424-13c4-4bdc-825a-0aa6164e89e2", "metadata": {}, "outputs": [], "source": [ "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": 51, "id": "7b291b67-93ad-4b51-934a-dbaf095f7704", "metadata": {}, "outputs": [], "source": [ "# load options; quick'n'dirty copy from track.py (as the Namespace object is used in the multitracker)\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", "result_frame_path = os.path.join(result_path, 'track-test')\n", "mkdir_if_missing(result_path)\n", "mkdir_if_missing(result_frame_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'])]" ] }, { "cell_type": "code", "execution_count": 52, "id": "648faf4b-d692-473a-a99d-06b50a2e2261", "metadata": {}, "outputs": [], "source": [ "import queue, threading\n", "\n", "# bufferless VideoCapture (by Ulrich Stern: https://stackoverflow.com/a/54577746)\n", "# Usefull when using Webcam with higher fps than the script can process it.\n", "class BufferlessVideoCapture:\n", "\n", " def __init__(self, name):\n", " self.cap = cv2.VideoCapture(name)\n", " self.q = queue.Queue()\n", " t = threading.Thread(target=self._reader)\n", " t.daemon = True\n", " t.start()\n", "\n", " # read frames as soon as they are available, keeping only most recent one\n", " def _reader(self):\n", " while True:\n", " ret, frame = self.cap.read()\n", " if not ret:\n", " break\n", " if not self.q.empty():\n", " try:\n", " self.q.get_nowait() # discard previous (unprocessed) frame\n", " except queue.Empty:\n", " pass\n", " self.q.put(frame)\n", "\n", " def read(self):\n", " return self.q.get()" ] }, { "cell_type": "code", "execution_count": 53, "id": "a28ef404-2031-43cf-aeb1-357aa1be0934", "metadata": {}, "outputs": [], "source": [ "\n", "with projector_pcl.open('rb') as fp:\n", " reducer = pickle.load(fp)" ] }, { "cell_type": "markdown", "id": "c433bdc3-e3bb-4d53-8e41-6e11791d8ac2", "metadata": {}, "source": [ "Load video file and get it's properties. Use that to calculate the dimension to fit the loaded model" ] }, { "cell_type": "code", "execution_count": 59, "id": "642c1953-6f33-4a22-a223-797755ece204", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "video 640 x 480\n", "Scale to 810 x 608\n" ] } ], "source": [ "stream = cv2.VideoCapture(str(video_path))\n", "frame_rate = stream.get(cv2.CAP_PROP_FPS)\n", "vw = int(stream.get(cv2.CAP_PROP_FRAME_WIDTH))\n", "vh = int(stream.get(cv2.CAP_PROP_FRAME_HEIGHT))\n", "\n", "\n", "print(\"video\", vw, \"x\", vh)\n", "\n", "# get_size (from datasets.py)\n", "aspect_w, aspect_h = float(opt.img_size[0]) / vw, float(opt.img_size[1]) / vh\n", "aspect = min(aspect_w, aspect_h)\n", "w, h = int(vw *aspect), int(vh*aspect)\n", "print(\"Scale to\", w, \"x\", h)\n" ] }, { "cell_type": "code", "execution_count": 60, "id": "be84553e-4309-46e5-9d9a-3075c20c0463", "metadata": {}, "outputs": [], "source": [ "umap_pcl = os.path.join(result_path, 'reducer_umap.pcl')\n", "pca_pcl = os.path.join(result_path, 'reducer_pca.pcl')" ] }, { "cell_type": "code", "execution_count": 61, "id": "c623aa17-5ce2-4948-9adf-d4c9a6d1ccd2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-1.0, 1.0)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABpQAAANkCAYAAAC588kTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AACZQklEQVR4nOz9e5jXdZ0//t+R48DQ4AGLZtBNSA6eVygQE+lgfRr7eKqktfUQqO22hX2gNGvXpc9ubAu0UmrlIdRskw4eSCzNGnEhCbBL7ROHFdIV0AsDARkcjr5/f/Dj/RVhXswMMyJwu13X47qezOv5fj4fb50/3u/rPq/nq12SUgAAAAAAAKARh+zrBgAAAAAAAHhrEygBAAAAAABQSKAEAAAAAABAIYESAAAAAAAAhQRKAAAAAAAAFBIoAQAAAAAAUEigBAAAAAAAQCGBEgAAAAAAAIUESgAAAAAAABQSKAEAAAAAAFBIoAQAAAAAAEAhgRIAAAAAAACFBEoAAAAAAAAUEigBAAAAAABQSKAEAAAAAABAIYESAAAAAAAAhQRKAAAAAAAAFBIoAQAAAAAAUEigBAAAAAAAQCGBEgAAAAAAAIXaNFDq2bNnamtrM378+Dz44IP5y1/+klKplFKplKlTp7bJniNHjsxDDz2UF198MQ0NDXnuuefywx/+MEOGDGmT/QAAgIPT/vp9p6KiIl/60pcyd+7crF69OvX19Vm4cGEmTZqUo446qk36BgAADgyltqoiU6dObdW9unTpUnrggQca3W/r1q2lf/qnf2qz96qUUkoppZQ6uGp//L7Tp0+f0uLFixtdZ+3ataXa2tp9/t9WKaWUUkop9darN+3Iu//5n//JQw891Gbr/+AHP0htbW2S5Le//W3OOeecDB48OJ/5zGeyZMmStG/fPuPHj8/ll1/eZj0AAAAHp/3h+05lZWVmzJiRY489Nkly88035/3vf3+GDh2aa6+9NuvXr09VVVWmTZuWk046qc3eCwAAsP9qs7Tqn//5n0u1tbWlI488spSkdPTRR7fJX+yNGDGivO79999fOuSQQ3a6fvjhh5eee+65UqlUKr388sulHj167PMkTymllFJKKbV/1/72fWf8+PHldcaNG7fL9aFDh5Y2b95cKpVKpbq6un3+31cppZRSSin1lqs3b7O2+oI1Y8aMUqlUKm3evLlUXV292zkXXnhh4ZcnpZRSSimllNqbeit/3+nQoUNpzZo1pVKpVPrTn/5Uateu3W7X+e53v1teZ9CgQfv8v6lSSimllFLqrVNv2pF3baWysjIf+MAHkiSPPPJIVqxYsdt599xzT9atW5ckOe+88960/gAAAFqqtb7vjBgxIj169EiS3HHHHSmVSrtd5/bbby+PfW8CAABeb78PlAYPHpzOnTsnSWbOnNnovC1btmTOnDnl13To0OFN6Q8AAKClWuv7zumnn14eF60zf/78bNiwIUkybNiwFvcNAAAcePb7QGngwIHl8aJFiwrn7rjesWPHvPvd727TvgAAAPZWa33faeo627Zty5IlS5IkAwYMaHa/AADAgWu/v02npqamPF6+fHnh3GXLlpXHvXv3zsKFC5u8T3V1deH1Tp06ZcCAAXnppZfy0ksvZdu2bU1eGwAA9jft27fPkUcemSR5+umns3nz5n3c0YGptb7v7Finvr6+fDRe0TonnXRSjjzyyHTq1KnJ/299ZwIAgJ0daN+b9vtAqXv37uVxfX194dwdRzck288ib449fXkDAICD1eDBgzN//vx93cYBqbW+7+xYZ09r7G6dl19+uUm9+s4EAACNOxC+N+33R9516dKlPN5Turdp06byuKKios16AgAAaA2t9X1nxzpN+YtI35sAAIDd2e/vUNq4cWN53KlTp8K5Ox5mmyQNDQ3N2uf1R000dv31D8F98cUXm7U+AADsT3r16pV58+YlSV566aV93M2Bq7W+7+xYZ09r7GmdIr4zAQDAzg607037faC0fv368nhPx9h169atPG7KUQ+vt2LFiibPffHFF5s1HwAA9meehdN2Wuv7zo51mnL0d0u/N/nOBAAAjTsQvjft90fevf6c7j39RVzv3r3L49c/sBYAAOCtqLW+7+xYp7KyMlVVVU1a56WXXtrvHxoMAAC0nv0+UFqwYEF53L9//8K5O65v2bIlzzzzTJv2BQAAsLda6/tOU9dp3759+vTpkyRZuHBhs/sFAAAOXPt9oDRv3rzyQ2OHDx/e6LyOHTtmyJAh5dds3br1TekPAACgpVrr+86sWbPK46J1Bg0aVD4Wb/bs2S3uGwAAOPDs94FSfX19fvOb3yRJPvjBD6a6unq3884///zy0Q733nvvm9YfAABAS7XW951HH300a9euTZJccsklje536aWX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i1+U1/i7v/u73c6ZNGlSec53vvOdVn+f1dXV5fWrq6vb9L+pUkoppZRS+7p8/lXNLb8zSimllFLqYKsD7TNwm96hNHjw4JxxxhlJkttuuy1z5szZZc7kyZOzYMGCJMmYMWPSoUPzT+E77bTTkiSrVq3Kd7/73d3O+frXv14eDx06tNl7AAAAAAAAHKzaNFA699xzy+OpU6fudk6pVMqdd96ZJDn00EMzYsSIZu/TqVOnJMmzzz7b6JxXXnklf/nLX3aaDwAAAAAAwJ61aaB0+umnJ0nq6+vzxBNPNDpv5syZ5fGwYcOavc/ixYuTpPDZSN27d0/Pnj13mg8AAAAAAMCetWmgNGDAgCTJkiVLsm3btkbnLVq0aJfXNMf3vve9JMkRRxyRK6+8crdz/vEf/3GX+QAAAAAAAOxZ8x9Y1ESdO3cu3xG0fPnywrlr165NfX19Kisr07t372bv9YMf/CCnn356Lrnkktx444059dRTM3369Lz44os56qij8rd/+7c577zzkiT/8i//kt/85jfN3qO6urrweq9evZq9JgAAAAAAwP6gzQKl7t27l8f19fV7nL9hw4ZUVlamsrKy2Xu99tprufTSS/OLX/wi1157bS6//PJcfvnlO8357W9/m2984xstCpOSPYdiAAAAAAAAB6o2O/KuS5cu5fHmzZv3OH/Tpk1JkoqKihbt179//1x88cU54YQTdnt96NChGTVqVN75zne2aH0AAAAAAICDVZsFShs3biyPO3XqtMf5nTt3TpI0NDQ0e6/TTz89jz/+eP73//7fWbFiRT796U/n7W9/ezp27Jiampr8/d//fV599dV86lOfyty5czNw4MBm71FTU1NYgwcPbvaaAAAAAAAA+4M2O/Ju/fr15XFTjrHr1q1bkqYdj/d6nTp1yo9//OP06NEjL774YoYMGZKVK1eWr69YsSLf/e53M3PmzMyfPz/V1dW54447mh0ArVixolnzAQAAAAAADhRtdofSpk2bsmrVqiTb7+4p0qNHj3LotGzZsmbt85GPfKS8/ne+852dwqTXW7BgQe66664kyaBBg3LiiSc2ax8AAAAAAICDVZsFSsn2ECdJ+vbtm/bt2zc6r3///uXxwoULm7XHgAEDyuM//OEPhXOfeOKJ3e4JAAAAAABA49o0UJo1a1aS7UfenXrqqY3OGz58eHk8e/bsZu2xdevW8rhDh+IT/Dp27Ljb1wEAAAAAANC4Ng2U7rvvvvL4sssu2+2cdu3a5eKLL06SrFmzJnV1dc3a49lnny2P3/e+9xXOfX1w9frXAQAAAAAA0Lg2DZTmzZuXxx57LEkyatSoDBkyZJc5Y8eOzcCBA5MkU6ZM2eXOoeHDh6dUKqVUKmXq1Km7vP43v/lNNmzYkCT5u7/7uxx//PG77eUjH/lIzjvvvCTJ8uXL8+STT7b4fQEAAAAAABxM2jRQSpIxY8bk1VdfTceOHfPwww/nmmuuyXvf+96ceeaZ+d73vpeJEycmSRYvXpzJkyc3e/1169bl3/7t35Ikb3vb2/K73/0u//qv/5ozzzwzJ510Us4666zceOONmT59evk5Ttdcc01KpVLrvUkAAAAAAIADWPFDh1rBk08+mQsvvDB33XVXqqqqMmHChF3mLF68OLW1tamvr2/RHv/yL/+Sww47LGPGjEn37t1z7bXX5tprr91l3ubNm3PttdfmRz/6UYv2AQAAAAAAOBi1+R1KSfLAAw/kxBNPzLe+9a0sXrw4GzZsyJo1azJv3rx8+ctfzimnnJKlS5fu1R7/5//8nwwePDjf/e5388c//jGvvPJKtm7dmrVr12b+/PmZPHlyjj/++BbdBQUAAAAAAHAwa5fE2W+toLq6OsuXL0+S1NTUZMWKFfu4IwAAaDs+/9JcfmcAADjYHGifgd+UO5QAAAAAAADYfwmUAAAAAAAAKCRQAgAAAAAAoJBACQAAAAAAgEICJQAAAAAAAAoJlAAAAAAAACgkUAIAAAAAAKCQQAkAAAAAAIBCAiUAAAAAAAAKCZQAAAAAAAAoJFACAAAAAACgkEAJAAAAAACAQgIlAAAAAAAACgmUAAAAAAAAKCRQAgAAAAAAoJBACQAAAAAAgEICJQAAgL101FFHZdKkSVm4cGHq6+uzevXqzJ07N+PGjUtFRcVerX3JJZekVCo1qS655JI9rldRUZEvfelLmTt3blavXp36+vosXLgwkyZNylFHHbVXvQIAAAeuDvu6AQAAgP3Z2WefnbvuuitVVVXln3Xr1i2HHXZYBg8enNGjR6e2tjZLly7dh11u16dPnzz44IM59thjd/p5//79079//4wePToXXXRRZsyYsY86BAAA3qoESgAAAC108sknZ9q0aenatWvWr1+fCRMmpK6uLhUVFRk5cmSuuOKK9OvXLzNmzMigQYNSX1+/V/udddZZeeGFFxq9vnz58kavVVZWZsaMGeUw6eabb87dd9+dhoaGjBgxIl/5yldSVVWVadOmZdiwYXnqqaf2qlcAAODAIlACAABooSlTpqRr167ZsmVLzjrrrMyZM6d8ra6uLs8880wmTpyYfv36ZezYsRk/fvxe7fff//3f+Z//+Z8WvfZLX/pS+vXrVx5PmjSpfG3OnDl59NFHM3PmzHTr1i3XX399RowYsVe9AgAABxbPUAIAAGiBwYMH54wzzkiS3HbbbTuFSTtMnjw5CxYsSJKMGTMmHTrsm7/p69ChQ77whS8kSRYsWJDJkyfvMufxxx/PbbfdliQ588wzM2jQoDe1RwAA4K1NoAQAANAC5557bnk8derU3c4plUq58847kySHHnroPrvrZ8SIEenRo0eS5I477kipVNrtvNtvv708Pu+8896EzgAAgP2FQAkAAKAFTj/99CRJfX19nnjiiUbnzZw5szweNmxYm/e1Ozt6TXbu543mz5+fDRs2JNl3vQIAAG9NAiUAAIAWGDBgQJJkyZIl2bZtW6PzFi1atMtrWmrq1KlZsWJFNm3alL/85S95/PHH83//7//NO9/5zsLXDRw4cLf9vNG2bduyZMmSVukVAAA4sOybA7wBAAD2Y507d07Pnj2TJMuXLy+cu3bt2tTX16eysjK9e/feq31ff2TeEUcckSOOOCJDhgzJ2LFjc9VVV+Xmm2/e7etqamqSbL+bat26dYV7LFu2LCeddFKOPPLIdOrUKZs3b25Sb9XV1YXXe/Xq1aR1AACAtyaBEgAAQDN17969PK6vr9/j/A0bNqSysjKVlZUt2m/p0qW555578vjjj2fZsmVJkmOOOSYXXHBBPv7xj6eioiLf//73UyqVcssttzTab1N73aGysjIvv/xyk3rcU7AGAADs3wRKAAAAzdSlS5fyuCl38GzatClJUlFR0ey97r333txxxx27/Hz+/Pn5yU9+ktra2txzzz3p1KlT/uM//iPTp0/PypUrd9tvc3ptab8AAMCByTOUAAAAmmnjxo3lcadOnfY4v3PnzkmShoaGZu/1yiuvFF6fMWNGvv71rydJunXrllGjRu0yZ0e/zek1aV6/NTU1hTV48OAmrwUAALz1CJQAAACaaf369eVxU46x69atW5KmHTnX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n3xypk2blq5du2b9+vWZMGFC6urqUlFRkZEjR+aKK65Iv379MmPGjAwaNCj19fXNWv9tb3tbOUyaNWtWHnjggcyfPz+rV69Oz549c/755+fyyy9PVVVVfvSjH+WVV17Jr371q8I1582bl8suu6zF7xkAADg4CZQAAABaaMqUKenatWu2bNmSs846K3PmzClfq6uryzPPPJOJEyemX79+GTt2bMaPH9+s9V977bVMmzYt48ePz8KFC3e5/utf/zq//OUvc++996ZDhw75zne+k3e/+92Fa27YsCF/+tOfmtUHAACAZygBAAC0wODBg3PGGWckSW677badwqQdJk+enAULFiRJxowZkw4dmvc3fY8//nhGjhy52zBph+nTp+eee+5JkvTt2zennHJKs/YAAABoCoESAABAC5x77rnl8dSpU3c7p1Qq5c4770ySHHrooRkxYkSb9FJXV1ce9+nTp032AAAADm4CJQAAgBY4/fTTkyT19fV54oknGp03c+bM8njYsGFt0kvnzp3L423btrXJHgAAwMHNM5QAAABaYMCAAUmSJUuWFIY4ixYt2uU1rW348OHlcdHxeEnSv3//zJkzJ/369UuXLl2yatWqPPHEE/n5z3+eH//4x9m6dWuLeqiuri683qtXrxatCwAAvDUIlAAAAJqpc+fO6dmzZ5Jk+fLlhXPXrl2b+vr6VFZWpnfv3q3ey4knnpja2tokydNPP71TgLU773jHO/KOd7yj/O+amprU1NTknHPOydVXX52Pf/zje1xjd/b03wEAANi/CZQAAACaqXv37uVxfX39Hudv2LAhlZWVqaysbNU+OnXqlFtvvTUdOmz/avfVr3610bmvvfZaHnnkkTz44IN56qmnsnr16nTv3j1//dd/nSuvvDIDBw7Mcccdl7q6urznPe/JsmXLWrVXAABg/yZQAgAAaKYuXbqUx5s3b97j/E2bNiVJKioqWrWPG264IYMHD06S3H777XnggQcanXv++edn3bp1u/x81qxZuemmm3LLLbfk0ksvzTve8Y5cf/31ueCCC5rVS01NTeH1Xr16Zd68ec1aEwAAeOsQKAEAADTTxo0by+NOnTrtcX7nzp2TJA0NDa3WwzXXXJPLL788STJ37tx87nOfK5y/uzBph61bt2b06NEZMmRI+vfvn/PPPz/vfOc788ILLzS5nxUrVjR5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dVU6duyYJPn85z+fjRs37nS9oaEhn//855MkHTt2zBe/+MXdrjNu3LgkyerVq/OlL31pl+tLly7NhAkTkiTvfve7c9555zW7VwAA4MAlUAIAAGiBc889tzyeOnXqbueUSqXceeedSZJDDz00I0aMaPY+55xzTpJk4cKF+f3vf7/bOb///e+zaNGinea/3rvf/e4MHDgwSfKTn/wkDQ0Nu13n9ttvL48FSgAAwOsJlAAAAFrg9NNPT5LU19fniSeeaHTezJkzy+Nhw4Y1a493vetdqa6u3mWdon1qamryV3/1V7vtdU/rrFy5MosXL25RrwAAwIFNoAQAANACAwYMSJIsWbIk27Zta3TejjuHXv+aptpxV9Eb12nuPi1Zp3fv3unatWuTewUAAA5szT/AGwAA4CDXuXPn9OzZM0myfPnywrlr165NfX19Kisr07t372btU1NTUx7vaZ9ly5aVx2/cpyXrHHLIIampqcl///d/N6nXHXdSNaZXr15NWgcAAHhrEigBAAA0U/fu3cvj+vr6Pc7fsGFDKisrU1lZ2Wb7bNiwoTx+4z6ttU6RPQVVAADA/s2RdwAAAM3UpUuX8njz5s17nL9p06YkSUVFRZvts2OP3e3TWusAAAAHL3coAQAANNPGjRvL406dOu1xfufOnZMkDQ0NbbbPjj12t88b13l9aNScdYq8/li93enVq1fmzZvX5PUAAIC3FoESAABAM61fv748bsqxcN26dUvStOPxWrrPjj12t88b1ykKlIrWKbJixYomzwUAAPY/jrwDAABopk2bNmXVqlVJ9nxnTo8ePcph0LJly5q1z+ufS7SnfXr37l0ev3Gflqzz2muveS4SAABQJlACAABogQULFiRJ+vbtm/bt2zc6r3///uXxwoULW7THG9dp7j4tWWfZsmV59dVXm9wrAABwYBMoAQAAtMCsWbOSbD9C7tRTT2103vDhw8vj2bNnN2uPZ599tnyU3OvX2Z0zzjgjyfa7kZ577rnd9rqndd7+9renX79+LeoVAAA4sAmUAAAAWuC+++4rjy+77LLdzmnXrl0uvvjiJMmaNWtSV1fX7H3uv//+JMmAAQPy3ve+d7dz3vve92bAgAE7zX+9Z555pnyX0ic/+clUVFTsdp1LL720PL733nub3SsAAHDgEigBAAC0wLx58/LYY48lSUaNGpUhQ4bs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km9961v54x//2LxGm6impqbweq9evTJv3rw22RsAAAAAAGBfarNAaf369eVxU46x69atW5KmHY/3el/96lfTv3//PP/887nuuuua12QzrFixos3WBgAAAAAAeCtrs0Bp06ZNWbVqVY444og93t3To0ePcui0bNmyZu1z9dVXJ0keeeSRfOxjH9vtnB1hVbdu3XLhhRcmSV566aXU1dU1ay8AAAAAAICDUZsFSkmyYMGCnHHGGenbt2/at2+fbdu27XZe//79y+OFCxc2a48dR+V95jOfyWc+85nCuT179szdd9+dJHn00UcFSgAAAAAAAE1wSFsuPmvWrCTbj7w79dRTG503fPjw8nj27Nlt2RIAAAAAAADN1KaB0n333VceX3bZZbud065du1x88cVJkjVr1jT7rqF27drtsZ577rkkyXPPPVf+2YgRI1r0ngAAAAAAAA42bRoozZs3L4899liSZNSoURkyZMguc8aOHZuBAwcmSaZMmZKtW7fudH348OEplUoplUqZOnVqW7YLAAAAAADAbrTpM5SSZMyYMZk9e3a6du2ahx9+ON/4xjdSV1eXioqKjBw5MldeeWWSZPHixZk8eXJbtwMAAAAAAEAztekdSkny5JNP5sILL8y6devSvXv3TJgwIXPmzEldXd1OYVJtbW3q6+vbuh0AAIBWVVFRkS996UuZO3duVq9enfr6+ixcuDCTJk3KUUcdtdfrt2vXLu973/vyr//6r6mrq8uLL76YTZs2Zd26dfnjH/+YG2+8MSeccMIe17nuuuvKpz/sqV7/nFsAAIDkTbhDKUkeeOCBnHjiiRkzZkxqa2tTU1OTzZs3Z8mSJfnpT3+aG264IQ0NDW9GKwAAAK2mT58+efDBB3Psscfu9PP+/funf//+GT16dC666KLMmDGjxXs899xzuw2mOnXqlOOPPz7HH398rrzyykyaNCnXXHNNi/cBAAAo8qYESkny/PPPZ+zYsRk7dmyzXjdz5sy0a9dur/Z+17vetVevBwAAeKPKysrMmDGjHCbdfPPNufvuu9PQ0JARI0bkK1/5SqqqqjJt2rQMGzYsTz31VIv2eec735kkeeaZZ/Lzn/88s2fPzgsvvJCKioqMGDEiX/ziF3PYYYfl6quvzrZt2/LVr351j2sef/zxhdefffbZFvUKAAAc2Epq76u6urq0Q3V19T7vRymllFJKqbYsn39TGj9+fPm/wbhx43a5PnTo0NLmzZtLpVKpVFdX1+J9Zs+eXTrrrLMavX7MMceUVq5cWSqVSqXNmzeX3vWud+123nXXXVfu1++MUkoppZRSbV8H2mfgNn+GEgAAwIGmQ4cO+cIXvpAkWbBgQSZPnrzLnMcffzy33XZbkuTMM8/MoEGDWrTXsGHD8vDDDzd6/c9//nO+/vWvJ0k6duyYc889t0X7AAAAFBEoAQAANNOIESPSo0ePJMkdd9yR7Tf97Or2228vj88777w266eurq487tOnT5vtAwAAHLwESgAAAM10+umnl8czZ85sdN78+fOzYcOGJNvvNGornTt3Lo+3bdvWZvsAAAAHL4ESAABAMw0cOLA8XrRoUaPztm3bliVLliRJBgwY0Gb9DB8+vDxeuHDhHuc/9NBDWblyZTZt2pSVK1emrq4uV199dfmuKwAAgDfqsK8bAAAA2N/U1NQkSerr67Nu3brCucuWLctJJ52UI488Mp06dcrmzZtbtZeKiopcddVVSZKNGzfm/vvv3+NrzjrrrPL4yCOPzJFHHpkzzzwzV199dS699NJMnz692X1UV1cXXu/Vq1ez1wQAAN46BEoAAADN1L179yTbA6U92XHkXZJUVlbm5ZdfbtVevvnNb+boo49Oktx444158cUXG5379NNP57777svcuXPzwgsvpGPHjunXr18uuuiifPjDH86hhx6an//85/nYxz6WX/3qV83qY/ny5Xv1PgAAgLc2gRIAAEAzdenSJUmadLfRpk2byuOKiopW7eNv/uZv8vnPfz5JsmDBgnzta19rdO7111+f8ePH7/LzuXPn5oc//GGuuOKKfP/730+HDh1y6623pk+fPjv1DgAAHNw8QwkAADhglUqlva5LLrlkl3U3btyYJOnUqdMee+jcuXN53NDQ0Grvbfjw4bntttuSJKtXr84FF1xQ7mt39nQ0380335xbb701yfbj6y644IJm9VNTU1NYgwcPbtZ6AADAW4s7lAAAAJpp/fr1SbYfYbcn3bp1K4+bckReU5x66qmZPn16unTpkvXr1+ejH/1oFi1atNfrfv/738/o0aOTbA+s/vM//7PJr12xYsVe7w8AALx1CZQAAIADVv/+/fd6jd09k2jH84IqKytTVVVVePdP7969kyQvvfRSk47I25OBAwfmV7/6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0Zo4caIyMjJ04sQJFRYWKjMzU9OmTVOrVq1q3X9OTo71urka8fHxlfqZPHmyy89PTk6u9bw9xdvrGx8f7/K6uLrfJX//X0hIiO644w5NmTJF6enpOnLkiM6fP69Tp07pq6++0syZM3XzzTdX208g5W8wnY8KCwvTo48+qs8++0w//PCDzp07p3379umtt95Shw4dPDZXTwuGczjp6eku52Sg8eb6pqamurwuqamp1fbn7X2UN3hrfd15v6ru816w5W+wHhMFQv4aoiz69+9vCgoKTFWysrJMQkJCrcYICQkxb7/9dpVjGGPMnDlzTEhIiN/Xg/Bfvtx8883m9OnTtnlijDEFBQVmyJAhfl8Lwv85YxevvvpqhXFycnL8vhZEYOVMbGysWb58ebX7nE6dOvl9TQj/58yDDz5ozp49a5sreXl55u677/b7ehBVh5158+Z5dKyoqCizatWqKscrLS01v/vd7/y+JoTrsWHDhipfT298zpg8ebIpLS2tcsyPPvrI1KtXz7aPYMvDhIQEs3fv3irnW1BQYPr161erMXJycqrs35n8/Hyn6zx58mSX+0hOTvb72vpqfePj411el+r2u+Rv5fj++++rXdfS0lIzdepU234CJX+D6XxUkyZNzNatW6vso6ioyIwZM8bveejLNfbkOZz09PRq+3Hw95r6ModTU1NdXpfU1FTbvnyxjwqm9XXn/cohLS2tTuSvnUA9JgqQ/PX/ixcIccstt1gnR06fPm2eeeYZk5SUZFJSUszs2bOtFyUrK8vExMTUeJyXXnrJ6mvHjh1m6NChpmvXrmbo0KFmx44d1rYpU6b4fU0I/+VLjx49rD7++c9/mkmTJplevXqZW265xfTu3dvMmjXLOqguKSkxffv29fuaEP7NGbtxS0pKzLlz58ypU6eMMRSUgiV8lTMNGzY027Zts/r74IMPzPDhw81tt91munTpYu69917z2muvmf3791NQCvDwRc789Kc/td5/SktLzTvvvGMGDhxounbtagYPHmxWrFhhjXP27Fnz4x//2O/rQjiP8nJzc01aWpr1/z198LR48WKr7/Xr11s58/DDD5vs7Gxr29ixY/2+LoRrUf5kQV5enklLS7NOpHn6c8a4ceOssbKzs83DDz9sunbtagYOHGjWr19vbfvb3/5m208w5WFMTIzJysqy5jR79myTkpJi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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# matplotlib in interactive mode so the scatter can be updated.\n", "\n", "plt.style.use('dark_background')\n", "\n", "fig, ax = plt.subplots(1, 2, figsize=(10, 5), dpi=200)\n", "x, y = [],[]\n", "scatter = ax[1].scatter(x,y)\n", "# scatter = ax.plot([],[],label='toto',ms=10,color='k',marker='o',ls='')\n", "plt.xlim(-1,1)\n", "plt.ylim(-1,1)\n" ] }, { "cell_type": "code", "execution_count": 62, "id": "e8952235-7e56-4606-858a-a9165b967726", "metadata": {}, "outputs": [], "source": [ "# init tracker\n", "tracker = JDETracker(opt, frame_rate=frame_rate)\n", "timer = Timer()\n", "results = []\n", "frame_id = -1\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f9cc6fd1-b9c2-4303-a21c-a193c6045526", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3ec1f9b647cf40edbf662db14ac36bcb", "version_major": 2, "version_minor": 0 }, "text/plain": [ "0it [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "with tqdm() as pbar:\n", " while True:\n", " timer.tic()\n", " frame_id += 1\n", "\n", " pbar.update(1)\n", "\n", " ret, frame = stream.read()\n", " # scale down/up frame to fit tracker\n", " frame = cv2.resize(frame, (w, h))\n", "\n", "\n", " # letterbox as to have a constant size for the model\n", " img, _, _, _ = datasets.letterbox(frame, height=opt.img_size[1], width=opt.img_size[0])\n", "\n", " # Normalize RGB\n", " img = img[:, :, ::-1].transpose(2, 0, 1)\n", " img = np.ascontiguousarray(img, dtype=np.float32)\n", " img /= 255.0\n", "\n", " # send frame to GPU\n", " blob = torch.from_numpy(img).cuda().unsqueeze(0)\n", "\n", " # online targets: all targets that are not timed out\n", " # frame_embeddings: the embeddings of objects visible only in the current frame\n", " online_targets, frame_embeddings = tracker.update(blob, frame)\n", "\n", " # all relevant tracks from the tracker directly (excludes the 'removed' ones)\n", " # thus also accessing its those that it has stored from previous frames\n", " all_stracks = tracker.tracked_stracks + tracker.lost_stracks\n", "\n", " # project them to 2D using PCA (see visualise_embeddings.ipynb)\n", " if len(all_stracks):\n", " projections = reducer.transform([strack.smooth_feat for strack in all_stracks])\n", " else:\n", " projections = []\n", "\n", " timer.toc()\n", "\n", "\n", " online_tlwhs = []\n", " online_ids = []\n", " for t in online_targets:\n", " tlwh = t.tlwh\n", " tid = t.track_id\n", " vertical = tlwh[2] / tlwh[3] > 1.6\n", " if tlwh[2] * tlwh[3] > opt.min_box_area and not vertical:\n", " online_tlwhs.append(tlwh)\n", " online_ids.append(tid)\n", " # visualise results for single frame\n", " online_im = vis.plot_tracking(frame, online_tlwhs, online_ids, frame_id=frame_id,\n", " fps=1. / timer.average_time)\n", " \n", " # redraw the canvas\n", " # fig.canvas.draw()\n", " # ax[0].clear()\n", " # ax[1].clear()\n", " \n", " ax[0].imshow(online_im)\n", " # cv2.imwrite(result_frame_path + f\"/{frame_id:04d}-live.jpg\", online_im)\n", "\n", "\n", " # scatter.set_data(projections[:,0],projections[:,1])\n", " if len(projections):\n", " scatter.set_offsets(projections)\n", " scatter.set_color([(0,0,1,0.5) if strack.state == TrackState.Lost else (0,0,1,1) for strack in all_stracks])\n", " else:\n", " scatter = ax[1].scatter([],[])\n", " pbar.set_description('todo: empty axes')\n", " # print()\n", "\n", " # plot = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')\n", " # plot = plot.reshape(fig.canvas.get_width_height()[::-1] + (3,))\n", "\n", " # # img is rgb, convert to opencv's default bgr\n", " # plot = cv2.cvtColor(plot,cv2.COLOR_RGB2BGR)\n", "\n", "\n", "\n", "\n", " fig.savefig(result_frame_path + f\"/{frame_id:04d}.png\")\n", "\n", " # fig.canvas.draw_idle()\n", " # plt.pause(0.1)\n", " # if cv2.waitKey(1) & 0xFF == ord('q'): # wait for 1 millisecond\n", " # break" ] }, { "cell_type": "code", "execution_count": null, "id": "8f21e642-2320-4a7e-a0ea-af32e8d1a182", "metadata": {}, "outputs": [], "source": [ "! ffmpeg -i OUT/embedding_test/track-test/%04d.png -c:v libx264 -crf 10 OUT/embedding_test/track-test.mp4" ] }, { "cell_type": "code", "execution_count": null, "id": "94d6e0cb-4d32-4d18-8b18-4ecfcc67a634", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "30953716-c267-401f-ad30-51b2a139bfc2", "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" } }, "nbformat": 4, "nbformat_minor": 5 }