多目標跟蹤-DeepSort分析(三)KalmanTracker.h模塊分析

KalmanTracker.h模塊的作用是實現跟蹤算法,用的是kalman濾波和級聯檢測目標,基本流程是:基於kalman的預測,更新,根據軌跡的情況,判斷是否新的id,如果軌跡miss了 > 30fps,則delete這個軌跡,將state_ = Deleted.


多目標跟蹤DeepSort的論文地址及代碼鏈接(Python版):

論文地址https://arxiv.org/pdf/1703.07402.pdf

代碼鏈接:https://github.com/nwojke/deep_sort


下面進入KalmanTracker.h模塊的代碼分析,該模塊大概包含以下8個部分,下面對這8個部分的功能及參數進行介紹:

1--枚舉當前的偵測狀態

enum TrackState

{

TS_NONE = 0,//跟蹤狀態的初始值

    Tentative,//嘗試性的

    Confirmed,//確定的

    Deleted//被刪除的

};

2--KalmanTrackerN各個參數介紹

   KalmanTrackerN(const MEAN &mean,

                                 const VAR &covariance,

                                 int tid,

                                 int n_init,

                                 int max_age,

                                 const FEATURE &feature, bool featureFull, int oriPos)

其中,各個參數分別代表:

/*

***mean 初始狀態分佈的平均向量

***covariance 協方差

***tid 唯一的軌跡ID

***n_init 在軌道設置爲confirmed之前的連續檢測幀數。

當一個miss發生時,軌道狀態設置爲Deleted幀。

***max_age 在偵測狀態設置成Deleted前,最大的連續miss數

***feature Optional[ndarray]

特徵向量檢測的這條軌道的起源。

如果爲空,則這個特性被添加到'features'緩存中。

*/

3--將bbox轉換成xywh

    DSBOX to_tlwh() const

    {

        DSBOX ret;

        ret(0) = mean_(0);

        ret(1) = mean_(1);

        ret(2) = mean_(2);

        ret(3) = mean_(3);

        ret(2) *= ret(3);

        ret(0) -= ret(2) / 2;

        ret(1) -= ret(3) / 2;

        return ret;

    }

4--以邊界框的格式(min x ,min y,max x ,max y)表示當前位置,返回值爲邊界框

DSBOX to_tlbr()

    {

        DSBOX ret = to_tlwh();

        ret(2) = ret(0) + ret(2);

        ret(3) = ret(1) + ret(3);

        return ret;

    }

5--基於kalman filter的預測

void predict(const KF &kalmanFilter, bool only = false)

    {

        std::pair<MEAN, VAR> pa = kalmanFilter.predict(mean_, covariance_);

        mean_ = pa.first;

        covariance_ = pa.second;

        if (only)

        { 

            return; 

       }

        age_ += 1;

        time_since_update_ += 1;

    }

6--更新。 檢測方法爲級聯檢測

void update(const KF &kalmanFilter, const Detection &detection)

    {

        DSBOX box = detection.to_xyah();

        std::pair<MEAN, VAR> pa = kalmanFilter.update(

                mean_, covariance_, box);

        mean_ = pa.first;

        covariance_ = pa.second;

        features_.push_back(detection.feature_);

        hits_ += 1;

        time_since_update_ = 0;

        if (state_ == Tentative && hits_ >= _n_init_)

        {

            state_ = Confirmed;

        }

    }

7--標記已經miss的,如果從更新起miss了_max_age(30)幀以上,則將狀態設置爲Deleted

void mark_missed()

    {

        if (state_ == Tentative)

        {

            state_ = Deleted;

        }

        else if (time_since_update_ > _max_age_)

        {

            state_ = Deleted;

        }

    }

8--設置三種狀態

bool is_tentative()

    {

        return state_ == Tentative;

    }

    bool is_confirmed() const

    {

        return state_ == Confirmed;

    }

    bool is_deleted()

    {

        return state_ == Deleted;

    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章