this->metric->distance(features, targets)
详细解读
this->metric->distance(features, targets)
是一个关键调用,用于计算检测目标的特征向量(features
)与轨迹目标的特征向量(targets
)之间的距离矩阵。这个距离矩阵是目标跟踪中匹配过程的重要依据,表示每个轨迹与每个检测之间的特征相似性。
调用上下文
该调用出现在 tracker::gated_matric
函数中:
DYNAMICM cost_matrix = this->metric->distance(features, targets);
参数说明:
features
:一个二维矩阵,表示检测目标的特征向量,每一行对应一个检测目标的特征。- 大小为
[detection_indices.size(), k_feature_dim]
,其中k_feature_dim
是特征向量的维度。
- 大小为
targets
:一个一维向量,表示轨迹目标的 ID 列表。- 每个轨迹目标的特征向量通过
NearNeighborDisMetric
类内部存储的特征库获取。
- 每个轨迹目标的特征向量通过
返回值:
cost_matrix
:一个二维矩阵,表示轨迹和检测之间的特征距离。- 大小为
[track_indices.size(), detection_indices.size()]
。 - 每个元素表示一个轨迹目标与一个检测目标之间的特征距离。
- 大小为
NearNeighborDisMetric::distance
的作用
distance
是 NearNeighborDisMetric
类中的一个方法,用于计算特征向量之间的距离。它的核心逻辑如下:
- 提取轨迹的特征向量:
- 根据
targets
中的轨迹 ID,从内部存储的特征库中提取对应的特征向量。
- 根据
- 计算特征距离:
- 使用指定的距离度量(如余弦距离或欧几里得距离)计算轨迹特征与检测特征之间的距离。
- 返回距离矩阵:
- 返回一个二维矩阵,表示每个轨迹与每个检测之间的距离。
距离计算的核心逻辑
以下是 NearNeighborDisMetric::distance
的伪代码逻辑:
DYNAMICM NearNeighborDisMetric::distance(
const FEATURESS &features,
const std::vector<int> &targets)
{
// 提取轨迹的特征向量
FEATURESS track_features(targets.size(), k_feature_dim);
for (size_t i = 0; i < targets.size(); i++) {
track_features.row(i) = this->feature_store[targets[i]];
}
// 初始化距离矩阵
DYNAMICM cost_matrix(track_features.rows(), features.rows());
// 计算特征距离
for (int i = 0; i < track_features.rows(); i++) {
for (int j = 0; j < features.rows(); j++) {
cost_matrix(i, j) = calculate_distance(track_features.row(i), features.row(j));
}
}
return cost_matrix;
}
距离度量的类型
NearNeighborDisMetric
支持多种距离度量方法,常见的包括:
-
余弦距离(Cosine Distance):
- 用于衡量两个向量之间的夹角,范围为
[0, 2]
,值越小表示越相似。 - 公式:
[
\text{Cosine Distance} = 1 - \frac{\mathbf{u} \cdot \mathbf{v}}{|\mathbf{u}| |\mathbf{v}|}
]
- 用于衡量两个向量之间的夹角,范围为
-
欧几里得距离(Euclidean Distance):
- 用于衡量两个向量之间的直线距离,值越小表示越相似。
- 公式:
[
\text{Euclidean Distance} = \sqrt{\sum_{i=1}^n (u_i - v_i)^2}
]
-
马氏距离(Mahalanobis Distance)(可选):
- 考虑特征之间的相关性,用于衡量多维数据之间的距离。
在 DeepSORT
中,默认使用 余弦距离,因为它对特征向量的尺度不敏感,适合用于深度学习提取的特征。
特征库的作用
NearNeighborDisMetric
内部维护了一个特征库,用于存储每个轨迹目标的历史特征向量。特征库的作用包括:
- 存储轨迹的历史特征:
- 每个轨迹的特征向量会在更新时存储到特征库中。
- 支持特征匹配:
- 在匹配过程中,从特征库中提取轨迹的特征向量,与检测的特征向量进行比较。
- 限制特征数量:
- 特征库的大小由
nn_budget
参数控制,超过限制时会删除最旧的特征。
- 特征库的大小由
总结
this->metric->distance(features, targets)
的主要作用是:
- 提取轨迹目标的特征向量。
- 计算轨迹目标与检测目标之间的特征距离。
- 返回一个距离矩阵,用于后续的匹配算法(如匈牙利算法)。
这个函数是目标跟踪中基于特征匹配的重要组成部分,结合深度学习提取的特征向量,可以实现高效、准确的目标关联。