Global Data Association for Multi-Object Tracking Using Network Flows
背景知识:
- 网络流的相关定义:
1. 前置条件:n个点,m条边的有向图
2. 源点:只出不进
3. 汇点:只进不出
4. 容量和流量:每条边上有两个量,分别是容量和流量。从i到j的容量通常用c[i,j]表示,从i到j的流量通常用f[i,j]表示。
如果把网络想象成自来水管道网络,那么流就是其中流动的水。每条边上的流不能超过它的容量,并且除了源点和汇点外的所有点(即中继点),流入的流量都等于流出的流量。
通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然,流量<=容量。而对于每个不是源点和汇点的点来说,可以类比的想象成没有存储功能的货物中转站,所有“进入”他们的流量和等于所有从他本身“出去”的流量。 - 最大流: 把源点比作工厂的话,问题就是求从工厂最大可以发出多少货物,是不至于超过道路的容量限制,也就是最大流。
求解思路:
首先,假设所有边上的流量都没有超过容量(不大于容量),那么就把这一组流量,或者说这个流称为一个可行流。
一个最简单的例子就是零流,即所有的流量都是0的流。
- 我们就从零流开始考虑,假如有这么一条路,这条路从远点开始一直一段一段的连到了汇点,并且这条路上的每一段都满足流量<容量,注意是严格的<。
- 那么我们一定能找到这条路上的每一段的(容量-流量)的值当中的最小值delta。我们把这条路上每一段的流量都加上这个delta,一定可以保证这个流依然是可行流。
- 这样我们就得到了一个更大的流,他的流量是之前的流量+delta,而这条路就叫做增广路。我们不断地从起点开始寻找增广路,每次都对其进行增广,直到找不到增广路为止。
- 当找不到增广路的时候,当前的流量就是最大流。
补充: - 寻找增广路的时候我们可以简单的从源点开始做BFS,并不断修改这条路上的delta量。直到找到源点或者找不到增广路。
- 在程序实现的时候,我们通常只是用一个c数组来记录容量,而不记录流量,当流量+delta的时候,我们可以通过容量-delta来实现,以方便程序的实现。
参考博客: 点我
在论文的方法中,给定一组物体检测结果作为输入观测值,将数据关联定义为最大后验概率(maximum a posteriori)估计问题。不重叠的轨迹假设被建模为成本流网络中不相交的流动路径。观察可能性和过渡概率被建模为流动成本。全局最优轨迹关联是通过最小成本流算法得到的。 为了在
长期遮挡的情况下进行追踪,需要构建一个明确的遮挡模型(EOM)。
通过在网络中添加遮挡节点和约束条件,构建了一个明确的遮挡模型(只考虑物体间的遮挡)。
![](https://i-blog.csdnimg.cn/blog_migrate/e35cf2f936b305653a89f0cf3e8bba60.png)
这里重点讲解一下为什么要把一个观测对象拆分为两个点。
如下图,图中所有边的容量量都是1,每次流过一个单位的流量。左图是不拆分的情况,v1,v2,v3分别代表三个不同时刻的检测目标。此时s -> v1 -> v2 -> t和s -> v2 -> v3 -> t属于两条不同的轨迹,很明显可以看出这样是不对的,v2同时属于了两个轨迹,但是轨迹同样满足了每条边的流量不超过容量这个约束。
右图是拆分的情况,将每一个观测目标都拆分成
(
v
i
,
u
i
)
(v_i,u_i)
(vi,ui),黑色的线条将他们连接起来。第一条轨迹是s -> v1 -> u1 -> v2 -> u2 ->t,第二条轨迹s -> v2 -> u2 -> v3 -> u3 ->t,如果两条轨迹同时存在,v2和u2之间的流量就为2,超过了本身的容量,所以这两条轨迹不能同时存在,也就不会存在同一个检测目标属于同一条轨迹的情况。
小结:
- 拆分就是为了使同一个目标只属于一个轨迹。
- 用于约束结点,实现对点的限制。