Этот пример показывает вам, как отследить дорожные транспортные средства вокруг автомобиля, оборудованного датчиком. Транспортные средства расширены объекты, размерности которых охватывают несколько ячеек разрешения датчика. В результате датчики сообщают о нескольких обнаружениях этих объектов в одном скане. В этом примере вы будете использовать различные расширенные методы отслеживания объекта, чтобы отследить дорожные транспортные средства и оценить результаты их эффективности отслеживания.
В обычных подходах отслеживания, таких как глобальный самый близкий сосед (multiObjectTracker
, trackerGNN
), соедините вероятностную ассоциацию данных (trackerJPDA
) и отслеживание мультигипотезы (trackerTOMHT
), отслеживаемые объекты приняты, чтобы возвратить одно обнаружение на скан датчика. С разработкой датчиков, которые имеют лучшее разрешение, такое как радар с высоким разрешением, датчики обычно возвращают больше чем одно обнаружение объекта. Например, изображение ниже изображает несколько обнаружений для одного транспортного средства, которое охватывает несколько радарных ячеек разрешения. В таких случаях метод, используемый, чтобы отследить объекты, известен как расширенный объект, отслеживающий [1].
Ключевое преимущество использования датчика с высоким разрешением получает больше информации об объекте, таком как его размерности и ориентация. Эта дополнительная информация может улучшить вероятность обнаружения и уменьшать ложный сигнальный уровень.
Расширенные объекты представляют собой новые проблемы к обычным средствам отслеживания, потому что эти средства отслеживания принимают одно обнаружение на объект на датчик. В некоторых случаях можно кластеризировать данные о датчике, чтобы предоставить обычным средствам отслеживания одно обнаружение на объект. Однако путем выполнения так, преимущество использования датчика с высоким разрешением может быть потеряно.
В отличие от этого расширенные объектные средства отслеживания могут обработать несколько обнаружений на объект. Кроме того, эти средства отслеживания могут оценить не только кинематические состояния, такие как положение и скорость объекта, но также и размерности и ориентация объекта. В этом примере вы отслеживаете транспортные средства вокруг автомобиля, оборудованного датчиком с помощью следующих средств отслеживания:
Обычное мультиобъектное средство отслеживания с помощью целевой точкой модели, multiObjectTracker
GGIW-доктор-философии (Гэмма Госсиэн Инверс Уишарт PHD) средство отслеживания, trackerPHD
с ggiwphd
фильтр
Доктор философии GM (Гауссова смесь PHD) средство отслеживания, trackerPHD
с gmphd
отфильтруйте использующую прямоугольную целевую модель
Вы оцените результаты отслеживания всех средств отслеживания с помощью trackErrorMetrics
и trackAssignmentMetrics
, которые обеспечивают несколько мер эффективности средства отслеживания. Вы также оцените результаты с помощью Оптимальной Метрики Присвоения SubPattern (OSPA), trackOSPAMetric
, который стремится оценивать эффективность средства отслеживания с помощью объединенного счета.
Сценарий
В этом примере существует автомобиль, оборудованный датчиком и четыре других транспортных средства: транспортное средство перед автомобилем, оборудованным датчиком в центральном маршруте, транспортное средство позади автомобиля, оборудованного датчиком в центральном маршруте, грузовике перед автомобилем, оборудованным датчиком в правильном маршруте и транспортном средстве перехвата в левом маршруте.
В этом примере вы симулируете автомобиль, оборудованный датчиком, который имеет 6 радарных датчиков и 2 датчика видения, покрывающие полное поле зрения. Датчики имеют некоторое перекрытие и некоторый разрыв покрытия. Автомобиль, оборудованный датчиком оборудован радарным датчиком дальним и датчиком видения на обоих передняя и задняя часть транспортного средства. Каждая сторона транспортного средства имеет два ближних радарных датчика, каждый покрывающий 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
обеспечьте несколько мер эффективности алгоритма отслеживания. Вы также оцените эффективность на основе Оптимальной Метрики Присвоения SubPattern (OSPA), который обеспечивает одно значение баллов для алгоритма отслеживания на каждом временном шаге. Эта метрика может быть вычислена с помощью trackOSPAMetric
класс. 'Пользовательская' функция, определяемая расстояния для OSPA - то же самое как метрики присвоения.
% actorProfiles to provide the error function size information about each % truth. aProfiles = actorProfiles(scenario); % Function to return the errors given track and truth. errorFcn = @(track,truth)helperExtendedTargetError(track,truth,aProfiles); % Function to return the distance between track and truth distFcn = @(track,truth)helperExtendedTargetDistance(track,truth,aProfiles); % 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 = 'Ego Cartesian'; 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 использует следующие распределения:
\Gamma: Положительное значение, чтобы описать ожидаемое количество обнаружений.
Гауссов: Вектор состояния, чтобы описать кинематическое состояние цели
Обратный Уишарт: положительно-определенная матрица, чтобы описать эллиптическую степень.
В модели принимается, что каждое распределение независимо друг от друга. Таким образом плотность гипотезы вероятности (PHD) в фильтре GGIW-PHD описана взвешенной суммой функций плотности вероятности нескольких компонентов GGIW.
Средство отслеживания доктора философии требует вычисления обнаружительной способности каждого компонента в плотности. Вычисление обнаружительной способности требует настроек каждого датчика, используемого со средством отслеживания. Вы задаете эти настройки для 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 в функции ниже задают более низкое и верхнее расстояние Mahalanobis между обнаружениями. Это эквивалентно определению, что каждый кластер обнаружения должен быть минимумом 3 разрешений независимо и максимума 5 разрешений друг кроме друга.
partFcn = @(x)partitionDetections(x,3,5); tracker = trackerPHD('SensorConfigurations', sensorConfigurations,... 'PartitioningFcn',partFcn,... 'AssignmentThreshold',220,...% Minimum negative log-likelihood of a detection cell (multiple detections per cell) to add birth components. 'ExtractionThreshold',0.8,...% 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); 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
(Sensor Fusion and Tracking Toolbox)) к отслеживаемым объектам. В отличие от ggiwphd
, который использует эллиптическую форму, чтобы отследить степень, gmphd
позволяет вам использовать Распределение Гаусса, чтобы задать форму по вашему выбору. Прямоугольная целевая модель задана моделями движения, ctrect
(Sensor Fusion and Tracking Toolbox) и ctrectjac
(Sensor Fusion and Tracking Toolbox) и модели измерения, ctrectmeas
(Sensor Fusion and Tracking Toolbox) и ctrectmeasjac
(Sensor Fusion and Tracking Toolbox).
Настройки датчика, заданные для 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',220,...% Minimum negative log-likelihood of a detection cell to add birth components 'ExtractionThreshold',0.8,...% 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 принимает, что измерения распределяются вокруг степени объекта, которая приводит к центру дорожек на заметных частях транспортного средства. Это может также быть замечено в ошибочных метриках положения для TruthID 2 и 4. Средство отслеживания может оценить размерности объекта приблизительно с 0,3-метровой точностью для транспортных средств вперед и позади автомобиля, оборудованного датчиком. Из-за более высокой уверенности, заданной для размерностей транспортных средств в helperInitGGIWFilter
функция, средство отслеживания не сворачивает длину этих транспортных средств, даже когда хорошо-подходящий эллипс имеет очень низкую длину. Когда проходящее мимо транспортное средство (TruthID 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] Granström, Карл, Маркус Баум и Штефан Ройтер. "Расширенное объектное отслеживание: введение, обзор и приложения". Журнал усовершенствований в информационном Fusion. Издание 12, № 2, декабрь 2017.
[2] Granström, Карл, Кристиан Ландкуист и Умут Оргунер. "Отслеживая прямоугольные и эллиптические расширенные цели с помощью лазерных измерений". 14-я Международная конференция по вопросам информационного Fusion. IEEE, 2011.
[3] Granström, Карл. "Расширенное целевое отслеживание с помощью фильтров PHD". 2012
helperExtendedTargetError
Функция, чтобы задать ошибку между отслеженной целью и связанной основной истиной.
function [posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth,aProfiles) % 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(:); thisActor = truth.ActorID; thisProfile = aProfiles([aProfiles.ActorID] == thisActor); trueDims = [thisProfile.Length;thisProfile.Width]; % Get estimated value from track. % GGIW-PHD tracker outputs a field 'Extent' and 'SourceIndex' % GM-PHD tracker outputs 'SourceIndex', but not 'Extent' % multiObjectTracker does not output 'SourceIndex' if ~isfield(track,'SourceIndex') 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,aProfiles) % This function computes the distance between track and a truth. % Copyright 2019 The MathWorks, Inc. % Errors in each aspect [posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth,aProfiles); % 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}(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
drivingScenario
| multiObjectTracker
| ggiwphd
(Sensor Fusion and Tracking Toolbox) | trackAssignmentMetrics
(Sensor Fusion and Tracking Toolbox) | trackErrorMetrics
(Sensor Fusion and Tracking Toolbox)