Tracking without bells and whistles(Tracktor) 论文简单解读

主要工作:

提出一个基于检测器的多目标跟踪框架。

主要贡献:

  1. 提出一种多目标跟踪器,利用检测器的边界框回归进行目标边界框的临时配准(利用跟踪在当前帧的边界框预测其在下一帧的边界框)。
  2. 利用行人重识别孪生网络(利用行人重识别匹配失效跟踪与检测,重新激活匹配上的失效跟踪,并用被匹配的检测作为其在当前帧的位置)和基于相机运动补偿的运动模型(利用强化的相关系数最大化进行图像配准,解决不稳定的相机运动造成帧间目标位移较大而导致的匹配出错问题)来扩展原始跟踪器 。
  3. 详细研究了多目标跟踪中失败情况和具有挑战性的场景(能见度低的场景,目标尺寸较小的场景,低帧率的场景),显示没有一个专门的跟踪方法能够优于本文提出的基于检测器回归的方法。
  4. 提出了一种新的利用检测器的多目标跟踪范式,使研究人员可以关注其他更复杂的跟踪问题。进行了一个指明最具前景的研究方向的扩展研究(利用gt信息来代替跟踪过程中的一个或多个操作,例如利用gt信息来进行跟踪killing策略,利用gt信息来进行边界框回归,利用gt信息进行运动模型,利用gt信息进行行人重识别)。

逐帧跟踪方式

Tracktor的跟踪过程
如图所示,对于给定帧:

  1. 将每个跟踪在t-1帧的边界框输入到检测器中得到对应目标在t帧的边界框 b t b^t bt和分类分数 s t s^t st
  2. 利用每个跟踪的分类分数 s k t s_k^t skt kill潜在的被遮挡跟踪。
  3. 利用目标检测器得到t帧的检测集 D t D^t Dt(或者公共检测集)。
  4. 将检测集 D t D^t Dt中与当前帧的目标边界框 b t b^t bt没有显著IOU的检测初始化为新跟踪。

整体跟踪流程

伪代码表示

利用公开检测集的整体跟踪流程可以用下面的伪代码表示得到(不包括行人重识别与运动模型):

// 有序图像列表表示的单个视频序列
I I I={ i 0 i_0 i0, i 1 i_1 i1, …, i T − 1 i_{T-1} iT1}, i t i_t it表示t帧的图像。
// 公共检测集
D D D={ D 0 D_0 D0, D 1 D_1 D1, …, D T − 1 D_{T-1} DT1}, D t D_t Dt表示t帧的检测列表。
// 目标的跟踪轨迹集
T T T={ T 1 T_1 T1, T 2 T_2 T2, …, T k T_k Tk}
// 有序边界框列表
T k T_k Tk={ b t 1 k b_{t_1}^k bt1k, b t 2 k b_{t_2}^k bt2k, …, b t N k b_{t_N}^k btNk | 0 ≤ \le t 1 t_1 t1, t 2 t_2 t2, …, t N t_N tN ≤ \le T-1}, b t k b_t^k btk=(x, y, w, h)为边界框坐标。

T T T, T a c t i v e T_{active} Tactive ← \leftarrow 0;
f o r for for i t i_t it D t D_t Dt ∈ \in z i p ( I , D ) zip(I,D) zip(I,D) d o do do
     B B B, S S S ← \leftarrow 0;
     f o r for for T k T_k Tk ∈ \in T a c t i v e T_{active} Tactive d o do do
        //获取跟踪上一帧的边界框
         b t − 1 k b_{t-1}^k bt1k ← \leftarrow T k [ − 1 ] T_k[-1] Tk[1];
        //预测跟踪在当前帧的边界框和分类得分
         b t k b_t^k btk, s t k s_t^k stk ← \leftarrow dectector.reg and class( b t − 1 k b_{t-1}^k bt1k);
        //利用分类得分kill掉可能被遮挡的目标
         i f if if s t k s_t^k stk < σ a c t i v e \sigma_{active} σactive t h e n then then
             T a c t i v e T_{active} Tactive ← \leftarrow T a c t i v e T_{active} Tactive - { T k T_k Tk};
             T T T ← \leftarrow T T T + { T k T_k Tk};
        //添加当前帧跟踪边界框以及跟踪分类得分
         e l s e else else
             B B B ← \leftarrow B B B + { b t k b_t^k btk};
             S S S ← \leftarrow + { s t k s_t^k stk};
    //利用NMS kill掉被遮挡跟踪
     B B B ← \leftarrow NMS ( B , S , λ a c t i v e B, S, \lambda_{active} B,S,λactive);
    //将kill掉的跟踪从激活跟踪中剔除
     f o r for for k k k, T k T_k Tk ∈ \in T a c t i v e T_{active} Tactive d o do do
         i f if if k k k ∉ \notin / B B B t h e n then then
             T a c t i v e T_{active} Tactive ← \leftarrow T a c t i v e T_{active} Tactive - { T k T_k Tk};
             T T T ← \leftarrow T T T + { T k T_k Tk};
    //将未被剔除的边界框添加到对应跟踪轨迹中
     f o r for for T k T_k Tk b t k b_t^k btk ∈ \in zip( T a c t i v e , B T_{active}, B Tactive,B) d o do do
         T k T_k Tk ← \leftarrow T k T_k Tk + { b t k b_t^k btk};
     S S S ← \leftarrow 0;
    //利用检测器改善检测集的边界框以及得到分类分数
     f o r for for d t d_t dt ∈ \in D t D_t Dt d o do do
         d t d_t dt, s t s_t st ← \leftarrow detector.reg and class( d t d_t dt);
        //利用分类得分剔除被遮挡检测
         i f if if s t < σ a c t i v e s_t < \sigma_{active} st<σactive t h e n then then
             D t D_t Dt ← \leftarrow D t D_t Dt - { d t d_t dt};
         e l s e else else
             S S S ← \leftarrow S S S + { s t s_t st};
    //利用NMS kill掉被遮挡的检测
     D t D_t Dt ← \leftarrow NMS( D t , S , λ n e w D_t, S, \lambda_{new} Dt,S,λnew);
    //利用IoU将检测与跟踪进行匹配
     f o r for for d t d_t dt ∈ \in D t D_t Dt d o do do
         f o r for for b t k ∈ B b_t^k \in B btkB d o do do
             i f if if IoU( d t , b t k d_t, b_t^k dt,btk)> λ n e w \lambda_{new} λnew t h e n then then
                 D t D_t Dt ← \leftarrow D t D_t Dt - { d t d_t dt};
    //匹配剩余的检测初始化为新跟踪(如果有reid模块,则在初始化新跟踪之前会进行reid)
     f o r for for d t d_t dt ∈ \in D t D_t Dt d o do do
         T k T_k Tk ← \leftarrow 0;
         T k T_k Tk ← \leftarrow T k T_k Tk + { d t d_t dt};
         T a c t i v e T_{active} Tactive ← \leftarrow T a c t i v e T_{active} Tactive + { T k T_k Tk};
T T T ← \leftarrow T a c t i v e T_{active} Tactive;

行人重拾别流程

  1. 计算每个未激活跟踪与匹配剩余检测的外观模型距离矩阵。
  2. 计算每个未激活跟踪与匹配剩余检测之间的iou矩阵。
  3. 利用iou矩阵以及reid阈值得到mask矩阵。
  4. 利用mask将距离矩阵中不可能的匹配所对应的元素设置为一个极大值。
  5. 利用更改后的距离矩阵进行二元分配。
  6. 激活匹配上的未激活跟踪,用匹配的检测位置更新跟踪的位置,剩余的跟踪继续作为未激活跟踪,并对长时间未激活的跟踪进行终结,剩余的检测初始化为新跟踪。

个人看法

  1. 利用检测器来预测跟踪在当前帧的边界框以及得到分类分数就保证了边界框的精确,得到了目标的被遮挡情况。
  2. 精确的边界框可以直接作为跟踪在当前帧的位置(减少了FP),不需要用检测来更新跟踪的边界框。
  3. 利用分类分数来进行kill,一定程度上解决了遮挡问题。
  4. 由于检测器的精确性,经过分类分数和NMS kill的跟踪预测与改善检测在匹配阶段不需要再次kill。匹配时不采用基于匈牙利算法的数据关联,直接逐一将检测与跟踪进行匹配(减少了IDSW),没有匹配上的跟踪依然是激活跟踪,没有匹配上的检测用于初始化新跟踪(减少了FN),大幅度提高了MOTA值。
  5. 测试代码google colab上的训练代码,训练代码的损失包括两对分类损失和回归损失,其中一对训练了一个检测器中没用到的部分,可以在定义损失时改正。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值