概要

JiFeng老师CVPR2019的另一篇大作,真正地把检测和跟踪做到了一起,之前的一篇大作FGFA首次构建了一个非常干净的视频目标检测框架,但是没有实现帧间box的关联,也就是说没有实现跟踪。而多目标跟踪问题一般需要一个off-the-shelf的检测器先去逐帧检测,然后再将各帧的detection进行associate,检测与跟踪是一个“晚融合”的过程,检测是为了跟踪,跟踪却不能反哺检测。这篇文章结构非常干净,就连笔者这样对跟踪基本小白的水平也能无压力看懂。更可贵的是,这篇文章是在online的设定下做的,也就是处理某一帧时只考虑当前帧及前序帧,不接触到后续帧,而之前的FGFA、D&T等工作都是offline的,online显然更贴合实际应用。

背景

给定一个视频的多帧\(\mathbf{I}_t, t=0, \ldots, T\),目标是检测并跟踪t时刻及其之前的帧中所有目标\(\mathbf{D}_t = \{<d_j^t, c_j^t>\}, j=1, \ldots, m\),\(d_j^t\)表示第t帧中的第j个tracklet,\(c_j^t\)是其类别,一个tracklet \(d^t\)由t时刻及其之所有帧中的bbox集合,\(d^t = [b_k^{t_k}]\),\(b_k^{t_k}\)是帧\(t_k\)中的第k个bbox,\(t_k\le t\)。

传统基于检测的在线跟踪方法,如文中的算法1所示,写的非常直白,主要看for循环里的6行。第一行逐帧检测,第四行逐帧NMS,第五行用某种跟踪算法把各帧的bbox关联起来,这一步方法就很多了,可以基于bbox之间的几何关系去匹配,也可以结合图像特征,等等,总之概括起来就是这三下子。2、3、6行是两个可选的优化技术,第2、3行是box传播,就是通过光流之类的方法,将前序帧的bbox传播到当前帧,然后与当前帧检测出的bbox一起做NMS,第6行是对box的类别分数重新赋值,通常做法就是用历史的类别分数及当前帧检测出的类别分数取平均。

可以看到,即使用了两个技术去优化,检测依然不能从跟踪中获利

Tracklet-Conditioned Detection Formulation

下面,作者展示了如何把检测和跟踪统一成一个框架,让两者在更早的阶段就相互影响,相互促进。首先将问题形式化,给定第t帧中的一堆候选box,\(b_i^t\)是一个四元组,表示一个box位置,还有t时刻之前的tracklets \(\{d_j^{t-1}\}_{j=1}^{m}\)。剩下的问题就是对每个\(b_i^t\)进行分类,也就是
\[P(c|b_{i}^{t},\{d_j^{t-1}\}) = \sum_{j=0}^{m}w(b_i^t,d_j^{t-1})P(c|b_i^t,d_j^{t-1})\]
注意,这里的\(b_i^t\)可以是检测器第一阶段中的anchor box,也可以是第二阶段做完之后的比较稀疏的box;权重项是自适应学习出来的,权重最大的就认为是同一个目标,另外增加一个空tracklet \(d_0^{t-1}\),应对新出现的目标,当新目标出现时,这一项的权重理论上就比较大,其他项权重就比较小。这样,问题就比较好的形式化了,思路很清楚。
\[P(c|b_i^t,d_j^{t-1}) \propto \exp(\log P_{\textbf{det}}(c|b_i^t)+\alpha\log P_{\textbf{tr}}(c|d_j^{t-1}))\]
\(P_{\textbf{det}}(c|b_i^t)\)是基于当前帧预测的类别概率,用softmax来实现归一化\(\sum_{c=0}^{C} P(c|b_i^t,d_j^{t-1}) = 1\),要注意看清楚符号,视频分析的问题符号比较多,比较容易乱。\(P_{\textbf{tr}}(c|d_j^{t-1}))\)是tracklet的类别概率,也就是一连串box取平均。具体地,
\[P_{\textbf{tr}}(c|d_j^{t}) = \frac{P(c|b_{k}^{t},\{d_j^{t-1}\}) + \beta P_{\textbf{tr}}(c|d_j^{t-1}) \text{len}(d_j^{t-1})}{1+\beta \text{len}(d_j^{t-1})}\]
\(\beta\)是一个指数衰减项,默认为0.99,看起来无伤大雅。现在还剩权重项,这一项可以直观的理解为当前帧中的box,比较像前一帧中的哪个box,越像权重就越高,所以很自然地用当前box的特征与前面的一堆box的特征进行逐一比对,自适应地学习权重,这是比较两个box的apperance相似性,其实还应该比较box之间的geometry特性,譬如挨得越近就越可能是同一物体,不过作者貌似没有从几何方面考虑,可能是效果没出来,或者没时间弄了,埋个坑下一篇继续填。
\[w(b_i^t,d_j^{t-1}) = \exp(\gamma\cos(\mathcal{E}(b_i^t), \mathcal{E}(d_j^{t-1}))) \quad j>0\]
\(\mathcal{E}(b_i^t)\)和\(\mathcal{E}(d_j^{t-1})\)是把box映射成的128-D特征,具体做法下一章介绍,其实就是一层fc搞定。\(\gamma\)是一个调节项,设为8。此外还要考虑新出现的物体:
\[w(b_i^t,d_0^{t-1}) = \exp(R)\]
R设为0.3,当然,还需要归一化一下,
\[w(b_i^t,d_j^{t-1}) = \frac{w(b_i^t,d_j^{t-1})}{\sum_{k=0}^{m}w(b_i^t,d_k^{t-1})}\]
最后,空tracklet的类别概率设为均匀分布就行,
\[P_{\textbf{tr}}(c|d_0^{t}) = \frac{1}{C+1}\]
这一段比较长,符号也比较多,总结一下,中心就是第一个式子,下面这一堆都是这个式子里面每个项的解释,just so so...

Tracklet-Conditioned Two-stage Detectors

上一段遗留了几个坑,一是box是怎么来的,二是哪个128-D特征怎么来的。这一段就是把上面的思路嵌入到两阶段检测器里面。检测器使用Faster R-CNN+ResNet-101+OHEM,conv5的步长由32降为16,RPN接在conv4之后,分类和回归头接在conv5之后,就是ROI Pooling+2层fc+分类/回归。在此基础上加了一个box embedding头\(\mathcal{E}_{\text{s2}}\),与第二阶段的分类和回归头并列;还有\(\mathcal{E}_{\text{anchor}}\),与RPN的分类和回归头并列;以及\(\mathcal{E}_{\text{s1}}\),用了一个比较特别的方式获得。个人觉得这里\(\mathcal{E}_{\text{s1}}\)和\(\mathcal{E}_{\text{anchor}}\)其实用其中一个就可以了,但应该是考虑到性能问题,anchor的embedding是dense的,数量极大,如果两帧之间dense的embedding两两比对,计算量太大了,而\(\mathcal{E}_{\text{s1}}\)是筛选过的,通常是几百个。暂时是这样考虑的,以后可能有新的想法。
\[\mathcal{E}_{\text{s2}}(d_j^{t}) =
\begin{cases}
\eta \mathcal{E}_{\text{s2}}(b_k^t) + (1-\eta) \mathcal{E}_{\text{s2}}(d_j^{t-1}) \quad & \text{if } t>0, \\
\mathcal{E}_{\text{s2}}(b_k^0) \quad & \text{otherwise,}
\end{cases}\]
很简单的式子,0时刻就直接用当前帧box的特征,其他时刻用当前帧box的特征与前一帧的特征的加权和,\(\eta\)默认取0.8。\(\mathcal{E}_{\text{anchor}}\)是与RPN的分类回归并列的1x1卷积,输出128xK维。\(\mathcal{E}_{\text{s1}}\)比较特别,是在ROI Pooling的特征之后又接了两层1024维的fc,再接一层128维的fc得到结果。注意这两层1024维fc不是分类和回归用的那两层,是新加上去的。作者的解释是另加两层fc可以让\(\mathcal{E}_{\text{s1}}\)和\(\mathcal{E}_{\text{s2}}\)尽可能去相关,准确率会更高。最后还要注意\(\mathcal{E}_{\text{anchor}}\)的比较对象是前一帧的\(\mathcal{E}_{\text{s1}}\),而不是前一帧的\(\mathcal{E}_{\text{anchor}}\),前面说了应该是出于计算量的考虑。

训练/测试/实现细节/讨论

Inference见原文算法2,顺利成章的事情,没什么好写的。Training的样本是在视频中随机采样两个连续帧,第一帧只基于图像检测,第二帧使用Tracklet-Conditioned的检测,检测loss照抄Faster,跟踪loss定义如下:
\[\begin{aligned}
L &_{\text{track_box}}(b_{t-1}, b^{\text{gt}}_{t-1}, b^{\text{gt}}_{t}) =
\begin{cases}
(1 - \cos(\mathcal{E}(b_{t-1}), \mathcal{E}(b^{\text{gt}}_{t})))^2 \quad \text{if IoU}(b_{t-1}, b^{\text{gt}}_{t-1}) \ge 0.5\\
\max (0, \cos(\mathcal{E}(b_{t-1}), \mathcal{E}(b^{\text{gt}}_{t})))^2 \quad \text{otherwise} \\
\end{cases}
\end{aligned}\]
就是按照同一目标的特征相似度应该比较大,不同目标相似度应较小,比较好理解。
作者从准确性、鲁棒性和稳定性几个方面作了讨论,值得注意的是这个算法在稳定性方面很有优势,也就是检测框“抖动”的现象减轻了很多,这对于实际应用非常重要。
另外还有一些细节,AssociateTracklet的过程其实是一个二分图匹配的过程,不一定是权重最大的就认为是同一个目标,运用经典的二分图匹配算法就可以了,这在许多多目标跟踪器中也有应用。PropagateBox过程用了FlowNet2来取代opencv里自带的光流算法,不过这个过程应该只是用来复现Baseline,在作者提出的方法里并没有用到?
最后,说一下个人的几点看法:

  • 虽说统一了检测和跟踪,但是跟踪只用到了上一帧的信息,这或许对稳定性有一些伤害。
  • 对于reappear的问题是无力的,不过很多多目标跟踪的算法同样面临这个问题,当消失的目标重新出现时,会被视为新的目标,要解决这个问题就得用re-id来辅助一下了。
  • 跟踪性能到底如何?文章只在MOT15上跟其他算法进行了pk,并且也不是最优的,再最新的MOT17上可能就更无力了。不过,整合检测和跟踪,是未来的大势所趋,可以说开了个好头,提出了一个非常干净的框架。

论文笔记:Integrated Object Detection and Tracking with Tracklet-Conditioned Detection的更多相关文章

  1. 论文笔记之:Speed Up Tracking by Ignoring Features

    Speed Up Tracking by Ignoring Features CVPR 2014 Abstract:本文提出一种特征选择的算法,来实现用最"精简"的特征以进行目标跟 ...

  2. 论文笔记之:From Facial Parts Responses to Face Detection: A Deep Learning Approach

    From Facial Parts Responses to Face Detection: A Deep Learning Approach ICCV 2015 从以上两张图就可以感受到本文所提方法 ...

  3. Deep Reinforcement Learning for Visual Object Tracking in Videos 论文笔记

    Deep Reinforcement Learning for Visual Object Tracking in Videos 论文笔记 arXiv 摘要:本文提出了一种 DRL 算法进行单目标跟踪 ...

  4. 多目标跟踪(MOT)论文随笔-POI: Multiple Object Tracking with High Performance Detection and Appearance Feature

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,最大的特点是使用 ...

  5. 论文笔记《Spatial Memory for Context Reasoning in Object Detection》

    好久不写论文笔记了,不是没看,而是很少看到好的或者说值得记的了,今天被xinlei这篇paper炸了出来,这篇被据老大说xinlei自称idea of the year,所以看的时候还是很认真的,然后 ...

  6. 论文笔记之:Visual Tracking with Fully Convolutional Networks

    论文笔记之:Visual Tracking with Fully Convolutional Networks ICCV 2015  CUHK 本文利用 FCN 来做跟踪问题,但开篇就提到并非将其看做 ...

  7. 【论文笔记】Malware Detection with Deep Neural Network Using Process Behavior

    [论文笔记]Malware Detection with Deep Neural Network Using Process Behavior 论文基本信息 会议: IEEE(2016 IEEE 40 ...

  8. 论文笔记: Dual Deep Network for Visual Tracking

    论文笔记: Dual Deep Network for Visual Tracking  2017-10-17 21:57:08  先来看文章的流程吧 ... 可以看到,作者所总结的三个点在于: 1. ...

  9. 论文笔记之:Natural Language Object Retrieval

    论文笔记之:Natural Language Object Retrieval 2017-07-10  16:50:43   本文旨在通过给定的文本描述,在图像中去实现物体的定位和识别.大致流程图如下 ...

  10. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning

    论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning  2017-06-06  21: ...

随机推荐

  1. Spring Cloud(1):概览

    什么是微服务? 小型的,简单的和解耦的服务 = 可伸缩的,有弹性的和灵活的应用程序. 什么是云? 基础设施即服务(Infrastructure as a Service, Iaas):云提供商只提供基 ...

  2. Windows Server 2019远程桌面服务配置和授权激活

    参考Windows Server 2016远程桌面服务配置和授权激活方法可适用于Windows Server 2019     Server 2016默认远程桌面连接数是2个用户,如果多余两个用户进行 ...

  3. 【计算机视觉】基于样本一致性的背景减除运动目标检测算法(SACON)

    SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...

  4. 微信小程序实现navbar导航栏

    一.效果图 二.涉及到组件 1.view组件 2.swiper组件 三.原理 整体来讲是比较简单的,顶部的navbar是使用flex进行布局的:下面的内容区域则是使用到swiper组件,使用方式比较简 ...

  5. day22 subprocess、configeparser、表格操作模块

    今日内容: 1.configparser模块的使用 2.subprocess模块的使用 3.表格处理模块 xlrd模块 xlwt模块 1.configparser模块 configparser模块是用 ...

  6. 华为 huawei 查看系统中存在的安全风险信息 display security risk

    查看系统中存在的安全风险信息. 应用场景 由于协议自身的安全性能不同,用户配置时使用的某些协议可能存在安全风险.通过该命令可查看系统中存在的安全风险,并根据给出的修复建议解除风险.例如,用户配置了SN ...

  7. SQL SERVICES 搭建问题

    一.SQL SERVICES  设置IP 连接 SQL2008是没有外围配置的,为了能用IP地址或者local登陆,需要做下面的配置. 打开Microsoft SQL Server 2008 R2→配 ...

  8. 理解twisted中的reactor和deferred(一)

    Deferred是一个延迟加载对象,这个概念类似于tornado future,是调用异步操作返回的一个对象,其中包括了操作成功后的回调处理,错误后的回调处理. 简单讲,当我们需要执行一个耗时操作,比 ...

  9. extern int PASCAL

    表示声明一个变量,这个变量在其他地方已经定义,但是这里因为要使用,所以声明下. 写成下面: extern “C” int PASCAL: 说明PASCAL是在一个C文件下定义的.如果不是在C下就不用加 ...

  10. Linux就该这么学——新手必须掌握的命令之常用的系统工作命令

    echo命令 含义:echo命令用于在终端输出字符串或变量提取后的值,格式为 : echo [字符串|$变量] 示例: 将”Linuxprobe.com”输出到终端屏幕的命令为: [root@linu ...