В этом примере показано, как отслеживать автомобильные транспортные средства вокруг эго-транспортного средства. Транспортные средства представляют собой расширенные объекты, размеры которых охватывают несколько ячеек сенсорного разрешения. В результате датчики сообщают о множественных обнаружениях этих объектов в одном сканировании. В этом примере используются различные расширенные методы отслеживания объектов для отслеживания транспортных средств и оценки результатов их отслеживания.
В обычных подходах отслеживания, таких как глобальный ближайший сосед (multiObjectTracker, trackerGNN), совместная вероятностная ассоциация данных (trackerJPDA) и отслеживание нескольких гипотез (trackerTOMHT), предполагается, что отслеживаемые объекты возвращают по одному обнаружению на сканирование датчика. С развитием датчиков, которые имеют лучшее разрешение, таких как радар высокого разрешения, датчики обычно возвращают более одного обнаружения объекта. Например, изображение ниже изображает множество обнаружений для одного транспортного средства, которое охватывает множество ячеек разрешения радара. В таких случаях метод, используемый для отслеживания объектов, известен как расширенное отслеживание объектов [1].

Ключевым преимуществом использования датчика высокого разрешения является получение дополнительной информации об объекте, такой как его размеры и ориентация. Эта дополнительная информация может повысить вероятность обнаружения и снизить частоту ложных аварийных сигналов.
Расширенные объекты представляют новые проблемы для обычных трекеров, поскольку эти трекеры предполагают одиночное обнаружение на объект на датчик. В некоторых случаях можно сгруппировать данные датчика для обеспечения обычных трекеров одним обнаружением для каждого объекта. Однако при этом преимущество использования датчика высокого разрешения может быть утрачено.
Напротив, расширенные средства отслеживания объектов могут обрабатывать несколько обнаружений на объект. Кроме того, эти трекеры могут оценивать не только кинематические состояния, такие как положение и скорость объекта, но также размеры и ориентацию объекта. В этом примере отслеживаются транспортные средства вокруг эго-транспортного средства с помощью следующих трекеров:
Обычный многообъектный трекер, использующий модель «точка-цель», multiObjectTracker
GGIW-PHD (гамма-гауссовский обратный PHD) трекер, trackerPHD с ggiwphd фильтр
трекер GM-PHD (гауссова смесь PHD), trackerPHD с gmphd фильтр с использованием прямоугольной целевой модели
Вы оцените результаты отслеживания всех трекеров с помощью trackErrorMetrics и trackAssignmentMetrics, которые обеспечивают множественные показатели эффективности трекера. Вы также оцените результаты, используя метрику оптимального назначения субпоследовательности (OSPA), trackOSPAMetric, которая направлена на оценку производительности трекера с использованием комбинированной оценки.
Сценарий
В этом примере имеется эго-транспортное средство и четыре других транспортных средства: транспортное средство впереди эго-транспортного средства в центральной полосе, транспортное средство позади эго-транспортного средства в центральной полосе, грузовик впереди эго-транспортного средства в правой полосе и обгон транспортного средства в левой полосе.
В этом примере моделируется эго-транспортное средство с 6 радиолокационными датчиками и 2 датчиками зрения, охватывающими 360-градусное поле зрения. Датчики имеют некоторое перекрытие и некоторый промежуток покрытия. Эго-транспортное средство оснащено дальнобойным радиолокационным датчиком и датчиком зрения как спереди, так и сзади транспортного средства. Каждая сторона транспортного средства имеет два радиолокационных датчика ближнего радиуса действия, каждый из которых охватывает 90 градусов. Один датчик с каждой стороны закрывает от середины транспортного средства к спине. Другой датчик с каждой стороны закрывается от середины транспортного средства вперед.
% Create the scenario exPath = fullfile(matlabroot,'examples','driving_fusion','main'); addpath(exPath) [scenario, egoVehicle, sensors] = helperCreateScenario; % Create the display object display = helperExtendedTargetTrackingDisplay; % Create the Animation writer to record each frame of the figure for % animation writing. Set 'RecordGIF' to true to enable GIF writing. gifWriter = helperGIFWriter('Figure',display.Figure,... 'RecordGIF',false);

Метрики
В этом примере используются некоторые ключевые метрики для оценки производительности отслеживания каждого трекера. В частности, вы оцениваете трекеры на основе их точности в оценке положений, скоростей, размеров (длины и ширины) и ориентаций объектов. Эти метрики могут быть оценены с помощью trackErrorMetrics класс. Чтобы определить ошибку отслеживаемой цели по ее истинности, в этом примере используется «пользовательская» функция ошибки, helperExtendedTargetError, перечисленных в конце этого примера.
Вы также оцените производительность на основе таких показателей, как количество ложных дорожек или избыточных дорожек. Эти метрики могут быть рассчитаны с помощью trackAssignmentMetrics класс. Чтобы определить расстояние между отслеживаемой целью и объектом истинности, в этом примере используется «пользовательская» функция ошибки, helperExtendedTargetDistance, перечисленных в конце этого примера. Функция определяет метрику расстояния как сумму расстояний по положению, скорости, размеру и рысканию.
trackErrorMetrics и trackAssignmentMetrics обеспечение множества показателей эффективности алгоритма слежения. Вы также оцените производительность, основываясь на метрике оптимального назначения подшаблонов (OSPA), которая предоставляет единственное значение оценки для алгоритма отслеживания на каждом шаге времени. Эта метрика может быть вычислена с помощью trackOSPAMetric класс. «Пользовательская» функция расстояния, определенная для OSPA, совпадает с метрикой назначения.
% Function to return the errors given track and truth. errorFcn = @(track,truth)helperExtendedTargetError(track,truth); % Function to return the distance between track and truth distFcn = @(track,truth)helperExtendedTargetDistance(track,truth); % Function to return the IDs from the ground truth. The default % identifier assumes that the truth is identified with PlatformID. In % drivingScenario, truth is identified with an ActorID. truthIdFcn = @(x)[x.ActorID]; % Create metrics object. tem = trackErrorMetrics(... 'ErrorFunctionFormat','custom',... 'EstimationErrorLabels',{'PositionError','VelocityError','DimensionsError','YawError'},... 'EstimationErrorFcn',errorFcn,... 'TruthIdentifierFcn',truthIdFcn); tam = trackAssignmentMetrics(... 'DistanceFunctionFormat','custom',... 'AssignmentDistanceFcn',distFcn,... 'DivergenceDistanceFcn',distFcn,... 'TruthIdentifierFcn',truthIdFcn,... 'AssignmentThreshold',30,... 'DivergenceThreshold',35); % Create ospa metric object tom = trackOSPAMetric(... 'Distance','custom',... 'DistanceFcn',distFcn,... 'TruthIdentifierFcn',truthIdFcn);
multiObjectTracker Система object™ предполагает одно обнаружение на объект на датчик и использует подход глобального ближайшего соседа для связывания обнаружений с дорожками. Предполагается, что каждый объект может быть обнаружен сенсором при сканировании максимум один раз. В этом случае моделируемые радиолокационные датчики имеют достаточно высокое разрешение, чтобы генерировать множество обнаружений на объект. Если эти обнаружения не кластеризованы, трекер генерирует несколько дорожек на объект. Кластеризация возвращает одно обнаружение на кластер, за счет большей ковариации неопределенности и потери информации о истинных измерениях объекта. Кластеризация также затрудняет различение двух объектов, когда они находятся близко друг к другу, например, когда одно транспортное средство проходит другое транспортное средство.
trackerRunTimes = zeros(0,3); ospaMetric = zeros(0,3); % Create a multiObjectTracker tracker = multiObjectTracker(... 'FilterInitializationFcn', @helperInitPointFilter, ... 'AssignmentThreshold', 30, ... 'ConfirmationThreshold', [4 5], ... 'DeletionThreshold', 3); % Reset the random number generator for repeatable results seed = 2018; S = rng(seed); timeStep = 1; % For multiObjectTracker, the radar reports in Ego Cartesian frame and does % not report velocity. This allows us to cluster detections from multiple % sensors. for i = 1:6 sensors{i}.HasRangeRate = false; sensors{i}.DetectionCoordinates = 'Body'; end
Выполнение сценария
while advance(scenario) && ishghandle(display.Figure) % Get the scenario time time = scenario.SimulationTime; % Collect detections from the ego vehicle sensors [detections,isValidTime] = helperDetect(sensors, egoVehicle, time); % Update the tracker if there are new detections if any(isValidTime) % Detections must be clustered first for the point tracker detectionClusters = helperClusterRadarDetections(detections); % Update the tracker tic % confirmedTracks are in scenario coordinates confirmedTracks = updateTracks(tracker, detectionClusters, time); t = toc; % Update the metrics % a. Obtain ground truth groundTruth = scenario.Actors(2:end); % All except Ego % b. Update assignment metrics tam(confirmedTracks,groundTruth); [trackIDs,truthIDs] = currentAssignment(tam); % c. Update error metrics tem(confirmedTracks,trackIDs,groundTruth,truthIDs); % d. Update ospa metric ospaMetric(timeStep,1) = tom(confirmedTracks, groundTruth); % Update bird's-eye-plot % Convert tracks to ego coordinates for display confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks); display(egoVehicle, sensors, detections, confirmedTracksEgo, detectionClusters); drawnow; % Record tracker run times trackerRunTimes(timeStep,1) = t; timeStep = timeStep + 1; % Capture frames for animation gifWriter(); end end % Capture the cumulative track metrics. The error metrics show the averaged % value of the error over the simulation. assignmentMetricsMOT = tam.trackMetricsTable; errorMetricsMOT = tem.cumulativeTruthMetrics; % Write GIF if requested writeAnimation(gifWriter,'multiObjectTracking');
Эти результаты показывают, что при кластеризации трекер может отслеживать объекты в сцене. Однако это также показывает, что трасса, связанная с обгоняющим транспортным средством (желтая), перемещается от передней части транспортного средства в начале сценария к задней части транспортного средства в конце. В начале сценария обгоняющее транспортное средство находится позади эго-транспортного средства (синего цвета), поэтому с его передней стороны производятся радиолокационные и визуальные детекторы. Когда обгоняющее транспортное средство проходит мимо эго-транспортного средства, производится радиолокационное обнаружение со стороны обгоняющего транспортного средства, а затем с его задней стороны, и трасса перемещается в заднюю часть транспортного средства.
Также видно, что кластеризация не идеальна. Когда проезжающее транспортное средство проходит мимо транспортного средства, которое находится за эго-транспортным средством (фиолетовым), обе дорожки слегка смещаются влево из-за несовершенной кластеризации. Резервная дорожка создается на дорожке первоначально из-за множества кластеров, созданных при пропуске части боковой кромки. Кроме того, избыточная дорожка появляется на проезжающем транспортном средстве во время конца, потому что расстояния между ее обнаружениями увеличиваются.
![]()
В этом разделе используется трекер GGIW-PHD (trackerPHD с ggiwphd) для отслеживания объектов. В отличие от этого, multiObjectTracker, который использует один фильтр на дорожку, GGIW-PHD является многоцелевым фильтром, который описывает плотность вероятностной гипотезы (PHD) сценария. Для моделирования расширенного целевого объекта GGIW-PHD использует следующие распределения:
Гамма: Положительное значение для описания ожидаемого количества обнаружений.
Гауссов: Вектор состояния для описания кинематического состояния цели
Инверсно-Вишарт: Положительно-определенная матрица для описания эллиптической степени.
Модель предполагает, что каждое распределение не зависит друг от друга. Таким образом, плотность гипотезы вероятности (PHD) в GGIW-PHD фильтре описывается взвешенной суммой функций плотности вероятности нескольких GGIW компонентов.
PHD-трекер требует вычисления обнаруживаемости каждого компонента в плотности. Расчет обнаруживаемости требует конфигурации каждого датчика, используемого с трекером. Эти конфигурации определяются для trackerPHD с использованием trackingSensorConfiguration класс. Просмотрите helperCreateSensorConfigurations чтобы увидеть, как свойства датчика могут быть использованы для определения конфигураций датчика для трекера.
% Set up sensor configurations % sensorConfigurations = helperCreateSensorConfigurations(sensors,egoVehicle); % The transform function and filter initialization functions are state and % filter dependent. Therefore, they are not set in the helper function. for i = 1:numel(sensorConfigurations) % You can use a different technique to initialize a filter for each % sensor by using a different function for each configuration. sensorConfigurations{i}.FilterInitializationFcn = @helperInitGGIWFilter; % Tracks are defined in constant turn-rate state-space in the scenario % coordinates. The MeasurementFcn for constant turn-rate model can be % used as the transform function. sensorConfigurations{i}.SensorTransformFcn = @ctmeas; end
Определите трекер.
В отличие от трекера точечных объектов, который обычно учитывает один раздел (кластер) обнаружений, trackerPHD создает несколько возможных разделов набора обнаружений и оценивает его по текущим компонентам в PHD-фильтре. 3 и 5 в функции ниже определяет нижнее и верхнее расстояние Махаланобиса между обнаружениями. Это эквивалентно определению того, что каждый кластер обнаружения должен быть как минимум на 3 разрешения друг от друга и как максимум на 5 разрешений друг от друга. Вспомогательная функция обтекает элемент Detections и не использует измерения дальности для разбиения обнаружений с боковых радаров.
partFcn = @(x)helperPartitioningFcn(x,3,5); tracker = trackerPHD('SensorConfigurations', sensorConfigurations,... 'PartitioningFcn',partFcn,... 'AssignmentThreshold',450,...% Minimum negative log-likelihood of a detection cell (multiple detections per cell) to add birth components. 'ExtractionThreshold',0.75,...% Weight threshold of a filter component to be declared a track 'ConfirmationThreshold',0.85,...% Weight threshold of a filter component to be declared a confirmed track 'MergingThreshold',50,...% Threshold to merge components 'HasSensorConfigurationsInput',true... % Tracking is performed in scenario frame and hence sensor configurations change with time );
Запустите моделирование.
% Release and restart all objects. restart(scenario); release(tem); release(tam); % No penality for trackerPHD tam.AssignmentThreshold = tam.AssignmentThreshold - 2; release(display); display.PlotClusteredDetection = false; gifWriter.pFrames = {}; for i = 1:numel(sensors) release(sensors{i}); if i <= 6 sensors{i}.HasRangeRate = true; sensors{i}.DetectionCoordinates = 'Sensor spherical'; end end % Restore random seed. rng(seed) % First time step timeStep = 1; % Run the scenario while advance(scenario) && ishghandle(display.Figure) % Get the scenario time time = scenario.SimulationTime; % Get the poses of the other vehicles in ego vehicle coordinates ta = targetPoses(egoVehicle); % Collect detections from the ego vehicle sensors [detections, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time, sensorConfigurations); % Update the tracker with all the detections. Note that there is no % need to cluster the detections before passing them to the tracker. % Also, the sensor configurations are passed as an input to the % tracker. tic % confirmedTracks are in scenario coordinates confirmedTracks = tracker(detections,configurations,time); t = toc; % Update the metrics % a. Obtain ground truth groundTruth = scenario.Actors(2:end); % All except Ego % b. Update assignment metrics tam(confirmedTracks,groundTruth); [trackIDs,truthIDs] = currentAssignment(tam); % c. Update error metrics tem(confirmedTracks,trackIDs,groundTruth,truthIDs); % d. Update ospa metric ospaMetric(timeStep,2) = tom(confirmedTracks, groundTruth); % Update the bird's-eye plot % Convert tracks to ego coordinates for display confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks); display(egoVehicle, sensors, detections, confirmedTracksEgo); drawnow; % Record tracker run times trackerRunTimes(timeStep,2) = t; timeStep = timeStep + 1; % Capture frames for GIF gifWriter(); end % Capture the truth and track metrics tables assignmentMetricsGGIWPHD = tam.trackMetricsTable; errorMetricsGGIWPHD = tem.cumulativeTruthMetrics; % Write GIF if requested writeAnimation(gifWriter,'ggiwphdTracking');
Эти результаты показывают, что GGIW-PHD может обрабатывать несколько обнаружений на объект на сенсор, без необходимости кластеризации этих обнаружений в первую очередь. Кроме того, используя множество обнаружений, трекер оценивает положение, скорость, размеры и ориентацию каждого объекта. Пунктирная эллиптическая форма на рисунке демонстрирует ожидаемую протяженность мишени. Функция инициализации фильтра определяет несколько возможных размеров и их относительные веса с использованием нескольких компонентов. Список можно расширить, чтобы добавить дополнительные размеры с добавленной вычислительной сложностью. Напротив, можно также инициализировать один компонент для каждого обнаружения с более высокой неопределенностью размеров. Это позволит трекеру автоматически оценивать размеры объектов. Тем не менее, точность оценки будет зависеть от наблюдаемости целевых размеров и подвержена усадке и увеличению путевых размеров, когда цели перемещаются вокруг эго-транспортного средства.
Фильтр GGIW-PHD предполагает, что обнаружения распределены по эллиптическому центру цели. Поэтому дорожки имеют тенденцию следовать за наблюдаемыми частями транспортного средства. Такие наблюдаемые части включают в себя заднюю поверхность транспортного средства, которая находится непосредственно перед эго-транспортным средством или переднюю поверхность транспортного средства, например, непосредственно позади эго-транспортного средства, заднюю и переднюю поверхности транспортного средства, соответственно, впереди и позади эго-транспортного средства. Напротив, длина и ширина проезжающего транспортного средства полностью наблюдались во время моделирования. Поэтому его предполагаемый эллипс имеет лучшее перекрытие с фактической формой.
![]()
В этом разделе используется трекер GM-PHD (trackerPHD с gmphd) и прямоугольную целевую модель (initctrectgmphd) для отслеживания объектов. В отличие от этого, ggiwphd, которая использует эллиптическую форму для отслеживания протяженности, gmphd позволяет использовать распределение по Гауссу для определения формы выбора. Прямоугольная целевая модель определяется моделями движения. ctrect и ctrectjac и модели измерений, ctrectmeas и ctrectmeasjac.
Конфигурации датчиков, определенные для trackerPHD ранее, остаются прежними, за исключением определения SensorTransformFcn и FilterInitializationFcn.
for i = 1:numel(sensorConfigurations) sensorConfigurations{i}.FilterInitializationFcn = @helperInitRectangularFilter; % Initialize a rectangular target gmphd sensorConfigurations{i}.SensorTransformFcn = @ctrectcorners; % Use corners to calculate detection probability end % Define tracker using new sensor configurations tracker = trackerPHD('SensorConfigurations', sensorConfigurations,... 'PartitioningFcn',partFcn,... 'AssignmentThreshold',600,...% Minimum negative log-likelihood of a detection cell to add birth components 'ExtractionThreshold',0.85,...% Weight threshold of a filter component to be declared a track 'ConfirmationThreshold',0.95,...% Weight threshold of a filter component to be declared a confirmed track 'MergingThreshold',50,...% Threshold to merge components 'HasSensorConfigurationsInput',true... % Tracking is performed in scenario frame and hence sensor configurations change with time ); % Release and restart all objects. restart(scenario); for i = 1:numel(sensors) release(sensors{i}); end release(tem); release(tam); release(display); display.PlotClusteredDetection = false; gifWriter.pFrames = {}; % Restore random seed. rng(seed) % First time step timeStep = 1; % Run the scenario while advance(scenario) && ishghandle(display.Figure) % Get the scenario time time = scenario.SimulationTime; % Get the poses of the other vehicles in ego vehicle coordinates ta = targetPoses(egoVehicle); % Collect detections from the ego vehicle sensors [detections, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time, sensorConfigurations); % Update the tracker with all the detections. Note that there is no % need to cluster the detections before passing them to the tracker. % Also, the sensor configurations are passed as an input to the % tracker. tic % confirmedTracks are in scenario coordinates confirmedTracks = tracker(detections,configurations,time); t = toc; % Update the metrics % a. Obtain ground truth groundTruth = scenario.Actors(2:end); % All except Ego % b. Update assignment metrics tam(confirmedTracks,groundTruth); [trackIDs,truthIDs] = currentAssignment(tam); % c. Update error metrics tem(confirmedTracks,trackIDs,groundTruth,truthIDs); % d. Update ospa metric ospaMetric(timeStep,3) = tom(confirmedTracks, groundTruth); % Update the bird's-eye plot % Convert tracks to ego coordinates for display confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks); display(egoVehicle, sensors, detections, confirmedTracksEgo); drawnow; % Record tracker run times trackerRunTimes(timeStep,3) = t; timeStep = timeStep + 1; % Capture frames for GIF gifWriter(); end % Capture the truth and track metrics tables assignmentMetricsGMPHD = tam.trackMetricsTable; errorMetricsGMPHD = tem.cumulativeTruthMetrics; % Write GIF if requested writeAnimation(gifWriter,'gmphdTracking'); % Return the random number generator to its previous state rng(S) rmpath(exPath)
Эти результаты показывают, что GM-PHD также может обрабатывать несколько обнаружений на объект на сенсор. Подобно GGIW-PHD, он также оценивает размер и ориентацию объекта. Функция инициализации фильтра использует подход, аналогичный GGIW-PHD-трекеру, и инициализирует несколько компонентов для различных размеров.
Можно заметить, что предполагаемые дорожки, смоделированные в виде прямоугольников, хорошо вписываются в моделируемый объект истинности земли, изображаемый сплошными цветовыми фрагментами. В частности, дорожки способны правильно отслеживать форму транспортного средства вместе с кинематическим центром.
![]()
Оценка производительности отслеживания каждого трекера с использованием количественных показателей, таких как ошибка оценки положения, скорости, размеров и ориентации. Также оцените назначения дорожек, используя такие метрики, как избыточные и ложные дорожки.
Метрики назначения
helperPlotAssignmentMetrics(assignmentMetricsMOT, assignmentMetricsGGIWPHD, assignmentMetricsGMPHD);
![]()
Метрики назначения показывают, что избыточные и ложные дорожки были инициализированы и подтверждены трекером точечных объектов. Эти треки являются результатом несовершенной кластеризации, где обнаружения, принадлежащие одной цели, были сгруппированы в несколько кластеризованных обнаружений. Напротив, GGIW-PHD трекер и GM-PHD трекер поддерживают дорожки на всех четырех целевых объектах и не создают ложных или избыточных дорожек. Эти метрики показывают, что оба расширенных трекера объектов правильно разбивают обнаруженные объекты и связывают их с правильными дорожками.
Метрики ошибок
helperPlotErrorMetrics(errorMetricsMOT, errorMetricsGGIWPHD, errorMetricsGMPHD);
![]()
График показывает средние ошибки оценки для трех типов трекеров, используемых в этом примере. Поскольку трекер точечных объектов не оценивает рыскание и размеры объектов, они теперь отображаются на графиках. Трекер точечных объектов способен оценивать кинематику объектов с разумной точностью. Погрешность положения транспортного средства позади эго-транспортного средства выше, поскольку оно было потянуто влево, когда проезжающее транспортное средство обгоняет это транспортное средство. Это также артефакт несовершенной кластеризации, когда объекты находятся близко друг к другу.
Как описано выше, трекер GGIW-PHD предполагает, что измерения распределены по протяженности объекта, что приводит к центру дорожек на наблюдаемых частях транспортного средства. Это также можно видеть в метриках ошибки положения для ИДС 2 и 4. Трекер способен оценить размеры объекта с точностью около 0,3 метра для транспортных средств впереди и позади эго-транспортного средства. Ввиду более высокой определенности, определенной для габаритов транспортных средств в helperInitGGIWFilter функция, трекер не сворачивает длину этих транспортных средств, даже когда наиболее подходящий эллипс имеет очень низкую длину. Поскольку проходящее транспортное средство (РID 3) наблюдалось по всем размерам, его размеры измерялись более точно, чем у других транспортных средств. Однако, когда проходящее транспортное средство маневрирует относительно эго-транспортного средства, погрешность оценки рыскания выше.
GM-PHD в этом примере использует целевую модель прямоугольной формы и использует полученные измерения для оценки ожидаемых измерений на границе цели. Эта модель помогает трекеру точнее оценивать форму и ориентацию. Однако процесс оценки ожидаемых измерений на краях прямоугольной мишени является более дорогостоящим в вычислительном отношении.
Метрика OSPA
Как описано выше, метрика OSPA предназначена для описания производительности алгоритма отслеживания с использованием одной оценки. Обратите внимание, что OSPA в достаточной степени фиксирует производительность алгоритма слежения, который уменьшается от GM-PHD к GGIW-PHD до точечного трекера, как описано с использованием метрик ошибки и назначения.
ospaFig = figure; plot(ospaMetric,'LineWidth',2); legend('Point Target Tracker','GGIW-PHD Tracker','Rectangular GM-PHD Tracker'); xlabel('Time step (k)'); ylabel('OSPA');
![]()
Ранее вы узнали о различных методах, предположениях, которые они делают о целевых моделях, и результирующей производительности отслеживания. Теперь сравните время работы трекеров. Обратите внимание, что фильтр GGIW-PHD предлагает значительные вычислительные преимущества по сравнению с GM-PHD, что приводит к снижению производительности отслеживания.
runTimeFig = figure; h = plot(trackerRunTimes(3:end,:)./trackerRunTimes(3:end,1),'LineWidth',2); legend('Point Target Tracker','GGIW-PHD Tracker','Rectangular GM-PHD Tracker'); xlabel('Time step (k)'); ylabel('$$\frac{t_{tracker}}{t_{multiObjectTracker}}$$','interpreter','latex','fontsize',14); ylim([0 max([h.YData]) + 1]);
![]()
В этом примере показано, как отслеживать объекты, которые возвращают несколько обнаружений при сканировании одного датчика с использованием различных подходов. Эти подходы могут быть использованы для отслеживания объектов с помощью датчиков высокого разрешения, таких как радар или лазерный датчик.
[1] Гранстрём, Карл, Маркус Баум и Стефан Рейтер. «Расширенное отслеживание объектов: введение, обзор и приложения». Журнал достижений в области слияния информации. т. 12, № 2, декабрь 2017 года.
[2] Гранстрём, Карл, Кристиан Лундквист и Умут Оргунер. 14-я Международная конференция по слиянию информации. IEEE, 2011.
[3] Гранстрём, Карл. «Расширенное отслеживание цели с помощью PHD-фильтров». 2012
helperExtendedTargetError
Функция для определения ошибки между отслеживаемой целью и соответствующей истинностью грунта.
function [posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth) % Errors as a function of target track and associated truth. % Get true information from the ground truth. truePos = truth.Position(1:2)'; % Position is at the rear axle for all vehicles. We would like to compute % the error from the center of the vehicle rot = [cosd(truth.Yaw) -sind(truth.Yaw);sind(truth.Yaw) cosd(truth.Yaw)]; truePos = truePos + rot*[truth.Wheelbase/2;0]; trueVel = truth.Velocity(1:2); trueYaw = truth.Yaw(:); trueDims = [truth.Length;truth.Width]; % Get estimated value from track. % GGIW-PHD tracker outputs a struct field 'Extent' and 'SourceIndex' % GM-PHD tracker outputs struct with but not 'Extent' % multiObjectTracker outputs objectTrack if isa(track,'objectTrack') estPos = track.State([1 3]); estVel = track.State([2 4]); % No yaw or dimension information in multiObjectTracker. estYaw = nan; estDims = [nan;nan]; elseif isfield(track,'Extent') % trackerPHD with GGIWPHD estPos = track.State([1 3]); estVel = track.State([2 4]); estYaw = atan2d(estVel(2),estVel(1)); d = eig(track.Extent); dims = 2*sqrt(d); estDims = [max(dims);min(dims)]; else % trackerPHD with GMPHD estPos = track.State(1:2); estYaw = track.State(4); estVel = [track.State(3)*cosd(estYaw);track.State(3)*sind(estYaw)]; estDims = track.State(6:7); end % Compute 2-norm of error for each attribute. posError = norm(truePos(:) - estPos(:)); velError = norm(trueVel(:) - estVel(:)); dimError = norm(trueDims(:) - estDims(:)); yawError = norm(trueYaw(:) - estYaw(:)); end
helperExtendedTargetDistance
Функция для определения расстояния между дорожкой и истинной землей.
function dist = helperExtendedTargetDistance(track,truth) % This function computes the distance between track and a truth. % Copyright 2019-2020 The MathWorks, Inc. % Errors in each aspect [posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth); % For multiObjectTracker, add a constant penalty for not estimating yaw % and dimensions if isnan(dimError) dimError = 1; end if isnan(yawError) yawError = 1; end % Distance is the sum of errors dist = posError + velError + dimError + yawError; end
helperInitGGIWFilter
Функция для создания фильтра ggiwphd из ячейки обнаружения.
function phd = helperInitGGIWFilter(varargin) % helperInitGGIWFilter A function to initialize the GGIW-PHD filter for the % Extended Object Tracking example % Create a ggiwphd filter using 5 states and the constant turn-rate models. phd = ggiwphd(zeros(5,1),eye(5),... 'StateTransitionFcn',@constturn,... 'StateTransitionJacobianFcn',@constturnjac,... 'MeasurementFcn',@ctmeas,... 'MeasurementJacobianFcn',@ctmeasjac,... 'HasAdditiveMeasurementNoise',true,... 'HasAdditiveProcessNoise',false,... 'ProcessNoise',diag([1 1 3]),... 'MaxNumComponents',1000,... 'ExtentRotationFcn',@extentRotFcn,... 'PositionIndex',[1 3]); % If the function is called with no inputs i.e. the predictive portion of % the birth density, no components are added to the mixture. if nargin == 0 % Nullify to return 0 components. nullify(phd); else % When called with detections input, add two components to the filter, % one for car and one for truck, More components can be added based on % prior knowledge of the scenario, example, pedestrian or motorcycle. % This is a "multi-model" type approach. Another approach can be to add % only 1 component with a higher covariance in the dimensions. The % later is computationally less demanding, but has a tendency to track % observable dimensions of the object. For example, if only the back is % visible, the measurement noise may cause the length of the object to % shrink. % Detections detections = varargin{1}; % Enable elevation measurements to create a 3-D filter using % initctggiwphd if detections{1}.SensorIndex < 7 for i = 1:numel(detections) detections{i}.Measurement = [detections{i}.Measurement(1);0;detections{i}.Measurement(2:end)]; detections{i}.MeasurementNoise = blkdiag(detections{i}.MeasurementNoise(1,1),0.4,detections{i}.MeasurementNoise(2:end,2:end)); detections{i}.MeasurementParameters(1).HasElevation = true; end end phd3d = initctggiwphd(detections); % Set states of the 2-D filter using 3-D filter phd.States = phd3d.States(1:5); phd.StateCovariances = phd3d.StateCovariances(1:5,1:5); phd.DegreesOfFreedom = 1000; phd.ScaleMatrices = (1000-4)*diag([4.7/2 1.8/2].^2); % Add truck dimensions as second component append(phd,phd); phd.ScaleMatrices(:,:,2) = (1000-4)*diag([8.1/2 2.45/2].^2); phd.GammaForgettingFactors = [1.03 1.03]; % Relative weights of the components. Can be treated as probability of % existence of a car vs a truck on road. phd.Weights = [0.7 0.3]; end end function R = extentRotFcn(x,dT) % Rotation of the extent during prediction. w = x(5); theta = w*dT; R = [cosd(theta) -sind(theta);sind(theta) cosd(theta)]; end
helperInitRectangularFilter
Функция для создания прямоугольного целевого фильтра gmphd из ячейки обнаружения
function filter = helperInitRectangularFilter(varargin) % helperInitRectangularFilter A function to initialize the rectangular % target PHD filter for the Extended Object Tracking example % Copyright 2019 The MathWorks, Inc. if nargin == 0 % If called with no inputs, simply use the initctrectgmphd function to % create a PHD filter with no components. filter = initctrectgmphd; % Set process noise filter.ProcessNoise = diag([1 3]); else % When called with detections input, add two components to the filter, % one for car and one for truck, More components can be added based on % prior knowledge of the scenario, example, pedestrian or motorcycle. % This is a "multi-model" type approach. Another approach can be to add % only 1 component with a higher covariance in the dimensions. The % later is computationally less demanding, but has a tendency to track % observable dimensions of the object. For example, if only the back is % visible, the measurement noise may cause the length of the object to % shrink. % Detections detections = varargin{1}; % Create a GM-PHD filter with rectangular model filter = initctrectgmphd(detections); % Length width of a passenger car filter.States(6:7,1) = [4.7;1.8]; % High certainty in dimensions lCov = 1e-4; wCov = 1e-4; lwCorr = 0.5; lwCov = sqrt(lCov*wCov)*lwCorr; filter.StateCovariances(6:7,6:7,1) = [lCov lwCov;lwCov wCov]; % Add one more component by appending the filter with itself. append(filter,filter); % Set length and width to a truck dimensions filter.States(6:7,2) = [8.1;2.45]; % Relative weights of each component filter.Weights = [0.7 0.3]; end end