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