【目标跟踪】解决多目标跟踪遮挡问题

文章目录

前言

  1. 目标跟踪在发生遮挡时,极其容易发生Id Switch。
  2. 网上许多算法忽视跟踪遮挡问题,同时网上相关资料也很少。
  3. 博主为了解决跟踪遮挡,翻阅大量论文。分享其中一篇论文。论文链接:https://arxiv.org/abs/2103.04147
  4. 论文介绍了一种思路,但是未提供代码,博主根据论文思路编写了相关代码。验证后发现,效果好得出乎意料。
  5. 阅读本文需要一定跟踪的基础。如果是新手建议先阅读博主往期博客【目标跟踪】多目标跟踪测距:https://blog.csdn.net/qq_49560248/article/details/134016802

一、判定遮挡目标

要处理遮挡问题,我们先明确什么是遮挡目标,方便与我们后面针对性处理。

  1. 目标未与新检测目标匹配,此时的目标是预测的目标没有与新检测的目标匹配上。
  2. 存在其他目标,在相机与遮挡目标中间

当同时符合上述两个条件时,会判定为遮挡目标

为了判定是否为遮挡目标,我们定义了两个关键的量。

  1. Ci 目标 i 遮挡置信度
  2. CPi 目标 i 被覆盖的比例

Ci = min(1, a * (Age / t) * (Ai / Aavg))

a:可调参数,可以默认为1

Age:id 起始帧到当前帧的帧数。如 id 在第 2 帧首次出现,当前第 10 帧还存在,那么 Age = 8

t: 从上一次更新起 连续预测次数。如 目标 i 在第 1 帧匹配了,在第 2 帧未匹配,此时 t = 1,在第 3 帧 匹配上,此时 t = 0。如果是匹配上的目标,不在我们遮挡目标讨论范围内,就不会进入计算 Ci 范围内。

Ai: 目标 i box的面积 box.width * box.height

Aavg: 当前帧所有目标 box 的平均面积

CPi = I(bbi, bbj) / A(bbi)

I(bbi, bbj): 目标 i box 与 目标 j box 的交集

A(bbi): 目标 i box 面积

当 Ci 大于设定值,同时 CPi 大于设定值,则此时目标判定为遮挡目标

c++ 复制代码
for (auto umt:unMatch) {
    // 目标置信度 Ci
    cv::Rect_<float> trackerBox = trackers[umt].kBox.GetState();
    float confidence = (trackers[umt].kBox.mAge / trackers[umt].kBox.mTimeSinceUpdate) * GetBoxArea(trackerBox) / boxAvg;
    float maxCoverPercent = 0;
    for (int i = 0; i < detNum; i++) {
        float percent = GetCoverPercent(trackerBox, deData[i].box);    // 覆盖百分比
        if (percent > maxCoverPercent) {
            maxCoverPercent = percent;
        }
    }
    /* 当 跟踪目标置信度>mTrackConfidence和覆盖百分比>mCoverPercent时, 标记为遮挡目标此时计算扩展目标框 */
    if (confidence > mTrackConfidence && maxCoverPercent > mCoverPercent) {
        trackers[umt].whetherCover = true;
        trackers[umt].kBox.kf.statePost.at<float>(7, 0) = trackers[umt].kBox.kf.statePost.at<float>(7, 0) / 2; // 遮挡目标速率减半
        continue;
    } 

注:代码中有一行遮挡目标面积速率减半,是因为目标在遮挡时那一帧,目标 box 面积会急速变小,除以 2 是为了补偿这个速率。实际效果算是锦上添花。


二、扩展目标框

当目标判定为遮挡目标时,我们才会计算该目标的扩展框

扩展IOU的计算公式

回顾下传统 IOU 计算公式

上述 IOUext 与 IOU 计算 差别 就在于 bbextT(扩展目标框)

现在问题是 bbextT 如何计算呢?

观察红色框与虚线框,红色框是卡尔曼预测框,虚线框就是我们的扩展目标框

当预测的帧数+1,则此时扩展目标框会有一定比例的扩大。由于论文仅仅提供思路,没有说明具体数值,代码也未提供。我是根据实际的数据调试。

c++ 复制代码
if (pBox.whetherCover == true) {
   // 如果是遮挡目标, 预测框需要保存扩展框
   float ePixe = pBox.box.width * boxExpandScale * (*it).kBox.mTimeSinceUpdate;  // boxExpandScale设定的 0.2
   pBox.expansionBox = pBox.box + cv::Point_<float>(-ePixe, -ePixe) + cv::Size_<float>(2 * ePixe, 2 * ePixe);
}

如果是遮挡目标,此时用扩展IOU计算匹配矩阵的目标权重

c++ 复制代码
float GetExpansionIou(cv::Rect_<float> boxD, cv::Rect_<float> boxT, cv::Rect_<float> boxExpand)
{
    // boxD:检测框, boxT:跟踪框, boxExpand:扩展框
    float in = (boxD & boxExpand).area();           // 检测框与扩展框交集面积
    float un = boxD.area() + boxT.area() - in;      
    float result = in / un;    
    if (result > 1) {
        result = 1;     // 当iou >1 时赋值为1
    }      
	return result * mExpansionIou;  
}

三、结论

  • 实际数据测试,在 10 - 20m 的遮挡目标,解决 超过 50% 的 id switch问题
相关推荐
请站在我身后18 分钟前
最新的强大的文生视频模型Pyramid Flow 论文阅读及复现
论文阅读·人工智能·神经网络·计算机视觉·stable diffusion·transformer
weixin_5152024943 分钟前
第R4周-LSTM-火灾温度预测
人工智能·rnn·lstm
小任同学Alex1 小时前
Lagent:从零搭建你的 Multi-Agent
人工智能·自然语言处理·大模型·大语言模型·多模态
伊一大数据&人工智能学习日志1 小时前
OpenCV计算机视觉 02 图片修改 图像运算 边缘填充 阈值处理
人工智能·opencv·计算机视觉
杀生丸学AI1 小时前
【三维重建】去除瞬态物体Distractor汇总
人工智能·大模型·aigc·三维重建·扩散模型·高斯泼溅·空间智能
Zhi.C.Yue1 小时前
SVM理论推导
人工智能·机器学习·支持向量机
愚者大大1 小时前
线性分类器(KNN,SVM损失,交叉熵损失,softmax)
人工智能·机器学习·支持向量机
volcanical2 小时前
Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena
人工智能·自然语言处理·机器翻译
大知闲闲哟2 小时前
深度学习J6周 ResNeXt-50实战解析
人工智能·深度学习
静静AI学堂2 小时前
Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
人工智能·深度学习·目标跟踪