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。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DeepSORT流程图包括以下几个步骤: 1. 预测状态:利用上一轮迭代生成的Tracks,通过卡尔曼滤波进行预测,计算得出本轮的状态的mean和covariance。 2. 第一次匹配:将步骤1中的Tracks和本轮目标检测器检测出的Detections一起送入Cascade进行匹配。匹配结果包括三种状态:Unmatched Tracks(未匹配的Tracks)、Unmatched Detections(未匹配的Detections)和Matched Tracks(已匹配的Tracks)。 3. 第二次匹配:由于步骤2中的检测可能存在漏检情况,需要将未确定的Tracks与步骤1中的未匹配Tracks合并,在进行IOU Match的匹配后得到更可靠的匹配结果。匹配结果同样包括Unmatched Tracks、Unmatched Detections和Matched Tracks。 4. 处理失效对象:对于未匹配的Tracks中的未确定状态(Unconfirmed)和超过设定阈值的已确定状态(Confirmed),将其状态设置为Delete。 5. 输出结果并为下一轮准备数据:将步骤3和步骤4中已匹配的Tracks合并,进行卡尔曼滤波的update,并将age加1,输出Tracks。同时,根据不同来源的Tracks,包括步骤3未匹配的Detections和步骤4中已确认且未超龄的Tracks,将它们合并作为下一轮迭代的输入,继续进行步骤1。 综上所述,DeepSORT流程图包括预测状态、两次匹配、处理失效对象和输出结果的步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值