本文主要講解Deep SORT論文核心內容,包括狀態估計、匹配方法、級聯匹配、表觀模型等核心內容。
1. 簡介
Simple Online and Realtime Tracking(SORT)是一個非常簡單、有效、實用的多目標跟蹤算法。在SORT中,僅僅通過IOU來進行匹配雖然速度非常快,但是ID switch依然非常大。
本文提出了Deep SORT算法,相比SORT,通過集成表觀信息來提升SORT的表現。通過這個擴展,模型能夠更好地處理目標被長時間遮擋的情況,將ID switch指標降低了45%。表觀信息也就是目標對應的特征,論文中通過在大型行人重識別數據集上訓練得到的深度關聯度量來提取表觀特征(借用了ReID領域的模型)。
2. 方法
2.1 狀態估計
延續SORT算法使用8維的狀態空間\((u,v,r,h,\dot{x},\dot{y},\dot{r},\dot{h})\),其中(u,v)代表bbox的中心點,寬高比r, 高h以及對應的在圖像坐標上的相對速度。
論文使用具有等速運動和線性觀測模型的標准卡爾曼濾波器,將以上8維狀態作為物體狀態的直接觀測模型。
每一個軌跡,都計算當前幀距上次匹配成功幀的差值,代碼中對應time_since_update變量。該變量在卡爾曼濾波器predict的時候遞增,在軌跡和detection關聯的時候重置為0。
超過最大年齡\(A_{max}\)的軌跡被認為離開圖片區域,將從軌跡集合中刪除,被設置為刪除狀態。代碼中最大年齡默認值為70,是級聯匹配中的循環次數。
如果detection沒有和現有track匹配上的,那么將對這個detection進行初始化,轉變為新的Track。新的Track初始化的時候的狀態是未確定態,只有滿足連續三幀都成功匹配,才能將未確定態轉化為確定態。
如果處於未確定態的Track沒有在n_init幀中匹配上detection,將變為刪除態,從軌跡集合中刪除。
2.2 匹配問題
Assignment Problem指派或者匹配問題,在這里主要是匹配軌跡Track和觀測結果Detection。這種匹配問題經常是使用匈牙利算法(或者KM算法)來解決,該算法求解對象是一個代價矩陣,所以首先討論一下如何求代價矩陣:
- 使用平方馬氏距離來度量Track和Detection之間的距離,由於兩者使用的是高斯分布來進行表示的,很適合使用馬氏距離來度量兩個分布之間的距離。馬氏距離又稱為協方差距離,是一種有效計算兩個未知樣本集相似度的方法,所以在這里度量Track和Detection的匹配程度。
\(d_j\)代表第j個detection,\(y_i\)代表第i個track,\(S_i^{-1}\)代表d和y的協方差。
第二個公式是一個指示器,比較的是馬氏距離和卡方分布的閾值,\(t^{(1)}\)=9.4877,如果馬氏距離小於該閾值,代表成功匹配。
- 使用cosine距離來度量表觀特征之間的距離,reid模型抽出得到一個128維的向量,使用余弦距離來進行比對:
\(r_j^Tr_k^{(i)}\)計算的是余弦相似度,而余弦距離=1-余弦相似度,通過cosine距離來度量track的表觀特征和detection對應的表觀特征,來更加准確地預測ID。SORT中僅僅用運動信息進行匹配會導致ID Switch比較嚴重,引入外觀模型+級聯匹配可以緩解這個問題。
同上,余弦距離這部分也使用了一個指示器,如果余弦距離小於\(t^{(2)}\),則認為匹配上。這個閾值在代碼中被設置為0.2(由參數max_dist控制),這個屬於超參數,在人臉識別中一般設置為0.6。
- 綜合匹配度是通過運動模型和外觀模型的加權得到的
其中\(\lambda\)是一個超參數,在代碼中默認為0。作者認為在攝像頭有實質性移動的時候這樣設置比較合適,也就是在關聯矩陣中只使用外觀模型進行計算。但並不是說馬氏距離在Deep SORT中毫無用處,馬氏距離會對外觀模型得到的距離矩陣進行限制,忽視掉明顯不可行的分配。
\(b_{i,j}\)也是指示器,只有\(b_{i,j}=1\)的時候才會被人為初步匹配上。
2.3 級聯匹配
級聯匹配是Deep SORT區別於SORT的一個核心算法,致力於解決目標被長時間遮擋的情況。為了讓當前Detection匹配上當前時刻較近的Track,匹配的時候Detection優先匹配消失時間較短的Track。
當目標被長時間遮擋,之后卡爾曼濾波預測結果將增加非常大的不確定性(因為在被遮擋這段時間沒有觀測對象來調整,所以不確定性會增加), 狀態空間內的可觀察性就會大大降低。
在兩個Track競爭同一個Detection的時候,消失時間更長的Track往往匹配得到的馬氏距離更小, 使得Detection更可能和遮擋時間較長的Track相關聯,這種情況會破壞一個Track的持續性,這也就是SORT中ID Switch太高的原因之一。
所以論文提出級聯匹配:
偽代碼中需要注意的是匹配順序,優先匹配age比較小的軌跡,對應實現如下:
# 1. 分配track_indices和detection_indices
if track_indices is None:
track_indices = list(range(len(tracks)))
if detection_indices is None:
detection_indices = list(range(len(detections)))
unmatched_detections = detection_indices
matches = []
# cascade depth = max age 默認為70
for level in range(cascade_depth):
if len(unmatched_detections) == 0: # No detections left
break
track_indices_l = [
k for k in track_indices
if tracks[k].time_since_update == 1 + level
]
if len(track_indices_l) == 0: # Nothing to match at this level
continue
# 2. 級聯匹配核心內容就是這個函數
matches_l, _, unmatched_detections = \
min_cost_matching( # max_distance=0.2
distance_metric, max_distance, tracks, detections,
track_indices_l, unmatched_detections)
matches += matches_l
unmatched_tracks = list(set(track_indices) - set(k for k, _ in matches))
return matches, unmatched_tracks, unmatched_detections
在匹配的最后階段還對unconfirmed和age=1的未匹配軌跡進行基於IOU的匹配(和SORT一致)。這可以緩解因為表觀突變或者部分遮擋導致的較大變化。
2.4 表觀特征
表觀特征這部分借用了行人重識別領域的網絡模型,這部分的網絡是需要提前離線學習好,其功能是提取出具有區分度的特征。
論文中用的是wide residual network, 具體結構如下圖所示:
網絡最后的輸出是一個128維的向量用於代表該部分表觀特征(一般維度越高區分度越高帶來的計算量越大)。最后使用了L2歸一化來將特征映射到單位超球面上,以便進一步使用余弦表觀來度量相似度。
3. 實驗
選用MOTA、MOTP、MT、ML、FN、ID swiches、FM等指標進行評估模型。
相比SORT, Deep SORT的ID Switch指標下降了45%,達到了當時的SOTA。
經過實驗,發現Deep SORT的MOTA、MOTP、MT、ML、FN指標對於之前都有提升。
FP很多,主要是由於Detection和Max age過大導致的。
速度達到了20Hz,其中一半時間都花費在表觀特征提取。
4. 總結
Deep SORT可以看成三部分:
- 檢測: 目標檢測的效果對結果影響非常非常大, 並且Recall和Precision都應該很高才可以滿足要求. 據筆者測試, 如果使用yolov3作為目標檢測器, 目標跟蹤過程中大概60%的時間都花費在yolov3上,並且場景中的目標越多,這部分耗時也越多(NMS花費的時間).
- 表觀特征: 也就是reid模型,原論文中用的是wide residual network,含有的參數量比較大,可以考慮用新的、性能更好、參數量更低的ReID模型來完成這部分工作。筆者看到好多人推薦使用OSNet,但是實際使用的效果並不是特別好。
- 關聯:包括卡爾曼濾波算法和匈牙利算法。
改進空間:
最近非常多優秀的工作的思路是認為reid這部分特征提取和目標檢測網絡無法特征重用,所以想將這兩部分融合到一塊。
JDE=YOLOv3和reid融合
FairMOT=CenterNet和reid融合
最近看了CenterNet,感覺這種無需anchor來匹配的方式非常優雅,所以非常推薦FairMOT,效果非常出色,適合作為研究的baseline。
5. 參考
距離: https://blog.csdn.net/Kevin_cc98/article/details/73742037
論文地址:https://arxiv.org/pdf/1703.07402.pdf
代碼地址:https://github.com/nwojke/deep_SORT
FairMOT: https://github.com/ifzhang/FairMOT