[{"data":1,"prerenderedAt":3653},["ShallowReactive",2],{"navigation":3,"api-navigation":126,"\u002Fnotebooks\u002Ftutorials\u002Fquickstart":328,"docyard:crossref-index":3652},[4,8,38,44,48,122],{"title":5,"path":6,"stem":7},"Getting Started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11,"children":12,"page":37},"Recipes","\u002Frecipes","2.recipes",[13,17,21,25,29,33],{"title":14,"path":15,"stem":16},"Recipe: two-stage cascade tracker","\u002Frecipes\u002Fcascade_tracker","2.recipes\u002Fcascade_tracker",{"title":18,"path":19,"stem":20},"Recipe: cosine appearance tracker","\u002Frecipes\u002Fcosine_tracker","2.recipes\u002Fcosine_tracker",{"title":22,"path":23,"stem":24},"Recipe: Kalman motion tracker","\u002Frecipes\u002Fkalman_motion_tracker","2.recipes\u002Fkalman_motion_tracker",{"title":26,"path":27,"stem":28},"Recipe: learned MOTR-style appearance tracker","\u002Frecipes\u002Flearned_motr_tracker","2.recipes\u002Flearned_motr_tracker",{"title":30,"path":31,"stem":32},"Recipe: overlap-IoU tracker (port of 1.x models.overlap)","\u002Frecipes\u002Foverlap_tracker","2.recipes\u002Foverlap_tracker",{"title":34,"path":35,"stem":36},"Recipe: SORT-style tracker on unitrack 2.0","\u002Frecipes\u002Fsort","2.recipes\u002Fsort",false,{"title":39,"path":40,"stem":41,"children":42},"API reference","\u002Fapi","3.api\u002Findex",[43],{"title":39,"path":40,"stem":41},{"title":45,"path":46,"stem":47},"Migrating from 1.x to 2.0","\u002Fmigration","4.migration",{"title":49,"path":50,"stem":51,"children":52,"page":37},"Notebooks","\u002Fnotebooks","5.notebooks",[53,84,88],{"title":54,"path":55,"stem":56,"children":57},"Embedding \u002F appearance filters","\u002Fnotebooks\u002Fembedding_filters","5.notebooks\u002Fembedding_filters\u002Findex",[58,59,64,68,72,76,80],{"title":54,"path":55,"stem":56},{"title":60,"path":61,"stem":62,"icon":63},"Embedding filters 1 — Exponential moving average (EMA)","\u002Fnotebooks\u002Fembedding_filters\u002Fema","5.notebooks\u002Fembedding_filters\u002F1.ema","i-lucide-notebook",{"title":65,"path":66,"stem":67,"icon":63},"Embedding filters 2 — Diagonal Kalman","\u002Fnotebooks\u002Fembedding_filters\u002Fkalman_diagonal","5.notebooks\u002Fembedding_filters\u002F2.kalman_diagonal",{"title":69,"path":70,"stem":71,"icon":63},"Embedding filters 3 — von Mises-Fisher (directional)","\u002Fnotebooks\u002Fembedding_filters\u002Fvmf_directional","5.notebooks\u002Fembedding_filters\u002F3.vmf_directional",{"title":73,"path":74,"stem":75,"icon":63},"Embedding filters 4 — Ensemble Kalman & information filters","\u002Fnotebooks\u002Fembedding_filters\u002Fenkf_information","5.notebooks\u002Fembedding_filters\u002F4.enkf_information",{"title":77,"path":78,"stem":79,"icon":63},"Embedding filters 5 — Memory bank & learned propagation","\u002Fnotebooks\u002Fembedding_filters\u002Fgallery_and_learned","5.notebooks\u002Fembedding_filters\u002F5.gallery_and_learned",{"title":81,"path":82,"stem":83,"icon":63},"Embedding filters 6 — summary & benchmark","\u002Fnotebooks\u002Fembedding_filters\u002Fsummary_benchmark","5.notebooks\u002Fembedding_filters\u002F6.summary_benchmark",{"title":85,"path":86,"stem":87,"icon":63},"Kalman filters for motion prediction in tracking","\u002Fnotebooks\u002Fkalman","5.notebooks\u002Fkalman",{"title":89,"path":90,"stem":91,"children":92},"Tutorial notebooks","\u002Fnotebooks\u002Ftutorials","5.notebooks\u002Ftutorials\u002Findex",[93,94,98,102,106,110,114,118],{"title":89,"path":90,"stem":91},{"title":95,"path":96,"stem":97,"icon":63},"1. Quickstart — your first tracker","\u002Fnotebooks\u002Ftutorials\u002Fquickstart","5.notebooks\u002Ftutorials\u002F1.quickstart",{"title":99,"path":100,"stem":101,"icon":63},"2. The data model — typed records that flow through a tracker","\u002Fnotebooks\u002Ftutorials\u002Fdata_model","5.notebooks\u002Ftutorials\u002F2.data_model",{"title":103,"path":104,"stem":105,"icon":63},"3. The cost & gate zoos","\u002Fnotebooks\u002Ftutorials\u002Fcosts_and_gates","5.notebooks\u002Ftutorials\u002F3.costs_and_gates",{"title":107,"path":108,"stem":109,"icon":63},"4. The composable pipeline tree","\u002Fnotebooks\u002Ftutorials\u002Fpipeline_tree","5.notebooks\u002Ftutorials\u002F4.pipeline_tree",{"title":111,"path":112,"stem":113,"icon":63},"5. State evolution and lifecycle","\u002Fnotebooks\u002Ftutorials\u002Fstates_and_lifecycle","5.notebooks\u002Ftutorials\u002F5.states_and_lifecycle",{"title":115,"path":116,"stem":117,"icon":63},"6. End-to-end: K=2 cascaded and parallel fusion","\u002Fnotebooks\u002Ftutorials\u002Fcascaded_and_parallel","5.notebooks\u002Ftutorials\u002F6.cascaded_and_parallel",{"title":119,"path":120,"stem":121,"icon":63},"7. Migration & new possibilities — driven by a real detector","\u002Fnotebooks\u002Ftutorials\u002Fmigration","5.notebooks\u002Ftutorials\u002F7.migration",{"title":123,"path":124,"stem":125},"Unitrack","\u002F","index",[127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,249,252,255,258,261,263,266,269,272,274,277,280,282,285,288,290,293,296,299,302,305,308,311,313,315,318,320,323,326],{"title":128,"path":129},"assignment","\u002Fapi\u002Fassignment",{"title":131,"path":132},"associate","\u002Fapi\u002Fassignment\u002Fassociate",{"title":134,"path":135},"clip_associate","\u002Fapi\u002Fassignment\u002Fclip_associate",{"title":137,"path":138},"lap","\u002Fapi\u002Fassignment\u002Flap",{"title":140,"path":141},"lapjv","\u002Fapi\u002Fassignment\u002Flapjv",{"title":143,"path":144},"benchmarks","\u002Fapi\u002Fbenchmarks",{"title":146,"path":147},"hota","\u002Fapi\u002Fbenchmarks\u002Fhota",{"title":149,"path":150},"datasets","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fdatasets",{"title":152,"path":153},"learned_modules","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Flearned_modules",{"title":155,"path":156},"metric","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fmetric",{"title":158,"path":159},"models","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fmodels",{"title":161,"path":162},"protocols","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fprotocols",{"title":164,"path":165},"render","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Frender",{"title":167,"path":168},"report","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Freport",{"title":170,"path":171},"runner","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Frunner",{"title":173,"path":174},"tracker","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Ftracker",{"title":176,"path":177},"train_learned","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Ftrain_learned",{"title":179,"path":180},"types","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Ftypes",{"title":182,"path":183},"costs","\u002Fapi\u002Fcosts",{"title":185,"path":186},"combinators","\u002Fapi\u002Fcosts\u002Fcombinators",{"title":188,"path":189},"distance","\u002Fapi\u002Fcosts\u002Fdistance",{"title":191,"path":192},"gallery","\u002Fapi\u002Fcosts\u002Fgallery",{"title":194,"path":195},"overlap","\u002Fapi\u002Fcosts\u002Foverlap",{"title":197,"path":198},"data","\u002Fapi\u002Fdata",{"title":200,"path":201},"clip","\u002Fapi\u002Fdata\u002Fclip",{"title":203,"path":204},"cost","\u002Fapi\u002Fdata\u002Fcost",{"title":206,"path":207},"detections","\u002Fapi\u002Fdata\u002Fdetections",{"title":209,"path":210},"frame","\u002Fapi\u002Fdata\u002Fframe",{"title":212,"path":213},"gate","\u002Fapi\u002Fdata\u002Fgate",{"title":215,"path":216},"match","\u002Fapi\u002Fdata\u002Fmatch",{"title":218,"path":219},"tensor_spec","\u002Fapi\u002Fdata\u002Ftensor_spec",{"title":221,"path":222},"tracklets","\u002Fapi\u002Fdata\u002Ftracklets",{"title":224,"path":225},"gates","\u002Fapi\u002Fgates",{"title":227,"path":228},"motion","\u002Fapi\u002Fgates\u002Fmotion",{"title":230,"path":231},"simple","\u002Fapi\u002Fgates\u002Fsimple",{"title":233,"path":234},"soft","\u002Fapi\u002Fgates\u002Fsoft",{"title":236,"path":237},"spatial","\u002Fapi\u002Fgates\u002Fspatial",{"title":239,"path":240},"lifecycle","\u002Fapi\u002Flifecycle",{"title":242,"path":243},"filters","\u002Fapi\u002Flifecycle\u002Ffilters",{"title":245,"path":246},"policies","\u002Fapi\u002Flifecycle\u002Fpolicies",{"title":233,"path":248},"\u002Fapi\u002Flifecycle\u002Fsoft",{"title":250,"path":251},"status","\u002Fapi\u002Flifecycle\u002Fstatus",{"title":253,"path":254},"visibility","\u002Fapi\u002Flifecycle\u002Fvisibility",{"title":256,"path":257},"pipeline","\u002Fapi\u002Fpipeline",{"title":259,"path":260},"base","\u002Fapi\u002Fpipeline\u002Fbase",{"title":185,"path":262},"\u002Fapi\u002Fpipeline\u002Fcombinators",{"title":264,"path":265},"diff","\u002Fapi\u002Fpipeline\u002Fdiff",{"title":267,"path":268},"merge","\u002Fapi\u002Fpipeline\u002Fmerge",{"title":270,"path":271},"states","\u002Fapi\u002Fstates",{"title":259,"path":273},"\u002Fapi\u002Fstates\u002Fbase",{"title":275,"path":276},"directional","\u002Fapi\u002Fstates\u002Fdirectional",{"title":278,"path":279},"ema","\u002Fapi\u002Fstates\u002Fema",{"title":191,"path":281},"\u002Fapi\u002Fstates\u002Fgallery",{"title":283,"path":284},"identity","\u002Fapi\u002Fstates\u002Fidentity",{"title":286,"path":287},"kalman","\u002Fapi\u002Fstates\u002Fkalman",{"title":259,"path":289},"\u002Fapi\u002Fstates\u002Fkalman\u002Fbase",{"title":291,"path":292},"bbox","\u002Fapi\u002Fstates\u002Fkalman\u002Fbbox",{"title":294,"path":295},"centroid","\u002Fapi\u002Fstates\u002Fkalman\u002Fcentroid",{"title":297,"path":298},"ensemble","\u002Fapi\u002Fstates\u002Fkalman\u002Fensemble",{"title":300,"path":301},"information","\u002Fapi\u002Fstates\u002Fkalman\u002Finformation",{"title":303,"path":304},"project","\u002Fapi\u002Fstates\u002Fkalman\u002Fproject",{"title":306,"path":307},"update","\u002Fapi\u002Fstates\u002Fkalman\u002Fupdate",{"title":309,"path":310},"learned","\u002Fapi\u002Fstates\u002Flearned",{"title":233,"path":312},"\u002Fapi\u002Fstates\u002Fsoft",{"title":173,"path":314},"\u002Fapi\u002Ftracker",{"title":316,"path":317},"batch","\u002Fapi\u002Ftracker\u002Fbatch",{"title":200,"path":319},"\u002Fapi\u002Ftracker\u002Fclip",{"title":321,"path":322},"memory","\u002Fapi\u002Ftracker\u002Fmemory",{"title":324,"path":325},"multistream","\u002Fapi\u002Ftracker\u002Fmultistream",{"title":173,"path":327},"\u002Fapi\u002Ftracker\u002Ftracker",{"id":329,"title":95,"body":330,"description":3646,"extension":3647,"meta":3648,"navigation":3649,"path":96,"seo":3650,"stem":97,"__hash__":3651},"content\u002F5.notebooks\u002Ftutorials\u002F1.quickstart.md",{"type":331,"value":332,"toc":3637},"minimark",[333,337,346,369,372,377,386,396,425,439,714,718,724,727,779,1184,1189,1193,1200,1788,1791,1811,1815,1822,1836,2816,2822,2826,2836,3068,3071,3074,3078,3081,3555,3560,3563,3567,3633],[334,335,95],"h1",{"id":336},"_1-quickstart-your-first-tracker",[338,339,340,341,345],"p",{},"This is a 10-minute introduction to ",[342,343,344],"strong",{},"unitrack",", the PyTorch-native\nmulti-object tracking library. By the end of this notebook you will:",[347,348,349,363,366],"ul",{},[350,351,352,353,357,358,362],"li",{},"understand what a unitrack ",[354,355,356],"code",{},"Tracker"," ",[359,360,361],"em",{},"is"," (a pure step function),",[350,364,365],{},"build a minimal tracker that matches detections by appearance,",[350,367,368],{},"run it on a synthetic clip and visualize the resulting tracks.",[338,370,371],{},"Subsequent tutorials drill down into each part of the library:\nthe data model (notebook 2), the cost & gate zoos (3), the\ncomposable pipeline tree (4), state evolution and lifecycle (5),\nand a paper-style end-to-end reproduction (6).",[373,374,376],"h2",{"id":375},"what-is-a-tracker","What is a tracker?",[338,378,379,380,382,383,385],{},"A tracker associates ",[342,381,206],{}," (per-frame outputs of an object\ndetector) into ",[342,384,221],{}," (per-identity sequences over time).\nunitrack's central abstraction is:",[387,388,393],"pre",{"className":389,"code":391,"language":392},[390],"language-text","Tracker.step(snapshot, detections, ctx, next_id) → (snapshot', match, ids, next_id')\n","text",[354,394,391],{"__ignoreMap":395},"",[347,397,398,408,413,419],{},[350,399,400,403,404,407],{},[354,401,402],{},"snapshot"," is the ",[342,405,406],{},"current state"," of the tracker — a typed,\nimmutable record of every live tracklet's fields (id, status,\nage, kernel embedding, position, mask, …).",[350,409,410,412],{},[354,411,206],{}," is one frame's worth of new observations.",[350,414,415,418],{},[354,416,417],{},"ctx"," carries timing and stream-identity metadata.",[350,420,421,424],{},[354,422,423],{},"next_id"," is a counter passed in by the caller for assigning new\ntracklet IDs.",[338,426,427,428,431,432,435,436,438],{},"The tracker is a ",[342,429,430],{},"pure function",". It doesn't mutate its inputs;\nit returns a fresh snapshot. The convenience wrapper\n",[354,433,434],{},"MultiStream"," holds the snapshot for you, so you don't have to\nthread ",[354,437,423],{}," and the snapshot through every call.",[387,440,444],{"className":441,"code":442,"language":443,"meta":395,"style":395},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","# The full set of imports we'll use across this notebook.\nimport torch\nimport matplotlib.pyplot as plt\n\nimport unitrack\nfrom unitrack.assignment import Associate, Jonker\nfrom unitrack.costs import Cosine\nfrom unitrack.data import Detections, FrameContext, TensorSpec\nfrom unitrack.lifecycle import IncludeAll, NoLifecycle\nfrom unitrack.pipeline import Pipe\nfrom unitrack.states import FromDetectionField, Identity, Replace, State\n\ntorch.manual_seed(0)\nplt.rcParams[\"figure.figsize\"] = (6, 4)\n\n","python",[354,445,446,455,466,488,495,503,528,545,572,594,611,643,648,670],{"__ignoreMap":395},[447,448,451],"span",{"class":449,"line":450},"line",1,[447,452,454],{"class":453},"sutJx","# The full set of imports we'll use across this notebook.\n",[447,456,458,462],{"class":449,"line":457},2,[447,459,461],{"class":460},"sVHd0","import",[447,463,465],{"class":464},"su5hD"," torch\n",[447,467,469,471,474,478,482,485],{"class":449,"line":468},3,[447,470,461],{"class":460},[447,472,473],{"class":464}," matplotlib",[447,475,477],{"class":476},"sP7_E",".",[447,479,481],{"class":480},"skxfh","pyplot",[447,483,484],{"class":460}," as",[447,486,487],{"class":464}," plt\n",[447,489,491],{"class":449,"line":490},4,[447,492,494],{"emptyLinePlaceholder":493},true,"\n",[447,496,498,500],{"class":449,"line":497},5,[447,499,461],{"class":460},[447,501,502],{"class":464}," unitrack\n",[447,504,506,509,512,514,517,519,522,525],{"class":449,"line":505},6,[447,507,508],{"class":460},"from",[447,510,511],{"class":464}," unitrack",[447,513,477],{"class":476},[447,515,516],{"class":464},"assignment ",[447,518,461],{"class":460},[447,520,521],{"class":464}," Associate",[447,523,524],{"class":476},",",[447,526,527],{"class":464}," Jonker\n",[447,529,531,533,535,537,540,542],{"class":449,"line":530},7,[447,532,508],{"class":460},[447,534,511],{"class":464},[447,536,477],{"class":476},[447,538,539],{"class":464},"costs ",[447,541,461],{"class":460},[447,543,544],{"class":464}," Cosine\n",[447,546,548,550,552,554,557,559,562,564,567,569],{"class":449,"line":547},8,[447,549,508],{"class":460},[447,551,511],{"class":464},[447,553,477],{"class":476},[447,555,556],{"class":464},"data ",[447,558,461],{"class":460},[447,560,561],{"class":464}," Detections",[447,563,524],{"class":476},[447,565,566],{"class":464}," FrameContext",[447,568,524],{"class":476},[447,570,571],{"class":464}," TensorSpec\n",[447,573,575,577,579,581,584,586,589,591],{"class":449,"line":574},9,[447,576,508],{"class":460},[447,578,511],{"class":464},[447,580,477],{"class":476},[447,582,583],{"class":464},"lifecycle ",[447,585,461],{"class":460},[447,587,588],{"class":464}," IncludeAll",[447,590,524],{"class":476},[447,592,593],{"class":464}," NoLifecycle\n",[447,595,597,599,601,603,606,608],{"class":449,"line":596},10,[447,598,508],{"class":460},[447,600,511],{"class":464},[447,602,477],{"class":476},[447,604,605],{"class":464},"pipeline ",[447,607,461],{"class":460},[447,609,610],{"class":464}," Pipe\n",[447,612,614,616,618,620,623,625,628,630,633,635,638,640],{"class":449,"line":613},11,[447,615,508],{"class":460},[447,617,511],{"class":464},[447,619,477],{"class":476},[447,621,622],{"class":464},"states ",[447,624,461],{"class":460},[447,626,627],{"class":464}," FromDetectionField",[447,629,524],{"class":476},[447,631,632],{"class":464}," Identity",[447,634,524],{"class":476},[447,636,637],{"class":464}," Replace",[447,639,524],{"class":476},[447,641,642],{"class":464}," State\n",[447,644,646],{"class":449,"line":645},12,[447,647,494],{"emptyLinePlaceholder":493},[447,649,651,654,656,660,663,667],{"class":449,"line":650},13,[447,652,653],{"class":464},"torch",[447,655,477],{"class":476},[447,657,659],{"class":658},"slqww","manual_seed",[447,661,662],{"class":476},"(",[447,664,666],{"class":665},"srdBf","0",[447,668,669],{"class":476},")\n",[447,671,673,676,678,681,684,688,692,694,697,701,704,707,709,712],{"class":449,"line":672},14,[447,674,675],{"class":464},"plt",[447,677,477],{"class":476},[447,679,680],{"class":480},"rcParams",[447,682,683],{"class":476},"[",[447,685,687],{"class":686},"sjJ54","\"",[447,689,691],{"class":690},"s_sjI","figure.figsize",[447,693,687],{"class":686},[447,695,696],{"class":476},"]",[447,698,700],{"class":699},"smGrS"," =",[447,702,703],{"class":476}," (",[447,705,706],{"class":665},"6",[447,708,524],{"class":476},[447,710,711],{"class":665}," 4",[447,713,669],{"class":476},[373,715,717],{"id":716},"a-minimal-tracker","A minimal tracker",[338,719,720,721,477],{},"We'll build the simplest meaningful tracker: it matches detections\nacross frames by ",[342,722,723],{},"cosine similarity over a learned kernel embedding",[338,725,726],{},"The construction reads top-down like a recipe:",[347,728,729,751,765],{},[350,730,731,734,735,738,739,742,743,746,747,750],{},[342,732,733],{},"State",": each tracklet carries a ",[354,736,737],{},"kernel"," field (a 4-dim float\nvector). ",[354,740,741],{},"Identity"," means the predict step is a no-op (the\nembedding doesn't drift between frames). ",[354,744,745],{},"Replace"," means matched\ntracklets adopt the new detection's embedding. ",[354,748,749],{},"FromDetectionField","\nsays \"when a new tracklet is created, copy this field from the\ndetection that spawned it.\"",[350,752,753,756,757,760,761,764],{},[342,754,755],{},"Stage tree",": a single ",[354,758,759],{},"Pipe"," that computes a cosine-distance\ncost matrix and hands it to ",[354,762,763],{},"Associate",", which runs Jonker–Volgenant\nassignment with a 0.5 threshold.",[350,766,767,770,771,774,775,778],{},[342,768,769],{},"Lifecycle \u002F Visibility",": ",[354,772,773],{},"NoLifecycle"," (no Tentative→Active\ntransitions) and ",[354,776,777],{},"IncludeAll"," (every tracklet is visible to the\ncaller). The next tutorial introduces the proper lifecycle policy.",[387,780,782],{"className":441,"code":781,"language":443,"meta":395,"style":395},"tracker = unitrack.Tracker(\n    root=Pipe(cost=Cosine(\"kernel\"), assoc=Associate(Jonker(threshold=0.5))),\n    states={\n        \"kernel\": State(\n            schema=TensorSpec(shape=(4,), dtype=torch.float32),\n            process=Identity(\"kernel\"),\n            observation=Replace(\"kernel\"),\n            init=FromDetectionField(\"kernel\"),\n        ),\n        # `position` isn't used for matching here; we carry it on\n        # the snapshot so the visualization below has a 2D point\n        # to draw per tracklet.\n        \"position\": State(\n            schema=TensorSpec(shape=(2,), dtype=torch.float32),\n            process=Identity(\"position\"),\n            observation=Replace(\"position\"),\n            init=FromDetectionField(\"position\"),\n        ),\n    },\n    lifecycle=NoLifecycle(),\n    visibility=IncludeAll(),\n)\n\nms = unitrack.MultiStream(tracker)\nprint(tracker)\n\n",[354,783,784,801,856,866,883,923,942,961,980,985,990,995,1000,1015,1048,1067,1086,1105,1110,1116,1129,1141,1146,1151,1171],{"__ignoreMap":395},[447,785,786,789,792,794,796,798],{"class":449,"line":450},[447,787,788],{"class":464},"tracker ",[447,790,791],{"class":699},"=",[447,793,511],{"class":464},[447,795,477],{"class":476},[447,797,356],{"class":658},[447,799,800],{"class":476},"(\n",[447,802,803,807,809,811,813,815,817,820,822,824,826,828,831,834,836,838,840,843,845,848,850,853],{"class":449,"line":457},[447,804,806],{"class":805},"s99_P","    root",[447,808,791],{"class":699},[447,810,759],{"class":658},[447,812,662],{"class":476},[447,814,203],{"class":805},[447,816,791],{"class":699},[447,818,819],{"class":658},"Cosine",[447,821,662],{"class":476},[447,823,687],{"class":686},[447,825,737],{"class":690},[447,827,687],{"class":686},[447,829,830],{"class":476},"),",[447,832,833],{"class":805}," assoc",[447,835,791],{"class":699},[447,837,763],{"class":658},[447,839,662],{"class":476},[447,841,842],{"class":658},"Jonker",[447,844,662],{"class":476},[447,846,847],{"class":805},"threshold",[447,849,791],{"class":699},[447,851,852],{"class":665},"0.5",[447,854,855],{"class":476},"))),\n",[447,857,858,861,863],{"class":449,"line":468},[447,859,860],{"class":805},"    states",[447,862,791],{"class":699},[447,864,865],{"class":476},"{\n",[447,867,868,871,873,875,878,881],{"class":449,"line":490},[447,869,870],{"class":686},"        \"",[447,872,737],{"class":690},[447,874,687],{"class":686},[447,876,877],{"class":476},":",[447,879,880],{"class":658}," State",[447,882,800],{"class":476},[447,884,885,888,890,893,895,898,900,902,905,908,911,913,915,917,920],{"class":449,"line":497},[447,886,887],{"class":805},"            schema",[447,889,791],{"class":699},[447,891,892],{"class":658},"TensorSpec",[447,894,662],{"class":476},[447,896,897],{"class":805},"shape",[447,899,791],{"class":699},[447,901,662],{"class":476},[447,903,904],{"class":665},"4",[447,906,907],{"class":476},",),",[447,909,910],{"class":805}," dtype",[447,912,791],{"class":699},[447,914,653],{"class":658},[447,916,477],{"class":476},[447,918,919],{"class":480},"float32",[447,921,922],{"class":476},"),\n",[447,924,925,928,930,932,934,936,938,940],{"class":449,"line":505},[447,926,927],{"class":805},"            process",[447,929,791],{"class":699},[447,931,741],{"class":658},[447,933,662],{"class":476},[447,935,687],{"class":686},[447,937,737],{"class":690},[447,939,687],{"class":686},[447,941,922],{"class":476},[447,943,944,947,949,951,953,955,957,959],{"class":449,"line":530},[447,945,946],{"class":805},"            observation",[447,948,791],{"class":699},[447,950,745],{"class":658},[447,952,662],{"class":476},[447,954,687],{"class":686},[447,956,737],{"class":690},[447,958,687],{"class":686},[447,960,922],{"class":476},[447,962,963,966,968,970,972,974,976,978],{"class":449,"line":547},[447,964,965],{"class":805},"            init",[447,967,791],{"class":699},[447,969,749],{"class":658},[447,971,662],{"class":476},[447,973,687],{"class":686},[447,975,737],{"class":690},[447,977,687],{"class":686},[447,979,922],{"class":476},[447,981,982],{"class":449,"line":574},[447,983,984],{"class":476},"        ),\n",[447,986,987],{"class":449,"line":596},[447,988,989],{"class":453},"        # `position` isn't used for matching here; we carry it on\n",[447,991,992],{"class":449,"line":613},[447,993,994],{"class":453},"        # the snapshot so the visualization below has a 2D point\n",[447,996,997],{"class":449,"line":645},[447,998,999],{"class":453},"        # to draw per tracklet.\n",[447,1001,1002,1004,1007,1009,1011,1013],{"class":449,"line":650},[447,1003,870],{"class":686},[447,1005,1006],{"class":690},"position",[447,1008,687],{"class":686},[447,1010,877],{"class":476},[447,1012,880],{"class":658},[447,1014,800],{"class":476},[447,1016,1017,1019,1021,1023,1025,1027,1029,1031,1034,1036,1038,1040,1042,1044,1046],{"class":449,"line":672},[447,1018,887],{"class":805},[447,1020,791],{"class":699},[447,1022,892],{"class":658},[447,1024,662],{"class":476},[447,1026,897],{"class":805},[447,1028,791],{"class":699},[447,1030,662],{"class":476},[447,1032,1033],{"class":665},"2",[447,1035,907],{"class":476},[447,1037,910],{"class":805},[447,1039,791],{"class":699},[447,1041,653],{"class":658},[447,1043,477],{"class":476},[447,1045,919],{"class":480},[447,1047,922],{"class":476},[447,1049,1051,1053,1055,1057,1059,1061,1063,1065],{"class":449,"line":1050},15,[447,1052,927],{"class":805},[447,1054,791],{"class":699},[447,1056,741],{"class":658},[447,1058,662],{"class":476},[447,1060,687],{"class":686},[447,1062,1006],{"class":690},[447,1064,687],{"class":686},[447,1066,922],{"class":476},[447,1068,1070,1072,1074,1076,1078,1080,1082,1084],{"class":449,"line":1069},16,[447,1071,946],{"class":805},[447,1073,791],{"class":699},[447,1075,745],{"class":658},[447,1077,662],{"class":476},[447,1079,687],{"class":686},[447,1081,1006],{"class":690},[447,1083,687],{"class":686},[447,1085,922],{"class":476},[447,1087,1089,1091,1093,1095,1097,1099,1101,1103],{"class":449,"line":1088},17,[447,1090,965],{"class":805},[447,1092,791],{"class":699},[447,1094,749],{"class":658},[447,1096,662],{"class":476},[447,1098,687],{"class":686},[447,1100,1006],{"class":690},[447,1102,687],{"class":686},[447,1104,922],{"class":476},[447,1106,1108],{"class":449,"line":1107},18,[447,1109,984],{"class":476},[447,1111,1113],{"class":449,"line":1112},19,[447,1114,1115],{"class":476},"    },\n",[447,1117,1119,1122,1124,1126],{"class":449,"line":1118},20,[447,1120,1121],{"class":805},"    lifecycle",[447,1123,791],{"class":699},[447,1125,773],{"class":658},[447,1127,1128],{"class":476},"(),\n",[447,1130,1132,1135,1137,1139],{"class":449,"line":1131},21,[447,1133,1134],{"class":805},"    visibility",[447,1136,791],{"class":699},[447,1138,777],{"class":658},[447,1140,1128],{"class":476},[447,1142,1144],{"class":449,"line":1143},22,[447,1145,669],{"class":476},[447,1147,1149],{"class":449,"line":1148},23,[447,1150,494],{"emptyLinePlaceholder":493},[447,1152,1154,1157,1159,1161,1163,1165,1167,1169],{"class":449,"line":1153},24,[447,1155,1156],{"class":464},"ms ",[447,1158,791],{"class":699},[447,1160,511],{"class":464},[447,1162,477],{"class":476},[447,1164,434],{"class":658},[447,1166,662],{"class":476},[447,1168,173],{"class":658},[447,1170,669],{"class":476},[447,1172,1174,1178,1180,1182],{"class":449,"line":1173},25,[447,1175,1177],{"class":1176},"sptTA","print",[447,1179,662],{"class":476},[447,1181,173],{"class":658},[447,1183,669],{"class":476},[1185,1186],"docyard-notebook-output",{"data":1187,"kind":1188},"PHVuaXRyYWNrLnRyYWNrZXIudHJhY2tlci5UcmFja2VyIG9iamVjdCBhdCAweDc0MTA2MTVhNjcxMD4K","stream",[373,1190,1192],{"id":1191},"a-tiny-synthetic-clip","A tiny synthetic clip",[338,1194,1195,1196,1199],{},"We'll generate three \"ground-truth\" objects, each with a unique\nkernel embedding plus a 2D position that drifts at constant velocity.\nAcross frames the detection order is ",[342,1197,1198],{},"shuffled"," so the tracker\ncan't trivially exploit row alignment — it has to use the kernel\nembedding to reassociate.",[387,1201,1203],{"className":441,"code":1202,"language":443,"meta":395,"style":395},"N_FRAMES, N_OBJS, K_DIM = 8, 3, 4\n\n# Per-identity ground truth.\nkernels = torch.randn(N_OBJS, K_DIM)\nkernels = kernels \u002F kernels.norm(dim=-1, keepdim=True)\npositions = torch.tensor([[20.0, 50.0], [100.0, 30.0], [180.0, 80.0]])\nvelocities = torch.tensor([[3.0, 1.0], [-1.0, 2.0], [-2.0, -1.0]])\n\nclip = []\ngt_per_frame = []\nfor k in range(N_FRAMES):\n    order = torch.randperm(N_OBJS)\n    gt_per_frame.append(order)\n\n    kernel_obs = kernels[order] + 0.02 * torch.randn(N_OBJS, K_DIM)\n    kernel_obs = kernel_obs \u002F kernel_obs.norm(dim=-1, keepdim=True)\n    pos_obs = positions[order] + k * velocities[order]\n\n    clip.append(\n        Detections(\n            index=torch.arange(N_OBJS, dtype=torch.int64),\n            kernel=kernel_obs.float(),\n            position=pos_obs.float(),\n            batch_size=[N_OBJS],\n        )\n    )\ngt_per_frame = torch.stack(gt_per_frame)\nprint(f\"Generated {N_FRAMES} frames of {N_OBJS} detections each.\")\n\n",[354,1204,1205,1236,1240,1245,1271,1314,1368,1424,1428,1438,1447,1468,1488,1505,1509,1549,1585,1618,1622,1633,1640,1673,1690,1706,1720,1725,1731,1752],{"__ignoreMap":395},[447,1206,1207,1211,1213,1216,1218,1221,1223,1226,1228,1231,1233],{"class":449,"line":450},[447,1208,1210],{"class":1209},"s_hVV","N_FRAMES",[447,1212,524],{"class":476},[447,1214,1215],{"class":1209}," N_OBJS",[447,1217,524],{"class":476},[447,1219,1220],{"class":1209}," K_DIM",[447,1222,700],{"class":699},[447,1224,1225],{"class":665}," 8",[447,1227,524],{"class":476},[447,1229,1230],{"class":665}," 3",[447,1232,524],{"class":476},[447,1234,1235],{"class":665}," 4\n",[447,1237,1238],{"class":449,"line":457},[447,1239,494],{"emptyLinePlaceholder":493},[447,1241,1242],{"class":449,"line":468},[447,1243,1244],{"class":453},"# Per-identity ground truth.\n",[447,1246,1247,1250,1252,1255,1257,1260,1262,1265,1267,1269],{"class":449,"line":490},[447,1248,1249],{"class":464},"kernels ",[447,1251,791],{"class":699},[447,1253,1254],{"class":464}," torch",[447,1256,477],{"class":476},[447,1258,1259],{"class":658},"randn",[447,1261,662],{"class":476},[447,1263,1264],{"class":1176},"N_OBJS",[447,1266,524],{"class":476},[447,1268,1220],{"class":1176},[447,1270,669],{"class":476},[447,1272,1273,1275,1277,1280,1282,1285,1287,1290,1292,1295,1298,1301,1303,1306,1308,1312],{"class":449,"line":497},[447,1274,1249],{"class":464},[447,1276,791],{"class":699},[447,1278,1279],{"class":464}," kernels ",[447,1281,124],{"class":699},[447,1283,1284],{"class":464}," kernels",[447,1286,477],{"class":476},[447,1288,1289],{"class":658},"norm",[447,1291,662],{"class":476},[447,1293,1294],{"class":805},"dim",[447,1296,1297],{"class":699},"=-",[447,1299,1300],{"class":665},"1",[447,1302,524],{"class":476},[447,1304,1305],{"class":805}," keepdim",[447,1307,791],{"class":699},[447,1309,1311],{"class":1310},"s39Yj","True",[447,1313,669],{"class":476},[447,1315,1316,1319,1321,1323,1325,1328,1331,1334,1336,1339,1342,1345,1348,1350,1353,1355,1357,1360,1362,1365],{"class":449,"line":505},[447,1317,1318],{"class":464},"positions ",[447,1320,791],{"class":699},[447,1322,1254],{"class":464},[447,1324,477],{"class":476},[447,1326,1327],{"class":658},"tensor",[447,1329,1330],{"class":476},"([[",[447,1332,1333],{"class":665},"20.0",[447,1335,524],{"class":476},[447,1337,1338],{"class":665}," 50.0",[447,1340,1341],{"class":476},"],",[447,1343,1344],{"class":476}," [",[447,1346,1347],{"class":665},"100.0",[447,1349,524],{"class":476},[447,1351,1352],{"class":665}," 30.0",[447,1354,1341],{"class":476},[447,1356,1344],{"class":476},[447,1358,1359],{"class":665},"180.0",[447,1361,524],{"class":476},[447,1363,1364],{"class":665}," 80.0",[447,1366,1367],{"class":476},"]])\n",[447,1369,1370,1373,1375,1377,1379,1381,1383,1386,1388,1391,1393,1395,1398,1401,1403,1406,1408,1410,1412,1415,1417,1420,1422],{"class":449,"line":530},[447,1371,1372],{"class":464},"velocities ",[447,1374,791],{"class":699},[447,1376,1254],{"class":464},[447,1378,477],{"class":476},[447,1380,1327],{"class":658},[447,1382,1330],{"class":476},[447,1384,1385],{"class":665},"3.0",[447,1387,524],{"class":476},[447,1389,1390],{"class":665}," 1.0",[447,1392,1341],{"class":476},[447,1394,1344],{"class":476},[447,1396,1397],{"class":699},"-",[447,1399,1400],{"class":665},"1.0",[447,1402,524],{"class":476},[447,1404,1405],{"class":665}," 2.0",[447,1407,1341],{"class":476},[447,1409,1344],{"class":476},[447,1411,1397],{"class":699},[447,1413,1414],{"class":665},"2.0",[447,1416,524],{"class":476},[447,1418,1419],{"class":699}," -",[447,1421,1400],{"class":665},[447,1423,1367],{"class":476},[447,1425,1426],{"class":449,"line":547},[447,1427,494],{"emptyLinePlaceholder":493},[447,1429,1430,1433,1435],{"class":449,"line":574},[447,1431,1432],{"class":464},"clip ",[447,1434,791],{"class":699},[447,1436,1437],{"class":476}," []\n",[447,1439,1440,1443,1445],{"class":449,"line":596},[447,1441,1442],{"class":464},"gt_per_frame ",[447,1444,791],{"class":699},[447,1446,1437],{"class":476},[447,1448,1449,1452,1455,1458,1461,1463,1465],{"class":449,"line":613},[447,1450,1451],{"class":460},"for",[447,1453,1454],{"class":464}," k ",[447,1456,1457],{"class":460},"in",[447,1459,1460],{"class":1176}," range",[447,1462,662],{"class":476},[447,1464,1210],{"class":1176},[447,1466,1467],{"class":476},"):\n",[447,1469,1470,1473,1475,1477,1479,1482,1484,1486],{"class":449,"line":645},[447,1471,1472],{"class":464},"    order ",[447,1474,791],{"class":699},[447,1476,1254],{"class":464},[447,1478,477],{"class":476},[447,1480,1481],{"class":658},"randperm",[447,1483,662],{"class":476},[447,1485,1264],{"class":1176},[447,1487,669],{"class":476},[447,1489,1490,1493,1495,1498,1500,1503],{"class":449,"line":650},[447,1491,1492],{"class":464},"    gt_per_frame",[447,1494,477],{"class":476},[447,1496,1497],{"class":658},"append",[447,1499,662],{"class":476},[447,1501,1502],{"class":658},"order",[447,1504,669],{"class":476},[447,1506,1507],{"class":449,"line":672},[447,1508,494],{"emptyLinePlaceholder":493},[447,1510,1511,1514,1516,1518,1520,1522,1524,1527,1530,1533,1535,1537,1539,1541,1543,1545,1547],{"class":449,"line":1050},[447,1512,1513],{"class":464},"    kernel_obs ",[447,1515,791],{"class":699},[447,1517,1284],{"class":464},[447,1519,683],{"class":476},[447,1521,1502],{"class":464},[447,1523,696],{"class":476},[447,1525,1526],{"class":699}," +",[447,1528,1529],{"class":665}," 0.02",[447,1531,1532],{"class":699}," *",[447,1534,1254],{"class":464},[447,1536,477],{"class":476},[447,1538,1259],{"class":658},[447,1540,662],{"class":476},[447,1542,1264],{"class":1176},[447,1544,524],{"class":476},[447,1546,1220],{"class":1176},[447,1548,669],{"class":476},[447,1550,1551,1553,1555,1558,1560,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583],{"class":449,"line":1069},[447,1552,1513],{"class":464},[447,1554,791],{"class":699},[447,1556,1557],{"class":464}," kernel_obs ",[447,1559,124],{"class":699},[447,1561,1562],{"class":464}," kernel_obs",[447,1564,477],{"class":476},[447,1566,1289],{"class":658},[447,1568,662],{"class":476},[447,1570,1294],{"class":805},[447,1572,1297],{"class":699},[447,1574,1300],{"class":665},[447,1576,524],{"class":476},[447,1578,1305],{"class":805},[447,1580,791],{"class":699},[447,1582,1311],{"class":1310},[447,1584,669],{"class":476},[447,1586,1587,1590,1592,1595,1597,1599,1601,1603,1605,1608,1611,1613,1615],{"class":449,"line":1088},[447,1588,1589],{"class":464},"    pos_obs ",[447,1591,791],{"class":699},[447,1593,1594],{"class":464}," positions",[447,1596,683],{"class":476},[447,1598,1502],{"class":464},[447,1600,696],{"class":476},[447,1602,1526],{"class":699},[447,1604,1454],{"class":464},[447,1606,1607],{"class":699},"*",[447,1609,1610],{"class":464}," velocities",[447,1612,683],{"class":476},[447,1614,1502],{"class":464},[447,1616,1617],{"class":476},"]\n",[447,1619,1620],{"class":449,"line":1107},[447,1621,494],{"emptyLinePlaceholder":493},[447,1623,1624,1627,1629,1631],{"class":449,"line":1112},[447,1625,1626],{"class":464},"    clip",[447,1628,477],{"class":476},[447,1630,1497],{"class":658},[447,1632,800],{"class":476},[447,1634,1635,1638],{"class":449,"line":1118},[447,1636,1637],{"class":658},"        Detections",[447,1639,800],{"class":476},[447,1641,1642,1645,1647,1649,1651,1654,1656,1658,1660,1662,1664,1666,1668,1671],{"class":449,"line":1131},[447,1643,1644],{"class":805},"            index",[447,1646,791],{"class":699},[447,1648,653],{"class":658},[447,1650,477],{"class":476},[447,1652,1653],{"class":658},"arange",[447,1655,662],{"class":476},[447,1657,1264],{"class":1176},[447,1659,524],{"class":476},[447,1661,910],{"class":805},[447,1663,791],{"class":699},[447,1665,653],{"class":658},[447,1667,477],{"class":476},[447,1669,1670],{"class":480},"int64",[447,1672,922],{"class":476},[447,1674,1675,1678,1680,1683,1685,1688],{"class":449,"line":1143},[447,1676,1677],{"class":805},"            kernel",[447,1679,791],{"class":699},[447,1681,1682],{"class":658},"kernel_obs",[447,1684,477],{"class":476},[447,1686,1687],{"class":658},"float",[447,1689,1128],{"class":476},[447,1691,1692,1695,1697,1700,1702,1704],{"class":449,"line":1148},[447,1693,1694],{"class":805},"            position",[447,1696,791],{"class":699},[447,1698,1699],{"class":658},"pos_obs",[447,1701,477],{"class":476},[447,1703,1687],{"class":658},[447,1705,1128],{"class":476},[447,1707,1708,1711,1713,1715,1717],{"class":449,"line":1153},[447,1709,1710],{"class":805},"            batch_size",[447,1712,791],{"class":699},[447,1714,683],{"class":476},[447,1716,1264],{"class":1176},[447,1718,1719],{"class":476},"],\n",[447,1721,1722],{"class":449,"line":1173},[447,1723,1724],{"class":476},"        )\n",[447,1726,1728],{"class":449,"line":1727},26,[447,1729,1730],{"class":476},"    )\n",[447,1732,1734,1736,1738,1740,1742,1745,1747,1750],{"class":449,"line":1733},27,[447,1735,1442],{"class":464},[447,1737,791],{"class":699},[447,1739,1254],{"class":464},[447,1741,477],{"class":476},[447,1743,1744],{"class":658},"stack",[447,1746,662],{"class":476},[447,1748,1749],{"class":658},"gt_per_frame",[447,1751,669],{"class":476},[447,1753,1755,1757,1759,1763,1766,1769,1771,1774,1777,1779,1781,1783,1786],{"class":449,"line":1754},28,[447,1756,1177],{"class":1176},[447,1758,662],{"class":476},[447,1760,1762],{"class":1761},"sbsja","f",[447,1764,1765],{"class":690},"\"Generated ",[447,1767,1768],{"class":665},"{",[447,1770,1210],{"class":1176},[447,1772,1773],{"class":665},"}",[447,1775,1776],{"class":690}," frames of ",[447,1778,1768],{"class":665},[447,1780,1264],{"class":1176},[447,1782,1773],{"class":665},[447,1784,1785],{"class":690}," detections each.\"",[447,1787,669],{"class":476},[1185,1789],{"data":1790,"kind":1188},"R2VuZXJhdGVkIDggZnJhbWVzIG9mIDMgZGV0ZWN0aW9ucyBlYWNoLgo=",[338,1792,1793,1794,1797,1798,1800,1801,1803,1804,1806,1807,1810],{},"Note ",[354,1795,1796],{},"Detections"," accepts arbitrary user fields (",[354,1799,737],{},", ",[354,1802,1006],{},")\nbeyond its single reserved field ",[354,1805,125],{},". The same is true of\n",[354,1808,1809],{},"Tracklets",". unitrack's typed-record story is intentionally\npermissive about user fields so you can plug in whatever your\ndetector emits — kernels, masks, depth, classes, scores, …",[373,1812,1814],{"id":1813},"what-does-the-clip-look-like","What does the clip look like?",[338,1816,1817,1818,1821],{},"Before we track anything, let's ",[359,1819,1820],{},"see"," what we just generated —\nthe two cues the tracker will rely on:",[347,1823,1824,1830],{},[350,1825,1826,1829],{},[342,1827,1828],{},"Left (2D motion)",": each object's ground-truth position over\nthe eight frames. This is the world the tracker observes,\nmodulo per-frame shuffling.",[350,1831,1832,1835],{},[342,1833,1834],{},"Right (appearance space)",": the cosine similarity between the\nthree identities' kernel embeddings. The near-identity matrix\n(1 on the diagonal, ≈0 off it) is exactly what lets the cosine\ncost tell the objects apart even when their positions cross.",[387,1837,1839],{"className":441,"code":1838,"language":443,"meta":395,"style":395},"fig, (ax_pos, ax_emb) = plt.subplots(1, 2, figsize=(11, 4))\ncmap = plt.get_cmap(\"tab10\")\n\n# (left) ground-truth motion: where each identity actually is.\nfor o in range(N_OBJS):\n    track = torch.stack([positions[o] + k * velocities[o] for k in range(N_FRAMES)])\n    ax_pos.plot(track[:, 0], track[:, 1], \"-\", color=cmap(o), alpha=0.4)\n    ax_pos.scatter(\n        track[:, 0],\n        track[:, 1],\n        color=cmap(o),\n        s=25,\n        edgecolor=\"black\",\n        linewidth=0.4,\n        label=f\"object {o}\",\n    )\n    ax_pos.scatter(\n        track[0, 0],\n        track[0, 1],\n        color=cmap(o),\n        s=160,\n        marker=\"*\",\n        edgecolor=\"black\",\n        zorder=3,\n    )\nax_pos.set_title(\"Ground-truth motion in 2D (★ = frame 0)\")\nax_pos.set_xlabel(\"x\")\nax_pos.set_ylabel(\"y\")\nax_pos.legend(fontsize=8)\nax_pos.grid(alpha=0.3)\n\n# (right) appearance space: cosine similarity between identity kernels.\nsim = kernels @ kernels.T\nim = ax_emb.imshow(sim.numpy(), cmap=\"viridis\", vmin=-1, vmax=1)\nax_emb.set_title(\"Appearance space: kernel cosine similarity\")\nax_emb.set_xlabel(\"object\")\nax_emb.set_ylabel(\"object\")\nax_emb.set_xticks(range(N_OBJS))\nax_emb.set_yticks(range(N_OBJS))\nfor i in range(N_OBJS):\n    for j in range(N_OBJS):\n        ax_emb.text(\n            j,\n            i,\n            f\"{sim[i, j]:.2f}\",\n            ha=\"center\",\n            va=\"center\",\n            color=\"white\",\n            fontsize=9,\n        )\nfig.colorbar(im, ax=ax_emb, fraction=0.046)\nplt.tight_layout()\nplt.show()\n\n",[354,1840,1841,1899,1924,1928,1933,1950,2006,2072,2083,2094,2104,2119,2132,2148,2159,2181,2185,2195,2209,2223,2237,2248,2263,2277,2289,2293,2313,2333,2353,2375,2397,2402,2408,2428,2488,2509,2529,2548,2569,2589,2607,2626,2638,2646,2654,2687,2704,2720,2737,2750,2755,2791,2804],{"__ignoreMap":395},[447,1842,1843,1846,1848,1850,1853,1855,1858,1861,1863,1866,1868,1871,1873,1875,1877,1880,1882,1885,1887,1889,1892,1894,1896],{"class":449,"line":450},[447,1844,1845],{"class":464},"fig",[447,1847,524],{"class":476},[447,1849,703],{"class":476},[447,1851,1852],{"class":464},"ax_pos",[447,1854,524],{"class":476},[447,1856,1857],{"class":464}," ax_emb",[447,1859,1860],{"class":476},")",[447,1862,700],{"class":699},[447,1864,1865],{"class":464}," plt",[447,1867,477],{"class":476},[447,1869,1870],{"class":658},"subplots",[447,1872,662],{"class":476},[447,1874,1300],{"class":665},[447,1876,524],{"class":476},[447,1878,1879],{"class":665}," 2",[447,1881,524],{"class":476},[447,1883,1884],{"class":805}," figsize",[447,1886,791],{"class":699},[447,1888,662],{"class":476},[447,1890,1891],{"class":665},"11",[447,1893,524],{"class":476},[447,1895,711],{"class":665},[447,1897,1898],{"class":476},"))\n",[447,1900,1901,1904,1906,1908,1910,1913,1915,1917,1920,1922],{"class":449,"line":457},[447,1902,1903],{"class":464},"cmap ",[447,1905,791],{"class":699},[447,1907,1865],{"class":464},[447,1909,477],{"class":476},[447,1911,1912],{"class":658},"get_cmap",[447,1914,662],{"class":476},[447,1916,687],{"class":686},[447,1918,1919],{"class":690},"tab10",[447,1921,687],{"class":686},[447,1923,669],{"class":476},[447,1925,1926],{"class":449,"line":468},[447,1927,494],{"emptyLinePlaceholder":493},[447,1929,1930],{"class":449,"line":490},[447,1931,1932],{"class":453},"# (left) ground-truth motion: where each identity actually is.\n",[447,1934,1935,1937,1940,1942,1944,1946,1948],{"class":449,"line":497},[447,1936,1451],{"class":460},[447,1938,1939],{"class":464}," o ",[447,1941,1457],{"class":460},[447,1943,1460],{"class":1176},[447,1945,662],{"class":476},[447,1947,1264],{"class":1176},[447,1949,1467],{"class":476},[447,1951,1952,1955,1957,1959,1961,1963,1966,1969,1971,1974,1976,1978,1980,1982,1984,1986,1988,1990,1993,1995,1997,1999,2001,2003],{"class":449,"line":505},[447,1953,1954],{"class":464},"    track ",[447,1956,791],{"class":699},[447,1958,1254],{"class":464},[447,1960,477],{"class":476},[447,1962,1744],{"class":658},[447,1964,1965],{"class":476},"([",[447,1967,1968],{"class":658},"positions",[447,1970,683],{"class":476},[447,1972,1973],{"class":658},"o",[447,1975,696],{"class":476},[447,1977,1526],{"class":699},[447,1979,1454],{"class":658},[447,1981,1607],{"class":699},[447,1983,1610],{"class":658},[447,1985,683],{"class":476},[447,1987,1973],{"class":658},[447,1989,696],{"class":476},[447,1991,1992],{"class":460}," for",[447,1994,1454],{"class":658},[447,1996,1457],{"class":460},[447,1998,1460],{"class":1176},[447,2000,662],{"class":476},[447,2002,1210],{"class":1176},[447,2004,2005],{"class":476},")])\n",[447,2007,2008,2011,2013,2016,2018,2021,2024,2027,2029,2032,2034,2037,2039,2042,2044,2046,2048,2051,2053,2056,2058,2060,2062,2065,2067,2070],{"class":449,"line":530},[447,2009,2010],{"class":464},"    ax_pos",[447,2012,477],{"class":476},[447,2014,2015],{"class":658},"plot",[447,2017,662],{"class":476},[447,2019,2020],{"class":658},"track",[447,2022,2023],{"class":476},"[:,",[447,2025,2026],{"class":665}," 0",[447,2028,1341],{"class":476},[447,2030,2031],{"class":658}," track",[447,2033,2023],{"class":476},[447,2035,2036],{"class":665}," 1",[447,2038,1341],{"class":476},[447,2040,2041],{"class":686}," \"",[447,2043,1397],{"class":690},[447,2045,687],{"class":686},[447,2047,524],{"class":476},[447,2049,2050],{"class":805}," color",[447,2052,791],{"class":699},[447,2054,2055],{"class":658},"cmap",[447,2057,662],{"class":476},[447,2059,1973],{"class":658},[447,2061,830],{"class":476},[447,2063,2064],{"class":805}," alpha",[447,2066,791],{"class":699},[447,2068,2069],{"class":665},"0.4",[447,2071,669],{"class":476},[447,2073,2074,2076,2078,2081],{"class":449,"line":547},[447,2075,2010],{"class":464},[447,2077,477],{"class":476},[447,2079,2080],{"class":658},"scatter",[447,2082,800],{"class":476},[447,2084,2085,2088,2090,2092],{"class":449,"line":574},[447,2086,2087],{"class":658},"        track",[447,2089,2023],{"class":476},[447,2091,2026],{"class":665},[447,2093,1719],{"class":476},[447,2095,2096,2098,2100,2102],{"class":449,"line":596},[447,2097,2087],{"class":658},[447,2099,2023],{"class":476},[447,2101,2036],{"class":665},[447,2103,1719],{"class":476},[447,2105,2106,2109,2111,2113,2115,2117],{"class":449,"line":613},[447,2107,2108],{"class":805},"        color",[447,2110,791],{"class":699},[447,2112,2055],{"class":658},[447,2114,662],{"class":476},[447,2116,1973],{"class":658},[447,2118,922],{"class":476},[447,2120,2121,2124,2126,2129],{"class":449,"line":645},[447,2122,2123],{"class":805},"        s",[447,2125,791],{"class":699},[447,2127,2128],{"class":665},"25",[447,2130,2131],{"class":476},",\n",[447,2133,2134,2137,2139,2141,2144,2146],{"class":449,"line":650},[447,2135,2136],{"class":805},"        edgecolor",[447,2138,791],{"class":699},[447,2140,687],{"class":686},[447,2142,2143],{"class":690},"black",[447,2145,687],{"class":686},[447,2147,2131],{"class":476},[447,2149,2150,2153,2155,2157],{"class":449,"line":672},[447,2151,2152],{"class":805},"        linewidth",[447,2154,791],{"class":699},[447,2156,2069],{"class":665},[447,2158,2131],{"class":476},[447,2160,2161,2164,2166,2168,2171,2173,2175,2177,2179],{"class":449,"line":1050},[447,2162,2163],{"class":805},"        label",[447,2165,791],{"class":699},[447,2167,1762],{"class":1761},[447,2169,2170],{"class":690},"\"object ",[447,2172,1768],{"class":665},[447,2174,1973],{"class":658},[447,2176,1773],{"class":665},[447,2178,687],{"class":690},[447,2180,2131],{"class":476},[447,2182,2183],{"class":449,"line":1069},[447,2184,1730],{"class":476},[447,2186,2187,2189,2191,2193],{"class":449,"line":1088},[447,2188,2010],{"class":464},[447,2190,477],{"class":476},[447,2192,2080],{"class":658},[447,2194,800],{"class":476},[447,2196,2197,2199,2201,2203,2205,2207],{"class":449,"line":1107},[447,2198,2087],{"class":658},[447,2200,683],{"class":476},[447,2202,666],{"class":665},[447,2204,524],{"class":476},[447,2206,2026],{"class":665},[447,2208,1719],{"class":476},[447,2210,2211,2213,2215,2217,2219,2221],{"class":449,"line":1112},[447,2212,2087],{"class":658},[447,2214,683],{"class":476},[447,2216,666],{"class":665},[447,2218,524],{"class":476},[447,2220,2036],{"class":665},[447,2222,1719],{"class":476},[447,2224,2225,2227,2229,2231,2233,2235],{"class":449,"line":1118},[447,2226,2108],{"class":805},[447,2228,791],{"class":699},[447,2230,2055],{"class":658},[447,2232,662],{"class":476},[447,2234,1973],{"class":658},[447,2236,922],{"class":476},[447,2238,2239,2241,2243,2246],{"class":449,"line":1131},[447,2240,2123],{"class":805},[447,2242,791],{"class":699},[447,2244,2245],{"class":665},"160",[447,2247,2131],{"class":476},[447,2249,2250,2253,2255,2257,2259,2261],{"class":449,"line":1143},[447,2251,2252],{"class":805},"        marker",[447,2254,791],{"class":699},[447,2256,687],{"class":686},[447,2258,1607],{"class":690},[447,2260,687],{"class":686},[447,2262,2131],{"class":476},[447,2264,2265,2267,2269,2271,2273,2275],{"class":449,"line":1148},[447,2266,2136],{"class":805},[447,2268,791],{"class":699},[447,2270,687],{"class":686},[447,2272,2143],{"class":690},[447,2274,687],{"class":686},[447,2276,2131],{"class":476},[447,2278,2279,2282,2284,2287],{"class":449,"line":1153},[447,2280,2281],{"class":805},"        zorder",[447,2283,791],{"class":699},[447,2285,2286],{"class":665},"3",[447,2288,2131],{"class":476},[447,2290,2291],{"class":449,"line":1173},[447,2292,1730],{"class":476},[447,2294,2295,2297,2299,2302,2304,2306,2309,2311],{"class":449,"line":1727},[447,2296,1852],{"class":464},[447,2298,477],{"class":476},[447,2300,2301],{"class":658},"set_title",[447,2303,662],{"class":476},[447,2305,687],{"class":686},[447,2307,2308],{"class":690},"Ground-truth motion in 2D (★ = frame 0)",[447,2310,687],{"class":686},[447,2312,669],{"class":476},[447,2314,2315,2317,2319,2322,2324,2326,2329,2331],{"class":449,"line":1733},[447,2316,1852],{"class":464},[447,2318,477],{"class":476},[447,2320,2321],{"class":658},"set_xlabel",[447,2323,662],{"class":476},[447,2325,687],{"class":686},[447,2327,2328],{"class":690},"x",[447,2330,687],{"class":686},[447,2332,669],{"class":476},[447,2334,2335,2337,2339,2342,2344,2346,2349,2351],{"class":449,"line":1754},[447,2336,1852],{"class":464},[447,2338,477],{"class":476},[447,2340,2341],{"class":658},"set_ylabel",[447,2343,662],{"class":476},[447,2345,687],{"class":686},[447,2347,2348],{"class":690},"y",[447,2350,687],{"class":686},[447,2352,669],{"class":476},[447,2354,2356,2358,2360,2363,2365,2368,2370,2373],{"class":449,"line":2355},29,[447,2357,1852],{"class":464},[447,2359,477],{"class":476},[447,2361,2362],{"class":658},"legend",[447,2364,662],{"class":476},[447,2366,2367],{"class":805},"fontsize",[447,2369,791],{"class":699},[447,2371,2372],{"class":665},"8",[447,2374,669],{"class":476},[447,2376,2378,2380,2382,2385,2387,2390,2392,2395],{"class":449,"line":2377},30,[447,2379,1852],{"class":464},[447,2381,477],{"class":476},[447,2383,2384],{"class":658},"grid",[447,2386,662],{"class":476},[447,2388,2389],{"class":805},"alpha",[447,2391,791],{"class":699},[447,2393,2394],{"class":665},"0.3",[447,2396,669],{"class":476},[447,2398,2400],{"class":449,"line":2399},31,[447,2401,494],{"emptyLinePlaceholder":493},[447,2403,2405],{"class":449,"line":2404},32,[447,2406,2407],{"class":453},"# (right) appearance space: cosine similarity between identity kernels.\n",[447,2409,2411,2414,2416,2418,2421,2423,2425],{"class":449,"line":2410},33,[447,2412,2413],{"class":464},"sim ",[447,2415,791],{"class":699},[447,2417,1279],{"class":464},[447,2419,2420],{"class":699},"@",[447,2422,1284],{"class":464},[447,2424,477],{"class":476},[447,2426,2427],{"class":480},"T\n",[447,2429,2431,2434,2436,2438,2440,2443,2445,2448,2450,2453,2456,2459,2461,2463,2466,2468,2470,2473,2475,2477,2479,2482,2484,2486],{"class":449,"line":2430},34,[447,2432,2433],{"class":464},"im ",[447,2435,791],{"class":699},[447,2437,1857],{"class":464},[447,2439,477],{"class":476},[447,2441,2442],{"class":658},"imshow",[447,2444,662],{"class":476},[447,2446,2447],{"class":658},"sim",[447,2449,477],{"class":476},[447,2451,2452],{"class":658},"numpy",[447,2454,2455],{"class":476},"(),",[447,2457,2458],{"class":805}," cmap",[447,2460,791],{"class":699},[447,2462,687],{"class":686},[447,2464,2465],{"class":690},"viridis",[447,2467,687],{"class":686},[447,2469,524],{"class":476},[447,2471,2472],{"class":805}," vmin",[447,2474,1297],{"class":699},[447,2476,1300],{"class":665},[447,2478,524],{"class":476},[447,2480,2481],{"class":805}," vmax",[447,2483,791],{"class":699},[447,2485,1300],{"class":665},[447,2487,669],{"class":476},[447,2489,2491,2494,2496,2498,2500,2502,2505,2507],{"class":449,"line":2490},35,[447,2492,2493],{"class":464},"ax_emb",[447,2495,477],{"class":476},[447,2497,2301],{"class":658},[447,2499,662],{"class":476},[447,2501,687],{"class":686},[447,2503,2504],{"class":690},"Appearance space: kernel cosine similarity",[447,2506,687],{"class":686},[447,2508,669],{"class":476},[447,2510,2512,2514,2516,2518,2520,2522,2525,2527],{"class":449,"line":2511},36,[447,2513,2493],{"class":464},[447,2515,477],{"class":476},[447,2517,2321],{"class":658},[447,2519,662],{"class":476},[447,2521,687],{"class":686},[447,2523,2524],{"class":690},"object",[447,2526,687],{"class":686},[447,2528,669],{"class":476},[447,2530,2532,2534,2536,2538,2540,2542,2544,2546],{"class":449,"line":2531},37,[447,2533,2493],{"class":464},[447,2535,477],{"class":476},[447,2537,2341],{"class":658},[447,2539,662],{"class":476},[447,2541,687],{"class":686},[447,2543,2524],{"class":690},[447,2545,687],{"class":686},[447,2547,669],{"class":476},[447,2549,2551,2553,2555,2558,2560,2563,2565,2567],{"class":449,"line":2550},38,[447,2552,2493],{"class":464},[447,2554,477],{"class":476},[447,2556,2557],{"class":658},"set_xticks",[447,2559,662],{"class":476},[447,2561,2562],{"class":1176},"range",[447,2564,662],{"class":476},[447,2566,1264],{"class":1176},[447,2568,1898],{"class":476},[447,2570,2572,2574,2576,2579,2581,2583,2585,2587],{"class":449,"line":2571},39,[447,2573,2493],{"class":464},[447,2575,477],{"class":476},[447,2577,2578],{"class":658},"set_yticks",[447,2580,662],{"class":476},[447,2582,2562],{"class":1176},[447,2584,662],{"class":476},[447,2586,1264],{"class":1176},[447,2588,1898],{"class":476},[447,2590,2592,2594,2597,2599,2601,2603,2605],{"class":449,"line":2591},40,[447,2593,1451],{"class":460},[447,2595,2596],{"class":464}," i ",[447,2598,1457],{"class":460},[447,2600,1460],{"class":1176},[447,2602,662],{"class":476},[447,2604,1264],{"class":1176},[447,2606,1467],{"class":476},[447,2608,2610,2613,2616,2618,2620,2622,2624],{"class":449,"line":2609},41,[447,2611,2612],{"class":460},"    for",[447,2614,2615],{"class":464}," j ",[447,2617,1457],{"class":460},[447,2619,1460],{"class":1176},[447,2621,662],{"class":476},[447,2623,1264],{"class":1176},[447,2625,1467],{"class":476},[447,2627,2629,2632,2634,2636],{"class":449,"line":2628},42,[447,2630,2631],{"class":464},"        ax_emb",[447,2633,477],{"class":476},[447,2635,392],{"class":658},[447,2637,800],{"class":476},[447,2639,2641,2644],{"class":449,"line":2640},43,[447,2642,2643],{"class":658},"            j",[447,2645,2131],{"class":476},[447,2647,2649,2652],{"class":449,"line":2648},44,[447,2650,2651],{"class":658},"            i",[447,2653,2131],{"class":476},[447,2655,2657,2660,2662,2664,2666,2668,2671,2673,2676,2678,2681,2683,2685],{"class":449,"line":2656},45,[447,2658,2659],{"class":1761},"            f",[447,2661,687],{"class":690},[447,2663,1768],{"class":665},[447,2665,2447],{"class":658},[447,2667,683],{"class":476},[447,2669,2670],{"class":658},"i",[447,2672,524],{"class":476},[447,2674,2675],{"class":658}," j",[447,2677,696],{"class":476},[447,2679,2680],{"class":1761},":.2f",[447,2682,1773],{"class":665},[447,2684,687],{"class":690},[447,2686,2131],{"class":476},[447,2688,2690,2693,2695,2697,2700,2702],{"class":449,"line":2689},46,[447,2691,2692],{"class":805},"            ha",[447,2694,791],{"class":699},[447,2696,687],{"class":686},[447,2698,2699],{"class":690},"center",[447,2701,687],{"class":686},[447,2703,2131],{"class":476},[447,2705,2707,2710,2712,2714,2716,2718],{"class":449,"line":2706},47,[447,2708,2709],{"class":805},"            va",[447,2711,791],{"class":699},[447,2713,687],{"class":686},[447,2715,2699],{"class":690},[447,2717,687],{"class":686},[447,2719,2131],{"class":476},[447,2721,2723,2726,2728,2730,2733,2735],{"class":449,"line":2722},48,[447,2724,2725],{"class":805},"            color",[447,2727,791],{"class":699},[447,2729,687],{"class":686},[447,2731,2732],{"class":690},"white",[447,2734,687],{"class":686},[447,2736,2131],{"class":476},[447,2738,2740,2743,2745,2748],{"class":449,"line":2739},49,[447,2741,2742],{"class":805},"            fontsize",[447,2744,791],{"class":699},[447,2746,2747],{"class":665},"9",[447,2749,2131],{"class":476},[447,2751,2753],{"class":449,"line":2752},50,[447,2754,1724],{"class":476},[447,2756,2758,2760,2762,2765,2767,2770,2772,2775,2777,2779,2781,2784,2786,2789],{"class":449,"line":2757},51,[447,2759,1845],{"class":464},[447,2761,477],{"class":476},[447,2763,2764],{"class":658},"colorbar",[447,2766,662],{"class":476},[447,2768,2769],{"class":658},"im",[447,2771,524],{"class":476},[447,2773,2774],{"class":805}," ax",[447,2776,791],{"class":699},[447,2778,2493],{"class":658},[447,2780,524],{"class":476},[447,2782,2783],{"class":805}," fraction",[447,2785,791],{"class":699},[447,2787,2788],{"class":665},"0.046",[447,2790,669],{"class":476},[447,2792,2794,2796,2798,2801],{"class":449,"line":2793},52,[447,2795,675],{"class":464},[447,2797,477],{"class":476},[447,2799,2800],{"class":658},"tight_layout",[447,2802,2803],{"class":476},"()\n",[447,2805,2807,2809,2811,2814],{"class":449,"line":2806},53,[447,2808,675],{"class":464},[447,2810,477],{"class":476},[447,2812,2813],{"class":658},"show",[447,2815,2803],{"class":476},[338,2817,2818],{},[2819,2820],"img",{"alt":395,"src":2821},"\u002F_nb\u002F23452bf822ecfc8c.png",[373,2823,2825],{"id":2824},"run-the-tracker","Run the tracker",[338,2827,2828,2829,2832,2833,2835],{},"Each step takes one frame's detections and a ",[354,2830,2831],{},"FrameContext"," (which\ncarries the frame index and a delta-t for state evolution). The\nwrapper holds the snapshot internally and threads ",[354,2834,423],{}," through.",[387,2837,2839],{"className":441,"code":2838,"language":443,"meta":395,"style":395},"all_results = []\nfor k, dets in enumerate(clip):\n    ctx = FrameContext.make(frame_idx=k, delta=1 \u002F 15.0, fps=15.0, stream_key=0)\n    res = ms.step(stream_key=0, detections=dets, ctx=ctx)\n    all_results.append(res)\n    print(\n        f\"frame {k}: snapshot={res.snapshot.batch_size[0]} live, ids={res.ids.tolist()}\"\n    )\n\n",[354,2840,2841,2850,2873,2933,2978,2994,3001,3064],{"__ignoreMap":395},[447,2842,2843,2846,2848],{"class":449,"line":450},[447,2844,2845],{"class":464},"all_results ",[447,2847,791],{"class":699},[447,2849,1437],{"class":476},[447,2851,2852,2854,2857,2859,2862,2864,2867,2869,2871],{"class":449,"line":457},[447,2853,1451],{"class":460},[447,2855,2856],{"class":464}," k",[447,2858,524],{"class":476},[447,2860,2861],{"class":464}," dets ",[447,2863,1457],{"class":460},[447,2865,2866],{"class":1176}," enumerate",[447,2868,662],{"class":476},[447,2870,200],{"class":658},[447,2872,1467],{"class":476},[447,2874,2875,2878,2880,2882,2884,2887,2889,2892,2894,2897,2899,2902,2904,2906,2909,2912,2914,2917,2919,2922,2924,2927,2929,2931],{"class":449,"line":468},[447,2876,2877],{"class":464},"    ctx ",[447,2879,791],{"class":699},[447,2881,566],{"class":464},[447,2883,477],{"class":476},[447,2885,2886],{"class":658},"make",[447,2888,662],{"class":476},[447,2890,2891],{"class":805},"frame_idx",[447,2893,791],{"class":699},[447,2895,2896],{"class":658},"k",[447,2898,524],{"class":476},[447,2900,2901],{"class":805}," delta",[447,2903,791],{"class":699},[447,2905,1300],{"class":665},[447,2907,2908],{"class":699}," \u002F",[447,2910,2911],{"class":665}," 15.0",[447,2913,524],{"class":476},[447,2915,2916],{"class":805}," fps",[447,2918,791],{"class":699},[447,2920,2921],{"class":665},"15.0",[447,2923,524],{"class":476},[447,2925,2926],{"class":805}," stream_key",[447,2928,791],{"class":699},[447,2930,666],{"class":665},[447,2932,669],{"class":476},[447,2934,2935,2938,2940,2943,2945,2948,2950,2953,2955,2957,2959,2962,2964,2967,2969,2972,2974,2976],{"class":449,"line":490},[447,2936,2937],{"class":464},"    res ",[447,2939,791],{"class":699},[447,2941,2942],{"class":464}," ms",[447,2944,477],{"class":476},[447,2946,2947],{"class":658},"step",[447,2949,662],{"class":476},[447,2951,2952],{"class":805},"stream_key",[447,2954,791],{"class":699},[447,2956,666],{"class":665},[447,2958,524],{"class":476},[447,2960,2961],{"class":805}," detections",[447,2963,791],{"class":699},[447,2965,2966],{"class":658},"dets",[447,2968,524],{"class":476},[447,2970,2971],{"class":805}," ctx",[447,2973,791],{"class":699},[447,2975,417],{"class":658},[447,2977,669],{"class":476},[447,2979,2980,2983,2985,2987,2989,2992],{"class":449,"line":497},[447,2981,2982],{"class":464},"    all_results",[447,2984,477],{"class":476},[447,2986,1497],{"class":658},[447,2988,662],{"class":476},[447,2990,2991],{"class":658},"res",[447,2993,669],{"class":476},[447,2995,2996,2999],{"class":449,"line":505},[447,2997,2998],{"class":1176},"    print",[447,3000,800],{"class":476},[447,3002,3003,3006,3009,3011,3013,3015,3018,3020,3022,3024,3026,3028,3031,3033,3035,3037,3039,3042,3044,3046,3048,3051,3053,3056,3059,3061],{"class":449,"line":530},[447,3004,3005],{"class":1761},"        f",[447,3007,3008],{"class":690},"\"frame ",[447,3010,1768],{"class":665},[447,3012,2896],{"class":658},[447,3014,1773],{"class":665},[447,3016,3017],{"class":690},": snapshot=",[447,3019,1768],{"class":665},[447,3021,2991],{"class":658},[447,3023,477],{"class":476},[447,3025,402],{"class":480},[447,3027,477],{"class":476},[447,3029,3030],{"class":480},"batch_size",[447,3032,683],{"class":476},[447,3034,666],{"class":665},[447,3036,696],{"class":476},[447,3038,1773],{"class":665},[447,3040,3041],{"class":690}," live, ids=",[447,3043,1768],{"class":665},[447,3045,2991],{"class":658},[447,3047,477],{"class":476},[447,3049,3050],{"class":480},"ids",[447,3052,477],{"class":476},[447,3054,3055],{"class":658},"tolist",[447,3057,3058],{"class":476},"()",[447,3060,1773],{"class":665},[447,3062,3063],{"class":690},"\"\n",[447,3065,3066],{"class":449,"line":547},[447,3067,1730],{"class":476},[1185,3069],{"data":3070,"kind":1188},"ZnJhbWUgMDogc25hcHNob3Q9MyBsaXZlLCBpZHM9WzEsIDIsIDNdCmZyYW1lIDE6IHNuYXBzaG90PTMgbGl2ZSwgaWRzPVsxLCAyLCAzXQpmcmFtZSAyOiBzbmFwc2hvdD0zIGxpdmUsIGlkcz1bMSwgMiwgM10KZnJhbWUgMzogc25hcHNob3Q9MyBsaXZlLCBpZHM9WzEsIDIsIDNdCmZyYW1lIDQ6IHNuYXBzaG90PTMgbGl2ZSwgaWRzPVsxLCAyLCAzXQpmcmFtZSA1OiBzbmFwc2hvdD0zIGxpdmUsIGlkcz1bMSwgMiwgM10KZnJhbWUgNjogc25hcHNob3Q9MyBsaXZlLCBpZHM9WzEsIDIsIDNdCmZyYW1lIDc6IHNuYXBzaG90PTMgbGl2ZSwgaWRzPVsxLCAyLCAzXQo=",[338,3072,3073],{},"Three tracklets live across all eight frames. Their IDs (1, 2, 3)\nare stable — the tracker correctly matches every shuffled detection\nback to the right identity by cosine similarity on the kernel.",[373,3075,3077],{"id":3076},"visualize","Visualize",[338,3079,3080],{},"We'll draw the trajectories color-coded by tracker-assigned ID.\nEach marker is one detection, located at its 2D position; the\ncolor tells us which tracklet the tracker thinks it belongs to.",[387,3082,3084],{"className":441,"code":3083,"language":443,"meta":395,"style":395},"fig, ax = plt.subplots(figsize=(8, 5))\ncmap = plt.get_cmap(\"tab10\")\n\nfor k, (dets, res) in enumerate(zip(clip, all_results)):\n    # The snapshot's id field aligns with the matched-then-appended order.\n    # For this minimal example we re-derive per-detection IDs by walking\n    # the snapshot in detection-index order. (Notebook 6 shows a robust\n    # version of this for ground-truth evaluation.)\n    ids = res.snapshot.id\n    pos = res.snapshot.position\n    for n, tid in enumerate(ids):\n        ax.scatter(\n            pos[n, 0],\n            pos[n, 1],\n            color=cmap(int(tid) % 10),\n            s=40,\n            edgecolor=\"black\",\n            linewidth=0.5,\n        )\n        if k == 0:\n            ax.text(pos[n, 0] + 5, pos[n, 1], f\"id={int(tid)}\", fontsize=9)\n\nax.set_xlabel(\"x\")\nax.set_ylabel(\"y\")\nax.set_title(\"Per-detection track IDs over 8 frames (color = tracker ID)\")\nax.grid(alpha=0.3)\nplt.show()\n\n",[354,3085,3086,3121,3143,3147,3188,3193,3198,3203,3208,3226,3244,3266,3277,3293,3307,3336,3348,3363,3374,3378,3393,3467,3471,3490,3508,3527,3545],{"__ignoreMap":395},[447,3087,3088,3090,3092,3095,3097,3099,3101,3103,3105,3108,3110,3112,3114,3116,3119],{"class":449,"line":450},[447,3089,1845],{"class":464},[447,3091,524],{"class":476},[447,3093,3094],{"class":464}," ax ",[447,3096,791],{"class":699},[447,3098,1865],{"class":464},[447,3100,477],{"class":476},[447,3102,1870],{"class":658},[447,3104,662],{"class":476},[447,3106,3107],{"class":805},"figsize",[447,3109,791],{"class":699},[447,3111,662],{"class":476},[447,3113,2372],{"class":665},[447,3115,524],{"class":476},[447,3117,3118],{"class":665}," 5",[447,3120,1898],{"class":476},[447,3122,3123,3125,3127,3129,3131,3133,3135,3137,3139,3141],{"class":449,"line":457},[447,3124,1903],{"class":464},[447,3126,791],{"class":699},[447,3128,1865],{"class":464},[447,3130,477],{"class":476},[447,3132,1912],{"class":658},[447,3134,662],{"class":476},[447,3136,687],{"class":686},[447,3138,1919],{"class":690},[447,3140,687],{"class":686},[447,3142,669],{"class":476},[447,3144,3145],{"class":449,"line":468},[447,3146,494],{"emptyLinePlaceholder":493},[447,3148,3149,3151,3153,3155,3157,3159,3161,3164,3166,3169,3171,3173,3176,3178,3180,3182,3185],{"class":449,"line":490},[447,3150,1451],{"class":460},[447,3152,2856],{"class":464},[447,3154,524],{"class":476},[447,3156,703],{"class":476},[447,3158,2966],{"class":464},[447,3160,524],{"class":476},[447,3162,3163],{"class":464}," res",[447,3165,1860],{"class":476},[447,3167,3168],{"class":460}," in",[447,3170,2866],{"class":1176},[447,3172,662],{"class":476},[447,3174,3175],{"class":1176},"zip",[447,3177,662],{"class":476},[447,3179,200],{"class":658},[447,3181,524],{"class":476},[447,3183,3184],{"class":658}," all_results",[447,3186,3187],{"class":476},")):\n",[447,3189,3190],{"class":449,"line":497},[447,3191,3192],{"class":453},"    # The snapshot's id field aligns with the matched-then-appended order.\n",[447,3194,3195],{"class":449,"line":505},[447,3196,3197],{"class":453},"    # For this minimal example we re-derive per-detection IDs by walking\n",[447,3199,3200],{"class":449,"line":530},[447,3201,3202],{"class":453},"    # the snapshot in detection-index order. (Notebook 6 shows a robust\n",[447,3204,3205],{"class":449,"line":547},[447,3206,3207],{"class":453},"    # version of this for ground-truth evaluation.)\n",[447,3209,3210,3213,3215,3217,3219,3221,3223],{"class":449,"line":574},[447,3211,3212],{"class":464},"    ids ",[447,3214,791],{"class":699},[447,3216,3163],{"class":464},[447,3218,477],{"class":476},[447,3220,402],{"class":480},[447,3222,477],{"class":476},[447,3224,3225],{"class":480},"id\n",[447,3227,3228,3231,3233,3235,3237,3239,3241],{"class":449,"line":596},[447,3229,3230],{"class":464},"    pos ",[447,3232,791],{"class":699},[447,3234,3163],{"class":464},[447,3236,477],{"class":476},[447,3238,402],{"class":480},[447,3240,477],{"class":476},[447,3242,3243],{"class":480},"position\n",[447,3245,3246,3248,3251,3253,3256,3258,3260,3262,3264],{"class":449,"line":613},[447,3247,2612],{"class":460},[447,3249,3250],{"class":464}," n",[447,3252,524],{"class":476},[447,3254,3255],{"class":464}," tid ",[447,3257,1457],{"class":460},[447,3259,2866],{"class":1176},[447,3261,662],{"class":476},[447,3263,3050],{"class":658},[447,3265,1467],{"class":476},[447,3267,3268,3271,3273,3275],{"class":449,"line":645},[447,3269,3270],{"class":464},"        ax",[447,3272,477],{"class":476},[447,3274,2080],{"class":658},[447,3276,800],{"class":476},[447,3278,3279,3282,3284,3287,3289,3291],{"class":449,"line":650},[447,3280,3281],{"class":658},"            pos",[447,3283,683],{"class":476},[447,3285,3286],{"class":658},"n",[447,3288,524],{"class":476},[447,3290,2026],{"class":665},[447,3292,1719],{"class":476},[447,3294,3295,3297,3299,3301,3303,3305],{"class":449,"line":672},[447,3296,3281],{"class":658},[447,3298,683],{"class":476},[447,3300,3286],{"class":658},[447,3302,524],{"class":476},[447,3304,2036],{"class":665},[447,3306,1719],{"class":476},[447,3308,3309,3311,3313,3315,3317,3321,3323,3326,3328,3331,3334],{"class":449,"line":1050},[447,3310,2725],{"class":805},[447,3312,791],{"class":699},[447,3314,2055],{"class":658},[447,3316,662],{"class":476},[447,3318,3320],{"class":3319},"sZMiF","int",[447,3322,662],{"class":476},[447,3324,3325],{"class":658},"tid",[447,3327,1860],{"class":476},[447,3329,3330],{"class":699}," %",[447,3332,3333],{"class":665}," 10",[447,3335,922],{"class":476},[447,3337,3338,3341,3343,3346],{"class":449,"line":1069},[447,3339,3340],{"class":805},"            s",[447,3342,791],{"class":699},[447,3344,3345],{"class":665},"40",[447,3347,2131],{"class":476},[447,3349,3350,3353,3355,3357,3359,3361],{"class":449,"line":1088},[447,3351,3352],{"class":805},"            edgecolor",[447,3354,791],{"class":699},[447,3356,687],{"class":686},[447,3358,2143],{"class":690},[447,3360,687],{"class":686},[447,3362,2131],{"class":476},[447,3364,3365,3368,3370,3372],{"class":449,"line":1107},[447,3366,3367],{"class":805},"            linewidth",[447,3369,791],{"class":699},[447,3371,852],{"class":665},[447,3373,2131],{"class":476},[447,3375,3376],{"class":449,"line":1112},[447,3377,1724],{"class":476},[447,3379,3380,3383,3385,3388,3390],{"class":449,"line":1118},[447,3381,3382],{"class":460},"        if",[447,3384,1454],{"class":464},[447,3386,3387],{"class":699},"==",[447,3389,2026],{"class":665},[447,3391,3392],{"class":476},":\n",[447,3394,3395,3398,3400,3402,3404,3407,3409,3411,3413,3415,3417,3419,3421,3423,3426,3428,3430,3432,3434,3436,3439,3442,3444,3446,3448,3450,3452,3454,3456,3458,3461,3463,3465],{"class":449,"line":1131},[447,3396,3397],{"class":464},"            ax",[447,3399,477],{"class":476},[447,3401,392],{"class":658},[447,3403,662],{"class":476},[447,3405,3406],{"class":658},"pos",[447,3408,683],{"class":476},[447,3410,3286],{"class":658},[447,3412,524],{"class":476},[447,3414,2026],{"class":665},[447,3416,696],{"class":476},[447,3418,1526],{"class":699},[447,3420,3118],{"class":665},[447,3422,524],{"class":476},[447,3424,3425],{"class":658}," pos",[447,3427,683],{"class":476},[447,3429,3286],{"class":658},[447,3431,524],{"class":476},[447,3433,2036],{"class":665},[447,3435,1341],{"class":476},[447,3437,3438],{"class":1761}," f",[447,3440,3441],{"class":690},"\"id=",[447,3443,1768],{"class":665},[447,3445,3320],{"class":3319},[447,3447,662],{"class":476},[447,3449,3325],{"class":658},[447,3451,1860],{"class":476},[447,3453,1773],{"class":665},[447,3455,687],{"class":690},[447,3457,524],{"class":476},[447,3459,3460],{"class":805}," fontsize",[447,3462,791],{"class":699},[447,3464,2747],{"class":665},[447,3466,669],{"class":476},[447,3468,3469],{"class":449,"line":1143},[447,3470,494],{"emptyLinePlaceholder":493},[447,3472,3473,3476,3478,3480,3482,3484,3486,3488],{"class":449,"line":1148},[447,3474,3475],{"class":464},"ax",[447,3477,477],{"class":476},[447,3479,2321],{"class":658},[447,3481,662],{"class":476},[447,3483,687],{"class":686},[447,3485,2328],{"class":690},[447,3487,687],{"class":686},[447,3489,669],{"class":476},[447,3491,3492,3494,3496,3498,3500,3502,3504,3506],{"class":449,"line":1153},[447,3493,3475],{"class":464},[447,3495,477],{"class":476},[447,3497,2341],{"class":658},[447,3499,662],{"class":476},[447,3501,687],{"class":686},[447,3503,2348],{"class":690},[447,3505,687],{"class":686},[447,3507,669],{"class":476},[447,3509,3510,3512,3514,3516,3518,3520,3523,3525],{"class":449,"line":1173},[447,3511,3475],{"class":464},[447,3513,477],{"class":476},[447,3515,2301],{"class":658},[447,3517,662],{"class":476},[447,3519,687],{"class":686},[447,3521,3522],{"class":690},"Per-detection track IDs over 8 frames (color = tracker ID)",[447,3524,687],{"class":686},[447,3526,669],{"class":476},[447,3528,3529,3531,3533,3535,3537,3539,3541,3543],{"class":449,"line":1727},[447,3530,3475],{"class":464},[447,3532,477],{"class":476},[447,3534,2384],{"class":658},[447,3536,662],{"class":476},[447,3538,2389],{"class":805},[447,3540,791],{"class":699},[447,3542,2394],{"class":665},[447,3544,669],{"class":476},[447,3546,3547,3549,3551,3553],{"class":449,"line":1733},[447,3548,675],{"class":464},[447,3550,477],{"class":476},[447,3552,2813],{"class":658},[447,3554,2803],{"class":476},[338,3556,3557],{},[2819,3558],{"alt":395,"src":3559},"\u002F_nb\u002Fab70f47c7ef778b4.png",[338,3561,3562],{},"Each color forms a coherent trajectory in (x, y) — the tracker\npreserved identity across all 8 frames, despite per-frame\ndetection shuffling.",[373,3564,3566],{"id":3565},"whats-next","What's next",[347,3568,3569,3593,3599,3621,3627],{},[350,3570,3571,3574,3575,2131,3577,1800,3579,1800,3582,1800,3585,3588,3589,3592],{},[342,3572,3573],{},"Notebook 2"," unpacks the typed records (",[354,3576,1809],{},[354,3578,1796],{},[354,3580,3581],{},"CostExpression",[354,3583,3584],{},"MatchOutcome",[354,3586,3587],{},"Gate",") and\nexplains ",[359,3590,3591],{},"why"," unitrack uses immutable snapshots.",[350,3594,3595,3598],{},[342,3596,3597],{},"Notebook 3"," visualizes every cost and gate primitive in the library.",[350,3600,3601,3604,3605,2131,3608,1800,3611,1800,3614,3617,3618,477],{},[342,3602,3603],{},"Notebook 4"," builds richer pipelines with ",[354,3606,3607],{},"Sequential",[354,3609,3610],{},"Parallel",[354,3612,3613],{},"Gated",[354,3615,3616],{},"Filter",", and ",[354,3619,3620],{},"Iterate",[350,3622,3623,3626],{},[342,3624,3625],{},"Notebook 5"," introduces state evolution (Kalman, EMA) and\nlifecycle (Tentative → Active → Lost → Removed).",[350,3628,3629,3632],{},[342,3630,3631],{},"Notebook 6"," assembles a K=2 cascaded canonical configuration\nand compares cascaded vs parallel fusion end-to-end.",[3634,3635,3636],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":395,"searchDepth":468,"depth":468,"links":3638},[3639,3640,3641,3642,3643,3644,3645],{"id":375,"depth":457,"text":376},{"id":716,"depth":457,"text":717},{"id":1191,"depth":457,"text":1192},{"id":1813,"depth":457,"text":1814},{"id":2824,"depth":457,"text":2825},{"id":3076,"depth":457,"text":3077},{"id":3565,"depth":457,"text":3566},"This is a 10-minute introduction to unitrack, the PyTorch-native\nmulti-object tracking library. By the end of this notebook you will:","md",{"notebook":493},{"icon":63},{"title":95,"description":3646},"7rW9pv_Pl7HiWMQlzik66r1P6rF3FW-qrByGmmRn0_Q",{},1785139889421]