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