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;
}