多目标跟踪-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;

    }

 

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