{ "cells": [ { "cell_type": "markdown", "id": "8666f97c-92c8-42ea-b025-2030dd3f3a9b", "metadata": {}, "source": [ "# Cell Tracking by Global optimization\n", "\n", "Autor: Filip Lux\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "159f69e5-6a90-40da-b905-dfd27ac5e694", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [] }, { "cell_type": "markdown", "id": "3a8304a7-71fe-47ec-b8cf-99162d0ae1f8", "metadata": {}, "source": [ "### 1. Import packages" ] }, { "cell_type": "code", "execution_count": 7, "id": "c9c3ebe6-7e58-45b4-b847-20a5fffcd463", "metadata": { "tags": [] }, "outputs": [], "source": [ "from pathlib import Path\n", "import os\n", "\n", "from tracking.global_tracker import GlobalTracker\n", "from tracking.embedtrack import run_embedtrack" ] }, { "cell_type": "markdown", "id": "21576aad-539a-4bfe-b41a-d9045d767208", "metadata": {}, "source": [ "### 2. Set configuration" ] }, { "cell_type": "code", "execution_count": 8, "id": "f2abf94a-3b99-4a06-9109-90a60ed29e22", "metadata": { "tags": [] }, "outputs": [], "source": [ "# according the data you have in DATA folder, set the hyperparameters\n", "dataset_name = 'BF-C2DL-HSC'\n", "subsets = ['train']\n", "seqs = ['01', '02']\n", "max_dist = 42\n", "vertex_thr = 0.95\n", "lm_dist = 80\n", "\n", "experiment = f'MU-CZ_CTC23'" ] }, { "cell_type": "markdown", "id": "1cb3c9eb-213e-419e-a0f5-b8771d2d692b", "metadata": { "tags": [] }, "source": [ "### 3. Run detection and tracking" ] }, { "cell_type": "code", "execution_count": 9, "id": "90e2394e-5a77-4a97-9df1-c2049403cb5d", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "creating graph\n", "GET GRAPH: adding vertices\n", "GET GRAPH: adding edges\n", "creating tracking file\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|███████████████████████████████████| 201/201 [00:00<00:00, 77358.70it/s]\n", "divisions: 100%|███████████████████████| 179/179 [00:00<00:00, 567483.31it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Added 99 division candidates.\n", "<itertools.chain object at 0x7f55c7edd040>\n", "CORRECT, 278 99\n", "computing solution\n", "[mem] ctor: size=49392123904B (46GiB) -> memory_=0x7f42e7f72010\n", "Set parameter Username\n", "Academic license - for non-commercial use only - expires 2024-06-21\n", "[mem] finalize: size=69104 (0.0659027 MiB)\n", "it=100 lb=-72.241677663677137 ub=-72.241677663676271 gap=1.1999473680315842e-12% t=0.0055045570000000002\n", "it=200 lb=-72.241677663677109 ub=-72.241677663676271 gap=1.1606048153783854e-12% t=0.010968277\n", "final solution: -72.2416776636763\n", "source file RESULTS/MU-CZ_CTC23/train/BF-C2DL-HSC/56_RES/tracking.txt\n", "source solution RESULTS/MU-CZ_CTC23/train/BF-C2DL-HSC/56_RES/tracking.sol\n", "saving RESULTS/MU-CZ_CTC23/train/BF-C2DL-HSC/56_RES/res_track.txt\n", "storing res images\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|███████████████████████████████████████| 20/20 [00:00<00:00, 166.44it/s]\n", "rm: cannot remove '/home/xlux/PROJECTS/TRACKING/twin/global-linking/DATA/train/BF-C2DL-HSC/56_RES': No such file or directory\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "/home/xlux/PROJECTS/TRACKING/twin/global-linking/RESULTS/MU-CZ_CTC23/train/BF-C2DL-HSC/56_RES\n", "ERROR: procedure $rm /home/xlux/PROJECTS/TRACKING/twin/global-linking/DATA/train/BF-C2DL-HSC/56_RES failed with an output 1\n", "running ./ctc_metrics/TRAMeasure DATA/train/BF-C2DL-HSC 56 4\n", "TRA measure: 0.956236\n", "running ./ctc_metrics/DETMeasure DATA/train/BF-C2DL-HSC 56 4\n", "DET measure: 0.950000\n", "running ./ctc_metrics/SEGMeasure DATA/train/BF-C2DL-HSC 56 4\n", "The directory 'DATA/train/BF-C2DL-HSC/56_GT/SEG/' does not exist!\n", "ERROR: procedure $./ctc_metrics/SEGMeasure DATA/train/BF-C2DL-HSC 56 4 failed with an output 255\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████████| 980/980 [00:00<00:00, 1335852.43it/s]\n", "100%|█████████████████████████████████| 123/123 [00:00<00:00, 1059341.67it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "running embedtrack with the following arguments: {'batch_size': '1', 'sequence': '01', 'data_path': 'DATA/train/BF-C2DL-HSC', 'model_path': 'EmbedTrack/models/BF-C2DL-HSC/MU-CZ_CTC23'}\n", "running inference(DATA/train/BF-C2DL-HSC/01, EmbedTrack/models/BF-C2DL-HSC/MU-CZ_CTC23/best_iou_model.pth, EmbedTrack/models/BF-C2DL-HSC/MU-CZ_CTC23/config.json, batch_size=1)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Traceback (most recent call last):\n", " File \"EmbedTrack/embedtrack.py\", line 69, in <module>\n", " main(args['data_path'], args['sequence'], args['model_path'], args['batch_size'])\n", " File \"EmbedTrack/embedtrack.py\", line 62, in main\n", " inference(img_path, model_path, config_file, batch_size=batch_size, overlap=0.25)\n", " File \"/home/xlux/PROJECTS/TRACKING/twin/global-linking/EmbedTrack/embedtrack/infer/infer_ctc_data.py\", line 72, in inference\n", " os.path.join(raw_data_path, os.listdir(raw_data_path)[0])\n", "FileNotFoundError: [Errno 2] No such file or directory: 'DATA/train/BF-C2DL-HSC/01'\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "ERROR: procedure $python3 EmbedTrack/embedtrack.py --sequence 01 --data_path DATA/train/BF-C2DL-HSC --model_path EmbedTrack/models/BF-C2DL-HSC/MU-CZ_CTC23 --batch_size 1 failed with an output 1\n", "creating graph\n" ] }, { "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'DATA/train/BF-C2DL-HSC/01_DATA'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[9], line 34\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m res_path\u001b[38;5;241m.\u001b[39mexists():\n\u001b[1;32m 32\u001b[0m os\u001b[38;5;241m.\u001b[39mmakedirs(res_path)\n\u001b[0;32m---> 34\u001b[0m tr \u001b[38;5;241m=\u001b[39m \u001b[43mGlobalTracker\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 35\u001b[0m \u001b[43m \u001b[49m\u001b[43mres_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_dist\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmax_dist\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 37\u001b[0m \u001b[43m \u001b[49m\u001b[43mvertex_thr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvertex_thr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;66;03m# create tracking.sol and tracking.txt\u001b[39;00m\n\u001b[1;32m 41\u001b[0m tr\u001b[38;5;241m.\u001b[39mrun_tracking(limit_dist\u001b[38;5;241m=\u001b[39mlm_dist)\n", "File \u001b[0;32m~/PROJECTS/TRACKING/twin/global-linking/tracking/global_tracker.py:101\u001b[0m, in \u001b[0;36mGlobalTracker.__init__\u001b[0;34m(self, data_path, res_path, mean_dist, max_dist, vertex_thr, app_cost, edge_min_cost, normalize, n_edges, min_frame, max_frame)\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmin_frame \u001b[38;5;241m=\u001b[39m min_frame\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmax_frame \u001b[38;5;241m=\u001b[39m max_frame\n\u001b[0;32m--> 101\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgraph \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_graph\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/PROJECTS/TRACKING/twin/global-linking/tracking/global_tracker.py:110\u001b[0m, in \u001b[0;36mGlobalTracker.create_graph\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcreate_graph\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 107\u001b[0m \u001b[38;5;66;03m# create graph\u001b[39;00m\n\u001b[1;32m 108\u001b[0m \u001b[38;5;66;03m# TODO: limit to min_frame/max_frame\u001b[39;00m\n\u001b[1;32m 109\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcreating graph\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 110\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mget_graph_bk\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 111\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 112\u001b[0m \u001b[43m \u001b[49m\u001b[43mmin_frame\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmin_frame\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 113\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_frame\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_frame\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 114\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_edges\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mn_edges\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/PROJECTS/TRACKING/twin/global-linking/tracking/global_tracker.py:281\u001b[0m, in \u001b[0;36mget_graph_bk\u001b[0;34m(data_path, n_edges, min_frame, max_frame)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 259\u001b[0m \u001b[38;5;124;03mcreates instance of candidate graph\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;124;03m\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 277\u001b[0m \u001b[38;5;124;03m\u001b[39;00m\n\u001b[1;32m 278\u001b[0m \u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 280\u001b[0m \u001b[38;5;66;03m# create an empty graph structure\u001b[39;00m\n\u001b[0;32m--> 281\u001b[0m graph \u001b[38;5;241m=\u001b[39m \u001b[43mFlowGraph\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 283\u001b[0m \u001b[38;5;66;03m# compute distances\u001b[39;00m\n\u001b[1;32m 284\u001b[0m pd_edge_path \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(data_path, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124medge_prob_distance.csv\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "File \u001b[0;32m~/PROJECTS/TRACKING/twin/global-linking/tracking/graph.py:33\u001b[0m, in \u001b[0;36mFlowGraph.__init__\u001b[0;34m(self, res_path)\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m res_path\u001b[38;5;241m.\u001b[39mexists(), res_path\n\u001b[1;32m 32\u001b[0m \u001b[38;5;66;03m# get datset of frames \u001b[39;00m\n\u001b[0;32m---> 33\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset \u001b[38;5;241m=\u001b[39m \u001b[43mDataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mres_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname_pattern\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmask\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;124;03m#########\u001b[39;00m\n\u001b[1;32m 38\u001b[0m \u001b[38;5;124;03mOUTPUTS\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[38;5;124;03musing this index you can get vertices that it represents\u001b[39;00m\n\u001b[1;32m 44\u001b[0m \u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39medges \u001b[38;5;241m=\u001b[39m {} \u001b[38;5;66;03m# edges[e_idx] = (v_idx, v_idx)\u001b[39;00m\n", "File \u001b[0;32m~/PROJECTS/TRACKING/twin/global-linking/tracking/my_utils/image.py:91\u001b[0m, in \u001b[0;36mDataset.__init__\u001b[0;34m(self, data_path, name_pattern, max_size)\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39misdir(data_path), data_path\n\u001b[1;32m 90\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_path \u001b[38;5;241m=\u001b[39m data_path\n\u001b[0;32m---> 91\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_files \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msorted\u001b[39m([os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_path, name) \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlistdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_path\u001b[49m\u001b[43m)\u001b[49m \\\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.tif\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m name \u001b[38;5;129;01mand\u001b[39;00m name_pattern \u001b[38;5;129;01min\u001b[39;00m name])\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_max_size \u001b[38;5;241m=\u001b[39m max_size\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_len \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_files)\n", "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'DATA/train/BF-C2DL-HSC/01_DATA'" ] } ], "source": [ "for subset in subsets:\n", " for seq in seqs:\n", "\n", " # learn data path\n", " data_path = Path('DATA',\n", " subset,\n", " dataset_name,\n", " f'{seq}_DATA')\n", "\n", " assert data_path.exists(), data_path\n", "\n", " # run EmbedTrack procedure\n", " if not os.path.isdir(data_path):\n", " model_path = Path('EmbedTrack',\n", " 'models',\n", " dataset_name,\n", " experiment)\n", "\n", " assert os.path.isdir(model_path)\n", " run_embedtrack(os.path.dirname(data_path), seq, model_path)\n", "\n", "\n", " # create result directory\n", " res_path = Path('RESULTS',\n", " experiment,\n", " subset,\n", " dataset_name,\n", " f'{seq}_RES')\n", "\n", "\n", " if not res_path.exists():\n", " os.makedirs(res_path)\n", "\n", " tr = GlobalTracker(data_path,\n", " res_path,\n", " max_dist=max_dist,\n", " vertex_thr=vertex_thr)\n", "\n", "\n", " # create tracking.sol and tracking.txt\n", " tr.run_tracking(limit_dist=lm_dist)\n", "\n", " # evaluate\n", " tr.save_results_ctc()\n", " tr.evaluate_ctc()\n", " tr.solution_stats()" ] }, { "cell_type": "markdown", "id": "88691d44-c2cb-4780-9789-1d47f5dda8ba", "metadata": {}, "source": [ "### 4. See results\n", "\n", "Results are stored in a `RESULTS` folder." ] }, { "cell_type": "code", "execution_count": null, "id": "0e69c4f8-8940-43a9-a6bb-419a1d2f7bca", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }