多目标跟踪理论基础
DeepSORT算法概述
由于sort算法还是比较粗糙的追踪算法,当物体发生遮挡的时候,特别容易丢失自己的ID。而Deepsort算法在sort算法的基础上增加了级联匹配 Matching Cascade和新轨迹的确认(confirmed)。Tracks分为确认态(confirmed),和不确认态(unconfirmed),新产生的Tracks是不确认态的;不确认态的Tracks必须要和Detections连续匹配一定的次数(默认是3)才可以转化成确认态。确认态的Tracks必须和Detections 连续失配一定次数(默认70次),才会被删除。
Deepsort的算法流程图如下所示。
(1)将第一帧次检测到的结果创建其对应的Tracks。将卡尔曼滤波的运动变量初始化,通过卡尔曼滤波预测其对应的框框。这时候的Tracks一定是unconfirmed的。
(2)将该帧目标检测的框框和第上一帧通过Tracks预测的框框一一进行IOU匹配,再通过IOU匹配的结果计算其代价矩阵(cost matrix,其计算方式是1-IOU)。
(3)将(2)中得到的所有的代价矩阵作为匈牙利算法的输入,得到线性的匹配的结果,这时候我们得到的结果有三种,第一种是Tracks失配(Unmatched Tracks),我们直接将失配的Tracks(因为这个Tracks是不确定态了,如果是确定态的话则要连续达到一定的次数(默认30次)才可以删除)删除;第二种是Detections失配(Unmatched Detections),我们将这样的Detections初始化为一个新的Tracks(new Tracks);第三种是检测框和预测的框框配对成功,这说明我们前一帧和后一帧追踪成功,将其对应的Detections通过卡尔曼滤波更新其对应的Tracks变量。
(4)反复循环(2)-(3)步骤,直到出现确认态(confirmed)的Tracks或者视频帧结束。
(5)通过卡尔曼滤波预测其确认态的Tracks和不确认态的Tracks对应的框框。将确认态的Tracks的框框和是Detections进行级联匹配(之前每次只要Tracks匹配上都会保存Detections其的外观特征和运动信息,默认保存前100帧,利用外观特征和运动信息和Detections进行级联匹配,这么做是因为确认态(confirmed)的Tracks和Detections匹配的可能性更大)。
(6)进行级联匹配后有三种可能的结果。第一种,Tracks匹配,这样的Tracks通过卡尔曼滤波更新其对应的Tracks变量。第二第三种是Detections和Tracks失配,这时将之前的不确认状态的Tracks和失配的Tracks一起和Unmatched Detections一一进行IOU匹配,再通过IOU匹配的结果计算其代价矩阵(cost matrix,其计算方式是1-IOU)。
(7)将(6)中得到的所有的代价矩阵作为匈牙利算法的输入,得到线性的匹配的结果,这时候我们得到的结果有三种,第一种是Tracks失配(Unmatched Tracks),我们直接将失配的Tracks(因为这个Tracks是不确定态了,如果是确定态的话则要连续达到一定的次数(默认30次)才可以删除)删除;第二种是Detections失配(Unmatched Detections),我们将这样的Detections初始化为一个新的Tracks(new Tracks);第三种是检测框和预测的框框配对成功,这说明我们前一帧和后一帧追踪成功,将其对应的Detections通过卡尔曼滤波更新其对应的Tracks变量。
(8)反复循环(5)-(7)步骤,直到视频帧结束。
距离度量方式
马氏距离(Mahalanobis distance)
为了结合运动信息,论文中提到使用了马氏距离
,的平方用于关联预测的卡尔曼状态
和新获得的测量值
Cov ( X , Y ) = E [ X Y ] − E [ X ] E [ Y ] \begin{aligned} \operatorname{Cov}(X, Y) & =E[X Y]-E[X] E[Y] \end{aligned} Cov(X,Y)=E[XY]−E[X]E[Y]
对协方差矩阵进行简单的说明。
x 1 x 2 x 3 [ x 1 x 2 x 3 var ( x 1 ) cov ( x 1 , x 2 ) cov ( x 1 , x 3 ) cov ( x 2 , x 1 ) var ( x 2 ) cov ( x 2 , x 3 ) cov ( x 3 , x 1 ) cov ( x 3 , x 2 ) var ( x 3 ) ] \begin{array}{c} \\ \boldsymbol{x} \mathbf{1} \\ \boldsymbol{x} \mathbf{2} \\ \boldsymbol{x} \mathbf{3} \end{array}\left[\begin{array}{ccc} \boldsymbol{x} \mathbf{1} & \boldsymbol{x} \mathbf{2} & \boldsymbol{x} \mathbf{3} \\ \operatorname{var}(x 1) & \operatorname{cov}(x 1, x 2) & \operatorname{cov}(x 1, x 3) \\ \operatorname{cov}(x 2, x 1) & \operatorname{var}(x 2) & \operatorname{cov}(x 2, x 3) \\ \operatorname{cov}(x 3, x 1) & \operatorname{cov}(x 3, x 2) & \operatorname{var}(x 3) \end{array}\right] x1x2x3 x1var(x1)cov(x2,x1)cov(x3,x1)x2cov(x1,x2)var(x2)cov(x3,x2)x3cov(x1,x3)cov(x2,x3)var(x3)
欧式距离计算:
d = ∑ i = 1 n ( x i − y i ) 2 d=\sqrt{\sum_{i=1}^{n}\left(x_{i}-y_{i}\right)^{2}} d=i=1∑n(xi−yi)2
马氏距离的计算公式:
D ( x ) = ( x − μ ) T S − 1 ( x − μ ) D(x)=\sqrt{(x-\mu)^{T} S^{-1}(x-\mu)} D(x)=(x−μ)TS−1(x−μ)
D 2 = ( x − x ˉ ) T S − 1 ( x − x ˉ ) D^{2}=(x-\bar{x})^{T} S^{-1}(x-\bar{x}) D2=(x−xˉ)TS−1(x−xˉ)
这里的核心思想是,如果数据在某个方向上的变化较大,那么在这个方向上的单位距离应该被“缩短而如果数据在某个方向上的变化较小,那么在这个方向上的单位距离应该被“拉长”。这就是协方差矩阵在这里起的作用。
余弦相似度
在机器学习领域中,通常将特征表示为向量的形式,所以在分析两个特征向量之间的相似性时,常用余弦相似度表示。
余弦相似度的定义公式为
cos ( A , B ) = A ⋅ B ∥ A ∥ 2 ∥ B ∥ 2 \cos (\mathrm{A}, \mathrm{B})=\frac{\mathrm{A} \cdot \mathrm{B}}{\|\mathrm{A}\|_{2}\|\mathrm{~B}\|_{2}} cos(A,B)=∥A∥2∥ B∥2A⋅B
其中:
归一化后 ∥ A ∥ 2 = 1 , ∥ B ∥ 2 = 1 , ∥ A ∥ 2 ∥ B ∥ 2 = 1 \text { 归一化后 }\|\mathrm{A}\|_{2}=1,\|\mathrm{~B}\|_{2}=1,\|\mathrm{~A}\|_{2}\|\mathrm{~B}\|_{2}=1 归一化后 ∥A∥2=1,∥ B∥2=1,∥ A∥2∥ B∥2=1
用1-余弦相似度后就可以得到对应的余弦距离
分配问题(关联问题)
论文对于Assignment Problem共给出了5个公式来进行说明。分别用于运动信息和外观信息的匹配。
d ( 1 ) ( i , j ) = ( d j − y i ) T S i − 1 ( d j − y i ) d^{(1)}(i, j)=\left(\boldsymbol{d}_{j}-\boldsymbol{y}_{i}\right)^{\mathrm{T}} \boldsymbol{S}_{i}^{-1}\left(\boldsymbol{d}_{j}-\boldsymbol{y}_{i}\right) d(1)(i,j)=(dj−yi)TSi−1(dj−yi)
通过设置马氏距离的阈值排除不太可能的关联,阈值设在95%置信区间内,由卡方分布计算得出。
b i , j ( 1 ) = I [ d ( 1 ) ( i , j ) ≤ t ( 1 ) ] b_{i, j}^{(1)}=\mathbb{I}\left[d^{(1)}(i, j) \leq t^{(1)}\right] bi,j(1)=I[d(1)(i,j)≤t(1)]
d ( 2 ) ( i , j ) = min { 1 − r j T r k ( i ) ∣ r k ( i ) ∈ R i } . d^{(2)}(i, j)=\min \left\{1-\boldsymbol{r}_{j}{ }^{\mathrm{T}} \boldsymbol{r}_{k}^{(i)} \mid \boldsymbol{r}_{k}^{(i)} \in \mathcal{R}_{i}\right\} . d(2)(i,j)=min{1−rjTrk(i)∣rk(i)∈Ri}.
b i , j ( 2 ) = 1 [ d ( 2 ) ( i , j ) ≤ t ( 2 ) ] b_{i, j}^{(2)}=\mathbb{1}\left[d^{(2)}(i, j) \leq t^{(2)}\right] bi,j(2)=1[d(2)(i,j)≤t(2)]
为了构建关联问题,论文使用加权和的方式组合两个度量,如式(5)所示。
c i , j = λ d ( 1 ) ( i , j ) + ( 1 − λ ) d ( 2 ) ( i , j ) c_{i, j}=\lambda d^{(1)}(i, j)+(1-\lambda) d^{(2)}(i, j) ci,j=λd(1)(i,j)+(1−λ)d(2)(i,j)
如果关联在两个度量的门控区域内,认为关联是可接受的,如式(6)所示。
b i , j = ∏ m = 1 2 b i , j ( m ) b_{i, j}=\prod_{m=1}^{2} b_{i, j}^{(m)} bi,j=m=1∏2bi,j(m)
级联匹配
级联匹配步骤:
- 得到这一帧的N个轨迹T和M个检测框D,以及最大的次数Amax
- 根据公式5(加权结合公式)计算代价矩阵c
- 根据公式6计算出一个矩阵包含T和D的可接受的关联内容
- 初始化一个已匹配集合M为空
- 初始化未匹配的检测框集合U为D
- 从轨迹未匹配次数由小至大开始循环:(从未匹配次数小的开始匹配,解决了上述问题)
- 先选出未匹配年龄为n的轨迹
- 使用匈牙利算法进行匹配,为未匹配次数为n的轨迹关联检测框,得到xij
- 根据xij更新已匹配集合M和未匹配检测框U
- 循环结束
- 返回已匹配的轨迹集合M和未匹配到的检测框集合U
ReID网络
论文给出了已经训练好用来提取特征的深度ReID网络的网络结构
可以在训练集上进行训练。