При разработке системы отслеживания мультиобъекта важно разработать метод оценки ее эффективности с учетом имеющихся основных истин. Эта основная истина обычно доступна из среды симуляции или с помощью таких методов, как экстракция основной истины с помощью ручной или автоматической маркировки записанных данных. Хотя можно качественно оценить алгоритм отслеживания с помощью инструментов визуализации, подход обычно не масштабируемый. Этот пример представляет различные инструменты количественного анализа в Sensor Fusion and Tracking Toolbox™ для оценки эффективности трекера. Вы также будете использовать некоторые общие события, такие как ложные треки, отслеживать свопы и т.д., с которыми сталкиваются при отслеживании нескольких объектов, чтобы понять сильные стороны и ограничения этих инструментов.
Общий рабочий процесс оценки мультиобъекта трекера при наличии основной истины можно разделить на 2 основных шага. Во-первых, треки присваиваются истинам, используя алгоритм назначения. Во-вторых, используя вычисленное назначение в качестве входа, вычисляют точность оценки состояния для каждой дорожки. На каждом шаге могут быть получены некоторые ключевые метрики для эффективности трекера. В Sensor Fusion and Tracking Toolbox™ метрики, соответствующие этим двум шагам, называются метриками присвоения и метриками ошибки соответственно.
Метрики назначения оценивают характеристики трекера, возникающие из-за неправильного назначения данных датчика трекам из-за неоднозначности, пропущенных целей или наличия ложных предупреждений. Неправильное назначение данных о датчике может привести к таким событиям, как обмен дорожками между целями, создание избыточных дорожек для цели, падение истинной целевой дорожки и создание ложной дорожки. С другой стороны, метрики ошибки обеспечивают оценку точности оценки состояния или уровня объекта трекера. Даже когда трекер хорошо работает при назначении, неточности на уровне дорожки могут произойти из-за шума в измерениях, а также неточностей в моделировании модели движения цели и модели измерения датчика.
Метрики назначения используют закрытый жадный подход ближайшего соседа, который позволяет назначать дорожки многие к одному, что означает, что несколько дорожек могут быть назначены одной и той же истине. На каждом шаге метрики направлены на присвоение треков истинам с учетом их назначения на предыдущем временном шаге. Это помогает метрикам присвоения классифицировать треки по определенным категориям на основе текущих и предыдущих назначений. Категории, используемые метриками назначения для треков, описаны на изображениях ниже.
Метрики присвоений также представляют истины как различные категории «целей» с точки зрения трекера. Это помогает метрикам назначения записывать события, такие как установление трека и пропуск. События установления и пропуска показаны на изображении ниже.
Путем классификации треков и истин по нескольким категориям, метрики назначения выводят кумулятивный анализ эффективности трекера. Метрики также предоставляют подробную информацию о информации о назначении для каждой истины и отслеживания. Кроме того, результаты назначения на каждом шаге из метрики назначения могут также использоваться для оценки метрики ошибки. Метрики ошибки выводят кумулятивный анализ точности трекера в оценке состояния. Подобно метрикам назначения, метрики ошибки также предоставляют подробную информацию для каждой дорожки и истинности.
Далее вы узнаете, как использовать присвоение и метрики ошибок в MATLAB.
Чтобы использовать метрики назначения, вы создаете trackAssignmentMetric
Системные object™. Вы также задаете свойства объекта, используя пары "имя-значение", чтобы сконфигурировать метрику для различных приложений. В этом примере вы задаете присвоение и расстояние расхождения как абсолютную ошибку в положении между дорожкой и истиной. Вы также задаете пороги расстояния для назначения и расхождения дорожки.
assignmentMetrics = trackAssignmentMetrics(... 'AssignmentDistance','posabserr',... 'DivergenceDistance','posabserr',... 'DivergenceThreshold',1,... 'AssignmentThreshold',0.85)
assignmentMetrics = trackAssignmentMetrics with properties: DistanceFunctionFormat: 'built-in' MotionModel: 'constvel' AssignmentThreshold: 0.8500 DivergenceThreshold: 1 AssignmentDistance: 'posabserr' DivergenceDistance: 'posabserr'
Чтобы использовать метрики ошибки, вы создаете trackErrorMetrics
Системный объект. Поскольку пар "имя-значение" не задано, используются значения по умолчанию. В этом примере цели считаются отслеживаемыми с помощью модели постоянной скорости.
errorMetrics = trackErrorMetrics
errorMetrics = trackErrorMetrics with properties: ErrorFunctionFormat: 'built-in' MotionModel: 'constvel'
Метрики назначения и ошибки управляются моделируемыми треками и истинами с помощью класса helper, helperMetricEvaluationScenarios
. Объект этого класса выводит список треков и истин на каждом временном шаге.
trackTruthSimulator = helperMetricEvaluationScenarios;
Вы также визуализируете результаты назначения и метрики ошибок с помощью вспомогательного класса с именем helperMetricEvaluationDisplay
. Эти вспомогательные классы включены вместе с примером в ту же рабочую папку, что и этот скрипт.
display = helperMetricEvaluationDisplay(... 'PlotTrackClassification',true,... 'PlotTruthClassification',true,... 'PlotTrackErrors',false,... 'PlotTruthErrors',false,... 'PlotAssignments',true,... 'RecordGIF',true,... 'ErrorToPlot','posRMS');
Вы генерируете список треков и истин в каждый раз и запускаете присвоение и метрики ошибок, используя следующий рабочий процесс.
% Time stamps at which the metrics are updated timeStamps = 0:0.1:10; n = numel(timeStamps); % Initialization of recorded variables posRMSE = zeros(n,1); velRMSE = zeros(n,1); posANEES = zeros(n,1); velANEES = zeros(n,1); truthError = cell(n,1); trackError = cell(n,1); % Loop over time stamps for i = 1 : n % Current time time = timeStamps(i); % Generate tracks and truths using simulation [tracks, truths] = trackTruthSimulator(time); % You provide the tracks and truths as input to the assignment metrics. % This outputs a cumulative summary from all the tracks and the truths. [trackAssignmentSummary(i), truthAssignmentSummary(i)] = assignmentMetrics(tracks, truths); %#ok<SAGROW> % For detailed assignment information about each track, you use the % trackMetricsTable method. trackTable = trackMetricsTable(assignmentMetrics); % Similarly, for detailed assignment information about each truth, you % use the truthMetricsTable method. truthTable = truthMetricsTable(assignmentMetrics); % For running error metrics, you obtain the current assignment of % tracks to truths using the currentAssignment method. [assignedTrackIDs, assignedTruthIDs] = currentAssignment(assignmentMetrics); % The current assignment information as well as the list of tracks and % truths at the current time can then be passed as an input to the % error metrics. [posRMSE(i),velRMSE(i),posANEES(i),velANEES(i)] = errorMetrics(tracks, assignedTrackIDs, truths, assignedTruthIDs); % For detailed error information about each record truth and track, you % use the cumulative metric methods on the error metrics. trackError{i} = cumulativeTrackMetrics(errorMetrics); truthError{i} = cumulativeTruthMetrics(errorMetrics); display(tracks, truths, assignedTrackIDs, assignedTruthIDs, trackTable, truthTable); end
Анализируйте метрики назначения
Анимация ниже показывает визуальное представление метрик назначения. В начале и у P1, и у P2 не было связанных треков из-за задержки установки. Поэтому они оба были классифицированы как пропущенные цели. Вокруг X = 5 метров P1 не отслеживался в течение нескольких временных шагов. Заметьте, что метрики назначения выводят P2 как отброшенную цель в течение этого времени. Когда дорожки менялись между P1 и P2, они первоначально объявлялись расходимыми, когда они выходили из порогов расхождения. Через несколько временных шагов треки достигли заданных ворот новых истин и стали ассоциироваться с новой истиной.
Визуализация метрики для каждого трека и истины может помочь в более легком понимании различных событий. Однако он может стать подавляющим для большого количества треков и истин. Альтернативный подход состоит в том, чтобы использовать суммированный выход метрик назначения. Эти выходы обеспечивают общие сводные данные метрик назначения до текущего временного шага. Поля и значения сводных данных метрик назначения в конце симуляции показаны ниже.
disp(trackAssignmentSummary(end));
TotalNumTracks: 5 NumFalseTracks: 1 MaxSwapCount: 1 TotalSwapCount: 2 MaxDivergenceCount: 1 TotalDivergenceCount: 3 MaxDivergenceLength: 7 TotalDivergenceLength: 17 MaxRedundancyCount: 1 TotalRedundancyCount: 1 MaxRedundancyLength: 34 TotalRedundancyLength: 34
disp(truthAssignmentSummary(end));
TotalNumTruths: 2 NumMissingTruths: 0 MaxEstablishmentLength: 5 TotalEstablishmentLength: 10 MaxBreakCount: 2 TotalBreakCount: 4 MaxBreakLength: 9 TotalBreakLength: 9
Путем захвата сводных данных назначений на каждом шаге можно также построить график совокупного анализа. Следующие графики показывают подмножество полей для сводных данных присвоения трека и истинности.
helperPlotStructArray(display,trackAssignmentSummary);
helperPlotStructArray(display,truthAssignmentSummary);
Анализируйте метрики ошибок
Подобно метрикам назначения, метрики ошибки могут также вычисляться и визуализироваться по дорожке и истине. Поля ошибки расчета для каждой дорожки и истинности в конце симуляции показаны ниже. Каждое из этих полей представляет совокупную ошибку по каждой дорожке и истине.
Ошибка расчета для каждой дорожки
disp(trackError{end});
TrackID posRMS velRMS posANEES velANEES _______ _______ ________ ________ _________ 1 0.72278 0.87884 0.52241 0.77236 2 0.16032 0.083823 0.025702 0.0070263 3 0.52898 1.3192 0.27982 1.7403 4 0.74411 2.112 0.55369 4.4604
Ошибка расчета для каждой истины
disp(truthError{end});
TruthID posRMS velRMS posANEES velANEES _______ _______ ______ ________ ________ 1 0.52259 1.3918 0.2731 1.9372 2 0.58988 1.259 0.34795 1.5851
Путем записи ошибок на каждом временном шаге, вы также можете построить график ошибки по сравнению со временем для каждой дорожки и правды. Следующие графики показывают ошибку RMS в положении для каждой дорожки и истины. После удаления дорожки ошибка в ее оценке остается постоянной. Заметьте, что в первой половине симуляции ошибка в оценке T3 выше, чем у T4, потому что траектория T3 не идеально совпадала с траекторией P2. Также заметьте падение ошибки для оценки T3 в первой половине, когда она медленно сходилась к истинной позиции. Во время события track-swap. ошибка в оценке как T3, так и T4 возрастает до тех пор, пока их назначения не переключаются.
% A utility to plot the table array. 'posRMS' is the field to plot helperPlotTableArray(display,trackError,'posRMS');
Ошибка в оценке каждой истинности является просто кумуляцией ошибки расчета всех присвоенных ей треков. Когда P2 была назначена избыточная дорожка около 8-го временного шага симуляции, его ошибка расчета подскочила. Когда избыточная дорожка приблизилась к P2, ошибка уменьшается, но снова увеличивается, когда связанная с ней дорожка расходится.
helperPlotTableArray(display,truthError,'posRMS');
Для большого количества треков и истин можно также использовать совокупные метрики ошибок для всех назначенных треков в течение их жизненного цикла. Заметьте увеличение ошибки, когда дорожки поменялись местами (около 80-го шага). Также заметьте меньший пик вокруг 25-го временного шага, когда T1 отвлекся от назначенной ему истинной P2 и был настигнут избыточной T3 дорожки.
f = figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]); ax = axes(f); subplot(2,2,1) plot(posRMSE,'LineWidth',2); xlabel('Time step'); ylabel('RMS Error in Position (m)'); grid('on'); subplot(2,2,2) plot(velRMSE,'LineWidth',2); xlabel('Time step'); ylabel('RMS Error in Velocity (m/s)'); grid('on'); subplot(2,2,3) plot(posANEES,'LineWidth',2); xlabel('Time step'); ylabel('Average Normalized Error in Position'); grid('on'); subplot(2,2,4) plot(velANEES,'LineWidth',2); xlabel('Time step'); ylabel('Average Normalized Error in Velocity'); grid('on'); sgtitle('Cumulative errors for all tracks','FontWeight','bold');
Распространенным случаем использования для оценки эффективности многообъектного трекера является настройка его параметров. Это обычно делается путем объединения метрик в одно значение стоимости, которое может служить функцией для алгоритма оптимизации. Метрики присвоения и ошибки обеспечивают несколько различных показателей эффективности (MoEs) и могут быть объединены, сначала выбрав наиболее релевантные метрики, а затем выполнив взвешенную комбинацию в зависимости от приложения. Выбор правильного MoEs, а также их комбинации в один счет может оказаться сложным. В качестве альтернативы этому подходу можно использовать метрику Optimal SubPattern Assignment (OSPA) [1] и обобщенную метрику Optimal SubPattern Assignment (GOSPA) [2]. И OSPA, и GOSPA метрика оценивают эффективность трекера мультиобъекта, объединяя как назначение, так и точность оценки состояния в одно значение стоимости. Далее вы узнаете о метрике OSPA и GOSPA и рабочем процессе для вычисления этих метрик в MATLAB.
Метрика OSPA может быть рассмотрена как статистическое расстояние между несколькими треками и истинами. Чтобы вычислить метрику OSPA, алгоритм сначала присваивает существующие треки и истины друг другу с помощью алгоритма глобального ближайшего соседа (GNN). После вычисления назначения метрика делит общее расстояние на два подкомпонента - локализацию и несоответствие кардинальности. Компонент локализации захватывает ошибки, следующие из точности оценки состояния, в то время как компонент несоответствия кардинальности захватывает эффект избыточных дорожек, ложных дорожек и пропущенных истин. Традиционная метрика OSPA не учитывает временную историю треков, то есть назначения с предыдущего шага не влияют на метрику на текущем шаге. Поэтому эффекты, подобные track-switch, не захватываются в традиционной метрике OSPA. Чтобы обойти это, был введен новый субкомпонент для OSPA, называемый компонентом «маркировки» [3]. Комбинация традиционных OSPA с компонентом «маркировки» иногда упоминается как «OSPA for Tracks» (OSPA-T) или «Labeled-OSPA» (LOSPA) [4].
Чтобы использовать метрику OSPA в MATLAB, используйте trackOSPAMetric
Системный объект. Вы можете переключиться с OSPA на Labeled-OSPA путем предоставления ненулевого значения LabelingError
свойство. Чтобы понять, как вычисляется каждый подкомпонент, смотрите раздел «Алгоритмы» trackOSPAMetric
.
ospaMetric = trackOSPAMetric('Distance','posabserr',... 'CutoffDistance',1,... 'LabelingError',0.25);
Далее запускается тот же сценарий и вычисляется метрика OSPA на каждом временном шаге.
timeStamps = 0:0.1:10; n = numel(timeStamps); % Scene simulation trackTruthSimulator = helperMetricEvaluationScenarios; % Initialize variables ospa = zeros(n,1); locComponent = zeros(n,1); cardComponent = zeros(n,1); labelingComponent = zeros(n,1); % Loop over time stamps for i = 1:numel(timeStamps) time = timeStamps(i); % Track and truth [tracks, truths] = trackTruthSimulator(time); % Call the System object as a function and record OSPA and all 3 components [ospa(i),locComponent(i),cardComponent(i),labelingComponent(i)] = ospaMetric(tracks, truths); end
Анализ метрики OSPA
figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]); subplot(2,1,1); plot(ospa,'LineWidth',2); xlabel('Time step'); ylabel('Cost'); title('OSPA'); grid('on'); subplot(2,1,2); plot([locComponent cardComponent labelingComponent],'LineWidth',2); xlabel('Time step'); ylabel('Component Cost'); title('OSPA Components'); legend('Localization','Cardinality-mismatch','Labeling'); grid('on');
Заметьте корреляцию между метрикой OSPA и различными событиями в сценарии. Первоначально OSPA является высоким из-за задержек с установлением. После создания OSPA остается относительно высоким из-за наличия избыточного трека. После удаления избыточной дорожки OSPA опустился до меньшего значения. Около 50-го временного шага OSPA получил значение, когда P1 истины было сброшено. Заметьте, что хотя метрика OSPA правильно захватывает все эти события, предоставляя более высокое значение, она не предоставляет более мелких подробностей о каждой истине и дорожке и точности в их оценке. Единственная информация, доступная от OSPA, - через его компоненты. Более высокий компонент локализации указывает, что назначенные дорожки не оценивают состояние истин правильно. Этот компонент локализации вычисляется с использованием того же типа расстояния, что и назначение. Компонент более высокой мощности указывает на наличие пропущенных целей и ложных или избыточных дорожек. Более высокая ошибка маркировки указывает, что дорожки помечены неправильно, что указывает, что дорожки связаны с их ближайшими доступными истинами.
Подход, используемый для вычисления GOSPA, аналогичен метрике OSPA. Используя немного другую математическую формулировку, метрика GOSPA дополнительно вычисляет подкомпоненты, такие как «пропущенный компонент целей» и «компонент ложных треков». Подобно традиционной OSPA, GOSPA также не учитывает временную историю треков. Однако метрика, подобная Labeled-OSPA, может быть достигнута путем добавления коммутационного компонента [5]. Коммутационный компонент захватывает эффект переключения присвоений между истинами. Каждое изменение назначения для истинности наказывается после классификации как полупереключатель или полный переключатель. Полупереключатель относится к событию, когда истина переключает назначение с дорожки на неназначение или наоборот. Полный переключатель относится к событию, когда истина переключает назначение с одной дорожки на другую.
Чтобы использовать метрику GOSPA в MATLAB, создайте trackGOSPAMetric
Системный объект. Для учета переключения треков вы обеспечиваете положительное значение для SwitchingPenalty.
gospaMetric = trackGOSPAMetric('Distance','posabserr',... 'CutoffDistance',1,... 'SwitchingPenalty',0.25);
Далее запускается тот же сценарий и вычисляется метрика GOSPA на каждом временном шаге.
timeStamps = 0:0.1:10; n = numel(timeStamps); trackTruthSimulator = helperMetricEvaluationScenarios; % Initialize variables labeledGospa = zeros(n,1); traditionalGospa = zeros(n,1); locComponent = zeros(n,1); missedTargetComponent = zeros(n,1); falseTrackComponent = zeros(n,1); switchingComponent = zeros(n,1); % Loop over time stamps for i = 1:numel(timeStamps) time = timeStamps(i); % Track and truth [tracks, truths] = trackTruthSimulator(time); % Call the System object as a function and get all 4 components [labeledGospa(i),traditionalGospa(i),switchingComponent(i),locComponent(i),missedTargetComponent(i),falseTrackComponent(i)] = gospaMetric(tracks, truths); end
Анализ результатов
figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]); subplot(2,1,1); plot(labeledGospa,'LineWidth',2); xlabel('Time step'); ylabel('Cost'); title('GOSPA'); grid('on'); subplot(2,1,2); plot([locComponent missedTargetComponent falseTrackComponent switchingComponent],'LineWidth',2); xlabel('Time step'); ylabel('Component Cost'); title('GOSPA Components'); legend('Localization','Missed Target','False Track','Switching'); grid('on');
Заметьте, что метрика GOSPA также захватывает эффект различных событий во время сценария, аналогичного метрике OSPA. В отличие от OSPA, он также предоставляет информацию, если метрика выше из-за ложных дорожек или пропущенных целей. Заметьте, что пик пропускается целевой компонент около 50-го временного шага. Этот пик обозначает событие, когда P1 был пропущен на несколько шагов. Пик около 80-го временного шага в пропущенном целевом компоненте обозначает событие, когда дорожки меняются местами. Задержка между расхождением и переназначением привела к пропущенным целям, а также к ложным компонентам трека.
Peaks в компоненте переключения дорожек обозначают различные события. Первый пик учитывает истины, переходящие с неназначенного на назначенное. Второй пик учитывает переключение путей на P2. Третий и четвертый пики захватывают, что P1 истинности была неназначена, а затем назначена другой дорожке соответственно. Последний два peaks относятся к отмене назначения по истине и последующему переназначению.
Подобно OSPA, GOSPA также не предоставляет подробной информации о каждом треке и правде. Информация от GOSPA доступна через его компоненты. Как указано в имени, более высокий пропущенный целевой компонент обозначает, что цели не отслеживаются, а более высокий компонент ложного трека обозначает наличие ложных треков. Более высокий штраф за переключение обозначает такие события, как установление, отслеживание свопов и сброшенные дорожки. Подразделение компонентов для включения пропущенных целей и ложных треков помогает в модификации правильного параметра трекера. Для примера, если создаются ложные дорожки, типичным решением является попытка увеличить порог для подтверждения дорожки.
В этом примере вы узнали о трех различных инструментах для анализа эффективности многообъектной системы отслеживания. Вы также узнали о рабочем процессе в MATLAB, чтобы использовать эти метрики. Вы также опирались на тип предоставляемой ими информации и на то, как ее можно анализировать. Инструменты, описанные в этом примере, являются гибкими и могут быть настроены для различных приложений и случаев использования. На всех инструментах доступны «встроенные» опции для определения различных типов расстояний, которые будут использоваться для метрики. Для примера абсолютная ошибка в положении или скорости или нормированная ошибка в положении или скорости. Можно также задать три различные модели движения для дорожек: постоянную скорость, постоянную скорость поворота и постоянное ускорение. Эти «встроенные» функциональности поддерживают треки в виде objectTrack
и истины, сгенерированные симуляциями сценариев с использованием trackingScenario.
Если формат треков и истин для вашего приложения отличается, можно предварительно обработать их, чтобы преобразовать. Это позволяет использовать всю «встроенную» функциональность метрики. Кроме того, можно задать пользовательскую функцию расстояния между дорожкой и истиной. Это позволяет вам контролировать расстояние, а также формат каждой дорожки и правды. Чтобы переключаться между пользовательскими и встроенными функциями для OSPA и GOSPA metric, задайте Distance
as 'c ustom
'. Чтобы переключаться между пользовательской и встроенной функциональностью для назначения и метрики ошибок, измените DistanceFunctionFormat
и ErrorFunctionFormat
на 'custom
'для присвоения и метрики ошибки соответственно.
[1] Шухмахер, Доминик, Ба-Туонг Во и Ба-Нгу Во. «Допустимая метрика для оценки эффективности мультиобъектов». Транзакции IEEE по обработке сигналов 56.8 (2008): 3447-3457.
[2] Рахматулла, Абу Сахана, Анхель Ф. Гарсия-Фернандес и Леннарт Свенссон. «Обобщенная оптимальная метрика назначения подшаблонов». 2017 20-я Международная конференция по информационному слиянию (Fusion). IEEE, 2017.
[3] Ristic, Branko, et al. «Метрика для оценки эффективности многоцелевых алгоритмов отслеживания». Транзакции IEEE по обработке сигналов 59.7 (2011): 3452-3457.
[4] Малер, Рональд P. С. Усовершенствования в статистическом слиянии информации с несколькими источниками и мультитаржетами. Дом Артека, 2014.
[5] Рахматулла, Абу Сахана, Анхель Ф. Гарсия-Фернандес и Леннарт Свенссон. «Метрика на пространстве конечных множеств траекторий для оценки многоцелевых алгоритмов слежения» .arXiv preprint arXiv:1605.01177 (2016).