В этом примере показано, как определить и использовать логику подтверждения и удаления, основанную на истории или балле. Он представляет trackHistoryLogic и trackScoreLogic и показывает, как использовать их как автономные объекты и как использовать их как часть trackerGNN.
Трекер поддерживает список дорожек или оценок целевых состояний в интересующей области. Если обнаружение не может быть назначено какой-либо дорожке, уже поддерживаемой трекером, трекер инициирует новую дорожку. В большинстве случаев неясно, представляет ли новая дорожка истинную цель или ложную. Сначала создается трек с предварительным статусом. Если получено достаточно доказательств, трек становится подтвержденным. Аналогично, если дорожке не назначено никаких обнаружений, дорожка выравнивается (прогнозируется без коррекции), но после нескольких пропущенных обновлений трекер удаляет дорожку.
Существует два основных способа подтверждения и удаления треков, используемых в литературе:
На основе истории: трекер подсчитывает количество обнаружений, назначенных дорожке в нескольких последних обновлениях. Если назначено достаточное количество обнаружений, дорожка подтверждается. Если дорожка не назначена обнаружению достаточного количества обновлений, она удаляется. Этот тип логики часто называют M-out-of-N или Last-N, что означает, что из N обновлений дорожка должна быть обнаружена по меньшей мере _M _ раз для ее подтверждения.
Оценка: трекер вычисляет вероятность того, что трасса является реальной целью. Вместо вероятности мы используем оценку, определенную как журнал вероятности. Высокая положительная оценка дорожки означает, что дорожка с большой вероятностью будет реальной целью. Очень отрицательная оценка дорожки означает, что дорожка, вероятно, будет ложной. В итоге мы можем установить порог для подтверждения трассы, если оценка достаточно высокая. Если балл низкий, или падает достаточно от максимального балла, трасса удаляется.
В следующих разделах показано, как определить и использовать два типа объектов, реализующих логику отслеживания на основе истории и оценки.
Простейший тип логики дорожки основан на истории. Этот тип логики подсчитывает, сколько раз дорожка обнаруживается (или пропускается) в последних N обновлениях. Вы хотите подтвердить трек после 3 обнаружений в 5 обновлениях (3 из 5) и удалить его после 6 последовательных промахов. Сначала создайте trackHistoryLogic объект, который поддерживает историю дорожек, определяя пороги подтверждения и удаления.
historyLogic = trackHistoryLogic('ConfirmationThreshold', [3 5], 'DeletionThreshold', 6)
historyLogic =
trackHistoryLogic with properties:
ConfirmationThreshold: [3 5]
DeletionThreshold: [6 6]
History: [0 0 0 0 0 0]
Чтобы проиллюстрировать это, в первых 5 обновлениях дорожка обнаруживается каждое другое обновление. Ниже показано, как логика дорожки подтверждается после 3 из 5 попаданий. Используйте init метод инициализации объекта с первым попаданием. Затем используйте либо hit или miss способы, чтобы указать, обновляется ли логика дорожки соответственно попаданием или промахом.
checkConfirmation используется для проверки возможности подтверждения дорожки на основе ее истории. Используйте output метод получения истории дорожек, который является логическим массивом длины Nmax = max(Nconf, Ndel). В этом примере: Nmax составляет 6.
wasInitialized = false; % Has the object been initialized yet? for i = 1:5 detectedFlag = logical(mod(i,2)); % Only odd updates are true if detectedFlag && ~wasInitialized init(historyLogic) wasInitialized = true; elseif detectedFlag && wasInitialized hit(historyLogic) else miss(historyLogic) end history = output(historyLogic); confFlag = checkConfirmation(historyLogic); disp(['Track history is: ', num2str(history),'. Confirmation Flag is: ',num2str(confFlag)]) end
Track history is: 1 0 0 0 0 0. Confirmation Flag is: 0 Track history is: 0 1 0 0 0 0. Confirmation Flag is: 0 Track history is: 1 0 1 0 0 0. Confirmation Flag is: 0 Track history is: 0 1 0 1 0 0. Confirmation Flag is: 0 Track history is: 1 0 1 0 1 0. Confirmation Flag is: 1
Теперь предположим, что дорожка не обнаружена для нескольких обновлений. После шестого обновления его следует удалить. Используйте checkDeletion метод проверки удаления дорожки.
for i = 1:6 miss(historyLogic); % Every update the track is not detected history = output(historyLogic); deleteFlag = checkDeletion(historyLogic); disp(['Track history is: ', num2str(history),'. Deletion Flag is: ',num2str(deleteFlag)]) end
Track history is: 0 1 0 1 0 1. Deletion Flag is: 0 Track history is: 0 0 1 0 1 0. Deletion Flag is: 0 Track history is: 0 0 0 1 0 1. Deletion Flag is: 0 Track history is: 0 0 0 0 1 0. Deletion Flag is: 0 Track history is: 0 0 0 0 0 1. Deletion Flag is: 0 Track history is: 0 0 0 0 0 0. Deletion Flag is: 1
Во многих случаях недостаточно знать, назначена ли дорожка обнаружению. Возможно, потребуется учесть вероятность правильности присвоения. Также необходимо знать, насколько вероятно обнаружение реальной цели, исходя из ее вероятности обнаружения, или насколько вероятно, что она будет ложной, основываясь на ее частоте ложных сигналов тревоги. Кроме того, если дорожка новая, необходимо учитывать скорость бета-тестирования, с которой новые цели, вероятно, будут обнаружены в единице объема.
Используйте trackScoreLogic объект для создания логики подтверждения и удаления трека на основе оценки. Определите ConfirmationThreshold и DeletionThreshold как два скалярных значения.
Когда дорожке назначено обнаружение, логика дорожки обновляется с помощью совпадения, и в большинстве случаев оценка дорожки увеличивается. ConfirmationThreshold определяет минимальный балл, необходимый для подтверждения трека.
Оценка дорожки уменьшается, когда дорожке не назначено обнаружение. DeletionThreshold используется для определения того, насколько мы позволяем уменьшить балл от максимального балла до удаления трека.
scoreLogic = trackScoreLogic('ConfirmationThreshold', 25, 'DeletionThreshold', -5)
scoreLogic =
trackScoreLogic with properties:
ConfirmationThreshold: 25
DeletionThreshold: -5
Score: 0
MaxScore: 0
pd = 0.9; % Probability of detection pfa = 1e-6; % Probability of false alarm volume = 1; % The volume of a sensor detection bin beta = 0.1; % New target rate in a unit volume wasInitialized = false; % Has the object been initialized yet?
Подтверждение дорожки с использованием логики, основанной на баллах, очень похоже на подтверждение дорожки с использованием логики, основанной на истории. Основное отличие заключается в том, что теперь учитываются дополнительные параметры, которые включают в себя статистическую производительность датчика, а также остаточное расстояние пути относительно обнаружения.
Вы используете init , hit , и miss методы для инициализации при первом попадании, обновить trackScoreLogic с последующим попаданием, или обновить с промахом, соответственно.
Вы используете checkConfirmation способ проверки необходимости подтверждения пути. Вы используете output метод, чтобы получить текущий балл и максимальный балл как [currentScore, maxScore] массив.
r = rng(2018); % Set the random seed for repeatable results numSteps1 = 6; scores = zeros(numSteps1,2); for i = 1:numSteps1 l = 0.05 + 0.05 * rand; % likelihood of the measurement detectedFlag = logical(mod(i,2)); % Only even updates are true in this example if detectedFlag && ~wasInitialized init(scoreLogic, volume, beta); wasInitialized = true; elseif detectedFlag && wasInitialized hit(scoreLogic, volume, l); else miss(scoreLogic); end scores(i,:) = output(scoreLogic); confFlag = checkConfirmation(scoreLogic); disp(['Score and MaxScore: ', num2str(scores(i,:)),'. Confirmation Flag is: ',num2str(confFlag)]) end
Score and MaxScore: 11.4076 11.4076. Confirmation Flag is: 0 Score and MaxScore: 9.10498 11.4076. Confirmation Flag is: 0 Score and MaxScore: 20.4649 20.4649. Confirmation Flag is: 0 Score and MaxScore: 18.1624 20.4649. Confirmation Flag is: 0 Score and MaxScore: 29.2459 29.2459. Confirmation Flag is: 1 Score and MaxScore: 26.9433 29.2459. Confirmation Flag is: 1
rng(r); % Return the random seed to its previous settingОбратите внимание, как оценка дорожки увеличивается с каждым успешным обновлением и уменьшается с каждым пропущенным обнаружением. Как только оценка трека выше, чем Порог Подтверждения (ConfirmationThreshold), функция (check Confirmation) возвращает значение true, что означает, что трек подтвержден сейчас.
Как и в логике дорожки, основанной на истории, если дорожка не назначена какому-либо обнаружению, она в конечном итоге должна быть удалена. DeletionThreshold свойство используется для определения того, когда балл трека уменьшился настолько, что трек должен быть удален. Обратите внимание, что оценка не должна опускаться ниже DeletionThreshold, только то, что разница между текущим баллом и максимальным баллом, полученным трассой, должна быть ниже порога. Причина в том, что если трек получает высокий балл после многих успешных обновлений, и если мы используем абсолютный балл, потребуется слишком много пропущенных обновлений, чтобы удалить трек. Ниже показана дорожка, удаляемая после трех промахов.
numSteps2 = 3; scores(end+1:end+numSteps2,:) = zeros(numSteps2,2); for i = 1:numSteps2 miss(scoreLogic); deleteFlag = checkDeletion(scoreLogic); scores(numSteps1+i,:) = output(scoreLogic); disp(['Score and MaxScore: ', num2str(scores(numSteps1+i,:)),'. Deletion Flag is: ',num2str(deleteFlag)]) end
Score and MaxScore: 24.6407 29.2459. Deletion Flag is: 0 Score and MaxScore: 22.3381 29.2459. Deletion Flag is: 1 Score and MaxScore: 20.0355 29.2459. Deletion Flag is: 1
deletionScore = scores(:,2) + scoreLogic.DeletionThreshold; stairs(scores) hold on plot([1,numSteps1+numSteps2],[scoreLogic.ConfirmationThreshold scoreLogic.ConfirmationThreshold],'--') stairs(deletionScore,'--') title('Track Score and Maximum Score') legend('Score','MaxScore','ConfirmationThrehsold','DeletionThreshold','Location','best')

Если вы хотите отложить удаление дорожки до тех пор, пока не произойдет больше промахов, просто измените DeletionThreshold к более отрицательному значению.
Обычно логика дорожки используется внутри трекера. Сконфигурируйте trackerGNN использовать логику дорожки на основе истории с подтверждением после 3 успехов в 5 обновлениях и удалением после 5 промахов в 6 обновлениях.
tracker = trackerGNN('Assignment', 'Auction', 'ConfirmationThreshold', [3 5], 'DeletionThreshold', [5 6], 'TrackLogic', 'History')
tracker =
trackerGNN with properties:
TrackerIndex: 0
FilterInitializationFcn: 'initcvekf'
Assignment: 'Auction'
AssignmentThreshold: [30 Inf]
MaxNumTracks: 100
MaxNumSensors: 20
OOSMHandling: 'Terminate'
TrackLogic: 'History'
ConfirmationThreshold: [3 5]
DeletionThreshold: [5 6]
HasCostMatrixInput: false
HasDetectableTrackIDsInput: false
StateParameters: [1x1 struct]
NumTracks: 0
NumConfirmedTracks: 0
Следующий цикл обновляет трекер с обнаружением при каждом обновлении с нечетными номерами. После 5 обновлений трекер подтверждает трек. Вы можете посмотреть историю трека и флаг подтверждения трека после каждого обновления, изучив TrackLogicState и IsConfirmed поля выходных данных дорожки.
for i = 1:5 detectedFlag = logical(mod(i,2)); % Only odd updates are true if detectedFlag detection = {objectDetection(i,[1;2;3])}; else detection = {}; end [~,~,allTracks] = tracker(detection, i) end
allTracks =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 1
Age: 1
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [1 0 0 0 0 0]
IsConfirmed: 0
IsCoasted: 0
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
allTracks =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 2
Age: 2
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [0 1 0 0 0 0]
IsConfirmed: 0
IsCoasted: 1
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
allTracks =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 3
Age: 3
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [1 0 1 0 0 0]
IsConfirmed: 0
IsCoasted: 0
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
allTracks =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 4
Age: 4
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [0 1 0 1 0 0]
IsConfirmed: 0
IsCoasted: 1
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
allTracks =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 5
Age: 5
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [1 0 1 0 1 0]
IsConfirmed: 1
IsCoasted: 0
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
Следующий цикл обновляет трекер еще 5 раз с 5 промахами. Трек удаляется после 4 дополнительных обновлений (9-е обновление в целом), поскольку он пропустил обнаружения в 4-м, 6-м, 7-м, 8-м и 9-м обновлениях (5 из последних 6 обновлений).
for i = 1:5 detection = {}; confirmedTrack = tracker(detection, i+5) end
confirmedTrack =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 6
Age: 6
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [0 1 0 1 0 1]
IsConfirmed: 1
IsCoasted: 1
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
confirmedTrack =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 7
Age: 7
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [0 0 1 0 1 0]
IsConfirmed: 1
IsCoasted: 1
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
confirmedTrack =
objectTrack with properties:
TrackID: 1
BranchID: 0
SourceIndex: 0
UpdateTime: 8
Age: 8
State: [6x1 double]
StateCovariance: [6x6 double]
StateParameters: [1x1 struct]
ObjectClassID: 0
TrackLogic: 'History'
TrackLogicState: [0 0 0 1 0 1]
IsConfirmed: 1
IsCoasted: 1
IsSelfReported: 1
ObjectAttributes: [1x1 struct]
confirmedTrack =
0x1 objectTrack array with properties:
TrackID
BranchID
SourceIndex
UpdateTime
Age
State
StateCovariance
StateParameters
ObjectClassID
TrackLogic
TrackLogicState
IsConfirmed
IsCoasted
IsSelfReported
ObjectAttributes
confirmedTrack =
0x1 objectTrack array with properties:
TrackID
BranchID
SourceIndex
UpdateTime
Age
State
StateCovariance
StateParameters
ObjectClassID
TrackLogic
TrackLogicState
IsConfirmed
IsCoasted
IsSelfReported
ObjectAttributes
Трекеры требуют способа подтверждения дорожек, которые считаются истинными целями, и удаления дорожек после того, как им не будут назначены какие-либо обнаружения через некоторое время. Были представлены два типа логики подтверждения и удаления трека: логика трека на основе истории и логика трека на основе оценки. Логика дорожек на основе истории учитывает только то, назначена ли дорожка обнаружениям в последних последних обновлениях. Основанная на баллах логика дорожек обеспечивает статистическую меру того, насколько вероятно, что дорожка представляет реальную цель. Оба типа объектов логики дорожки могут использоваться как автономные объекты, но обычно используются внутри объекта трекера.