[{"data":1,"prerenderedAt":1327},["ShallowReactive",2],{"navigation":3,"api-navigation":126,"\u002Frecipes\u002Fkalman_motion_tracker":328,"docyard:crossref-index":1326},[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":22,"body":330,"description":1321,"extension":1322,"meta":1323,"navigation":440,"path":23,"seo":1324,"stem":24,"__hash__":1325},"content\u002F2.recipes\u002Fkalman_motion_tracker.md",{"type":331,"value":332,"toc":1319},"minimark",[333,337,355,399,413,1269,1272,1301,1315],[334,335,22],"h1",{"id":336},"recipe-kalman-motion-tracker",[338,339,340,341,345,346,350,351,354],"p",{},"A motion tracker associates detections to the ",[342,343,344],"em",{},"predicted"," position of each\ntracklet, rejecting spatially-implausible matches. This recipe runs a\nconstant-velocity Kalman filter on instance centroids: the tracklet state is\n4-D ",[347,348,349],"code",{},"[x, y, vx, vy]",", advanced one step each frame; the detection carries a\n2-D ",[347,352,353],{},"[x, y]"," centroid measurement.",[338,356,357,360,361,363,364,367,368,372,373,376,377,379,380,382,383,386,387,390,391,394,395,398],{},[347,358,359],{},"KalmanCentroid2D.state_entries"," seeds the ",[347,362,294],{}," (predicted mean) and\n",[347,365,366],{},"centroid_cov"," (covariance) tracklet fields and supplies the predict\u002Fupdate.\nThe association cost is the ",[369,370,371],"strong",{},"Mahalanobis"," chi-squared distance from each\ndetection centroid to a tracklet's predicted centroid. A plain\n",[347,374,375],{},"CDist(\"centroid\")"," cannot be used here: the tracklet mean is 4-D while the\ndetection mean is 2-D, so the feature dimensions mismatch. ",[347,378,371],{},"\nis the primitive that projects the 4-D state into the 2-D measurement\nsubspace using ",[347,381,366],{},". The same metric drives the ",[347,384,385],{},"MotionGate",",\nwhich rejects matches whose chi-squared distance exceeds ",[347,388,389],{},"max_chi2","\n(",[347,392,393],{},"5.9915"," is the 0.95 quantile at 2 d.o.f. — the standard SORT\u002FDeepSORT\nmotion gate), and a ",[347,396,397],{},"ClassGate"," keeps matching within a class.",[338,400,401,404,405,408,409,412],{},[347,402,403],{},"q"," \u002F ",[347,406,407],{},"r"," are the process \u002F measurement noise; they are sized for\npixel-space centroids (order one pixel²), not the normalized-coordinate\ndefaults of ",[347,410,411],{},"KalmanCentroid2D",".",[414,415,420],"pre",{"className":416,"code":417,"language":418,"meta":419,"style":419},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import torch\n\nimport unitrack\nfrom unitrack.assignment import Associate, Jonker\nfrom unitrack.costs import Mahalanobis\nfrom unitrack.data import TensorSpec\nfrom unitrack.gates import ClassGate, MotionGate\nfrom unitrack.lifecycle import IncludeAll, NoLifecycle\nfrom unitrack.pipeline import Gated, Pipe, Sequential\nfrom unitrack.states import FromDetectionField, Identity, Replace, State\nfrom unitrack.states.kalman import KalmanCentroid2D\n\n# 0.95 quantile of chi-squared at 2 d.o.f. (centroid x, y).\nCHI2_GATE = 5.9915\n\n\ndef build_kalman_tracker(\n    *,\n    max_chi2: float = CHI2_GATE,\n    q: float = 1.0,\n    r: float = 1.0,\n) -> unitrack.Tracker:\n    kal = KalmanCentroid2D(field=\"centroid\", q=q, r=r)\n    centroid_states = kal.state_entries(meas_field=\"centroid\")\n    gate = Sequential(\n        [\n            ClassGate(\"category\"),\n            MotionGate(\n                mean_field=\"centroid\",\n                cov_field=\"centroid_cov\",\n                max_chi2=max_chi2,\n            ),\n        ]\n    )\n    inner = Pipe(\n        cost=Mahalanobis(\"centroid\", \"centroid_cov\"),\n        assoc=Associate(Jonker(threshold=max_chi2)),\n    )\n    pipeline = Gated(gate=gate, then=inner)\n    return unitrack.Tracker(\n        root=pipeline,\n        states={\n            **centroid_states,\n            \"category\": State(\n                schema=TensorSpec(shape=(), dtype=torch.int64),\n                process=Identity(\"category\"),\n                observation=Replace(\"category\"),\n                init=FromDetectionField(\"category\"),\n            ),\n        },\n        lifecycle=NoLifecycle(),\n        visibility=IncludeAll(),\n    )\n","python","",[347,421,422,435,442,450,476,493,510,532,554,581,613,634,639,646,661,666,671,685,694,715,732,748,768,820,851,864,870,888,896,912,928,940,946,952,958,970,999,1027,1032,1062,1076,1088,1099,1110,1127,1163,1184,1205,1226,1231,1237,1251,1264],{"__ignoreMap":419},[423,424,427,431],"span",{"class":425,"line":426},"line",1,[423,428,430],{"class":429},"sVHd0","import",[423,432,434],{"class":433},"su5hD"," torch\n",[423,436,438],{"class":425,"line":437},2,[423,439,441],{"emptyLinePlaceholder":440},true,"\n",[423,443,445,447],{"class":425,"line":444},3,[423,446,430],{"class":429},[423,448,449],{"class":433}," unitrack\n",[423,451,453,456,459,462,465,467,470,473],{"class":425,"line":452},4,[423,454,455],{"class":429},"from",[423,457,458],{"class":433}," unitrack",[423,460,412],{"class":461},"sP7_E",[423,463,464],{"class":433},"assignment ",[423,466,430],{"class":429},[423,468,469],{"class":433}," Associate",[423,471,472],{"class":461},",",[423,474,475],{"class":433}," Jonker\n",[423,477,479,481,483,485,488,490],{"class":425,"line":478},5,[423,480,455],{"class":429},[423,482,458],{"class":433},[423,484,412],{"class":461},[423,486,487],{"class":433},"costs ",[423,489,430],{"class":429},[423,491,492],{"class":433}," Mahalanobis\n",[423,494,496,498,500,502,505,507],{"class":425,"line":495},6,[423,497,455],{"class":429},[423,499,458],{"class":433},[423,501,412],{"class":461},[423,503,504],{"class":433},"data ",[423,506,430],{"class":429},[423,508,509],{"class":433}," TensorSpec\n",[423,511,513,515,517,519,522,524,527,529],{"class":425,"line":512},7,[423,514,455],{"class":429},[423,516,458],{"class":433},[423,518,412],{"class":461},[423,520,521],{"class":433},"gates ",[423,523,430],{"class":429},[423,525,526],{"class":433}," ClassGate",[423,528,472],{"class":461},[423,530,531],{"class":433}," MotionGate\n",[423,533,535,537,539,541,544,546,549,551],{"class":425,"line":534},8,[423,536,455],{"class":429},[423,538,458],{"class":433},[423,540,412],{"class":461},[423,542,543],{"class":433},"lifecycle ",[423,545,430],{"class":429},[423,547,548],{"class":433}," IncludeAll",[423,550,472],{"class":461},[423,552,553],{"class":433}," NoLifecycle\n",[423,555,557,559,561,563,566,568,571,573,576,578],{"class":425,"line":556},9,[423,558,455],{"class":429},[423,560,458],{"class":433},[423,562,412],{"class":461},[423,564,565],{"class":433},"pipeline ",[423,567,430],{"class":429},[423,569,570],{"class":433}," Gated",[423,572,472],{"class":461},[423,574,575],{"class":433}," Pipe",[423,577,472],{"class":461},[423,579,580],{"class":433}," Sequential\n",[423,582,584,586,588,590,593,595,598,600,603,605,608,610],{"class":425,"line":583},10,[423,585,455],{"class":429},[423,587,458],{"class":433},[423,589,412],{"class":461},[423,591,592],{"class":433},"states ",[423,594,430],{"class":429},[423,596,597],{"class":433}," FromDetectionField",[423,599,472],{"class":461},[423,601,602],{"class":433}," Identity",[423,604,472],{"class":461},[423,606,607],{"class":433}," Replace",[423,609,472],{"class":461},[423,611,612],{"class":433}," State\n",[423,614,616,618,620,622,624,626,629,631],{"class":425,"line":615},11,[423,617,455],{"class":429},[423,619,458],{"class":433},[423,621,412],{"class":461},[423,623,270],{"class":433},[423,625,412],{"class":461},[423,627,628],{"class":433},"kalman ",[423,630,430],{"class":429},[423,632,633],{"class":433}," KalmanCentroid2D\n",[423,635,637],{"class":425,"line":636},12,[423,638,441],{"emptyLinePlaceholder":440},[423,640,642],{"class":425,"line":641},13,[423,643,645],{"class":644},"sutJx","# 0.95 quantile of chi-squared at 2 d.o.f. (centroid x, y).\n",[423,647,649,653,657],{"class":425,"line":648},14,[423,650,652],{"class":651},"s_hVV","CHI2_GATE",[423,654,656],{"class":655},"smGrS"," =",[423,658,660],{"class":659},"srdBf"," 5.9915\n",[423,662,664],{"class":425,"line":663},15,[423,665,441],{"emptyLinePlaceholder":440},[423,667,669],{"class":425,"line":668},16,[423,670,441],{"emptyLinePlaceholder":440},[423,672,674,678,682],{"class":425,"line":673},17,[423,675,677],{"class":676},"sbsja","def",[423,679,681],{"class":680},"sGLFI"," build_kalman_tracker",[423,683,684],{"class":461},"(\n",[423,686,688,691],{"class":425,"line":687},18,[423,689,690],{"class":655},"    *",[423,692,693],{"class":433},",\n",[423,695,697,701,704,708,710,713],{"class":425,"line":696},19,[423,698,700],{"class":699},"sFwrP","    max_chi2",[423,702,703],{"class":461},":",[423,705,707],{"class":706},"sZMiF"," float",[423,709,656],{"class":655},[423,711,712],{"class":651}," CHI2_GATE",[423,714,693],{"class":461},[423,716,718,721,723,725,727,730],{"class":425,"line":717},20,[423,719,720],{"class":699},"    q",[423,722,703],{"class":461},[423,724,707],{"class":706},[423,726,656],{"class":655},[423,728,729],{"class":659}," 1.0",[423,731,693],{"class":461},[423,733,735,738,740,742,744,746],{"class":425,"line":734},21,[423,736,737],{"class":699},"    r",[423,739,703],{"class":461},[423,741,707],{"class":706},[423,743,656],{"class":655},[423,745,729],{"class":659},[423,747,693],{"class":461},[423,749,751,754,757,759,761,765],{"class":425,"line":750},22,[423,752,753],{"class":461},")",[423,755,756],{"class":461}," ->",[423,758,458],{"class":433},[423,760,412],{"class":461},[423,762,764],{"class":763},"skxfh","Tracker",[423,766,767],{"class":461},":\n",[423,769,771,774,777,781,784,788,790,794,797,799,801,804,806,808,810,813,815,817],{"class":425,"line":770},23,[423,772,773],{"class":433},"    kal ",[423,775,776],{"class":655},"=",[423,778,780],{"class":779},"slqww"," KalmanCentroid2D",[423,782,783],{"class":461},"(",[423,785,787],{"class":786},"s99_P","field",[423,789,776],{"class":655},[423,791,793],{"class":792},"sjJ54","\"",[423,795,294],{"class":796},"s_sjI",[423,798,793],{"class":792},[423,800,472],{"class":461},[423,802,803],{"class":786}," q",[423,805,776],{"class":655},[423,807,403],{"class":779},[423,809,472],{"class":461},[423,811,812],{"class":786}," r",[423,814,776],{"class":655},[423,816,407],{"class":779},[423,818,819],{"class":461},")\n",[423,821,823,826,828,831,833,836,838,841,843,845,847,849],{"class":425,"line":822},24,[423,824,825],{"class":433},"    centroid_states ",[423,827,776],{"class":655},[423,829,830],{"class":433}," kal",[423,832,412],{"class":461},[423,834,835],{"class":779},"state_entries",[423,837,783],{"class":461},[423,839,840],{"class":786},"meas_field",[423,842,776],{"class":655},[423,844,793],{"class":792},[423,846,294],{"class":796},[423,848,793],{"class":792},[423,850,819],{"class":461},[423,852,854,857,859,862],{"class":425,"line":853},25,[423,855,856],{"class":433},"    gate ",[423,858,776],{"class":655},[423,860,861],{"class":779}," Sequential",[423,863,684],{"class":461},[423,865,867],{"class":425,"line":866},26,[423,868,869],{"class":461},"        [\n",[423,871,873,876,878,880,883,885],{"class":425,"line":872},27,[423,874,875],{"class":779},"            ClassGate",[423,877,783],{"class":461},[423,879,793],{"class":792},[423,881,882],{"class":796},"category",[423,884,793],{"class":792},[423,886,887],{"class":461},"),\n",[423,889,891,894],{"class":425,"line":890},28,[423,892,893],{"class":779},"            MotionGate",[423,895,684],{"class":461},[423,897,899,902,904,906,908,910],{"class":425,"line":898},29,[423,900,901],{"class":786},"                mean_field",[423,903,776],{"class":655},[423,905,793],{"class":792},[423,907,294],{"class":796},[423,909,793],{"class":792},[423,911,693],{"class":461},[423,913,915,918,920,922,924,926],{"class":425,"line":914},30,[423,916,917],{"class":786},"                cov_field",[423,919,776],{"class":655},[423,921,793],{"class":792},[423,923,366],{"class":796},[423,925,793],{"class":792},[423,927,693],{"class":461},[423,929,931,934,936,938],{"class":425,"line":930},31,[423,932,933],{"class":786},"                max_chi2",[423,935,776],{"class":655},[423,937,389],{"class":779},[423,939,693],{"class":461},[423,941,943],{"class":425,"line":942},32,[423,944,945],{"class":461},"            ),\n",[423,947,949],{"class":425,"line":948},33,[423,950,951],{"class":461},"        ]\n",[423,953,955],{"class":425,"line":954},34,[423,956,957],{"class":461},"    )\n",[423,959,961,964,966,968],{"class":425,"line":960},35,[423,962,963],{"class":433},"    inner ",[423,965,776],{"class":655},[423,967,575],{"class":779},[423,969,684],{"class":461},[423,971,973,976,978,980,982,984,986,988,990,993,995,997],{"class":425,"line":972},36,[423,974,975],{"class":786},"        cost",[423,977,776],{"class":655},[423,979,371],{"class":779},[423,981,783],{"class":461},[423,983,793],{"class":792},[423,985,294],{"class":796},[423,987,793],{"class":792},[423,989,472],{"class":461},[423,991,992],{"class":792}," \"",[423,994,366],{"class":796},[423,996,793],{"class":792},[423,998,887],{"class":461},[423,1000,1002,1005,1007,1010,1012,1015,1017,1020,1022,1024],{"class":425,"line":1001},37,[423,1003,1004],{"class":786},"        assoc",[423,1006,776],{"class":655},[423,1008,1009],{"class":779},"Associate",[423,1011,783],{"class":461},[423,1013,1014],{"class":779},"Jonker",[423,1016,783],{"class":461},[423,1018,1019],{"class":786},"threshold",[423,1021,776],{"class":655},[423,1023,389],{"class":779},[423,1025,1026],{"class":461},")),\n",[423,1028,1030],{"class":425,"line":1029},38,[423,1031,957],{"class":461},[423,1033,1035,1038,1040,1042,1044,1046,1048,1050,1052,1055,1057,1060],{"class":425,"line":1034},39,[423,1036,1037],{"class":433},"    pipeline ",[423,1039,776],{"class":655},[423,1041,570],{"class":779},[423,1043,783],{"class":461},[423,1045,212],{"class":786},[423,1047,776],{"class":655},[423,1049,212],{"class":779},[423,1051,472],{"class":461},[423,1053,1054],{"class":786}," then",[423,1056,776],{"class":655},[423,1058,1059],{"class":779},"inner",[423,1061,819],{"class":461},[423,1063,1065,1068,1070,1072,1074],{"class":425,"line":1064},40,[423,1066,1067],{"class":429},"    return",[423,1069,458],{"class":433},[423,1071,412],{"class":461},[423,1073,764],{"class":779},[423,1075,684],{"class":461},[423,1077,1079,1082,1084,1086],{"class":425,"line":1078},41,[423,1080,1081],{"class":786},"        root",[423,1083,776],{"class":655},[423,1085,256],{"class":779},[423,1087,693],{"class":461},[423,1089,1091,1094,1096],{"class":425,"line":1090},42,[423,1092,1093],{"class":786},"        states",[423,1095,776],{"class":655},[423,1097,1098],{"class":461},"{\n",[423,1100,1102,1105,1108],{"class":425,"line":1101},43,[423,1103,1104],{"class":655},"            **",[423,1106,1107],{"class":779},"centroid_states",[423,1109,693],{"class":461},[423,1111,1113,1116,1118,1120,1122,1125],{"class":425,"line":1112},44,[423,1114,1115],{"class":792},"            \"",[423,1117,882],{"class":796},[423,1119,793],{"class":792},[423,1121,703],{"class":461},[423,1123,1124],{"class":779}," State",[423,1126,684],{"class":461},[423,1128,1130,1133,1135,1138,1140,1143,1145,1148,1151,1153,1156,1158,1161],{"class":425,"line":1129},45,[423,1131,1132],{"class":786},"                schema",[423,1134,776],{"class":655},[423,1136,1137],{"class":779},"TensorSpec",[423,1139,783],{"class":461},[423,1141,1142],{"class":786},"shape",[423,1144,776],{"class":655},[423,1146,1147],{"class":461},"(),",[423,1149,1150],{"class":786}," dtype",[423,1152,776],{"class":655},[423,1154,1155],{"class":779},"torch",[423,1157,412],{"class":461},[423,1159,1160],{"class":763},"int64",[423,1162,887],{"class":461},[423,1164,1166,1169,1171,1174,1176,1178,1180,1182],{"class":425,"line":1165},46,[423,1167,1168],{"class":786},"                process",[423,1170,776],{"class":655},[423,1172,1173],{"class":779},"Identity",[423,1175,783],{"class":461},[423,1177,793],{"class":792},[423,1179,882],{"class":796},[423,1181,793],{"class":792},[423,1183,887],{"class":461},[423,1185,1187,1190,1192,1195,1197,1199,1201,1203],{"class":425,"line":1186},47,[423,1188,1189],{"class":786},"                observation",[423,1191,776],{"class":655},[423,1193,1194],{"class":779},"Replace",[423,1196,783],{"class":461},[423,1198,793],{"class":792},[423,1200,882],{"class":796},[423,1202,793],{"class":792},[423,1204,887],{"class":461},[423,1206,1208,1211,1213,1216,1218,1220,1222,1224],{"class":425,"line":1207},48,[423,1209,1210],{"class":786},"                init",[423,1212,776],{"class":655},[423,1214,1215],{"class":779},"FromDetectionField",[423,1217,783],{"class":461},[423,1219,793],{"class":792},[423,1221,882],{"class":796},[423,1223,793],{"class":792},[423,1225,887],{"class":461},[423,1227,1229],{"class":425,"line":1228},49,[423,1230,945],{"class":461},[423,1232,1234],{"class":425,"line":1233},50,[423,1235,1236],{"class":461},"        },\n",[423,1238,1240,1243,1245,1248],{"class":425,"line":1239},51,[423,1241,1242],{"class":786},"        lifecycle",[423,1244,776],{"class":655},[423,1246,1247],{"class":779},"NoLifecycle",[423,1249,1250],{"class":461},"(),\n",[423,1252,1254,1257,1259,1262],{"class":425,"line":1253},52,[423,1255,1256],{"class":786},"        visibility",[423,1258,776],{"class":655},[423,1260,1261],{"class":779},"IncludeAll",[423,1263,1250],{"class":461},[423,1265,1267],{"class":425,"line":1266},53,[423,1268,957],{"class":461},[338,1270,1271],{},"Detection requirements:",[1273,1274,1275,1291],"ul",{},[1276,1277,1278,1280,1281,1284,1285,1287,1288,1290],"li",{},[347,1279,294],{}," — ",[347,1282,1283],{},"(M, 2)"," ",[347,1286,353],{}," pixel centroid per instance (e.g. the mask\npixel-mean). ",[347,1289,411],{}," lifts it to the 4-D position\u002Fvelocity state.",[1276,1292,1293,1280,1295,1298,1299,412],{},[347,1294,882],{},[347,1296,1297],{},"(M,)"," int64 semantic class, for the ",[347,1300,397],{},[338,1302,1303,1304,1284,1306,1308,1309,1311,1312,1314],{},"The ",[347,1305,1014],{},[347,1307,1019],{}," is set to ",[347,1310,389],{}," so the cost matrix and the gate\nagree on the maximum acceptable Mahalanobis distance; the ",[347,1313,385],{}," does\nthe principled per-pair rejection.",[1316,1317,1318],"style",{},"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 .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 .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--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 .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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 .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 .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);}",{"title":419,"searchDepth":444,"depth":444,"links":1320},[],"A motion tracker associates detections to the predicted position of each\ntracklet, rejecting spatially-implausible matches. This recipe runs a\nconstant-velocity Kalman filter on instance centroids: the tracklet state is\n4-D [x, y, vx, vy], advanced one step each frame; the detection carries a\n2-D [x, y] centroid measurement.","md",{},{"title":22,"description":1321},"rKUAl5FC9U_fYhLE95dCghYVjeGYXQP28Q1DHGRHxBc",{},1785139889142]