trap/test_custom_rnn.ipynb
2024-11-17 19:39:32 +01:00

3624 lines
294 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Goal of this notebook: implement some basic RNN/LSTM/GRU to _forecast_ trajectories based on VIRAT and/or the custom _hof_ dataset."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ruben/suspicion/trap/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n"
]
}
],
"source": [
"import numpy as np\n",
"import torch\n",
"import matplotlib.pyplot as plt # Visualization \n",
"import torch.nn as nn\n",
"import pandas_helper_calc # noqa # provides df.calc.derivative()\n",
"import pandas as pd\n",
"import cv2\n",
"import pathlib\n",
"from tqdm.autonotebook import tqdm"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"FPS = 12\n",
"# SRC_CSV = \"EXPERIMENTS/hofext-maskrcnn/all.txt\"\n",
"# SRC_CSV = \"EXPERIMENTS/raw/generated/train/tracks.txt\"\n",
"SRC_CSV = \"EXPERIMENTS/raw/hof-meter-maskrcnn2/train/tracks.txt\"\n",
"SRC_CSV = \"EXPERIMENTS/20240426-hof-yolo/train/tracked.txt\"\n",
"SRC_CSV = \"EXPERIMENTS/raw/hof2/train/tracked.txt\"\n",
"# SRC_H = \"../DATASETS/hof/webcam20231103-2-homography.txt\"\n",
"SRC_H = None\n",
"CACHE_DIR = \"EXPERIMENTS/cache/hof2/\"\n",
"SMOOTHING = True # hof-yolo is already smoothed, hof2 isn't\n",
"SMOOTHING_WINDOW=3 #2"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"in_fields = ['proj_x', 'proj_y', 'vx', 'vy', 'ax', 'ay']\n",
"# out_fields = ['v', 'heading']\n",
"# velocity cannot be negative, and heading is circular (modulo), this makes it harder to optimise than a linear space, so try to use components\n",
"# an we can use simple MSE loss (I guess?)\n",
"out_fields = ['vx', 'vy']\n",
"window = int(FPS*1.5)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cuda\n"
]
}
],
"source": [
"# Set device\n",
"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
"print(device)\n",
"\n",
"# Hyperparameters\n",
"input_size = len(in_fields)\n",
"hidden_size = 256\n",
"num_layers = 3\n",
"output_size = len(out_fields)\n",
"learning_rate = 0.005 #0.01 #0.005\n",
"batch_size = 256\n",
"num_epochs = 1000"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"cache_path = pathlib.Path(CACHE_DIR)\n",
"cache_path.mkdir(parents=True, exist_ok=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Samping 1/5, of 412098 items\n",
"Done sampling kept 83726 items\n"
]
}
],
"source": [
"from pathlib import Path\n",
"from trap.tools import load_tracks_from_csv\n",
"\n",
"data = load_tracks_from_csv(Path(SRC_CSV), FPS, 2, 5 )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>...</th>\n",
" <th>dx</th>\n",
" <th>dy</th>\n",
" <th>vx</th>\n",
" <th>vy</th>\n",
" <th>ax</th>\n",
" <th>ay</th>\n",
" <th>v</th>\n",
" <th>a</th>\n",
" <th>heading</th>\n",
" <th>d_heading</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>194</th>\n",
" <td>606.0</td>\n",
" <td>4</td>\n",
" <td>1593.885864</td>\n",
" <td>782.814819</td>\n",
" <td>145.704346</td>\n",
" <td>195.380432</td>\n",
" <td>12.897830</td>\n",
" <td>10.750061</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>0.201965</td>\n",
" <td>-0.291350</td>\n",
" <td>0.484716</td>\n",
" <td>-0.699240</td>\n",
" <td>-1.622919</td>\n",
" <td>-1.732144</td>\n",
" <td>0.850815</td>\n",
" <td>1.399195</td>\n",
" <td>304.729842</td>\n",
" <td>-101.772559</td>\n",
" </tr>\n",
" <tr>\n",
" <th>199</th>\n",
" <td>611.0</td>\n",
" <td>4</td>\n",
" <td>1563.890015</td>\n",
" <td>700.710510</td>\n",
" <td>137.461304</td>\n",
" <td>190.194855</td>\n",
" <td>13.099794</td>\n",
" <td>10.458712</td>\n",
" <td>1.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>0.201965</td>\n",
" <td>-0.291350</td>\n",
" <td>0.484716</td>\n",
" <td>-0.699240</td>\n",
" <td>-1.622919</td>\n",
" <td>-1.732144</td>\n",
" <td>0.850815</td>\n",
" <td>1.399195</td>\n",
" <td>304.729842</td>\n",
" <td>-101.772559</td>\n",
" </tr>\n",
" <tr>\n",
" <th>204</th>\n",
" <td>616.0</td>\n",
" <td>4</td>\n",
" <td>1529.469727</td>\n",
" <td>635.622498</td>\n",
" <td>129.342651</td>\n",
" <td>194.191528</td>\n",
" <td>13.020002</td>\n",
" <td>9.866642</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.079792</td>\n",
" <td>-0.592069</td>\n",
" <td>-0.191501</td>\n",
" <td>-1.420966</td>\n",
" <td>-1.622919</td>\n",
" <td>-1.732144</td>\n",
" <td>1.433812</td>\n",
" <td>1.399195</td>\n",
" <td>262.324609</td>\n",
" <td>-101.772559</td>\n",
" </tr>\n",
" <tr>\n",
" <th>209</th>\n",
" <td>621.0</td>\n",
" <td>4</td>\n",
" <td>1474.449341</td>\n",
" <td>569.387634</td>\n",
" <td>128.099854</td>\n",
" <td>199.766357</td>\n",
" <td>12.965776</td>\n",
" <td>9.301442</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.054226</td>\n",
" <td>-0.565200</td>\n",
" <td>-0.130143</td>\n",
" <td>-1.356479</td>\n",
" <td>0.147259</td>\n",
" <td>0.154769</td>\n",
" <td>1.362708</td>\n",
" <td>-0.170650</td>\n",
" <td>264.519715</td>\n",
" <td>5.268254</td>\n",
" </tr>\n",
" <tr>\n",
" <th>214</th>\n",
" <td>626.0</td>\n",
" <td>4</td>\n",
" <td>1443.123535</td>\n",
" <td>518.907043</td>\n",
" <td>120.022461</td>\n",
" <td>202.566772</td>\n",
" <td>12.642992</td>\n",
" <td>8.976624</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.322784</td>\n",
" <td>-0.324818</td>\n",
" <td>-0.774681</td>\n",
" <td>-0.779564</td>\n",
" <td>-1.546892</td>\n",
" <td>1.384597</td>\n",
" <td>1.099023</td>\n",
" <td>-0.632844</td>\n",
" <td>225.179993</td>\n",
" <td>-94.415332</td>\n",
" </tr>\n",
" <tr>\n",
" <th>219</th>\n",
" <td>631.0</td>\n",
" <td>4</td>\n",
" <td>1398.944946</td>\n",
" <td>461.813049</td>\n",
" <td>106.391357</td>\n",
" <td>193.476410</td>\n",
" <td>12.465588</td>\n",
" <td>8.557788</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.177404</td>\n",
" <td>-0.418836</td>\n",
" <td>-0.425771</td>\n",
" <td>-1.005205</td>\n",
" <td>0.837386</td>\n",
" <td>-0.541539</td>\n",
" <td>1.091659</td>\n",
" <td>-0.017675</td>\n",
" <td>247.044148</td>\n",
" <td>52.473972</td>\n",
" </tr>\n",
" <tr>\n",
" <th>224</th>\n",
" <td>636.0</td>\n",
" <td>4</td>\n",
" <td>1353.237793</td>\n",
" <td>438.118896</td>\n",
" <td>91.444336</td>\n",
" <td>170.930664</td>\n",
" <td>12.128433</td>\n",
" <td>8.052323</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.337155</td>\n",
" <td>-0.505465</td>\n",
" <td>-0.809172</td>\n",
" <td>-1.213117</td>\n",
" <td>-0.920163</td>\n",
" <td>-0.498987</td>\n",
" <td>1.458222</td>\n",
" <td>0.879752</td>\n",
" <td>236.295957</td>\n",
" <td>-25.795658</td>\n",
" </tr>\n",
" <tr>\n",
" <th>229</th>\n",
" <td>641.0</td>\n",
" <td>4</td>\n",
" <td>1272.791992</td>\n",
" <td>408.827759</td>\n",
" <td>104.274536</td>\n",
" <td>180.414551</td>\n",
" <td>11.689648</td>\n",
" <td>7.684636</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.438785</td>\n",
" <td>-0.367687</td>\n",
" <td>-1.053084</td>\n",
" <td>-0.882448</td>\n",
" <td>-0.585388</td>\n",
" <td>0.793604</td>\n",
" <td>1.373936</td>\n",
" <td>-0.202286</td>\n",
" <td>219.961870</td>\n",
" <td>-39.201809</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234</th>\n",
" <td>646.0</td>\n",
" <td>4</td>\n",
" <td>1198.965820</td>\n",
" <td>407.952759</td>\n",
" <td>103.282104</td>\n",
" <td>167.306580</td>\n",
" <td>11.207276</td>\n",
" <td>7.476216</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.482372</td>\n",
" <td>-0.208420</td>\n",
" <td>-1.157693</td>\n",
" <td>-0.500209</td>\n",
" <td>-0.251064</td>\n",
" <td>0.917374</td>\n",
" <td>1.261136</td>\n",
" <td>-0.270721</td>\n",
" <td>203.367915</td>\n",
" <td>-39.825493</td>\n",
" </tr>\n",
" <tr>\n",
" <th>239</th>\n",
" <td>651.0</td>\n",
" <td>4</td>\n",
" <td>1156.309570</td>\n",
" <td>415.743408</td>\n",
" <td>97.628784</td>\n",
" <td>158.774811</td>\n",
" <td>10.884154</td>\n",
" <td>7.514692</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.323122</td>\n",
" <td>0.038476</td>\n",
" <td>-0.775493</td>\n",
" <td>0.092343</td>\n",
" <td>0.917282</td>\n",
" <td>1.422125</td>\n",
" <td>0.780971</td>\n",
" <td>-1.152395</td>\n",
" <td>173.209381</td>\n",
" <td>-72.380481</td>\n",
" </tr>\n",
" <tr>\n",
" <th>244</th>\n",
" <td>656.0</td>\n",
" <td>4</td>\n",
" <td>1094.440430</td>\n",
" <td>443.849915</td>\n",
" <td>107.938110</td>\n",
" <td>177.703979</td>\n",
" <td>10.544492</td>\n",
" <td>7.870090</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.339661</td>\n",
" <td>0.355398</td>\n",
" <td>-0.815187</td>\n",
" <td>0.852955</td>\n",
" <td>-0.095267</td>\n",
" <td>1.825468</td>\n",
" <td>1.179857</td>\n",
" <td>0.957326</td>\n",
" <td>133.703018</td>\n",
" <td>-94.815270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>249</th>\n",
" <td>661.0</td>\n",
" <td>4</td>\n",
" <td>1072.595093</td>\n",
" <td>481.461945</td>\n",
" <td>118.452148</td>\n",
" <td>205.365173</td>\n",
" <td>10.486504</td>\n",
" <td>8.287758</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.057989</td>\n",
" <td>0.417668</td>\n",
" <td>-0.139173</td>\n",
" <td>1.002404</td>\n",
" <td>1.622435</td>\n",
" <td>0.358678</td>\n",
" <td>1.012019</td>\n",
" <td>-0.402811</td>\n",
" <td>97.904355</td>\n",
" <td>-85.916792</td>\n",
" </tr>\n",
" <tr>\n",
" <th>254</th>\n",
" <td>666.0</td>\n",
" <td>4</td>\n",
" <td>1086.627930</td>\n",
" <td>526.733154</td>\n",
" <td>105.444458</td>\n",
" <td>189.750610</td>\n",
" <td>10.498393</td>\n",
" <td>8.684043</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>0.011889</td>\n",
" <td>0.396285</td>\n",
" <td>0.028534</td>\n",
" <td>0.951083</td>\n",
" <td>0.402496</td>\n",
" <td>-0.123170</td>\n",
" <td>0.951511</td>\n",
" <td>-0.145220</td>\n",
" <td>88.281546</td>\n",
" <td>-23.094741</td>\n",
" </tr>\n",
" <tr>\n",
" <th>259</th>\n",
" <td>671.0</td>\n",
" <td>4</td>\n",
" <td>1099.592285</td>\n",
" <td>584.216675</td>\n",
" <td>114.395874</td>\n",
" <td>218.003479</td>\n",
" <td>10.492767</td>\n",
" <td>9.267106</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.005626</td>\n",
" <td>0.583063</td>\n",
" <td>-0.013502</td>\n",
" <td>1.399352</td>\n",
" <td>-0.100887</td>\n",
" <td>1.075845</td>\n",
" <td>1.399417</td>\n",
" <td>1.074975</td>\n",
" <td>90.552815</td>\n",
" <td>5.451045</td>\n",
" </tr>\n",
" <tr>\n",
" <th>264</th>\n",
" <td>676.0</td>\n",
" <td>4</td>\n",
" <td>1144.484782</td>\n",
" <td>642.779582</td>\n",
" <td>96.750326</td>\n",
" <td>180.744690</td>\n",
" <td>10.484691</td>\n",
" <td>9.582745</td>\n",
" <td>1.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>-0.008077</td>\n",
" <td>0.315639</td>\n",
" <td>-0.019384</td>\n",
" <td>0.757534</td>\n",
" <td>-0.014116</td>\n",
" <td>-1.540364</td>\n",
" <td>0.757782</td>\n",
" <td>-1.539925</td>\n",
" <td>91.465753</td>\n",
" <td>2.191052</td>\n",
" </tr>\n",
" <tr>\n",
" <th>269</th>\n",
" <td>681.0</td>\n",
" <td>4</td>\n",
" <td>1179.532959</td>\n",
" <td>682.365540</td>\n",
" <td>107.764282</td>\n",
" <td>200.651733</td>\n",
" <td>10.698373</td>\n",
" <td>9.950516</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>0.213682</td>\n",
" <td>0.367771</td>\n",
" <td>0.512837</td>\n",
" <td>0.882650</td>\n",
" <td>1.277331</td>\n",
" <td>0.300278</td>\n",
" <td>1.020820</td>\n",
" <td>0.631291</td>\n",
" <td>59.842534</td>\n",
" <td>-75.895726</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>16 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"194 606.0 4 1593.885864 782.814819 145.704346 195.380432 \n",
"199 611.0 4 1563.890015 700.710510 137.461304 190.194855 \n",
"204 616.0 4 1529.469727 635.622498 129.342651 194.191528 \n",
"209 621.0 4 1474.449341 569.387634 128.099854 199.766357 \n",
"214 626.0 4 1443.123535 518.907043 120.022461 202.566772 \n",
"219 631.0 4 1398.944946 461.813049 106.391357 193.476410 \n",
"224 636.0 4 1353.237793 438.118896 91.444336 170.930664 \n",
"229 641.0 4 1272.791992 408.827759 104.274536 180.414551 \n",
"234 646.0 4 1198.965820 407.952759 103.282104 167.306580 \n",
"239 651.0 4 1156.309570 415.743408 97.628784 158.774811 \n",
"244 656.0 4 1094.440430 443.849915 107.938110 177.703979 \n",
"249 661.0 4 1072.595093 481.461945 118.452148 205.365173 \n",
"254 666.0 4 1086.627930 526.733154 105.444458 189.750610 \n",
"259 671.0 4 1099.592285 584.216675 114.395874 218.003479 \n",
"264 676.0 4 1144.484782 642.779582 96.750326 180.744690 \n",
"269 681.0 4 1179.532959 682.365540 107.764282 200.651733 \n",
"\n",
" x y state diff ... dx dy vx \\\n",
"194 12.897830 10.750061 2.0 NaN ... 0.201965 -0.291350 0.484716 \n",
"199 13.099794 10.458712 1.0 5.0 ... 0.201965 -0.291350 0.484716 \n",
"204 13.020002 9.866642 2.0 5.0 ... -0.079792 -0.592069 -0.191501 \n",
"209 12.965776 9.301442 2.0 5.0 ... -0.054226 -0.565200 -0.130143 \n",
"214 12.642992 8.976624 2.0 5.0 ... -0.322784 -0.324818 -0.774681 \n",
"219 12.465588 8.557788 2.0 5.0 ... -0.177404 -0.418836 -0.425771 \n",
"224 12.128433 8.052323 2.0 5.0 ... -0.337155 -0.505465 -0.809172 \n",
"229 11.689648 7.684636 2.0 5.0 ... -0.438785 -0.367687 -1.053084 \n",
"234 11.207276 7.476216 2.0 5.0 ... -0.482372 -0.208420 -1.157693 \n",
"239 10.884154 7.514692 2.0 5.0 ... -0.323122 0.038476 -0.775493 \n",
"244 10.544492 7.870090 2.0 5.0 ... -0.339661 0.355398 -0.815187 \n",
"249 10.486504 8.287758 2.0 5.0 ... -0.057989 0.417668 -0.139173 \n",
"254 10.498393 8.684043 2.0 5.0 ... 0.011889 0.396285 0.028534 \n",
"259 10.492767 9.267106 2.0 5.0 ... -0.005626 0.583063 -0.013502 \n",
"264 10.484691 9.582745 1.0 5.0 ... -0.008077 0.315639 -0.019384 \n",
"269 10.698373 9.950516 2.0 5.0 ... 0.213682 0.367771 0.512837 \n",
"\n",
" vy ax ay v a heading d_heading \n",
"194 -0.699240 -1.622919 -1.732144 0.850815 1.399195 304.729842 -101.772559 \n",
"199 -0.699240 -1.622919 -1.732144 0.850815 1.399195 304.729842 -101.772559 \n",
"204 -1.420966 -1.622919 -1.732144 1.433812 1.399195 262.324609 -101.772559 \n",
"209 -1.356479 0.147259 0.154769 1.362708 -0.170650 264.519715 5.268254 \n",
"214 -0.779564 -1.546892 1.384597 1.099023 -0.632844 225.179993 -94.415332 \n",
"219 -1.005205 0.837386 -0.541539 1.091659 -0.017675 247.044148 52.473972 \n",
"224 -1.213117 -0.920163 -0.498987 1.458222 0.879752 236.295957 -25.795658 \n",
"229 -0.882448 -0.585388 0.793604 1.373936 -0.202286 219.961870 -39.201809 \n",
"234 -0.500209 -0.251064 0.917374 1.261136 -0.270721 203.367915 -39.825493 \n",
"239 0.092343 0.917282 1.422125 0.780971 -1.152395 173.209381 -72.380481 \n",
"244 0.852955 -0.095267 1.825468 1.179857 0.957326 133.703018 -94.815270 \n",
"249 1.002404 1.622435 0.358678 1.012019 -0.402811 97.904355 -85.916792 \n",
"254 0.951083 0.402496 -0.123170 0.951511 -0.145220 88.281546 -23.094741 \n",
"259 1.399352 -0.100887 1.075845 1.399417 1.074975 90.552815 5.451045 \n",
"264 0.757534 -0.014116 -1.540364 0.757782 -1.539925 91.465753 2.191052 \n",
"269 0.882650 1.277331 0.300278 1.020820 0.631291 59.842534 -75.895726 \n",
"\n",
"[16 rows x 24 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" </tr>\n",
" <tr>\n",
" <th>track_id</th>\n",
" <th>frame_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">1</th>\n",
" <th>342</th>\n",
" <td>1393.736572</td>\n",
" <td>0.000000</td>\n",
" <td>67.613647</td>\n",
" <td>121.391151</td>\n",
" <td>1363.3164</td>\n",
" <td>232.92647</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>343</th>\n",
" <td>1391.775879</td>\n",
" <td>0.852371</td>\n",
" <td>78.562622</td>\n",
" <td>141.050934</td>\n",
" <td>1359.1885</td>\n",
" <td>266.06586</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>346</th>\n",
" <td>1392.164551</td>\n",
" <td>7.758987</td>\n",
" <td>85.757324</td>\n",
" <td>154.357971</td>\n",
" <td>1355.7444</td>\n",
" <td>297.67404</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>347</th>\n",
" <td>1393.844849</td>\n",
" <td>12.691238</td>\n",
" <td>86.482910</td>\n",
" <td>156.264786</td>\n",
" <td>1355.2312</td>\n",
" <td>308.20670</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>348</th>\n",
" <td>1394.839111</td>\n",
" <td>15.621338</td>\n",
" <td>84.763428</td>\n",
" <td>154.584396</td>\n",
" <td>1354.9246</td>\n",
" <td>310.09225</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">5030</th>\n",
" <th>32691</th>\n",
" <td>1708.213379</td>\n",
" <td>749.260376</td>\n",
" <td>133.839966</td>\n",
" <td>182.405396</td>\n",
" <td>1402.5426</td>\n",
" <td>1075.20870</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32692</th>\n",
" <td>1707.651855</td>\n",
" <td>748.997437</td>\n",
" <td>134.013672</td>\n",
" <td>182.391296</td>\n",
" <td>1402.2948</td>\n",
" <td>1074.97230</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32720</th>\n",
" <td>1700.379639</td>\n",
" <td>750.314697</td>\n",
" <td>128.792603</td>\n",
" <td>181.589783</td>\n",
" <td>1395.7992</td>\n",
" <td>1074.27320</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32721</th>\n",
" <td>1701.722412</td>\n",
" <td>751.000488</td>\n",
" <td>125.286865</td>\n",
" <td>180.867615</td>\n",
" <td>1395.5424</td>\n",
" <td>1074.20560</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32722</th>\n",
" <td>1702.384766</td>\n",
" <td>750.754517</td>\n",
" <td>123.435425</td>\n",
" <td>180.945618</td>\n",
" <td>1395.4082</td>\n",
" <td>1074.06500</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>326960 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" l t w h x \\\n",
"track_id frame_id \n",
"1 342 1393.736572 0.000000 67.613647 121.391151 1363.3164 \n",
" 343 1391.775879 0.852371 78.562622 141.050934 1359.1885 \n",
" 346 1392.164551 7.758987 85.757324 154.357971 1355.7444 \n",
" 347 1393.844849 12.691238 86.482910 156.264786 1355.2312 \n",
" 348 1394.839111 15.621338 84.763428 154.584396 1354.9246 \n",
"... ... ... ... ... ... \n",
"5030 32691 1708.213379 749.260376 133.839966 182.405396 1402.5426 \n",
" 32692 1707.651855 748.997437 134.013672 182.391296 1402.2948 \n",
" 32720 1700.379639 750.314697 128.792603 181.589783 1395.7992 \n",
" 32721 1701.722412 751.000488 125.286865 180.867615 1395.5424 \n",
" 32722 1702.384766 750.754517 123.435425 180.945618 1395.4082 \n",
"\n",
" y state \n",
"track_id frame_id \n",
"1 342 232.92647 2 \n",
" 343 266.06586 2 \n",
" 346 297.67404 2 \n",
" 347 308.20670 2 \n",
" 348 310.09225 2 \n",
"... ... ... \n",
"5030 32691 1075.20870 2 \n",
" 32692 1074.97230 2 \n",
" 32720 1074.27320 2 \n",
" 32721 1074.20560 2 \n",
" 32722 1074.06500 2 \n",
"\n",
"[326960 rows x 7 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = pd.read_csv(SRC_CSV, delimiter=\"\\t\", index_col=False, header=None)\n",
"# data.columns = ['frame_id', 'track_id', 'pos_x', 'pos_y', 'width', 'height']#, '_x', '_y,']\n",
"data.columns = ['frame_id', 'track_id', 'l', 't', 'w', 'h', 'x', 'y', 'state']#, '_x', '_y,']\n",
"data['frame_id'] = pd.to_numeric(data['frame_id'], downcast='integer')\n",
"data['frame_id'] = data['frame_id'] // 10 # compatibility with Trajectron++\n",
"\n",
"data.sort_values(by=['track_id', 'frame_id'],inplace=True)\n",
"\n",
"data.set_index(['track_id', 'frame_id'])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# cm to meter\n",
"data['x'] = data['x']/100\n",
"data['y'] = data['y']/100"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"data['diff'] = data.groupby(['track_id'])['frame_id'].diff() #.fillna(0)\n",
"data['diff'] = pd.to_numeric(data['diff'], downcast='integer')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"326960it [06:37, 821.55it/s] "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"was: 326960 added: 85138 new length: 412098\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"missing=0\n",
"old_size=len(data)\n",
"# slow way to append missing steps to the dataset\n",
"for ind, row in tqdm(data.iterrows()):\n",
" if row['diff'] > 1:\n",
" for s in range(1, int(row['diff'])):\n",
" # add as many entries as missing\n",
" missing += 1\n",
" data.loc[len(data)] = [row['frame_id']-s, row['track_id'], np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1, 1]\n",
" # new_frame = [data.loc[ind-1]['frame_id']+s, row['track_id'], np.nan, np.nan, np.nan, np.nan, np.nan]\n",
" # data.loc[len(data)] = new_frame\n",
"\n",
"print('was:', old_size, 'added:', missing, 'new length:', len(data))\n",
"# now sort, so that the added data is in the right place\n",
"data.sort_values(by=['track_id', 'frame_id'], inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# interpolate missing data\n",
"df=data.copy()\n",
"df = df.groupby('track_id').apply(lambda group: group.interpolate(method='linear'))\n",
"df.reset_index(drop=True, inplace=True)\n",
"data = df\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Running smoother\n"
]
}
],
"source": [
"from trap.tracker import Smoother\n",
"\n",
"if SMOOTHING:\n",
" df=data.copy()\n",
" if 'x_raw' not in df:\n",
" df['x_raw'] = df['x']\n",
" if 'y_raw' not in df:\n",
" df['y_raw'] = df['y']\n",
"\n",
" print(\"Running smoother\")\n",
" # print(df)\n",
" # from tsmoothie.smoother import KalmanSmoother, ConvolutionSmoother\n",
" smoother = Smoother(convolution=False)\n",
" def smoothing(data):\n",
" # smoother = ConvolutionSmoother(window_len=SMOOTHING_WINDOW, window_type='ones', copy=None)\n",
" return smoother.smooth(data).tolist()\n",
" # df=df.assign(smooth_data=smoother.smooth_data[0])\n",
" # return smoother.smooth_data[0].tolist()\n",
"\n",
" # operate smoothing per axis\n",
" df['x'] = df.groupby('track_id')['x_raw'].transform(smoothing)\n",
" df['y'] = df.groupby('track_id')['y_raw'].transform(smoothing)\n",
" \n",
"\n",
" data = df\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>x_raw</th>\n",
" <th>y_raw</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.0</td>\n",
" <td>1.0</td>\n",
" <td>0.000000</td>\n",
" <td>565.566162</td>\n",
" <td>88.795326</td>\n",
" <td>173.917542</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>0.881595</td>\n",
" <td>7.341152</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10.0</td>\n",
" <td>1.0</td>\n",
" <td>0.000000</td>\n",
" <td>565.116699</td>\n",
" <td>88.801704</td>\n",
" <td>171.334290</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.870703</td>\n",
" <td>7.309168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11.0</td>\n",
" <td>1.0</td>\n",
" <td>0.000000</td>\n",
" <td>564.874573</td>\n",
" <td>90.596596</td>\n",
" <td>177.199951</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.901374</td>\n",
" <td>7.370044</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12.0</td>\n",
" <td>1.0</td>\n",
" <td>0.000000</td>\n",
" <td>564.874268</td>\n",
" <td>90.928131</td>\n",
" <td>183.125732</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.924360</td>\n",
" <td>7.432365</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13.0</td>\n",
" <td>1.0</td>\n",
" <td>0.000000</td>\n",
" <td>569.931213</td>\n",
" <td>86.213280</td>\n",
" <td>180.774292</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.906583</td>\n",
" <td>7.456334</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320183</th>\n",
" <td>60159.0</td>\n",
" <td>3632.0</td>\n",
" <td>1830.709717</td>\n",
" <td>651.257446</td>\n",
" <td>150.202515</td>\n",
" <td>157.239746</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>15.214551</td>\n",
" <td>10.027093</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320184</th>\n",
" <td>60160.0</td>\n",
" <td>3632.0</td>\n",
" <td>1834.013672</td>\n",
" <td>649.612122</td>\n",
" <td>153.686646</td>\n",
" <td>160.874023</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.244872</td>\n",
" <td>10.047117</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320185</th>\n",
" <td>60161.0</td>\n",
" <td>3632.0</td>\n",
" <td>1845.373047</td>\n",
" <td>651.249756</td>\n",
" <td>147.178589</td>\n",
" <td>153.729248</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.318496</td>\n",
" <td>10.015218</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320186</th>\n",
" <td>60162.0</td>\n",
" <td>3632.0</td>\n",
" <td>1857.388916</td>\n",
" <td>650.908203</td>\n",
" <td>136.407349</td>\n",
" <td>142.354614</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.400203</td>\n",
" <td>9.935355</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320187</th>\n",
" <td>60163.0</td>\n",
" <td>3632.0</td>\n",
" <td>1862.792725</td>\n",
" <td>658.719971</td>\n",
" <td>141.984253</td>\n",
" <td>149.052307</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.416893</td>\n",
" <td>10.051785</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>320188 rows × 12 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"0 9.0 1.0 0.000000 565.566162 88.795326 173.917542 \n",
"1 10.0 1.0 0.000000 565.116699 88.801704 171.334290 \n",
"2 11.0 1.0 0.000000 564.874573 90.596596 177.199951 \n",
"3 12.0 1.0 0.000000 564.874268 90.928131 183.125732 \n",
"4 13.0 1.0 0.000000 569.931213 86.213280 180.774292 \n",
"... ... ... ... ... ... ... \n",
"320183 60159.0 3632.0 1830.709717 651.257446 150.202515 157.239746 \n",
"320184 60160.0 3632.0 1834.013672 649.612122 153.686646 160.874023 \n",
"320185 60161.0 3632.0 1845.373047 651.249756 147.178589 153.729248 \n",
"320186 60162.0 3632.0 1857.388916 650.908203 136.407349 142.354614 \n",
"320187 60163.0 3632.0 1862.792725 658.719971 141.984253 149.052307 \n",
"\n",
" x y state diff x_raw y_raw \n",
"0 0.855100 7.136193 2.0 NaN 0.881595 7.341152 \n",
"1 0.873132 7.235233 2.0 1.0 0.870703 7.309168 \n",
"2 0.890957 7.328989 2.0 1.0 0.901374 7.370044 \n",
"3 0.907784 7.418187 2.0 1.0 0.924360 7.432365 \n",
"4 0.923439 7.505012 2.0 1.0 0.906583 7.456334 \n",
"... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 2.0 NaN 15.214551 10.027093 \n",
"320184 15.033432 9.870472 2.0 1.0 15.244872 10.047117 \n",
"320185 15.211560 9.943236 2.0 1.0 15.318496 10.015218 \n",
"320186 15.377673 10.008965 2.0 1.0 15.400203 9.935355 \n",
"320187 15.538255 10.075935 2.0 1.0 15.416893 10.051785 \n",
"\n",
"[320188 rows x 12 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# del data['diff']\n",
"# recalculate diff\n",
"data['diff'] = data.groupby(['track_id'])['frame_id'].diff()\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>x_raw</th>\n",
" <th>y_raw</th>\n",
" <th>dt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.566162</td>\n",
" <td>88.795326</td>\n",
" <td>173.917542</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>0.881595</td>\n",
" <td>7.341152</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.116699</td>\n",
" <td>88.801704</td>\n",
" <td>171.334290</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.870703</td>\n",
" <td>7.309168</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874573</td>\n",
" <td>90.596596</td>\n",
" <td>177.199951</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.901374</td>\n",
" <td>7.370044</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874268</td>\n",
" <td>90.928131</td>\n",
" <td>183.125732</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.924360</td>\n",
" <td>7.432365</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>569.931213</td>\n",
" <td>86.213280</td>\n",
" <td>180.774292</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.906583</td>\n",
" <td>7.456334</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320183</th>\n",
" <td>60159.0</td>\n",
" <td>3632</td>\n",
" <td>1830.709717</td>\n",
" <td>651.257446</td>\n",
" <td>150.202515</td>\n",
" <td>157.239746</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>15.214551</td>\n",
" <td>10.027093</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320184</th>\n",
" <td>60160.0</td>\n",
" <td>3632</td>\n",
" <td>1834.013672</td>\n",
" <td>649.612122</td>\n",
" <td>153.686646</td>\n",
" <td>160.874023</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.244872</td>\n",
" <td>10.047117</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320185</th>\n",
" <td>60161.0</td>\n",
" <td>3632</td>\n",
" <td>1845.373047</td>\n",
" <td>651.249756</td>\n",
" <td>147.178589</td>\n",
" <td>153.729248</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.318496</td>\n",
" <td>10.015218</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320186</th>\n",
" <td>60162.0</td>\n",
" <td>3632</td>\n",
" <td>1857.388916</td>\n",
" <td>650.908203</td>\n",
" <td>136.407349</td>\n",
" <td>142.354614</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.400203</td>\n",
" <td>9.935355</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320187</th>\n",
" <td>60163.0</td>\n",
" <td>3632</td>\n",
" <td>1862.792725</td>\n",
" <td>658.719971</td>\n",
" <td>141.984253</td>\n",
" <td>149.052307</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.416893</td>\n",
" <td>10.051785</td>\n",
" <td>0.083333</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>320188 rows × 13 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"0 9.0 1 0.000000 565.566162 88.795326 173.917542 \n",
"1 10.0 1 0.000000 565.116699 88.801704 171.334290 \n",
"2 11.0 1 0.000000 564.874573 90.596596 177.199951 \n",
"3 12.0 1 0.000000 564.874268 90.928131 183.125732 \n",
"4 13.0 1 0.000000 569.931213 86.213280 180.774292 \n",
"... ... ... ... ... ... ... \n",
"320183 60159.0 3632 1830.709717 651.257446 150.202515 157.239746 \n",
"320184 60160.0 3632 1834.013672 649.612122 153.686646 160.874023 \n",
"320185 60161.0 3632 1845.373047 651.249756 147.178589 153.729248 \n",
"320186 60162.0 3632 1857.388916 650.908203 136.407349 142.354614 \n",
"320187 60163.0 3632 1862.792725 658.719971 141.984253 149.052307 \n",
"\n",
" x y state diff x_raw y_raw dt \n",
"0 0.855100 7.136193 2.0 NaN 0.881595 7.341152 NaN \n",
"1 0.873132 7.235233 2.0 1.0 0.870703 7.309168 0.083333 \n",
"2 0.890957 7.328989 2.0 1.0 0.901374 7.370044 0.083333 \n",
"3 0.907784 7.418187 2.0 1.0 0.924360 7.432365 0.083333 \n",
"4 0.923439 7.505012 2.0 1.0 0.906583 7.456334 0.083333 \n",
"... ... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 2.0 NaN 15.214551 10.027093 NaN \n",
"320184 15.033432 9.870472 2.0 1.0 15.244872 10.047117 0.083333 \n",
"320185 15.211560 9.943236 2.0 1.0 15.318496 10.015218 0.083333 \n",
"320186 15.377673 10.008965 2.0 1.0 15.400203 9.935355 0.083333 \n",
"320187 15.538255 10.075935 2.0 1.0 15.416893 10.051785 0.083333 \n",
"\n",
"[320188 rows x 13 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# data['node_type'] = 'PEDESTRIAN' # compatibility with Trajectron++\n",
"# data['node_id'] = data['track_id'].astype(str)\n",
"data['track_id'] = pd.to_numeric(data['track_id'], downcast='integer')\n",
"\n",
"\n",
"data['dt'] = data['diff'] * (1/FPS)\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# position into an average coordinate system. (DO THESE NEED TO BE STORED?)\n",
"# Don't do this, messes up\n",
"# data['pos_x'] = data['pos_x'] - data['pos_x'].mean()\n",
"# data['pos_y'] = data['pos_y'] - data['pos_y'].mean()\n",
" \n",
"# data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data['diff'].hist()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The dataset is a bit crappy because it has different frame step: ranging from predominantly 1 and 2 to sometimes have 3 and 4 as well. This inevitabily leads to difference in speed caluclations"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"if SRC_H is not None:\n",
" H = np.loadtxt(SRC_H, delimiter=',')\n",
"else:\n",
" H = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No H given, probably already projected data?\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>x_raw</th>\n",
" <th>y_raw</th>\n",
" <th>dt</th>\n",
" <th>proj_x</th>\n",
" <th>proj_y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.566162</td>\n",
" <td>88.795326</td>\n",
" <td>173.917542</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>0.881595</td>\n",
" <td>7.341152</td>\n",
" <td>NaN</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.116699</td>\n",
" <td>88.801704</td>\n",
" <td>171.334290</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.870703</td>\n",
" <td>7.309168</td>\n",
" <td>0.083333</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874573</td>\n",
" <td>90.596596</td>\n",
" <td>177.199951</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.901374</td>\n",
" <td>7.370044</td>\n",
" <td>0.083333</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874268</td>\n",
" <td>90.928131</td>\n",
" <td>183.125732</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.924360</td>\n",
" <td>7.432365</td>\n",
" <td>0.083333</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>569.931213</td>\n",
" <td>86.213280</td>\n",
" <td>180.774292</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.906583</td>\n",
" <td>7.456334</td>\n",
" <td>0.083333</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320183</th>\n",
" <td>60159.0</td>\n",
" <td>3632</td>\n",
" <td>1830.709717</td>\n",
" <td>651.257446</td>\n",
" <td>150.202515</td>\n",
" <td>157.239746</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>15.214551</td>\n",
" <td>10.027093</td>\n",
" <td>NaN</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320184</th>\n",
" <td>60160.0</td>\n",
" <td>3632</td>\n",
" <td>1834.013672</td>\n",
" <td>649.612122</td>\n",
" <td>153.686646</td>\n",
" <td>160.874023</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.244872</td>\n",
" <td>10.047117</td>\n",
" <td>0.083333</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320185</th>\n",
" <td>60161.0</td>\n",
" <td>3632</td>\n",
" <td>1845.373047</td>\n",
" <td>651.249756</td>\n",
" <td>147.178589</td>\n",
" <td>153.729248</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.318496</td>\n",
" <td>10.015218</td>\n",
" <td>0.083333</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320186</th>\n",
" <td>60162.0</td>\n",
" <td>3632</td>\n",
" <td>1857.388916</td>\n",
" <td>650.908203</td>\n",
" <td>136.407349</td>\n",
" <td>142.354614</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.400203</td>\n",
" <td>9.935355</td>\n",
" <td>0.083333</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320187</th>\n",
" <td>60163.0</td>\n",
" <td>3632</td>\n",
" <td>1862.792725</td>\n",
" <td>658.719971</td>\n",
" <td>141.984253</td>\n",
" <td>149.052307</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>15.416893</td>\n",
" <td>10.051785</td>\n",
" <td>0.083333</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>320188 rows × 15 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"0 9.0 1 0.000000 565.566162 88.795326 173.917542 \n",
"1 10.0 1 0.000000 565.116699 88.801704 171.334290 \n",
"2 11.0 1 0.000000 564.874573 90.596596 177.199951 \n",
"3 12.0 1 0.000000 564.874268 90.928131 183.125732 \n",
"4 13.0 1 0.000000 569.931213 86.213280 180.774292 \n",
"... ... ... ... ... ... ... \n",
"320183 60159.0 3632 1830.709717 651.257446 150.202515 157.239746 \n",
"320184 60160.0 3632 1834.013672 649.612122 153.686646 160.874023 \n",
"320185 60161.0 3632 1845.373047 651.249756 147.178589 153.729248 \n",
"320186 60162.0 3632 1857.388916 650.908203 136.407349 142.354614 \n",
"320187 60163.0 3632 1862.792725 658.719971 141.984253 149.052307 \n",
"\n",
" x y state diff x_raw y_raw dt \\\n",
"0 0.855100 7.136193 2.0 NaN 0.881595 7.341152 NaN \n",
"1 0.873132 7.235233 2.0 1.0 0.870703 7.309168 0.083333 \n",
"2 0.890957 7.328989 2.0 1.0 0.901374 7.370044 0.083333 \n",
"3 0.907784 7.418187 2.0 1.0 0.924360 7.432365 0.083333 \n",
"4 0.923439 7.505012 2.0 1.0 0.906583 7.456334 0.083333 \n",
"... ... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 2.0 NaN 15.214551 10.027093 NaN \n",
"320184 15.033432 9.870472 2.0 1.0 15.244872 10.047117 0.083333 \n",
"320185 15.211560 9.943236 2.0 1.0 15.318496 10.015218 0.083333 \n",
"320186 15.377673 10.008965 2.0 1.0 15.400203 9.935355 0.083333 \n",
"320187 15.538255 10.075935 2.0 1.0 15.416893 10.051785 0.083333 \n",
"\n",
" proj_x proj_y \n",
"0 0.855100 7.136193 \n",
"1 0.873132 7.235233 \n",
"2 0.890957 7.328989 \n",
"3 0.907784 7.418187 \n",
"4 0.923439 7.505012 \n",
"... ... ... \n",
"320183 14.840476 9.786501 \n",
"320184 15.033432 9.870472 \n",
"320185 15.211560 9.943236 \n",
"320186 15.377673 10.008965 \n",
"320187 15.538255 10.075935 \n",
"\n",
"[320188 rows x 15 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"if H is not None:\n",
" print(\"Projecting data\")\n",
" data['foot_x'] = data['pos_x'] + 0.5 * data['width']\n",
" data['foot_y'] = data['pos_y'] + 0.5 * data['height']\n",
" \n",
" transformed = cv2.perspectiveTransform(np.array([data[['foot_x','foot_y']].to_numpy()]),H)[0]\n",
" data['proj_x'], data['proj_y'] = transformed[:,0], transformed[:,1]\n",
" data['proj_x'] = data['proj_x'].div(100) # cm to m\n",
" data['proj_y'] = data['proj_y'].div(100) # cm to m\n",
" # and shift to mean (THES NEED TO BE STORED AND REUSED IN LIVE SETTING)\n",
" mean_x = data['proj_x'].mean()\n",
" mean_y = data['proj_y'].mean()\n",
" data['proj_x'] = data['proj_x'] - data['proj_x'].mean()\n",
" data['proj_y'] = data['proj_y'] - data['proj_y'].mean()\n",
"else:\n",
" print(\"No H given, probably already projected data?\")\n",
" mean_x = 0\n",
" mean_y = 0\n",
" data['proj_x'] = data['x']\n",
" data['proj_y'] = data['y']\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Deriving displacement, velocity and accelation from x and y\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>...</th>\n",
" <th>y_raw</th>\n",
" <th>dt</th>\n",
" <th>proj_x</th>\n",
" <th>proj_y</th>\n",
" <th>dx</th>\n",
" <th>dy</th>\n",
" <th>vx</th>\n",
" <th>vy</th>\n",
" <th>ax</th>\n",
" <th>ay</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.566162</td>\n",
" <td>88.795326</td>\n",
" <td>173.917542</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>7.341152</td>\n",
" <td>NaN</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.116699</td>\n",
" <td>88.801704</td>\n",
" <td>171.334290</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>7.309168</td>\n",
" <td>0.083333</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>0.018032</td>\n",
" <td>0.099039</td>\n",
" <td>0.216383</td>\n",
" <td>1.188473</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874573</td>\n",
" <td>90.596596</td>\n",
" <td>177.199951</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>7.370044</td>\n",
" <td>0.083333</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>0.017825</td>\n",
" <td>0.093756</td>\n",
" <td>0.213899</td>\n",
" <td>1.125077</td>\n",
" <td>-0.029812</td>\n",
" <td>-0.760753</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874268</td>\n",
" <td>90.928131</td>\n",
" <td>183.125732</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>7.432365</td>\n",
" <td>0.083333</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>0.016827</td>\n",
" <td>0.089198</td>\n",
" <td>0.201924</td>\n",
" <td>1.070371</td>\n",
" <td>-0.143699</td>\n",
" <td>-0.656466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>569.931213</td>\n",
" <td>86.213280</td>\n",
" <td>180.774292</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>7.456334</td>\n",
" <td>0.083333</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>0.015655</td>\n",
" <td>0.086825</td>\n",
" <td>0.187865</td>\n",
" <td>1.041902</td>\n",
" <td>-0.168701</td>\n",
" <td>-0.341637</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320183</th>\n",
" <td>60159.0</td>\n",
" <td>3632</td>\n",
" <td>1830.709717</td>\n",
" <td>651.257446</td>\n",
" <td>150.202515</td>\n",
" <td>157.239746</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>10.027093</td>\n",
" <td>NaN</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320184</th>\n",
" <td>60160.0</td>\n",
" <td>3632</td>\n",
" <td>1834.013672</td>\n",
" <td>649.612122</td>\n",
" <td>153.686646</td>\n",
" <td>160.874023</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>10.047117</td>\n",
" <td>0.083333</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>0.192955</td>\n",
" <td>0.083971</td>\n",
" <td>2.315463</td>\n",
" <td>1.007656</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320185</th>\n",
" <td>60161.0</td>\n",
" <td>3632</td>\n",
" <td>1845.373047</td>\n",
" <td>651.249756</td>\n",
" <td>147.178589</td>\n",
" <td>153.729248</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>10.015218</td>\n",
" <td>0.083333</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>0.178128</td>\n",
" <td>0.072764</td>\n",
" <td>2.137542</td>\n",
" <td>0.873173</td>\n",
" <td>-2.135059</td>\n",
" <td>-1.613797</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320186</th>\n",
" <td>60162.0</td>\n",
" <td>3632</td>\n",
" <td>1857.388916</td>\n",
" <td>650.908203</td>\n",
" <td>136.407349</td>\n",
" <td>142.354614</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>9.935355</td>\n",
" <td>0.083333</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>0.166113</td>\n",
" <td>0.065728</td>\n",
" <td>1.993352</td>\n",
" <td>0.788742</td>\n",
" <td>-1.730279</td>\n",
" <td>-1.013172</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320187</th>\n",
" <td>60163.0</td>\n",
" <td>3632</td>\n",
" <td>1862.792725</td>\n",
" <td>658.719971</td>\n",
" <td>141.984253</td>\n",
" <td>149.052307</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>10.051785</td>\n",
" <td>0.083333</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>0.160582</td>\n",
" <td>0.066971</td>\n",
" <td>1.926987</td>\n",
" <td>0.803649</td>\n",
" <td>-0.796376</td>\n",
" <td>0.178886</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>320188 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"0 9.0 1 0.000000 565.566162 88.795326 173.917542 \n",
"1 10.0 1 0.000000 565.116699 88.801704 171.334290 \n",
"2 11.0 1 0.000000 564.874573 90.596596 177.199951 \n",
"3 12.0 1 0.000000 564.874268 90.928131 183.125732 \n",
"4 13.0 1 0.000000 569.931213 86.213280 180.774292 \n",
"... ... ... ... ... ... ... \n",
"320183 60159.0 3632 1830.709717 651.257446 150.202515 157.239746 \n",
"320184 60160.0 3632 1834.013672 649.612122 153.686646 160.874023 \n",
"320185 60161.0 3632 1845.373047 651.249756 147.178589 153.729248 \n",
"320186 60162.0 3632 1857.388916 650.908203 136.407349 142.354614 \n",
"320187 60163.0 3632 1862.792725 658.719971 141.984253 149.052307 \n",
"\n",
" x y state diff ... y_raw dt \\\n",
"0 0.855100 7.136193 2.0 NaN ... 7.341152 NaN \n",
"1 0.873132 7.235233 2.0 1.0 ... 7.309168 0.083333 \n",
"2 0.890957 7.328989 2.0 1.0 ... 7.370044 0.083333 \n",
"3 0.907784 7.418187 2.0 1.0 ... 7.432365 0.083333 \n",
"4 0.923439 7.505012 2.0 1.0 ... 7.456334 0.083333 \n",
"... ... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 2.0 NaN ... 10.027093 NaN \n",
"320184 15.033432 9.870472 2.0 1.0 ... 10.047117 0.083333 \n",
"320185 15.211560 9.943236 2.0 1.0 ... 10.015218 0.083333 \n",
"320186 15.377673 10.008965 2.0 1.0 ... 9.935355 0.083333 \n",
"320187 15.538255 10.075935 2.0 1.0 ... 10.051785 0.083333 \n",
"\n",
" proj_x proj_y dx dy vx vy \\\n",
"0 0.855100 7.136193 NaN NaN NaN NaN \n",
"1 0.873132 7.235233 0.018032 0.099039 0.216383 1.188473 \n",
"2 0.890957 7.328989 0.017825 0.093756 0.213899 1.125077 \n",
"3 0.907784 7.418187 0.016827 0.089198 0.201924 1.070371 \n",
"4 0.923439 7.505012 0.015655 0.086825 0.187865 1.041902 \n",
"... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 NaN NaN NaN NaN \n",
"320184 15.033432 9.870472 0.192955 0.083971 2.315463 1.007656 \n",
"320185 15.211560 9.943236 0.178128 0.072764 2.137542 0.873173 \n",
"320186 15.377673 10.008965 0.166113 0.065728 1.993352 0.788742 \n",
"320187 15.538255 10.075935 0.160582 0.066971 1.926987 0.803649 \n",
"\n",
" ax ay \n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 -0.029812 -0.760753 \n",
"3 -0.143699 -0.656466 \n",
"4 -0.168701 -0.341637 \n",
"... ... ... \n",
"320183 NaN NaN \n",
"320184 NaN NaN \n",
"320185 -2.135059 -1.613797 \n",
"320186 -1.730279 -1.013172 \n",
"320187 -0.796376 0.178886 \n",
"\n",
"[320188 rows x 21 columns]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(\"Deriving displacement, velocity and accelation from x and y\")\n",
"data['dx'] = data.groupby(['track_id'])['proj_x'].diff()\n",
"data['dy'] = data.groupby(['track_id'])['proj_y'].diff()\n",
"data['vx'] = data['dx'].div(data['dt'], axis=0)\n",
"data['vy'] = data['dy'].div(data['dt'], axis=0)\n",
"\n",
"data['ax'] = data.groupby(['track_id'])['vx'].diff().div(data['dt'], axis=0)\n",
"data['ay'] = data.groupby(['track_id'])['vy'].diff().div(data['dt'], axis=0)\n",
"\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>...</th>\n",
" <th>dx</th>\n",
" <th>dy</th>\n",
" <th>vx</th>\n",
" <th>vy</th>\n",
" <th>ax</th>\n",
" <th>ay</th>\n",
" <th>v</th>\n",
" <th>a</th>\n",
" <th>heading</th>\n",
" <th>d_heading</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.566162</td>\n",
" <td>88.795326</td>\n",
" <td>173.917542</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.116699</td>\n",
" <td>88.801704</td>\n",
" <td>171.334290</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.018032</td>\n",
" <td>0.099039</td>\n",
" <td>0.216383</td>\n",
" <td>1.188473</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1.208011</td>\n",
" <td>NaN</td>\n",
" <td>79.681298</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874573</td>\n",
" <td>90.596596</td>\n",
" <td>177.199951</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.017825</td>\n",
" <td>0.093756</td>\n",
" <td>0.213899</td>\n",
" <td>1.125077</td>\n",
" <td>-0.029812</td>\n",
" <td>-0.760753</td>\n",
" <td>1.145230</td>\n",
" <td>-0.753373</td>\n",
" <td>79.235449</td>\n",
" <td>-5.350188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874268</td>\n",
" <td>90.928131</td>\n",
" <td>183.125732</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.016827</td>\n",
" <td>0.089198</td>\n",
" <td>0.201924</td>\n",
" <td>1.070371</td>\n",
" <td>-0.143699</td>\n",
" <td>-0.656466</td>\n",
" <td>1.089251</td>\n",
" <td>-0.671740</td>\n",
" <td>79.316807</td>\n",
" <td>0.976297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>569.931213</td>\n",
" <td>86.213280</td>\n",
" <td>180.774292</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.015655</td>\n",
" <td>0.086825</td>\n",
" <td>0.187865</td>\n",
" <td>1.041902</td>\n",
" <td>-0.168701</td>\n",
" <td>-0.341637</td>\n",
" <td>1.058703</td>\n",
" <td>-0.366576</td>\n",
" <td>79.778828</td>\n",
" <td>5.544252</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320183</th>\n",
" <td>60159.0</td>\n",
" <td>3632</td>\n",
" <td>1830.709717</td>\n",
" <td>651.257446</td>\n",
" <td>150.202515</td>\n",
" <td>157.239746</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320184</th>\n",
" <td>60160.0</td>\n",
" <td>3632</td>\n",
" <td>1834.013672</td>\n",
" <td>649.612122</td>\n",
" <td>153.686646</td>\n",
" <td>160.874023</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.192955</td>\n",
" <td>0.083971</td>\n",
" <td>2.315463</td>\n",
" <td>1.007656</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.525221</td>\n",
" <td>NaN</td>\n",
" <td>23.517970</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320185</th>\n",
" <td>60161.0</td>\n",
" <td>3632</td>\n",
" <td>1845.373047</td>\n",
" <td>651.249756</td>\n",
" <td>147.178589</td>\n",
" <td>153.729248</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.178128</td>\n",
" <td>0.072764</td>\n",
" <td>2.137542</td>\n",
" <td>0.873173</td>\n",
" <td>-2.135059</td>\n",
" <td>-1.613797</td>\n",
" <td>2.309007</td>\n",
" <td>-2.594562</td>\n",
" <td>22.219713</td>\n",
" <td>-15.579091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320186</th>\n",
" <td>60162.0</td>\n",
" <td>3632</td>\n",
" <td>1857.388916</td>\n",
" <td>650.908203</td>\n",
" <td>136.407349</td>\n",
" <td>142.354614</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.166113</td>\n",
" <td>0.065728</td>\n",
" <td>1.993352</td>\n",
" <td>0.788742</td>\n",
" <td>-1.730279</td>\n",
" <td>-1.013172</td>\n",
" <td>2.143727</td>\n",
" <td>-1.983366</td>\n",
" <td>21.588019</td>\n",
" <td>-7.580324</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320187</th>\n",
" <td>60163.0</td>\n",
" <td>3632</td>\n",
" <td>1862.792725</td>\n",
" <td>658.719971</td>\n",
" <td>141.984253</td>\n",
" <td>149.052307</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.160582</td>\n",
" <td>0.066971</td>\n",
" <td>1.926987</td>\n",
" <td>0.803649</td>\n",
" <td>-0.796376</td>\n",
" <td>0.178886</td>\n",
" <td>2.087853</td>\n",
" <td>-0.670484</td>\n",
" <td>22.638547</td>\n",
" <td>12.606340</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>320188 rows × 25 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"0 9.0 1 0.000000 565.566162 88.795326 173.917542 \n",
"1 10.0 1 0.000000 565.116699 88.801704 171.334290 \n",
"2 11.0 1 0.000000 564.874573 90.596596 177.199951 \n",
"3 12.0 1 0.000000 564.874268 90.928131 183.125732 \n",
"4 13.0 1 0.000000 569.931213 86.213280 180.774292 \n",
"... ... ... ... ... ... ... \n",
"320183 60159.0 3632 1830.709717 651.257446 150.202515 157.239746 \n",
"320184 60160.0 3632 1834.013672 649.612122 153.686646 160.874023 \n",
"320185 60161.0 3632 1845.373047 651.249756 147.178589 153.729248 \n",
"320186 60162.0 3632 1857.388916 650.908203 136.407349 142.354614 \n",
"320187 60163.0 3632 1862.792725 658.719971 141.984253 149.052307 \n",
"\n",
" x y state diff ... dx dy vx \\\n",
"0 0.855100 7.136193 2.0 NaN ... NaN NaN NaN \n",
"1 0.873132 7.235233 2.0 1.0 ... 0.018032 0.099039 0.216383 \n",
"2 0.890957 7.328989 2.0 1.0 ... 0.017825 0.093756 0.213899 \n",
"3 0.907784 7.418187 2.0 1.0 ... 0.016827 0.089198 0.201924 \n",
"4 0.923439 7.505012 2.0 1.0 ... 0.015655 0.086825 0.187865 \n",
"... ... ... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 2.0 NaN ... NaN NaN NaN \n",
"320184 15.033432 9.870472 2.0 1.0 ... 0.192955 0.083971 2.315463 \n",
"320185 15.211560 9.943236 2.0 1.0 ... 0.178128 0.072764 2.137542 \n",
"320186 15.377673 10.008965 2.0 1.0 ... 0.166113 0.065728 1.993352 \n",
"320187 15.538255 10.075935 2.0 1.0 ... 0.160582 0.066971 1.926987 \n",
"\n",
" vy ax ay v a heading d_heading \n",
"0 NaN NaN NaN NaN NaN NaN NaN \n",
"1 1.188473 NaN NaN 1.208011 NaN 79.681298 NaN \n",
"2 1.125077 -0.029812 -0.760753 1.145230 -0.753373 79.235449 -5.350188 \n",
"3 1.070371 -0.143699 -0.656466 1.089251 -0.671740 79.316807 0.976297 \n",
"4 1.041902 -0.168701 -0.341637 1.058703 -0.366576 79.778828 5.544252 \n",
"... ... ... ... ... ... ... ... \n",
"320183 NaN NaN NaN NaN NaN NaN NaN \n",
"320184 1.007656 NaN NaN 2.525221 NaN 23.517970 NaN \n",
"320185 0.873173 -2.135059 -1.613797 2.309007 -2.594562 22.219713 -15.579091 \n",
"320186 0.788742 -1.730279 -1.013172 2.143727 -1.983366 21.588019 -7.580324 \n",
"320187 0.803649 -0.796376 0.178886 2.087853 -0.670484 22.638547 12.606340 \n",
"\n",
"[320188 rows x 25 columns]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# then we need the velocity itself\n",
"data['v'] = np.sqrt(data['vx'].pow(2) + data['vy'].pow(2))\n",
"# and derive acceleration\n",
"data['a'] = data.groupby(['track_id'])['v'].diff().div(data['dt'], axis=0)\n",
"\n",
"# we can calculate heading based on the velocity components\n",
"data['heading'] = (np.arctan2(data['vy'], data['vx']) * 180 / np.pi) % 360\n",
"\n",
"# and derive it to get the rate of change of the heading\n",
"data['d_heading'] = data.groupby(['track_id'])['heading'].diff().div(data['dt'], axis=0)\n",
"\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>frame_id</th>\n",
" <th>track_id</th>\n",
" <th>l</th>\n",
" <th>t</th>\n",
" <th>w</th>\n",
" <th>h</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>state</th>\n",
" <th>diff</th>\n",
" <th>...</th>\n",
" <th>dx</th>\n",
" <th>dy</th>\n",
" <th>vx</th>\n",
" <th>vy</th>\n",
" <th>ax</th>\n",
" <th>ay</th>\n",
" <th>v</th>\n",
" <th>a</th>\n",
" <th>heading</th>\n",
" <th>d_heading</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.566162</td>\n",
" <td>88.795326</td>\n",
" <td>173.917542</td>\n",
" <td>0.855100</td>\n",
" <td>7.136193</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1.208011</td>\n",
" <td>-0.753373</td>\n",
" <td>79.681298</td>\n",
" <td>-5.350188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>565.116699</td>\n",
" <td>88.801704</td>\n",
" <td>171.334290</td>\n",
" <td>0.873132</td>\n",
" <td>7.235233</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.018032</td>\n",
" <td>0.099039</td>\n",
" <td>0.216383</td>\n",
" <td>1.188473</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1.208011</td>\n",
" <td>-0.753373</td>\n",
" <td>79.681298</td>\n",
" <td>-5.350188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874573</td>\n",
" <td>90.596596</td>\n",
" <td>177.199951</td>\n",
" <td>0.890957</td>\n",
" <td>7.328989</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.017825</td>\n",
" <td>0.093756</td>\n",
" <td>0.213899</td>\n",
" <td>1.125077</td>\n",
" <td>-0.029812</td>\n",
" <td>-0.760753</td>\n",
" <td>1.145230</td>\n",
" <td>-0.753373</td>\n",
" <td>79.235449</td>\n",
" <td>-5.350188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>564.874268</td>\n",
" <td>90.928131</td>\n",
" <td>183.125732</td>\n",
" <td>0.907784</td>\n",
" <td>7.418187</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.016827</td>\n",
" <td>0.089198</td>\n",
" <td>0.201924</td>\n",
" <td>1.070371</td>\n",
" <td>-0.143699</td>\n",
" <td>-0.656466</td>\n",
" <td>1.089251</td>\n",
" <td>-0.671740</td>\n",
" <td>79.316807</td>\n",
" <td>0.976297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>569.931213</td>\n",
" <td>86.213280</td>\n",
" <td>180.774292</td>\n",
" <td>0.923439</td>\n",
" <td>7.505012</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.015655</td>\n",
" <td>0.086825</td>\n",
" <td>0.187865</td>\n",
" <td>1.041902</td>\n",
" <td>-0.168701</td>\n",
" <td>-0.341637</td>\n",
" <td>1.058703</td>\n",
" <td>-0.366576</td>\n",
" <td>79.778828</td>\n",
" <td>5.544252</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320183</th>\n",
" <td>60159.0</td>\n",
" <td>3632</td>\n",
" <td>1830.709717</td>\n",
" <td>651.257446</td>\n",
" <td>150.202515</td>\n",
" <td>157.239746</td>\n",
" <td>14.840476</td>\n",
" <td>9.786501</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.525221</td>\n",
" <td>-2.594562</td>\n",
" <td>23.517970</td>\n",
" <td>-15.579091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320184</th>\n",
" <td>60160.0</td>\n",
" <td>3632</td>\n",
" <td>1834.013672</td>\n",
" <td>649.612122</td>\n",
" <td>153.686646</td>\n",
" <td>160.874023</td>\n",
" <td>15.033432</td>\n",
" <td>9.870472</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.192955</td>\n",
" <td>0.083971</td>\n",
" <td>2.315463</td>\n",
" <td>1.007656</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.525221</td>\n",
" <td>-2.594562</td>\n",
" <td>23.517970</td>\n",
" <td>-15.579091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320185</th>\n",
" <td>60161.0</td>\n",
" <td>3632</td>\n",
" <td>1845.373047</td>\n",
" <td>651.249756</td>\n",
" <td>147.178589</td>\n",
" <td>153.729248</td>\n",
" <td>15.211560</td>\n",
" <td>9.943236</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.178128</td>\n",
" <td>0.072764</td>\n",
" <td>2.137542</td>\n",
" <td>0.873173</td>\n",
" <td>-2.135059</td>\n",
" <td>-1.613797</td>\n",
" <td>2.309007</td>\n",
" <td>-2.594562</td>\n",
" <td>22.219713</td>\n",
" <td>-15.579091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320186</th>\n",
" <td>60162.0</td>\n",
" <td>3632</td>\n",
" <td>1857.388916</td>\n",
" <td>650.908203</td>\n",
" <td>136.407349</td>\n",
" <td>142.354614</td>\n",
" <td>15.377673</td>\n",
" <td>10.008965</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.166113</td>\n",
" <td>0.065728</td>\n",
" <td>1.993352</td>\n",
" <td>0.788742</td>\n",
" <td>-1.730279</td>\n",
" <td>-1.013172</td>\n",
" <td>2.143727</td>\n",
" <td>-1.983366</td>\n",
" <td>21.588019</td>\n",
" <td>-7.580324</td>\n",
" </tr>\n",
" <tr>\n",
" <th>320187</th>\n",
" <td>60163.0</td>\n",
" <td>3632</td>\n",
" <td>1862.792725</td>\n",
" <td>658.719971</td>\n",
" <td>141.984253</td>\n",
" <td>149.052307</td>\n",
" <td>15.538255</td>\n",
" <td>10.075935</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>0.160582</td>\n",
" <td>0.066971</td>\n",
" <td>1.926987</td>\n",
" <td>0.803649</td>\n",
" <td>-0.796376</td>\n",
" <td>0.178886</td>\n",
" <td>2.087853</td>\n",
" <td>-0.670484</td>\n",
" <td>22.638547</td>\n",
" <td>12.606340</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>320188 rows × 25 columns</p>\n",
"</div>"
],
"text/plain": [
" frame_id track_id l t w h \\\n",
"0 9.0 1 0.000000 565.566162 88.795326 173.917542 \n",
"1 10.0 1 0.000000 565.116699 88.801704 171.334290 \n",
"2 11.0 1 0.000000 564.874573 90.596596 177.199951 \n",
"3 12.0 1 0.000000 564.874268 90.928131 183.125732 \n",
"4 13.0 1 0.000000 569.931213 86.213280 180.774292 \n",
"... ... ... ... ... ... ... \n",
"320183 60159.0 3632 1830.709717 651.257446 150.202515 157.239746 \n",
"320184 60160.0 3632 1834.013672 649.612122 153.686646 160.874023 \n",
"320185 60161.0 3632 1845.373047 651.249756 147.178589 153.729248 \n",
"320186 60162.0 3632 1857.388916 650.908203 136.407349 142.354614 \n",
"320187 60163.0 3632 1862.792725 658.719971 141.984253 149.052307 \n",
"\n",
" x y state diff ... dx dy vx \\\n",
"0 0.855100 7.136193 2.0 NaN ... NaN NaN NaN \n",
"1 0.873132 7.235233 2.0 1.0 ... 0.018032 0.099039 0.216383 \n",
"2 0.890957 7.328989 2.0 1.0 ... 0.017825 0.093756 0.213899 \n",
"3 0.907784 7.418187 2.0 1.0 ... 0.016827 0.089198 0.201924 \n",
"4 0.923439 7.505012 2.0 1.0 ... 0.015655 0.086825 0.187865 \n",
"... ... ... ... ... ... ... ... ... \n",
"320183 14.840476 9.786501 2.0 NaN ... NaN NaN NaN \n",
"320184 15.033432 9.870472 2.0 1.0 ... 0.192955 0.083971 2.315463 \n",
"320185 15.211560 9.943236 2.0 1.0 ... 0.178128 0.072764 2.137542 \n",
"320186 15.377673 10.008965 2.0 1.0 ... 0.166113 0.065728 1.993352 \n",
"320187 15.538255 10.075935 2.0 1.0 ... 0.160582 0.066971 1.926987 \n",
"\n",
" vy ax ay v a heading d_heading \n",
"0 NaN NaN NaN 1.208011 -0.753373 79.681298 -5.350188 \n",
"1 1.188473 NaN NaN 1.208011 -0.753373 79.681298 -5.350188 \n",
"2 1.125077 -0.029812 -0.760753 1.145230 -0.753373 79.235449 -5.350188 \n",
"3 1.070371 -0.143699 -0.656466 1.089251 -0.671740 79.316807 0.976297 \n",
"4 1.041902 -0.168701 -0.341637 1.058703 -0.366576 79.778828 5.544252 \n",
"... ... ... ... ... ... ... ... \n",
"320183 NaN NaN NaN 2.525221 -2.594562 23.517970 -15.579091 \n",
"320184 1.007656 NaN NaN 2.525221 -2.594562 23.517970 -15.579091 \n",
"320185 0.873173 -2.135059 -1.613797 2.309007 -2.594562 22.219713 -15.579091 \n",
"320186 0.788742 -1.730279 -1.013172 2.143727 -1.983366 21.588019 -7.580324 \n",
"320187 0.803649 -0.796376 0.178886 2.087853 -0.670484 22.638547 12.606340 \n",
"\n",
"[320188 rows x 25 columns]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# we can backfill the v and a, so that our model can make estimations\n",
"# based on these assumed values\n",
"data['v'] = data.groupby(['track_id'])['v'].bfill()\n",
"data['a'] = data.groupby(['track_id'])['a'].bfill()\n",
"\n",
"data['heading'] = data.groupby(['track_id'])['heading'].bfill()\n",
"data['d_heading'] = data.groupby(['track_id'])['d_heading'].bfill()\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"312423 items in filtered set, out of 320188 in total set\n"
]
}
],
"source": [
"filtered_data = data.groupby(['track_id']).filter(lambda group: len(group) >= window+1) # a lenght of 3 is neccessary to have all relevant derivatives of position\n",
"filtered_data = filtered_data.set_index(['track_id', 'frame_id']) # use for quick access\n",
"print(filtered_data.shape[0], \"items in filtered set, out of\", data.shape[0], \"in total set\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1263 training tracks, 316 test tracks\n"
]
}
],
"source": [
"track_ids = filtered_data.index.unique('track_id').to_numpy()\n",
"np.random.shuffle(track_ids)\n",
"test_offset_idx = int(len(track_ids) * .8)\n",
"training_ids, test_ids = track_ids[:test_offset_idx], track_ids[test_offset_idx:]\n",
"print(f\"{len(training_ids)} training tracks, {len(test_ids)} test tracks\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"here, draw out a sample track to see if it looks alright. **unfortunately the imate isn't mapped properly**."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1058\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 0\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import random\n",
"if H:\n",
" img_src = \"../DATASETS/hof/webcam20231103-2.png\"\n",
" # dst = cv2.warpPerspective(img_src,H,(2500,1920))\n",
" src_img = cv2.imread(img_src)\n",
" print(src_img.shape)\n",
" h1,w1 = src_img.shape[:2]\n",
" corners = np.float32([[0,0], [w1, 0], [0, h1], [w1, h1]])\n",
"\n",
" print(corners)\n",
" corners_projected = cv2.perspectiveTransform(corners.reshape((-1,4,2)), H)[0]\n",
" print(corners_projected)\n",
" [xmin, ymin] = np.int32(corners_projected.min(axis=0).ravel() - 0.5)\n",
" [xmax, ymax] = np.int32(corners_projected.max(axis=0).ravel() + 0.5)\n",
" print(xmin, xmax, ymin, ymax)\n",
"\n",
" dst = cv2.warpPerspective(src_img,H, (xmax, ymax))\n",
" def plot_track(track_id: int):\n",
" plt.gca().invert_yaxis()\n",
"\n",
" plt.imshow(dst, origin='lower', extent=[xmin/100-mean_x, xmax/100-mean_x, ymin/100-mean_y, ymax/100-mean_y])\n",
" # plot scatter plot with x and y data \n",
" \n",
" ax = plt.scatter(\n",
" filtered_data.loc[track_id,:]['proj_x'],\n",
" filtered_data.loc[track_id,:]['proj_y'],\n",
" marker=\"*\") \n",
" ax.axes.invert_yaxis()\n",
" plt.plot(\n",
" filtered_data.loc[track_id,:]['proj_x'],\n",
" filtered_data.loc[track_id,:]['proj_y']\n",
" )\n",
"else:\n",
" def plot_track(track_id: int):\n",
" ax = plt.scatter(\n",
" filtered_data.loc[track_id,:]['x'],\n",
" filtered_data.loc[track_id,:]['y'],\n",
" marker=\"*\") \n",
" plt.plot(\n",
" filtered_data.loc[track_id,:]['proj_x'],\n",
" filtered_data.loc[track_id,:]['proj_y']\n",
" )\n",
"\n",
"# print(filtered_data.loc[track_id,:]['proj_x'])\n",
"# _track_id = 2188\n",
"_track_id = random.choice(track_ids)\n",
"print(_track_id)\n",
"plot_track(_track_id)\n",
"\n",
"for track_id in random.choices(track_ids, k=100):\n",
" plot_track(track_id)\n",
" \n",
"print(mean_x, mean_y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now make the dataset:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# a=filtered_data.loc[1]\n",
"# min(a.index.tolist())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/1263 [00:00<?, ?it/s]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1263/1263 [01:42<00:00, 12.36it/s]\n",
"100%|██████████| 316/316 [00:26<00:00, 11.75it/s]\n"
]
}
],
"source": [
"\n",
"\n",
"\n",
"def create_dataset(data, track_ids, window):\n",
" X, y, = [], []\n",
" for track_id in tqdm(track_ids):\n",
" df = data.loc[track_id]\n",
" start_frame = min(df.index.tolist())\n",
" for step in range(len(df)-window-1):\n",
" i = int(start_frame) + step\n",
" # print(step, int(start_frame), i)\n",
" feature = df.loc[i:i+window][in_fields]\n",
" # target = df.loc[i+1:i+window+1][out_fields]\n",
" target = df.loc[i+window+1][out_fields]\n",
" X.append(feature.values)\n",
" y.append(target.values)\n",
" \n",
" return torch.tensor(np.array(X), dtype=torch.float), torch.tensor(np.array(y), dtype=torch.float)\n",
"\n",
"X_train, y_train = create_dataset(filtered_data, training_ids, window)\n",
"X_test, y_test = create_dataset(filtered_data, test_ids, window)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"X_train, y_train = X_train.to(device=device), y_train.to(device=device)\n",
"X_test, y_test = X_test.to(device=device), y_test.to(device=device)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from torch.utils.data import TensorDataset, DataLoader\n",
"dataset_train = TensorDataset(X_train, y_train)\n",
"loader_train = DataLoader(dataset_train, shuffle=True, batch_size=8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Model give output for all timesteps, this should improve training. But we use only the last timestep for the prediction process"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"class LSTMModel(nn.Module):\n",
" # input_size : number of features in input at each time step\n",
" # hidden_size : Number of LSTM units \n",
" # num_layers : number of LSTM layers \n",
" def __init__(self, input_size, hidden_size, num_layers): \n",
" super(LSTMModel, self).__init__() #initializes the parent class nn.Module\n",
" self.lin1 = nn.Linear(input_size, hidden_size//2)\n",
" self.lstm = nn.LSTM(hidden_size//2, hidden_size, num_layers, batch_first=True)\n",
" self.linear = nn.Linear(hidden_size, output_size)\n",
" # self.activation_v = nn.LeakyReLU(.01)\n",
" # self.activation_heading = torch.remainder()\n",
"\n",
" def forward(self, x): # defines forward pass of the neural network\n",
" out = self.lin1(x)\n",
" out, h0 = self.lstm(out)\n",
" # extract only the last time step, see https://machinelearningmastery.com/lstm-for-time-series-prediction-in-pytorch/\n",
" # print(out.shape)\n",
" out = out[:, -1,:]\n",
" # print(out.shape)\n",
" out = self.linear(out)\n",
" \n",
" # torch.remainder(out[1], 360)\n",
" # print('o',out.shape)\n",
" return out\n",
"\n",
"model = LSTMModel(input_size, hidden_size, num_layers).to(device)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n",
"loss_fn = nn.MSELoss()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def evaluate():\n",
" # toggle evaluation mode\n",
" model.eval()\n",
" with torch.no_grad():\n",
" y_pred = model(X_train.to(device=device))\n",
" train_rmse = torch.sqrt(loss_fn(y_pred, y_train))\n",
" y_pred = model(X_test.to(device=device))\n",
" test_rmse = torch.sqrt(loss_fn(y_pred, y_test))\n",
" print(\"Epoch %d: train RMSE %.4f, test RMSE %.4f\" % (epoch, train_rmse, test_rmse))\n",
"\n",
"def load_most_recent():\n",
" paths = list(cache_path.glob(\"checkpoint_*.pt\"))\n",
" if len(paths) < 1:\n",
" print('Nothing found to load')\n",
" return None, None\n",
" paths.sort()\n",
"\n",
" print(f\"Loading {paths[-1]}\")\n",
" return load_cache(path=paths[-1])\n",
"\n",
"def load_cache(epoch=None, path=None):\n",
" if path is None:\n",
" if epoch is None:\n",
" raise RuntimeError(\"Either path or epoch must be given\")\n",
" path = cache_path / f\"checkpoint_{epoch:05d}.pt\"\n",
" else:\n",
" print (path.stem)\n",
" epoch = int(path.stem[-5:])\n",
"\n",
" cached = torch.load(path)\n",
" \n",
" optimizer.load_state_dict(cached['optimizer_state_dict'])\n",
" model.load_state_dict(cached['model_state_dict'])\n",
" return epoch, cached['loss']\n",
" \n",
"\n",
"def cache(epoch, loss):\n",
" path = cache_path / f\"checkpoint_{epoch:05d}.pt\"\n",
" print(f\"Cache to {path}\")\n",
" torch.save({\n",
" 'epoch': epoch,\n",
" 'model_state_dict': model.state_dict(),\n",
" 'optimizer_state_dict': optimizer.state_dict(),\n",
" 'loss': loss,\n",
" }, path)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading EXPERIMENTS/cache/hof2/checkpoint_00005.pt\n",
"checkpoint_00005\n",
"starting from epoch 5 (loss: nan)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/95 [00:00<?, ?it/s]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" 4%|▍ | 4/95 [07:37<2:53:27, 114.37s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cache to EXPERIMENTS/cache/hof2/checkpoint_00010.pt\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
},
{
"ename": "RuntimeError",
"evalue": "CUDA out of memory. Tried to allocate 28.40 GiB (GPU 0; 23.59 GiB total capacity; 15.01 GiB already allocated; 7.20 GiB free; 15.03 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[31], line 31\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m 30\u001b[0m cache(epoch, loss)\n\u001b[0;32m---> 31\u001b[0m \u001b[43mevaluate\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 33\u001b[0m evaluate()\n",
"Cell \u001b[0;32mIn[30], line 5\u001b[0m, in \u001b[0;36mevaluate\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m model\u001b[38;5;241m.\u001b[39meval()\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mno_grad():\n\u001b[0;32m----> 5\u001b[0m y_pred \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdevice\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdevice\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m train_rmse \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39msqrt(loss_fn(y_pred, y_train))\n\u001b[1;32m 7\u001b[0m y_pred \u001b[38;5;241m=\u001b[39m model(X_test\u001b[38;5;241m.\u001b[39mto(device\u001b[38;5;241m=\u001b[39mdevice))\n",
"File \u001b[0;32m~/suspicion/trap/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py:1130\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 1126\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1127\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1128\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1129\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1130\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1131\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1132\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n",
"Cell \u001b[0;32mIn[28], line 15\u001b[0m, in \u001b[0;36mLSTMModel.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x): \u001b[38;5;66;03m# defines forward pass of the neural network\u001b[39;00m\n\u001b[1;32m 14\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlin1(x)\n\u001b[0;32m---> 15\u001b[0m out, h0 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlstm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;66;03m# extract only the last time step, see https://machinelearningmastery.com/lstm-for-time-series-prediction-in-pytorch/\u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# print(out.shape)\u001b[39;00m\n\u001b[1;32m 18\u001b[0m out \u001b[38;5;241m=\u001b[39m out[:, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m,:]\n",
"File \u001b[0;32m~/suspicion/trap/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py:1130\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 1126\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1127\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1128\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1129\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1130\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1131\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1132\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n",
"File \u001b[0;32m~/suspicion/trap/.venv/lib/python3.10/site-packages/torch/nn/modules/rnn.py:769\u001b[0m, in \u001b[0;36mLSTM.forward\u001b[0;34m(self, input, hx)\u001b[0m\n\u001b[1;32m 767\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcheck_forward_args(\u001b[38;5;28minput\u001b[39m, hx, batch_sizes)\n\u001b[1;32m 768\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m batch_sizes \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 769\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43m_VF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlstm\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_flat_weights\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnum_layers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 770\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbidirectional\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbatch_first\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 771\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 772\u001b[0m result \u001b[38;5;241m=\u001b[39m _VF\u001b[38;5;241m.\u001b[39mlstm(\u001b[38;5;28minput\u001b[39m, batch_sizes, hx, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_flat_weights, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbias,\n\u001b[1;32m 773\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_layers, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropout, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraining, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbidirectional)\n",
"\u001b[0;31mRuntimeError\u001b[0m: CUDA out of memory. Tried to allocate 28.40 GiB (GPU 0; 23.59 GiB total capacity; 15.01 GiB already allocated; 7.20 GiB free; 15.03 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF"
]
}
],
"source": [
"start_epoch, loss = load_most_recent()\n",
"if start_epoch is None:\n",
" start_epoch = 0\n",
"else:\n",
" print(f\"starting from epoch {start_epoch} (loss: {loss})\")\n",
"\n",
"# Train Network\n",
"for epoch in tqdm(range(start_epoch+1,num_epochs+1)):\n",
" # toggle train mode\n",
" model.train()\n",
" for batch_idx, (data, targets) in enumerate(loader_train):\n",
" # Get data to cuda if possible\n",
" data = data.to(device=device).squeeze(1)\n",
" targets = targets.to(device=device)\n",
"\n",
" # forward\n",
" scores = model(data)\n",
" loss = loss_fn(scores, targets)\n",
"\n",
" # backward\n",
" optimizer.zero_grad()\n",
" loss.backward()\n",
"\n",
" # gradient descent update step/adam step\n",
" optimizer.step()\n",
"\n",
" if epoch % 5 != 0:\n",
" continue\n",
"\n",
" cache(epoch, loss)\n",
" evaluate()\n",
"\n",
"evaluate()"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'model' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241m.\u001b[39meval()\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mno_grad():\n\u001b[1;32m 3\u001b[0m y_pred \u001b[38;5;241m=\u001b[39m model(X_train\u001b[38;5;241m.\u001b[39mto(device\u001b[38;5;241m=\u001b[39mdevice))\n",
"\u001b[0;31mNameError\u001b[0m: name 'model' is not defined"
]
}
],
"source": [
"model.eval()\n",
"with torch.no_grad():\n",
" y_pred = model(X_train.to(device=device))\n",
" print(y_pred.shape, y_train.shape)\n",
"y_train, y_pred"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0, 0)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_x, mean_y"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import scipy\n",
"\n",
"\n",
"def predict_and_plot(feature, steps = 50):\n",
" lenght = feature.shape[0]\n",
" # feature = filtered_data.loc[_track_id,:].iloc[:5][in_fields].values\n",
" # nxt = filtered_data.loc[_track_id,:].iloc[5][out_fields]\n",
" with torch.no_grad():\n",
" for i in range(steps):\n",
" # predict_f = scipy.ndimage.uniform_filter(feature)\n",
" # predict_f = scipy.interpolate.splrep(feature[:][0], feature[:][1],)\n",
" # predict_f = scipy.signal.spline_feature(feature, lmbda=.1)\n",
" # bathc size of one, so feature as single item in array\n",
" X = torch.tensor([feature], dtype=torch.float).to(device)\n",
" # print(X.shape)\n",
" s = model(X)[0].cpu()\n",
" \n",
" # proj_x proj_y v heading a d_heading\n",
" # next_step = feature\n",
" dt = 1/ FPS\n",
" v = np.sqrt(s[0]**2 + s[1]**2)\n",
" heading = (np.arctan2(s[1], s[0]) * 180 / np.pi) % 360\n",
" a = (v - feature[-1][2]) / dt\n",
" d_heading = (heading - feature[-1][5])\n",
" # print(s)\n",
" feature = np.append(feature, [[feature[-1][0] + s[0]*dt, feature[-1][1] + s[1]*dt, v, heading, a, d_heading ]], axis=0)\n",
" \n",
" # print(next_step, nxt)\n",
" plt.plot(feature[:lenght,0], feature[:lenght,1], c='orange')\n",
" plt.plot(feature[lenght-1:,0], feature[lenght-1:,1], c='red')\n",
" plt.scatter(feature[lenght:,0], feature[lenght:,1], c='red')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2515\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"# print(filtered_data.loc[track_id,:]['proj_x'])\n",
"_track_id = 8701 # random.choice(track_ids)\n",
"_track_id = 3880 # random.choice(track_ids)\n",
"\n",
"# _track_id = 2780\n",
"\n",
"for i in range(100):\n",
" _track_id = random.choice(track_ids)\n",
" plt.plot(\n",
" filtered_data.loc[_track_id,:]['proj_x'],\n",
" filtered_data.loc[_track_id,:]['proj_y'],\n",
" c='grey', alpha=.2\n",
" )\n",
"\n",
"_track_id = random.choice(track_ids)\n",
"# _track_id = 801\n",
"print(_track_id)\n",
"ax = plt.scatter(\n",
" filtered_data.loc[_track_id,:]['proj_x'],\n",
" filtered_data.loc[_track_id,:]['proj_y'],\n",
" marker=\"*\") \n",
"plt.plot(\n",
" filtered_data.loc[_track_id,:]['proj_x'],\n",
" filtered_data.loc[_track_id,:]['proj_y']\n",
")\n",
"\n",
"predict_and_plot(filtered_data.loc[_track_id,:].iloc[:5][in_fields].values)\n",
"predict_and_plot(filtered_data.loc[_track_id,:].iloc[:10][in_fields].values)\n",
"predict_and_plot(filtered_data.loc[_track_id,:].iloc[:50][in_fields].values)\n",
"# predict_and_plot(filtered_data.loc[_track_id,:].iloc[:70][in_fields].values)\n",
"# predict_and_plot(filtered_data.loc[_track_id,:].iloc[:115][in_fields].values)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.10.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}