Anchor-free Multi-object Trackers(无锚框的多目标跟踪)

摘要:多目标跟踪Multiple Object Tracking (MOT)的目的是在事先不知道目标的外观和数量的情况下,对视频里的目标进行识别和跟踪,通常识别跟踪的对象为行人、车辆等。和目标检测不同,除了输出目标的检测框,目标跟踪还需要输出每个检测框的ID,以便于区分类内的物体。近些年来多目标跟踪领域SOTA的方法大多都是采用基于检测的跟踪算法,检测器的性能对跟踪的效果有着至关重要的作用。近一两年有几个先进的多目标跟踪算法都是使用2019年提出的一个anchor-free的目标检测算法CenterNet,本文将介绍有关CenterNet的特点以及几个基于CenterNet的多目标跟踪算法。

CenterNet

CenterNet的基本思想是:将每个目标物体建模成一个中心点来表示,不需要生成候选框,也不需要使用非极大值抑制这样的后处理。CenterNet使用一个全卷积网络生成一张高分辨率的特征图,对特征图的每个像素点进行分类判断,判断它是目标类别的中心点还是背景,这张特征图给定了每个目标物体中心点的位置,在目标的中心点处置信度为1,背景点置信度为0。
在这里插入图片描述
CenterNet的骨干网络的结构跟一般的实例分割网络相同,都是encoder-decoder的结构,作者在骨干网络的上采样过程中引入了可变形卷积的操作,标准卷积中的规则格点采样是导致网络难以适应几何形变的“罪魁祸首”,为了削弱这个限制,对卷积核中每个采样点的位置都增加了一个偏移变量,可以实现在当前位置附近随意采样而不局限于之前的规则格点。
在这里插入图片描述
CenterNet的输出除了目标物体的中心点之外,还有中心点的偏移量和物体的尺寸,输出的中心点坐标是整数形式的,但是实际的中心点是浮点数坐标,所以输出中心点的偏移量来提高中心点位置预测的精确度。训练的时候,因为输出的热力图尺寸相对原图下采样4倍,因此制作ground truth heatmap也下采样4倍,使用一个高斯核来将中心点映射到热力图上,标准差与目标大小有关。
在这里插入图片描述
预测热力图使用的损失函数采用focal loss的形式,focal loss可以用来解决正负样本不均衡的问题。focal loss能够使得易分类样本得到损失值更小,使得训练过程更加关注那些难以分类的样本,但是同时也容易收到噪声的干扰,比如错误的标注,会使得训练过程关注这些噪声,使得效果变差。
中心点预测损失函数
在这里插入图片描述
预测偏移量使用的损失函数采用L1 loss的形式,预测目标尺寸的损失函数也是采用L1 loss的形式。
最终的损失函数是三个损失函数的加权和,网络输出的3个预测部分如下图所示。
中心点偏移量损失
目标尺寸损失

CenterTrack

CenterTrack的基本思想是:输入前后两帧的一对图像和先前帧的heatmap,输出当前帧的中心点到先前帧的中心点的偏移向量,然后根据使用当前帧的中心点位置和偏移向量推断出先前帧的中心点的位置,再使用贪婪匹配策略根据距离来将该中心点匹配到先前帧的检测。如果在半径K的范围内没有先前帧的检测物体存在,则新建一条轨迹。
在这里插入图片描述
CenterTrack的思想延续了CenterNet简洁的风格,使用的数据关联方法十分简单,它只关联到相邻帧之间的检测目标,这样会造成比较多的ID切换的问题。而且基于贪婪匹配策略的数据关联不考虑整体最优,只考虑个体最优;基于匈牙利算法的数据关联考虑整体最优。
在这里插入图片描述
为了分析效果,作者做了3个baseline模型:
Detection only:只使用原版CenterNet进行检测,跟踪通过目标中心2D距离来匹配对象;
Without offset:使用CenterTrack中对输入端的改进,但不使用预测出的offset,目标的匹配还是通过距离来计算;
Without heatmap:在CenterTrack的基础上,去掉tracklets heatmap的输入,但是输出还是会预测offset,目标的匹配基于预测得到的偏移量结合贪婪匹配的策略进行。
在这里插入图片描述
最终实验效果如上图,可以看出,如果不添加tracklets heatmap作为附加输入,效果会大打折扣(个人认为是因为不输入heatmap,输出的offset就不准确,影响检测的匹配)。虽然看起来不使用offset效果下降不明显(跟只使用目标中心距离做贪婪匹配效果差不多),文中解释这是因为做实验用的这些数据集帧率相对较高,换句话说就是目标的运动不会过于剧烈,这会弱化offset的表现,可能换一个帧率低些的数据集,或者目标运动速度快的,可能offset的作用会更加明显。
在这里插入图片描述
在目标运动缓慢的数据集上使用offset和使用光流法和卡尔曼滤波的效果差不多。但是在目标运动比较快或者帧率低的数据集上使用offset运动模型效果更好。卡尔曼滤波器通过一个从物体的历史记录中估计出来的显式运动模型来预测每个物体的未来状态。它是传统实时跟踪器中应用最广泛的运动模型。

FairMOT

如果使用anchor-based 的目标检测,目标的ReID特征是在anchor区域提取的,anchor 和目标区域会出现不对齐的问题,这会导致网络训练时存在严重的歧义。
在这里插入图片描述
FairMOT的基本思想是公平的对待Re-ID任务和目标检测任务,使用anchor-free的目标检测算法获得目标中心点的热力图,并给每个中心点分配Re-ID特征能显著地提升跟踪精度。
FairMOT的检测部分与CenterNet完全相同,只不过添加了一个Re-ID分支,用于提取像素级别的中心点的Re-ID特征。
Re-ID分支应用一个128维的卷积层连接在DLA34骨干网络之后,对中心点坐标为(x,y)的heatmap提取ID特征。作者通过分类任务学习re-ID特征。 训练集中相同ID的所有对象实例都被视为同一类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Online Association
遵循标准的在线跟踪算法来关联框。 首先根据第一帧中的预测框初始化一些轨迹。 然后,在随后的帧中,根据在Re-ID特征上计算的余弦距离将检测到的物体与现有的轨迹进行链接。同时应用了Kalman Filter来筛选detection,如果预测的跟踪框与检测框距离过远,则将其cost设为无穷大,接着通过Re-ID特征之间的余弦距离来作为数据关联的cost,接着通过匈牙利算法来进行关联,然后进行轨迹的更新。第二次关联将未匹配上的检测框与跟踪框再通过IOU进行一次匹配,防止遗漏掉目标。

TraDes

TraDeS利用跟踪线索来辅助检测任务,通过cost volume来推理目标的跟踪偏移量,这个偏移量用来传播先前帧的目标特征以提升当前帧物体的检测与分割。
在这里插入图片描述
主要设计了Cost Volume based Association(CVA)模块和Motion-guided Feature Warper(MFW)模块,CVA模块用于学习ReID embedding和产生目标偏移量,MFW模块则用于利用CVA产生的跟踪线索来传播先前帧目标的特征给当前帧。
在这里插入图片描述
CVA模块通过backbone提取逐点的ReID embedding特征来构建一个cost volume,这个cost volume存储两帧之间的embedding之间的匹配相似度。然后,模型可以根据cost volume推断跟踪偏移(tracking offset)。追踪偏移加上提取的embedding一起构建数据关联。之后,MFW模块以跟踪偏移作为运动线索来将目标的特征从前帧传到当前帧。最后,对前帧传来的特征和当前帧的特征进行聚合进行当前帧的检测和分割任务。
在CVA模块中,cost volume用来监督ReID embedding,ReID分支的学习目标考虑了类间差异,文中说它可以学到有效的embedding并且兼容检测损失,从而不会损害检测性能。TraDes利用了tracking offset,它能有效检测目标的大幅度运动或者低帧率下的目标运动,tracking offset可以作为鲁棒的运动线索来指导MFW模块中的特征传播。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用cpp opencv的trackerKCF实现多目标跟踪的示例代码: ```cpp #include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; int main(int argc, char** argv) { // Read input video VideoCapture cap("input.mp4"); if (!cap.isOpened()) { cout << "Error opening video file" << endl; return -1; } // Create KCF tracker for each object vector<Ptr<TrackerKCF>> trackers; vector<Rect2d> objects; Mat frame; int num_objects = 2; // Number of objects to track for (int i = 0; i < num_objects; i++) { cap >> frame; Rect2d object = selectROI("Select Object " + to_string(i + 1), frame); objects.push_back(object); Ptr<TrackerKCF> tracker = TrackerKCF::create(); tracker->init(frame, object); trackers.push_back(tracker); } // Process frames and track objects while (cap.read(frame)) { for (int i = 0; i < num_objects; i++) { bool success = trackers[i]->update(frame, objects[i]); if (success) { rectangle(frame, objects[i], Scalar(0, 0, 255), 2); } else { // If object is lost, re-initialize tracker with new ROI objects[i] = selectROI("Select New Object " + to_string(i + 1), frame); trackers[i]->init(frame, objects[i]); } } imshow("Multi-Object Tracker", frame); if (waitKey(1) == 27) // Press "ESC" to exit break; } // Release resources cap.release(); destroyAllWindows(); return 0; } ``` 该代码使用了opencv的VideoCapture类读取输入视频,并创建了多个KCF tracker来跟踪多个目标。在程序开始时,会要求用户在视频帧上选择每个目标的初始位置。然后,程序会对每一帧视频依次处理,并对每个目标进行跟踪。如果跟踪失败,则会要求用户在当前帧上重新选择目标位置,并重新初始化tracker。最后,程序会显示跟踪结果,并等待用户按下"ESC"键退出。 需要注意的是,该示例代码中只处理了两个目标的情况,如果需要跟踪更多的目标,可以适当修改代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值