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

В этом примере показано, как задать и использовать логику подтверждения и удаления, которые основаны на истории или счете. Это вводит 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)
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

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

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