sort目标跟踪算法

概述

sort(Simple Online and Realtime Tracking),简单的在线实时跟踪,常用于多目标追踪(Multiple Object Tracking)中,其中不涉及到图像识别、特征匹配等算法,sort算法以目标检测结果作为输入,用数据关联算法(匈牙利算法)进行目标匹配,并以卡尔曼进行目标预测,通过IOU也建立目标间的关系,其主要目的在于连续跟踪目标的ID,优点是跟踪速度快。

sort算法流程图

在这里插入图片描述

sort关键参数

self.max_age = 1             # 在跟踪列表中有几帧没有关联匹配成功就从跟踪列表中移除,否则就将失去关联计数加1
self.min_hits = 3            # 连续3帧以上都匹配成功,则作为跟踪结果输出
self.iou_threshold = 0.3     # IOU匹配的阈值
self.trackers = []           # 跟踪缓存
self.frame_count = 0         # 帧率统计

sort过程代码

1.从现有跟踪器中获取预测位置

const auto get_pred_boxes = [] (auto &trackers) {
    std::vector<cv::Rect2f> boxes;
    boxes.reserve(trackers.size());
    for (auto it = trackers.begin(); it != trackers.end();)
    {
        const cv::Rect2f &box = (*it)->Predict();
        if (box.x >= 0 && box.y >= 0)
        {
            boxes.emplace_back(box);
            it++;
        }
        else
        {
            it = trackers.erase(it);
        }
    }
    return boxes;
};

const std::vector<cv::Rect2f> &pred_boxes = get_pred_boxes(trackers_);

2.得到所有检测框与跟踪框的匹配矩阵

std::vector<int> assignment;
const auto trk_num = pred_boxes.size();
const auto det_num = detected_box.size();
const auto &iou_matrix = CalcIou(detected_box, pred_boxes);

// 使用匈牙利算法进行分配问题
hung_algo_.Solve(iou_matrix, trk_num, det_num, assignment);

// 过滤低IOU的框,得到unmatched_trajectories, unmatched_detections, matched_pairs

3.更新trackers跟踪器

// 对跟踪列表关联成功的检测结果,使用检测结果进行更新
for (unsigned int i = 0; i < matched_pairs.size(); i++)
{
    // 跟踪列表索引
    const int trk_idx = matched_pairs[i].x;
    // 检测列表的索引
    const int det_idx = matched_pairs[i].y;
    // 用检测结果的信息来更新跟踪结果
    trackers_[trk_idx]->Update(detected_box[det_idx]);
}

4.创建并初始化新的跟踪器给没匹配上的检测结果

for (auto umd : unmatched_detections)
{
   cv::Rect2f rect;
   rect.x = detected_box[umd].rect.x;
   rect.y = detected_box[umd].rect.y;
   rect.width = detected_box[umd].rect.width;
   rect.height = detected_box[umd].rect.height;
   trackers_.push_back(std::make_unique<TrackerManager>(rect, counter_));
   counter_++;
}

匈牙利算法

匈牙利算法是解决二分图最大匹配问题的算法,是一种数据关联算法,其目的在于匹配个数最大化,而不是匹配的准不准问题,所以可能会匹配错误。
它的输入是代价矩阵IOU。

### DeepSort目标跟踪算法的评估标准和性能指标 DeepSort是一种基于SORT(Simple Online and Realtime Tracking)改进的目标跟踪算法,它引入了更复杂的特征表示来提升跟踪质量。以下是关于DeepSort目标跟踪算法的评估标准和性能指标的具体说明。 #### 1. **评价指标** 多目标跟踪任务通常采用一组标准化的评价指标来衡量算法的表现。这些指标可以从多个维度反映跟踪系统的优劣: - **MOTA (Multiple Object Tracking Accuracy)** MOTA综合考虑了漏检、误检以及身份切换的情况,是目前最广泛使用的多目标跟踪评价指标之一[^3]。计算公式如下: \[ MOTA = 1 - \frac{\text{FN} + \text{FP} + \text{ID Switches}}{\text{Total Ground Truth Objects}} \] 其中,\(\text{FN}\) 表示漏检数,\(\text{FP}\) 表示误检数,\(\text{ID Switches}\) 表示身份切换次数。 - **MOTP (Multiple Object Tracking Precision)** MOTP反映了平均检测误差的距离精度,即所有正确匹配的检测框与真实标注框之间的平均距离。 - **ID Swaps (Identity Switches)** IDSw 是用来统计不同目标间发生的身份切换次数。较低的 IDSw 值意味着更高的稳定性。 - **MT/ML/PT (Mostly Tracked/Mostly Lost/Partially Tracked)** 这些指标描述了一个目标在整个生命周期内的跟踪覆盖率情况。具体定义为: - \(MT\):至少有80%的时间被成功跟踪的目标比例。 - \(ML\):少于20%的时间被成功跟踪的目标比例。 - \(PT\):其余部分为目标的部分跟踪比例[^4]。 #### 2. **性能分析** DeepSort相比原始的SORT算法,在以下几个方面进行了显著优化: - **深度学习特征提取** DeepSort通过卷积神经网络(CNN)提取目标的外观特征,并将其融入到数据关联的过程中。这使得即使在短时间内丢失目标后也能重新找回,从而减少了\(IDSwitches\)的数量[^2]。 - **卡尔曼滤波器(Kalman Filter)** 继承自SORT的设计理念,DeepSort仍然使用卡尔曼滤波器来进行目标的状态估计。这种技术可以有效平滑噪声并预测下一帧可能的位置[^1]。 - **匈牙利算法(Hungarian Algorithm)** 利用成本矩阵结合马氏距离(Mahalanobis Distance)和余弦相似度(cosine similarity),DeepSort实现了更加精确的数据关联过程。 #### 3. **实验结果** 根据文献记录,DeepSort在公开的MOTChallenge数据集上的表现优于传统的SORT算法。例如,在相同的条件下运行时,DeepSort能够获得更高的MOTA分数,同时大幅降低IDSw数值。这是因为其加入了更深次级别的特征比较机制,增强了对于长期遮挡或者短暂消失场景下的鲁棒性。 ```python import numpy as np def calculate_mota(fn, fp, id_switches, total_gt_objects): """ 计算MOTA值。 参数: fn: 漏检数目 fp: 误检数目 id_switches: 身份切换次数 total_gt_objects: 地面真值总对象数 返回: mota: 多目标跟踪准确率 """ mota = 1 - (fn + fp + id_switches) / total_gt_objects return mota # 示例调用 mota_value = calculate_mota(50, 30, 10, 1000) print(f"MOTA Value: {mota_value}") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值