概要
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\)進行分類,也就是
注意,這里的\(b_i^t\)可以是檢測器第一階段中的anchor box,也可以是第二階段做完之后的比較稀疏的box;權重項是自適應學習出來的,權重最大的就認為是同一個目標,另外增加一個空tracklet \(d_0^{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取平均。具體地,
\(\beta\)是一個指數衰減項,默認為0.99,看起來無傷大雅。現在還剩權重項,這一項可以直觀的理解為當前幀中的box,比較像前一幀中的哪個box,越像權重就越高,所以很自然地用當前box的特征與前面的一堆box的特征進行逐一比對,自適應地學習權重,這是比較兩個box的apperance相似性,其實還應該比較box之間的geometry特性,譬如挨得越近就越可能是同一物體,不過作者貌似沒有從幾何方面考慮,可能是效果沒出來,或者沒時間弄了,埋個坑下一篇繼續填。
\(\mathcal{E}(b_i^t)\)和\(\mathcal{E}(d_j^{t-1})\)是把box映射成的128-D特征,具體做法下一章介紹,其實就是一層fc搞定。\(\gamma\)是一個調節項,設為8。此外還要考慮新出現的物體:
R設為0.3,當然,還需要歸一化一下,
最后,空tracklet的類別概率設為均勻分布就行,
這一段比較長,符號也比較多,總結一下,中心就是第一個式子,下面這一堆都是這個式子里面每個項的解釋,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}}\)是篩選過的,通常是幾百個。暫時是這樣考慮的,以后可能有新的想法。
很簡單的式子,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定義如下:
就是按照同一目標的特征相似度應該比較大,不同目標相似度應較小,比較好理解。
作者從准確性、魯棒性和穩定性幾個方面作了討論,值得注意的是這個算法在穩定性方面很有優勢,也就是檢測框“抖動”的現象減輕了很多,這對於實際應用非常重要。
另外還有一些細節,AssociateTracklet的過程其實是一個二分圖匹配的過程,不一定是權重最大的就認為是同一個目標,運用經典的二分圖匹配算法就可以了,這在許多多目標跟蹤器中也有應用。PropagateBox過程用了FlowNet2來取代opencv里自帶的光流算法,不過這個過程應該只是用來復現Baseline,在作者提出的方法里並沒有用到?
最后,說一下個人的幾點看法:
- 雖說統一了檢測和跟蹤,但是跟蹤只用到了上一幀的信息,這或許對穩定性有一些傷害。
- 對於reappear的問題是無力的,不過很多多目標跟蹤的算法同樣面臨這個問題,當消失的目標重新出現時,會被視為新的目標,要解決這個問題就得用re-id來輔助一下了。
- 跟蹤性能到底如何?文章只在MOT15上跟其他算法進行了pk,並且也不是最優的,再最新的MOT17上可能就更無力了。不過,整合檢測和跟蹤,是未來的大勢所趨,可以說開了個好頭,提出了一個非常干凈的框架。