主要内容

如何有效地跟踪大量的对象

这个例子展示了如何使用trackerGNN跟踪大量的目标。可以应用于类似的技术trackerJPDAtrackerTOMHT

介绍

在许多应用程序中,需要跟踪器跟踪成百上千的对象。增加跟踪的数量由一个追踪者是一个挑战,造成算法的计算复杂度每跟踪器的核心。特别是,两个常见的阶段跟踪更新不易可伸缩步:计算作业成本和执行任务。作业成本计算是很常见的trackerGNN,trackerJPDA,trackerTOMHT这个例子所示,技术可以应用在使用这些追踪器。每个追踪的方式执行每个跟踪任务是独一无二的,并且可能需要定制的解决方案来提高跟踪性能,超出了这个例子的范围。万博 尤文图斯

场景

对于本示例中,您定义了一个场景,其中包含900平台,组织在一个15-by-15网格,每个网格单元包含4个平台。网格细胞的目的是演示的好处粗成本计算,后面的例子来解释。

下面的代码安排900年的网格单元中的对象并创建可视化。在左边,整个场景。4日在右边,可视化在缩放网格细胞。注意每个单元包含4个平台。

(平台、tp zoomedtp) = createPlatforms;

使用默认的作业成本计算

本节显示了跟踪的结果上面定义的平台上使用trackerGNN用默认AssignmentThreshold。的AssignmentThreshold属性包含两个值:(C1, C2),在那里C1阈值用于分配和吗C2是粗的阈值计算在下一节中解释。

当追踪更新一套新的检测,它计算的成本分配每个检测每一个轨道。准确的成本核算必须考虑每一个检测的测量和不确定性以及预期从每个跟踪测量和预期的不确定性,如下描述。

默认情况下,C2设置为正无穷,这要求所有的成本跟踪和检测计算的组合。这将导致一个更准确的分配,但更多的计算量。你应该开始与默认设置以确保跟踪分配检测跟踪的最好方法,然后考虑降低的价值C2降低作业成本计算所需的时间。

在作业成本核算,成本矩阵元素的值高于C1与正取代。这样做有助于分配算法忽略了不可能的任务。

定义一个跟踪器,可以追踪到1000张光碟。跟踪器使用默认的恒定速度扩展卡尔曼滤波器,和它的状态被定义为[x, vx; y; v; z; vz]使用的positionSelector以下位置的组件。

追踪= trackerGNN (“MaxNumTracks”,1000,“AssignmentThreshold”[正]30日);positionSelector = [1 0 0 0 0 0;0 0 1 0 0 0;0 0 0 0 0 0);

在第一次调用步骤,跟踪器实例化所有的痕迹。分离实例化所需的时间追踪从第一步所需的处理时间,您可以调用设置重置之前的追踪。看到支持函数万博1manbetxrunTracker在这个例子中为更多的细节。

[trkSummary、truSummary信息]= runTracker(平台、跟踪positionSelector、tp zoomedtp);
跟踪设置时间:8.3108步骤1时间:3.7554步骤2:15.3029步骤3时间:14.1099步骤4时间:14.3506步骤5时间:14.3963

所有步骤从现在没有检测。步骤6:0.53103步骤7次:0.52582步骤8时间:0.50639步骤9:0.50909步骤10时间:0.16034场景中完成。所有跟踪现在都删除。

你分析的跟踪结果通过检查跟踪任务指标的值。为完美的跟踪轨迹的总数的数量应该等于平台和应该没有假,交换或发散。同样的,不应该有失踪的真理或减免的总结。

assignmentMetricsSummary (trkSummary truSummary)
跟踪任务指标简介:TotalNumTracks NumFalseTracks MaxSwapCount MaxDivergenceCount是_____________ _______ _____________ ___________________ MaxDivergenceLength * * * 900 0 0 0 0真理的任务指标简介:TotalNumTruths NumMissingTruths MaxEstablishmentLength ___________ ______________________ _________________ MaxBreakCount * * * 900 0 1 0

使用粗作业成本计算

在前一节中,您看到了跟踪器能跟踪所有的平台,但每次更新步骤需要很长一段时间。大部分时间是花在作业成本计算的矩阵。

检查成本矩阵,可以看到,绝大多数的元素,事实上,正无穷。

厘米= info.CostMatrix;disp (“成本矩阵”+元素个数(cm) +“元素”。);disp (“但有限值的数量”+元素个数(厘米(isfinite (cm))) +换行符)
成本矩阵有810000个元素。但是有限的值的数量是2700

上述结果表明,成本计算花费太多时间在所有的作业成本计算的组合跟踪和检测。然而,大多数这些组合分配,太远的实测远离轨道预计基于传感器测量特征。为了避免计算的所有成本的浪费,您可以使用粗成本计算。

粗糙的计算来验证完成组合的跟踪和检测可能需要一个精确的归一化距离计算。只有组合的粗任务低于成本C2计算准确。粗的成本计算是下图中所示。检测是由它的测量z美元和测量噪声R美元。两个跟踪预测的时间检测和投影测量空间,描述的点美元z_ {e_1} $美元z_ {e_2} $。注意跟踪不确定性不是将测量空间,它允许我们粗糙的计算进行向量化。这是一个粗略的估计,因为只有检测周围的不确定性考虑在内。在描述的例子中,第一个跟踪计算粗门之外的瀑布而第二个跟踪落在里面。因此,准确的成本核算只是做的组合检测和第二轨道。

使用粗成本核算,释放跟踪和修改它AssignmentThreshold一个值(200)。然后,重新运行跟踪。

发布追踪(追踪)。AssignmentThreshold= [30 200]; [trkSummary,truSummary] = runTracker(platforms,tracker,positionSelector,tp,zoomedtp);
跟踪设置时间:6.5846步骤1时间:3.5863步骤2:3.4095步骤3时间:2.9347步骤4时间:2.8555步骤5时间:2.9397

所有步骤从现在没有检测。步骤6:0.51446步骤7次:0.52277步骤8时间:0.54865步骤9:0.50941步骤10时间:0.19085场景中完成。所有跟踪现在都删除。

你现在观察到的步骤3 - 5需要更少的时间来完成。第二步也比以前更快,但仍低于步骤3 - 5。

要理解为什么第二步是慢,首先考虑后的跟踪状态跟踪更新。美国包含位置信息,但速度仍然是零。当追踪计算作业成本,它预测的跟踪状态检测,但由于跟踪速度为0,他们仍然在同一位置。这导致大型检测之间的距离测量和预测的预期测量跟踪状态。这些相对较大的作业成本分配算法更难找到最好的作业,导致第二步需要更多时间比步骤3 - 5。

是很重要的验证与粗跟踪作业成本核算没有它仍然是一样的。如果跟踪任务指标是不一样的,你必须增加计算粗门的大小。以下显示跟踪仍然是完美的,因为它是在前面的小节中,但每个处理步骤花的时间少。

assignmentMetricsSummary (trkSummary truSummary)
跟踪任务指标简介:TotalNumTracks NumFalseTracks MaxSwapCount MaxDivergenceCount是_____________ _______ _____________ ___________________ MaxDivergenceLength * * * 900 0 0 0 0真理的任务指标简介:TotalNumTruths NumMissingTruths MaxEstablishmentLength ___________ ______________________ _________________ MaxBreakCount * * * 900 0 1 0

使用一个外部成本计算

另一种控制的时间来计算成本分配是通过使用自己的作业成本计算而不是默认的跟踪器使用。

外部成本计算可以考虑属性不属于跟踪状态和预期的测量。它还可以使用不同的距离度量,例如欧几里得范数距离代替规范化。成本核算的选择取决于具体的应用问题,测量空间,如何定义和测量。

使用一个外部成本计算,你释放追踪和设置它HasCostMatrixInput属性为true。你必须通过自己的成本矩阵作为一个额外的输入与每个更新的追踪。看到支持函数万博1manbetxrunTracker为更多的细节。

释放(跟踪);跟踪器。HasCostMatrixInput = true;[trkSummary, truSummary] = runTracker(平台、跟踪positionSelector、tp zoomedtp);assignmentMetricsSummary (trkSummary truSummary)
跟踪设置时间:6.559步骤1时间:3.4394步骤2:1.7852步骤3时间:1.474步骤4时间:1.5312步骤5时间:1.5152

所有步骤从现在没有检测。步骤6:0.60809步骤7次:0.61374步骤8时间:0.616步骤9:0.63798步骤10时间:0.22762场景中完成。所有跟踪现在都删除。跟踪任务指标简介:TotalNumTracks NumFalseTracks MaxSwapCount MaxDivergenceCount是_____________ _______ _____________ ___________________ MaxDivergenceLength * * * 900 0 0 0 0真理的任务指标简介:TotalNumTruths NumMissingTruths MaxEstablishmentLength ___________ ______________________ _________________ MaxBreakCount * * * 900 0 1 0

正如所料,加工时间更低当使用一个外部成本计算函数。

改变GNN分配算法

尝试另一个选择是使用不同的GNN分配算法,可以更有效的找到修改的任务赋值跟踪器的属性。

发布追踪(追踪)。赋值=“Jonker-Volgenant”;跟踪器。HasCostMatrixInput = true;runTracker(平台、跟踪positionSelector tp, zoomedtp);
跟踪设置时间:6.494步骤1时间:3.5346步骤2:1.894步骤3时间:3.1192步骤4时间:3.1212步骤5时间:3.1458

所有步骤从现在没有检测。步骤6:0.61109步骤7次:0.62456步骤8时间:0.61849步骤9:0.60604步骤10时间:0.22303场景中完成。所有跟踪现在都删除。

Jonker-Volgenant算法执行第二步的作业速度相对于默认Munkres算法。

蒙特卡罗模拟

如果你想运行多个场景,无需修改跟踪设置,不需要调用释放方法。相反,只需要调用重置从追踪方法清除以前的跟踪信息。通过这种方式,您保存实例化所有跟踪所需的时间。注意下面的“跟踪设置时间”相对于以前的运行。

重置(跟踪)runTracker(平台、跟踪positionSelector、tp zoomedtp);
跟踪设置时间:0.097531步骤1时间:3.4684步骤2:1.6592步骤3时间:3.1429步骤4时间:3.1274步骤5时间:3.0994

所有步骤从现在没有检测。步骤6:0.63232步骤7次:0.61857步骤8时间:0.61433步骤9:0.60698步骤10时间:0.25301场景中完成。所有跟踪现在都删除。

总结

这个例子展示了如何跟踪大量的对象。跟踪许多对象,追踪时花了大部分的处理时间为每个组合计算作业成本的跟踪和检测。您看到了如何使用成本计算阈值来提高计算任务所花费的时间成本。此外,这个例子展示了如何使用一个外部成本计算,这可能是设计为特定的追踪问题的计算效率更高。

可以降低作业成本阈值或使用外部成本核算来提高的速度trackerJPDAtrackerTOMHT

万博1manbetx支持功能

createPlatforms

这个函数创建的平台在一个20 x20的网格中每个网格单元与2 x2平台。

函数(平台、tp zoomedtp) = createPlatforms%,这是一个helper函数运行跟踪器和显示结果。它%在未来可能会被删除。nh = 15;%的水平网格细胞nv = 15;%垂直网格细胞的数量nsq = 2;% 2 x2平台在一个网格单元不良贷款= nh * nv * nsq ^ 2;%总数的平台xgv = (-50 + repmat (100 * (1: nh) [1 nsq]));ygv = (-50 + repmat (100 * (1: nv) [1 nsq]));(X, Y) = meshgrid (xgv ygv);《不扩散核武器条约》= nsq / 2;xshift = 10 * ((-npts + 1):《不扩散核武器条约》)5;yshift = xshift;xadd = repmat (xshift [1 nh]);yadd = repmat (yshift [1 nv]);[Xx, Yy] = meshgrid (xadd yadd);X = X + Xx; Y = Y + Yy; pos = [X(:),Y(:),zeros(numel(X),1)];%以下为平台,创建结构体数组的%后用于跟踪任务指标。韦尔= (3 1 0);%平台速度平台= repmat(结构体(“PlatformID”, 1“位置”(0 0 0),“速度”韦尔),不良贷款,1);i = 1:不良贷款平台(i)。PlatformID =我;平台(我).Position (,) = pos(我:);结束%的可视化图(f =“位置”[1 1 1425 700]);movegui中心;h1 = uipanel (f,“字形大小”12“位置”,(。01 . 01相关性.98),“标题”,“场景视图”);a1 =轴(h1,“位置”(0.05 - 0.05 0.9 - 0.9));tp = theaterPlot (“父”a1,“XLimits”[0 nh * 100],“YLimits”[0 nv * 100]);集(a1,“XTick”0:100:nh * 100)集(a1,“YTick”0:100:nv * 100)网格页= trackPlotter (tp,“标签”,“真相”,“标记”,“^”,“MarkerEdgeColor”,“k”,“MarkerSize”4“HistoryDepth”10);plotTrack (pp、重塑([platforms.Position] 3 []) ');trackPlotter (tp,“标签”,“跟踪”,“MarkerEdgeColor”,“b”,“MarkerSize”6“HistoryDepth”10);c =得到(a1.Parent“孩子”);i = 1:元素个数(c)如果isa (c(我),“matlab.graphics.illustration.Legend”)组(c(我),“可见”,“关闭”)结束结束h2 = uipanel (f,“字形大小”12“位置”,(。51 . 01相关性.98),“标题”,“放大视图”);a2 =轴(h2,“位置”(0.05 - 0.05 0.9 - 0.9));zoomedtp = theaterPlot (“父”a2“XLimits”(400 500),“YLimits”500年[400]);集(a2,“XTick”400:100:500)组(a2,“YTick”400:100:500电网)zoomedpp = trackPlotter (zoomedtp,“DisplayName的”,“真相”,“标记”,“^”,“MarkerEdgeColor”,“k”,“MarkerSize”6“HistoryDepth”10);plotTrack (zoomedpp重塑([platforms.Position] 3 []) ');trackPlotter (zoomedtp“DisplayName的”,“跟踪”,“MarkerEdgeColor”,“b”,“MarkerSize”8“HistoryDepth”10“ConnectHistory”,“上”,“字形大小”1);结束

runTracker

这个函数运行跟踪,更新策划者,收集跟踪任务指标。

函数[trkSummary、truSummary信息]= runTracker(平台、跟踪positionSelector、tp zoomedtp)%,这是一个helper函数运行跟踪器和显示结果。它%在未来可能会被删除。页= findPlotter (tp,“标签”,“真相”);trp = findPlotter (tp,“标签”,“跟踪”);zoomedpp = findPlotter (zoomedtp,“DisplayName的”,“真相”);zoomedtrp = findPlotter (zoomedtp,“DisplayName的”,“跟踪”);%节省时间,预先分配的所有检测和动态分配。不良贷款=元素个数(平台);侦破= objectDetection (0, 0, 0, 0));依据= repmat({侦破},[不良贷款,1]);%定义一个对象跟踪的任务指标。tam = trackAssignmentMetrics;%带回可视化。集(tp.Parent.Parent.Parent,“可见”,“上”)hasExternalCostFunction = tracker.HasCostMatrixInput;%测量时间设置跟踪。抽搐如果~ isLocked(跟踪)如果hasExternalCostFunction设置(追踪,侦破,0,0);其他的设置(追踪,侦破,0);结束结束重置(跟踪)disp (“追踪设置时间:“+ toc);%的5个步骤,检测的平台上运行。t = 1:5i = 1:不良贷款侦破{}。时间= t;依据我{}。测量=平台(i) .Position (:);结束抽搐如果hasExternalCostFunction如果isLocked(跟踪)%使用predictTracksToTime得到所有预测跟踪。allTracks = predictTracksToTime(追踪,“所有”t);其他的allTracks = [];结束costMatrix = predictedEuclidean (allTracks侦破,positionSelector);[痕迹,~,~,信息]=追踪(侦破t costMatrix);其他的[痕迹,~,~,信息]=追踪(侦破,t);结束trPos = getTrackPositions(跟踪、positionSelector);trIDs =字符串([tracks.TrackID]”);disp (“步骤”+ t +“:”+ toc)%更新图。plotTrack (pp、重塑([platforms.Position] 3 []) ');trPos plotTrack (trp);plotTrack (zoomedpp重塑([platforms.Position] 3 []) ');plotTrack (zoomedtrp trPos trIDs);drawnow%更新跟踪对象分配指标。如果nargout [trkSummary truSummary] = tam(跟踪、平台);结束%更新平台的位置。i = 1:不良贷款平台(i)。位置=平台(i)。位置+平台(我).Velocity;结束结束snapnow%运行步骤没有检测到追踪器删除所有歌曲。disp (“从现在开始的所有步骤都没有探测到。”)~ isempty(跟踪)t = t + 1;抽搐如果hasExternalCostFunction allTracks = predictTracksToTime(追踪,“所有”t);{},costMatrix = predictedEuclidean (allTracks positionSelector);跟踪=追踪({}t costMatrix);其他的跟踪=追踪({},t);结束disp (“步骤”+ t +“:”+ toc)%更新跟踪绘制的位置。trPos = getTrackPositions(跟踪、positionSelector);trIDs =字符串([tracks.TrackID]”);%更新图。plotTrack (pp、重塑([platforms.Position] 3 []) ');trPos plotTrack (trp);plotTrack (zoomedpp重塑([platforms.Position] 3 []) ');plotTrack (zoomedtrp trPos trIDs);drawnow%更新平台的位置。i = 1:不良贷款平台(i)。位置=平台(i)。位置+平台(我).Velocity;结束结束disp (”场景。所有曲目现在删除。”+换行)clearData (pp) clearData (trp) clearData (zoomedpp) clearData (zoomedtrp)组(tp.Parent.Parent.Parent,“可见”,“关闭”)%防止过度的快照drawnow结束

predictedEuclidean

函数计算之间的欧几里得距离测量的位置检测和预测位置跟踪。

函数euclidDist = predictedEuclidean(跟踪、检测、positionSelector)%,这是一个helper函数运行跟踪器和显示结果。它%在未来可能会被删除。如果isempty(跟踪)| | isempty(检测)euclidDist = 0(元素个数(跟踪),元素个数(检测);返回结束predictedStates = [tracks.State];predictedPositions = positionSelector * predictedStates;依据=(检测{:});measuredPositions = [dets.Measurement];euclidDist = 0(元素个数(跟踪),元素个数(检测);i = 1:元素个数(检测)差别= bsxfun (@minus, predictedPositions’, measuredPositions(:,我)');euclidDist(:,我=√总和((差别。*差别),2));结束结束

assignmentMetricsSummary

函数在一个表中显示关键任务指标形式。

函数assignmentMetricsSummary (trkSummary truSummary) trkSummary = rmfield (trkSummary, {“TotalSwapCount”,“TotalDivergenceCount”,“TotalDivergenceLength”,“MaxRedundancyCount”,“TotalRedundancyCount”,“MaxRedundancyLength”,“TotalRedundancyLength”});truSummary = rmfield (truSummary, {“TotalEstablishmentLength”,“TotalBreakCount”,“MaxBreakLength”,“TotalBreakLength”});trkTable = struct2table (trkSummary);truTable = struct2table (truSummary);disp (“跟踪任务指标总结:“)disp trkTable disp (“真相的任务指标总结:“)disp (truTable)结束