文章目錄
目標跟蹤、單目標跟蹤、多目標跟蹤的概念
目標跟蹤分爲靜態背景下的目標跟蹤和動態背景下的目標跟蹤。
靜態背景下的目標跟蹤:
靜態背景下的目標跟蹤指攝像頭是固定的,其採集的視野中背景是靜止的,如在十字路口的固定攝像頭。
動態背景下的目標跟蹤:
攝像頭採集的視野中背景和目標都是在變化的。
目標跟蹤又分爲單目標跟蹤和多目標跟蹤。
單目標跟蹤:
在視頻的初始幀畫面上框出單個目標,預測後續幀中該目標的大小與位置。典型算法有Mean shift(用卡爾曼濾波、粒子濾波進行狀態預測)、TLD(基於在線學習的跟蹤)、KCF(基於相關性濾波)等。
多目標追蹤:
不像單目標追蹤一樣先在初始幀上框出單個目標,而是追蹤多個目標的大小和位置,且每一幀中目標的數量和位置都可能變化。此外,多目標的追蹤中還存在下列問題:
處理新目標的出現和老目標的消失;
跟蹤目標的運動預測和相似度判別,即上一幀與下一幀目標的匹配;
跟蹤目標之間的重疊和遮擋處理;
跟蹤目標丟失一段時間後再重新出現的再識別。
歐氏距離、馬氏距離、餘弦距離
歐氏距離
在數學中,歐幾里得距離或歐幾里得度量是歐幾里得空間中兩點間“普通”(即直線)距離。
假設二維空間中有點(x1,y1)和(x2,y2),則這兩點的歐氏距離爲:
馬氏距離
馬氏距離(Mahalanobis distance)數據的協方差距離。它是一種有效的計算兩個未知樣本集的相似度的方法。與歐氏距離不同,馬氏距離考慮到各種特性之間的聯繫,並且與測量尺度無關。
對於一個均值爲:
協方差矩陣爲Σ的多變量矢量:
其馬氏距離爲:
馬氏距離也可以定義爲兩個服從同一分佈並且其協方差矩陣爲Σ的隨機變量x與y的差異程度:
如果協方差矩陣爲單位矩陣(或者說去掉協方差矩陣),馬氏距離就退化爲歐氏距離。如果協方差矩陣爲對角陣,其也可稱爲正規化的馬氏距離:
其中σi是xi的標準差。
協方差的物理意義:
在概率論中,兩個隨機變量X與Y之間的相互關係有3種情況:正相關、負相關、不相關(這裏的相關都是指線性相關)。
我們可以定義一個表示X, Y 相互關係的數字特徵,也就是協方差:
當cov(X, Y)>0時,表明X與Y正相關;當cov(X, Y)<0時,表明X與Y負相關;當cov(X, Y)=0時,表明X與Y不相關。
使用歐式距離衡量兩個變量,距離近就一定相似嗎?
如果兩個變量的度量尺度不同,如身高和體重,身高用毫米計算,而體重用千克計算。顯然差10mm的身高與差10kg的體重是完全不同的。但在普通的歐氏距離中,這將會算作相同的差距。
如果使用歸一化後的歐氏距離,兩個變量的歐氏距離近就一定相似嗎?
歸一化可以消除不同變量間的度量尺度不同的問題,但是不同變量之間的方差還是不一樣。第一個類別均值爲0,方差爲0.1,第二個類別均值爲5,方差爲5。那麼一個值爲2的點屬於第一類的概率大還是第二類的概率大?距離上說應該是第一類,但是直覺上顯然是第二類,因爲第一類不太可能到達2這個位置。因此,在一個方差較小的維度下很小的差別就有可能成爲離羣點。
如果維度間不獨立同分布,樣本點與歐氏距離近的樣本點同類的概率一定會更大嗎?
如果維度間不是獨立同分布的,那麼兩個點即使距離均值點距離相同,但顯然更接近整體分佈點集的點與該點集同類的概率更大。
馬氏距離的幾何意義:
馬氏距離就是將變量按照主成分進行旋轉,讓維度間相互獨立,然後進行標準化,使不同的維度獨立同分布。由於主成分就是特徵向量方向,每個方向的方差就是對應的特徵值,所以只需要按照特徵向量的方向旋轉,然後縮放特徵值的倍數。這樣,離羣點就被成功分離,這時候的新座標系下的歐式距離就是馬氏距離。
餘弦距離
餘弦距離,也稱爲餘弦相似度,是用N維空間中兩點與原點連接線段之間夾角的餘弦值作爲衡量兩個個體間差異的大小的度量。餘弦距離越大,表示夾角越小,那麼兩點越相似。如果餘弦距離爲1(最大值),那麼表示兩者非常相似。注意這裏只能說明兩點非常相似,並不一定相同。
餘弦距離公式:
向量a和向量b點乘的公式:
餘弦距離的意義:
當兩點夾角爲零時,表示兩點的各個維度的值所佔的比例相同。比如(2,2,2)和(6,6,6),(1,2,3)和(3,6,9)。
SORT算法原理
論文:Simple Online and Realtime Tracking
論文地址:https://arxiv.org/pdf/1602.00763.pdf 。
代碼地址:https://github.com/abewley/sort 。
在sort算法中,目標檢測模型的性能是影響追蹤效果的一個關鍵因素。SORT算法全稱爲Simple Online And Realtime Tracking, 對於tracking-by-detection的多目標跟蹤方法,更多依賴的是其目標檢測模型的性能的好壞。儘管只是簡單的結合了Kalman濾波追蹤和匈牙利指派算法,效果卻可以匹配2016年的SOTA算法。另外,由於本文的算法複雜度低,追蹤器可以實現260Hz的速度,比前者快了20倍。
多目標追蹤問題可以被看成是數據關聯問題,目的是在視頻幀序列中進行跨幀檢測結果的關聯。作者沒有在目標追蹤過程中使用任何的目標外觀特徵,而是僅使用檢測框的位置和大小進行目標的運動估計和數據關聯。另外,沒有考慮遮擋問題,也沒有通過目標的外觀特徵進行目標重識別,作者一切的核心就是圍繞處理速度要快,要能夠實時應用。
作者使用CNN進行目標檢測,使用kalman濾波進行目標運動狀態估計,使用匈牙利匹配算法進行位置匹配。文章主要關注行人目標的追蹤。
SORT算法中的匈牙利匹配算法
最大匹配的匈牙利算法
該算法詳細原理可以看我的另一篇專門介紹匈牙利算法最大匹配原理的博客。
我們知道一個二分圖可以用矩陣的形式來表示,如:
graph_1 = [(0, 0, 0, 0, 1, 0, 1, 0),
(0, 0, 0, 0, 1, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 0, 0),
(0, 0, 0, 0, 0, 0, 1, 1),
(1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 1, 0, 0, 0, 0, 0),
(1, 0, 0, 1, 0, 0, 0, 0),
(0, 0, 0, 1, 0, 0, 0, 0)]
上例表示這個二分圖的U集合有8個點,V集合也有8個點,當兩點之間有邊時對應位置的值爲1,否則爲0。
匈牙利算法的目標是從二分圖中找出一個最大匹配,即匹配邊最多的匹配方式。
指派問題中的匈牙利算法
進一步地,我們可以將二分圖變成下面的形式:
A B C D
甲 2 15 13 4
乙 10 4 14 15
丙 9 14 16 13
丁 7 8 11 9
此時U集合中任意點和V集合中任意點都有邊,但邊的代價不同。此時我們的目標是,在矩陣中選取n個元素(即n條不同代價的邊),使得每行每列各有1個元素(U集合和V集合中的每一個點都有配對點),且邊的代價和最小。
我們將上述矩陣賦予一個實際問題的含義:有n項不同的任務,需要n個人分別完成其中的1項,每個人完成任務的時間不一樣。於是就有一個問題,如何分配任務使得花費時間最少。
最優解性質:
若從矩陣的一行(列)各元素中分別減去該行(列)的最小元素,得到一個歸約矩陣,這個規約矩陣的最優解與原矩陣的最優解相同。
指派問題的匈牙利算法的基本思路:
- 通過行/列變換讓規約(費用)矩陣的每行和每列都出現0;
- 找出不同行不同列的n個0;
- 這些0對應的邊就是最優指派(代價最少)。
指派問題的匈牙利算法的主要步驟:
- 先對規約(費用)矩陣先作行變換,再作列變換。行變換即費用矩陣的每一行的各個元素分別減去該行的最小元素。列變換即費用矩陣的每一列的各個元素分別減去該列的最小元素,有0的列則無需作列變換;
- 在經過行變換和列變換的費用矩陣中尋找n個不同行不同列的0元素。如果找到,則這n個不同行不同列的0元素位置即對應最優指派。否則,進行下一步驟。一般使用標記法來尋找n個不同行不同列的0元素:
依次檢查新費用矩陣的各行,找出只有一個沒有加標記的0元素的行,並將這個0元素加上標記,而與這個0元素在同一列的0元素全劃去;
依次檢查新費用矩陣的各列,找出只有一個沒有加標記的0元素的列,並將這個0元素加上標記,而與這個0元素在同一行的0元素全劃去。 - 對新費用矩陣進行調整:對每一個加了標記的0元素畫一條橫線或豎線,使得這些橫線和豎線覆蓋全部0元素;在這些橫線和豎線沒有經過的元素中找出最小的元素;未畫橫線的各行元素減去這個最小的數,畫豎線的各列元素加上這個最小的數;重新在費用矩陣中找出n個不同行不同列的0元素,從而找出最優指派(代價最少)。
指派問題的匈牙利算法求解舉例:
原始矩陣如下,該矩陣U集合的點爲甲、乙、丙、丁,V集合的點爲A、B、C、D。矩陣中每個值是每條邊的代價。
A B C D
甲 90 75 75 80
乙 35 85 55 65
丙 125 95 90 105
丁 45 110 95 115
首先每行減去每行的最小值,矩陣變爲:
A B C D
甲 15 0 0 5
乙 0 50 20 30
丙 35 5 0 15
丁 0 65 50 70
然後每列減去每列的最小值,矩陣變爲:
A B C D
甲 15 0 0 0
乙 0 50 20 25
丙 35 5 0 10
丁 0 65 50 65
現在查找行或列中含有元素0的行或列,用最少數量的水平+垂直線覆蓋所有的0。發現只要第一行、第一列、第三列就可以覆蓋所有的0,線數量爲3,小於U集合中點個數4。沒有被覆蓋的元素有50,5,65,25,10,65,其中最小元素爲5。那麼我們讓沒有被覆蓋的每行減去最小值5,被覆蓋的每列加上最小值5,然後繼續尋找用最少數量的水平+垂直線覆蓋所有的0。
第二、三、四行沒有被覆蓋,每行減去最小值5。
A B C D
甲 15 0 0 0
乙 -5 45 15 20
丙 30 0 -5 5
丁 -5 60 45 60
第一、三列被覆蓋,每行加上最小值5。
A B C D
甲 20 0 5 0
乙 0 45 20 20
丙 35 0 0 5
丁 0 60 50 60
現在我們可以用第一行、第三行、第一列覆蓋所有的0,線數量爲3,仍小於U集合中點個數4。沒被覆蓋的元素有45,20,20,60,50,60,最小值元素爲20。那麼我們讓沒有被覆蓋的每行減去最小值20,被覆蓋的每列加上最小值20,然後繼續尋找用最少數量的水平+垂直線覆蓋所有的0。
第二、四行沒有被覆蓋,每行減去最小值20。
A B C D
甲 20 0 5 0
乙 -20 25 0 0
丙 35 0 0 5
丁 -20 40 30 40
第一列被覆蓋,每行加上最小值20。
A B C D
甲 40 0 5 0
乙 0 25 0 0
丙 55 0 0 5
丁 0 40 30 40
現在我們用第一行、第二行、第三行、第四行可以覆蓋所有的0。線數量爲4等於U集合中點個數4。找到不同行不同列的n個0。即丁A、丙B、乙C、D甲位置的4個0。
上面矩陣找到的最優解和原始矩陣的最優解等同。原始矩陣的最優指派(最小代價)就是這四個位置上的代價之和,即45,95,55,80。
在SORT算法中,二分圖的邊權值即前一幀的M個目標與後一幀的N個目標中,兩兩目標之間的IOU。
預測模型(卡爾曼濾波器)
作者近似地認爲目標的不同幀間地運動是和其他物體及相機運動無關的線性運動。每一個目標的狀態可以表示爲:
其中u和v分別代表目標的中心座標,而s和r分別代表目標邊界框的比例(面積)和長寬比,長寬比被認爲是常數,需要保持不變。
當進行目標關聯時,使用卡爾曼濾波器,用上一幀中目標的位置信息預測下一幀中這個目標的位置。若上一幀中沒有檢測到下一幀中的某個目標,則對於這個目標,重新初始化一個新的卡爾曼濾波器。關聯完成後,使用新關聯的下一幀中該目標的位置來更新卡爾曼濾波器。
數據關聯(匈牙利匹配)
SORT中匈牙利匹配的原理見上面指派問題中的匈牙利匹配算法。SORT算法中的代價矩陣爲上一幀的M個目標與下一幀的N個目標兩兩目標之間的IOU。當然,小於指定IOU閾值的指派結果是無效的(源碼中閾值設置爲0.3)。
此外,作者發現使用IOU能夠解決目標的短時被遮擋問題。這是因爲目標被遮擋時,檢測到了遮擋物,沒有檢測到原有目標,假設把遮擋物和原有目標進行了關聯。那麼在遮擋結束後,因爲在相近大小的目標IOU往往較大,因此很快就可以恢復正確的關聯。這是建立在遮擋物面積大於目標的基礎上的。
目標丟失問題的處理
如果連續Tlost幀沒有實現已追蹤目標預測位置和檢測框的IOU匹配,則認爲目標消失。實驗中設置 Tlost=1,文中指出是因爲沒有匹配的目標所使用的均速運動假設模型效果很差,並且幀數過多的re-id問題超出了本文討論的範圍(作者主要關注逐幀的目標追蹤,而不關注長時間的目標丟失再重識別問題)。另外,儘早刪除已丟失的目標有助於提升追蹤效率。但是這樣容易導致目標ID會頻繁切換,造成跟蹤計數的不準確。
SORT算法過程
對第一幀使用目標檢測模型進行目標檢測,得到第一幀中所有目標的分類和位置(假設有M個目標),並標註一個獨有id。對每個目標初始化卡爾曼濾波跟蹤器,預測每個目標在下一幀的位置;
對第二幀使用目標檢測模型進行目標檢測,得到第二幀中所有目標的分類和位置(假設有N個目標),求第一幀M個目標和第二幀N個目標兩兩目標之間的IOU,建立代價矩陣,使用匈牙利匹配算法得到IOU最大的唯一匹配(數據關聯部分),再去掉匹配值小於iou_threshold的匹配對;
用第二幀中匹配到的目標的位置去更新卡爾曼跟蹤器,計算第二幀時的卡爾曼增益Kk,狀態估計值xk,估計誤差協方差Pk。並輸出狀態估計值xk用來計算下一幀中的預測位置。對於本幀中沒有匹配到的目標重新初始化卡爾曼濾波跟蹤器;
後面每一幀圖像都按第一幀和第二幀的做法進行類似處理即可。
deep SORT算法原理
論文:Simple Online and Realtime Tracking With a Deep Association Metric
論文地址:https://arxiv.org/pdf/1703.07402.pdf 。
代碼地址:https://github.com/nwojke/deep_sort 。
狀態估計
使用一個8維空間去刻畫軌跡在某時刻的狀態:
使用一個kalman濾波器預測更新軌跡,該卡爾曼濾波器採用勻速模型和線性觀測模型。通過卡爾曼估計對(u, v, r, h)進行估計,u,v是物體中心點的位置,r是長寬比,h是高。運動估計對於運動狀態變化不是很劇烈和頻繁的物體能取得比較好的效果。
其觀測變量爲:
軌跡處理
對於每一個追蹤目標,都有一個閾值ak用於記錄軌跡從上一次成功匹配到當前時刻的時間(即連續沒有匹配的幀數),我們稱之爲軌跡。當該值大於提前設定的閾值Amax則認爲該軌跡終止,直觀上說就是長時間匹配不上的軌跡則認爲該軌跡已經結束。
在匹配時,對於沒有匹配成功的目標都認爲可能產生新的軌跡。但由於這些檢測結果可能是一些錯誤警告,所以對這種情形新生成的軌跡標註狀態’tentative’,然後觀查在接下來的連續若干幀(論文中是3幀)中是否連續匹配成功,是的話則認爲是新軌跡產生,標註爲’confirmed’,否則則認爲是假性軌跡,狀態標註爲’deleted’。
分配問題的評價指標
在位置度量上,使用馬氏距離(Mahalanobis distance)來評價卡爾曼濾波預測的狀態和實際狀態的匹配程度(運動匹配程度):
上式左邊表示第j個檢測到的目標和第i條軌跡之間的運動匹配度,其中Si是第i條軌跡由kalman濾波器預測得到的在當前時刻觀測空間的協方差矩陣,yi是軌跡在當前時刻的預測觀測量,dj是第j個目標的實際狀態(u,v,r,h)。
考慮到運動的連續性,可以通過該馬氏距離對目標進行篩選,文中使用卡方分佈的0.95分位點作爲閾值 t^{(1)} =0.4877,我們可以定義一個門限函數:
當目標運動不確定性較低時,馬氏距離是一個很好的關聯度量。但在實際中,如相機運動時會造成馬氏距離大量不能匹配,也就會使這個度量失效。因此,我們整合第二個度量標準,對每一個BBox檢測框dj我們計算一個表面特徵描述子:
我們保存最新的Lk=100個軌跡的描述子,然後我們計算使用第i個軌跡和第j個軌跡的最小余弦距離(cosine distance)來衡量檢測和軌跡之間的外觀相似程度:
同樣的,該度量同樣可以確定一個門限函數:
最後的評價指標是上面兩種距離的加權和:
其中是λ是超參數,用於調整不同項的權重。
總之,馬氏距離對於短期的預測和匹配效果很好,而最小余弦距離對於長時間丟失的軌跡而言,匹配度度量的比較有效。超參數的選擇要看具體的數據集,比如文中說對於相機運動幅度較大的數據集,直接不考慮運動匹配程度。
級聯匹配
如果一條軌跡被遮擋了一段較長的時間,那麼在kalman濾波器的不斷預測中就會導致概率彌散。那麼假設現在有兩條軌跡競爭同一個目標,那麼那條遮擋時間長的往往得到馬氏距離更小,使目標傾向於匹配給丟失時間更長的軌跡,但是直觀上,該目標應該匹配給時間上最近的軌跡。
導致這種現象的原因正是由於kalman濾波器連續預測沒法更新導致的概率彌散。假設本來協方差矩陣是一個正態分佈,那麼連續的預測不更新就會導致這個正態分佈的方差越來越大,那麼離均值歐氏距離遠的點可能和之前分佈中離得較近的點獲得同樣的馬氏距離值。
所以本文中才引入了級聯匹配的策略將遮擋時間按等級分層,遮擋時間越小的匹配等級更高,即更容易被匹配。
首先是得到追蹤框集合T和檢測框集合D,設置最大的Amax爲軌跡最大允許丟失匹配的幀數。通過計算上面的評價指標(兩種度量的加權和)得到成本矩陣,再通過級聯條件,設定閾值分別對外觀和位置因素進行計算,滿足條件則返回1,否則返回0。然後初始化匹配矩陣爲空,初始化未匹配矩陣等於D。通過匈牙利算法,對於每個屬於追蹤框集合的元素T,在檢測框裏面查找成本最低且滿足閾值過濾條件的檢測框作爲匹配結果,同時更新匹配矩陣和非匹配矩陣。
在匹配的最後階段還對unconfirmed和age=1的未匹配軌跡進行基於IOU的匹配。這可以緩解因爲表觀突變或者部分遮擋導致的較大變化。當然有好處就有壞處,這樣做也有可能導致一些新產生的軌跡被連接到了一些舊的軌跡上。但這種情況較少。
深度表觀描述子
預訓練的網絡時一個在大規模ReID數據集上訓練得到的,這個ReID數據集包含1261個人的1100000幅圖像,使得學到的特徵很適合行人跟蹤。
然後使用該預訓練網絡作爲基礎網絡,構建wide ResNet,用來提取bounding box的表觀特徵。該網絡在Nvidia GeForce GTX 1050 mobile GPU下提取出32個bounding boxes大約花費30ms,可以滿足實時性要求。
算法總結
使用wide ResNet提取的特徵進行匹配,大大減少了SORT中的ID switches, 經作者實驗證明減少了大約45%, 在高速率視頻流中也達到了很好的水準。該模型的速度主要取決於目標檢測模型的速度,在匹配上面耗時很短。