В этом примере показано, как определить и использовать логику подтверждения и удаления, основанную на истории или счете. Он представляет trackHistoryLogic
и trackScoreLogic
объекты и показывает, как использовать их как автономные объекты и как использовать их как часть trackerGNN
.
Трекер поддерживает список треков или оценок целевых состояний в интересующей области. Если обнаружение не может быть назначено ни одному треку, уже поддерживаемому трекером, трекер инициирует новый трек. В большинстве случаев неясно, представляет ли новая дорожка истинную цель или ложную. Сначала создается дорожка с предварительным статусом. При получении достаточного количества доказательств трасса становится подтвержденной. Точно так же, если никакие обнаружения не назначены дорожке, дорожка покрывается (предсказывается без коррекции), но после нескольких пропущенных обновлений трекер удаляет дорожку.
Существует два основных способа подтверждения и удаления треков, используемых в литературе:
History-based: трекер подсчитывает количество обнаружений, назначенных треку в нескольких последних обновлениях. Если назначено достаточное количество обнаружений, дорожка подтверждается. Если дорожка не назначена для обнаружения достаточного количества обновлений, она удаляется. Этот тип логики часто упоминается как 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
методы, чтобы указать, обновляется ли логика дорожки путем хита или промаха, соответственно.
The 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
как два скалярных значений.
Когда дорожке назначается обнаружение, вы обновляете логику дорожки с помощью хита, и в большинстве случаев счет дорожки увеличивается. The ConfirmationThreshold
определяет минимальный счет, необходимый для подтверждения дорожки.
Счет дорожки уменьшается, когда дорожке не назначается обнаружение. The 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, функция checkConfirmation возвращает true, что означает, что дорожка подтверждена сейчас.
Как и в логике дорожки, основанной на истории, если дорожка не назначена никакому обнаружению, она в конечном счете должна быть удалена. The 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
Трекерам требуется способ подтвердить треки, которые считаются истинными целями, и удалить треки после того, как им через некоторое время не будут назначены какие-либо обнаружения. Были представлены два типа логики подтверждения и удаления трека: основанная на истории логика трека и основанная на баллах логика трека. Основанная на истории логика дорожки рассматривает только, назначается ли дорожке обнаружение в последних прошлых обновлениях. Основанная на оценке логика трека обеспечивает статистическую меру того, насколько вероятно, что трек представляет действительную цель. Оба типа логических объектов дорожки могут использоваться как автономные объекты, но обычно используются внутри объекта трекера.