Введение в логику отслеживания

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

Введение

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

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

  1. History-based: трекер подсчитывает количество обнаружений, назначенных треку в нескольких последних обновлениях. Если назначено достаточное количество обнаружений, дорожка подтверждается. Если дорожка не назначена для обнаружения достаточного количества обновлений, она удаляется. Этот тип логики часто упоминается как M-out-of-N или Last-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 методы, чтобы указать, обновляется ли логика дорожки путем хита или промаха, соответственно.

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')

Figure contains an axes. The axes with title Track Score and Maximum Score contains 4 objects of type stair, line. These objects represent Score, MaxScore, ConfirmationThrehsold, DeletionThreshold.

Если вы хотите отложить удаление дорожки до тех пор, пока не произойдет больше промахов, просто измените 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

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

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