Введение, чтобы отследить логику

Этот пример показывает, как задать и использовать логику подтверждения и удаления, которые основаны на истории или счете. Это вводит trackHistoryLogic, и trackScoreLogic возражает и показывает, как использовать их в качестве автономных объектов и как использовать их в качестве части trackerGNN.

Введение

Средство отслеживания ведет список дорожек или оценки целевых состояний в сфере интересов. Если обнаружение не может быть присвоено никакой дорожке, уже сохраняемой средством отслеживания, средство отслеживания инициирует новый трек. В большинстве случаев неясно, представляет ли новый трек истинную цель или ложную. Сначала, дорожка создается с предварительным состоянием. Если достаточно доказательства получено, дорожка становится подтвержденной. Точно так же, если никакие обнаружения не присвоены дорожке, дорожка курсируется (предсказанный без исправления), но после того, как несколько пропущенных обновлений, средство отслеживания удаляет дорожку.

Существует два основных способа подтвердить и удалить дорожки, используемые в литературе:

  1. Основанный на истории: средство отслеживания считает количество обнаружений присвоенным дорожке в нескольких недавних обновлениях. Если достаточно обнаружений присвоено, дорожка подтверждена. Если дорожка не присвоена никакому обнаружению для достаточных обновлений, это удалено. Этот тип логики часто упоминается как M N или В-последний-раз-N, означая, что из обновлений N, дорожка должна быть обнаружена, по крайней мере, _M _ времена для него, чтобы быть подтвержденной.

  2. Основанный на счете: средство отслеживания вычисляет вероятность, что дорожка имеет действительную цель. Вместо вероятности мы используем счет, заданный как журнал вероятности. Высокий положительный счет дорожки означает, что дорожка, очень вероятно, будет иметь действительную цель. Очень отрицательный счет дорожки означает, что дорожка, вероятно, будет ложной. В результате мы можем установить порог для подтверждения дорожки, если счет достаточно высок. Если счет является низким, или падает достаточно от максимального счета, дорожка удалена.

В следующих разделах вы видите, как задать и использовать два типа объектов, которые реализуют основанную на истории и основанную на счете логику дорожки.

Используйте основанную на истории логику дорожки, чтобы подтвердить и удалить дорожку

Самый простой тип логики дорожки основан на истории. Этот тип логических количеств, сколько раз дорожка обнаружена (или пропущена) в недавних обновлениях 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)
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?
scoreLogic = 

  trackScoreLogic with properties:

    ConfirmationThreshold: 25
        DeletionThreshold: -5
                    Score: 0
                 MaxScore: 0

Подтверждение дорожки с помощью основанной на счете логики очень похоже на подтверждение дорожки с помощью основанной на истории логики. Основное различие - то, что теперь дополнительные параметры учтены, которые включают статистическую производительность датчика, а также остаточное расстояние дорожки относительно обнаружения.

Вы используете 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
rng(r); % Return the random seed to its previous setting
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

Заметьте, как счет дорожки увеличивается с каждым успешным обновлением и уменьшениями с каждым пропущенным обнаружением. Если счет дорожки выше, чем 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
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')
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

Если вы хотите задержать удаление дорожки, пока больше промахов не происходит, просто изменяет DeletionThreshold на более отрицательную величину.

Используйте логику дорожки в средстве отслеживания

Как правило, логика дорожки используется в средстве отслеживания. Сконфигурируйте trackerGNN, чтобы использовать основанную на истории логику дорожки с подтверждением после 3 успехов в 5 обновлениях и удалении после 5 промахов в 6 обновлениях.

tracker = trackerGNN('Assignment', 'Auction', 'ConfirmationThreshold', [3 5], 'DeletionThreshold', [5 6], 'TrackLogic', 'History')
tracker = 

  trackerGNN with properties:

       FilterInitializationFcn: 'initcvekf'
                    Assignment: 'Auction'
           AssignmentThreshold: [30 Inf]
                  MaxNumTracks: 100
                 MaxNumSensors: 20

                    TrackLogic: 'History'
         ConfirmationThreshold: [3 5]
             DeletionThreshold: [5 6]

            HasCostMatrixInput: false
    HasDetectableTrackIDsInput: false

                     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 = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 1
                 Age: 1
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [1 0 0 0 0 0]
         IsConfirmed: 0
           IsCoasted: 0
       ObjectClassID: 0
    ObjectAttributes: {}


allTracks = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 2
                 Age: 2
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [0 1 0 0 0 0]
         IsConfirmed: 0
           IsCoasted: 1
       ObjectClassID: 0
    ObjectAttributes: {}


allTracks = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 3
                 Age: 3
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [1 0 1 0 0 0]
         IsConfirmed: 0
           IsCoasted: 0
       ObjectClassID: 0
    ObjectAttributes: {}


allTracks = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 4
                 Age: 4
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [0 1 0 1 0 0]
         IsConfirmed: 0
           IsCoasted: 1
       ObjectClassID: 0
    ObjectAttributes: {}


allTracks = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 5
                 Age: 5
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [1 0 1 0 1 0]
         IsConfirmed: 1
           IsCoasted: 0
       ObjectClassID: 0
    ObjectAttributes: {}

Следующий цикл обновляет средство отслеживания еще 5 раз с 5 промахами. Дорожка удалена после 4 дополнительных обновлений (9-е обновление в целом), потому что это пропустило обнаружения в 4-х, 6-х, 7-х, 8-х и 9-х обновлениях (5 из последних 6 обновлений).

for i = 1:5
    detection = {};
    confirmedTrack = tracker(detection, i+5)
end
confirmedTrack = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 6
                 Age: 6
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [0 1 0 1 0 1]
         IsConfirmed: 1
           IsCoasted: 1
       ObjectClassID: 0
    ObjectAttributes: {}


confirmedTrack = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 7
                 Age: 7
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [0 0 1 0 1 0]
         IsConfirmed: 1
           IsCoasted: 1
       ObjectClassID: 0
    ObjectAttributes: {}


confirmedTrack = 

  struct with fields:

             TrackID: 1
            BranchID: 0
          UpdateTime: 8
                 Age: 8
               State: [6x1 double]
     StateCovariance: [6x6 double]
          TrackLogic: 'History'
     TrackLogicState: [0 0 0 1 0 1]
         IsConfirmed: 1
           IsCoasted: 1
       ObjectClassID: 0
    ObjectAttributes: {}


confirmedTrack = 

  0x1 empty struct array with fields:

    TrackID
    BranchID
    UpdateTime
    Age
    State
    StateCovariance
    TrackLogic
    TrackLogicState
    IsConfirmed
    IsCoasted
    ObjectClassID
    ObjectAttributes


confirmedTrack = 

  0x1 empty struct array with fields:

    TrackID
    BranchID
    UpdateTime
    Age
    State
    StateCovariance
    TrackLogic
    TrackLogicState
    IsConfirmed
    IsCoasted
    ObjectClassID
    ObjectAttributes

Сводные данные

Средства отслеживания требуют способа подтвердить дорожки, которые считаются истинных целей и удаляют дорожки после того, как они не присвоены никакие обнаружения через некоторое время. Были представлены два типа логики подтверждения и удаления дорожки: основанная на истории логика дорожки и основанная на счете логика дорожки. Основанная на истории логика дорожки только рассматривает, является ли дорожка присвоенными обнаружениями в обновлениях недалекого прошлого. Основанная на счете логика дорожки обеспечивает статистическую меру того, как, вероятно, дорожка должна представлять действительную цель. Оба типа объектов логики дорожки могут использоваться в качестве автономных объектов, но обычно используются в объекте средства отслеживания.