論文筆記:Integrated Object Detection and Tracking with Tracklet-Conditioned Detection

概要

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\)app

傳統基於檢測的在線跟蹤方法,如文中的算法1所示,寫的很是直白,主要看for循環裏的6行。第一行逐幀檢測,第四行逐幀NMS,第五行用某種跟蹤算法把各幀的bbox關聯起來,這一步方法就不少了,能夠基於bbox之間的幾何關係去匹配,也能夠結合圖像特徵,等等,總之歸納起來就是這三下子。二、三、6行是兩個可選的優化技術,第二、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\)進行分類,也就是
\[P(c|b_{i}^{t},\{d_j^{t-1}\}) = \sum_{j=0}^{m}w(b_i^t,d_j^{t-1})P(c|b_i^t,d_j^{t-1})\]
注意,這裏的\(b_i^t\)能夠是檢測器第一階段中的anchor box,也能夠是第二階段作完以後的比較稀疏的box;權重項是自適應學習出來的,權重最大的就認爲是同一個目標,另外增長一個空tracklet \(d_0^{t-1}\),應對新出現的目標,當新目標出現時,這一項的權重理論上就比較大,其餘項權重就比較小。這樣,問題就比較好的形式化了,思路很清楚。
\[P(c|b_i^t,d_j^{t-1}) \propto \exp(\log P_{\textbf{det}}(c|b_i^t)+\alpha\log P_{\textbf{tr}}(c|d_j^{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取平均。具體地,
\[P_{\textbf{tr}}(c|d_j^{t}) = \frac{P(c|b_{k}^{t},\{d_j^{t-1}\}) + \beta P_{\textbf{tr}}(c|d_j^{t-1}) \text{len}(d_j^{t-1})}{1+\beta \text{len}(d_j^{t-1})}\]
\(\beta\)是一個指數衰減項,默認爲0.99,看起來無傷大雅。如今還剩權重項,這一項能夠直觀的理解爲當前幀中的box,比較像前一幀中的哪一個box,越像權重就越高,因此很天然地用當前box的特徵與前面的一堆box的特徵進行逐一比對,自適應地學習權重,這是比較兩個box的apperance類似性,其實還應該比較box之間的geometry特性,譬如捱得越近就越多是同一物體,不過做者貌似沒有從幾何方面考慮,多是效果沒出來,或者沒時間弄了,埋個坑下一篇繼續填。
\[w(b_i^t,d_j^{t-1}) = \exp(\gamma\cos(\mathcal{E}(b_i^t), \mathcal{E}(d_j^{t-1}))) \quad j>0\]
\(\mathcal{E}(b_i^t)\)\(\mathcal{E}(d_j^{t-1})\)是把box映射成的128-D特徵,具體作法下一章介紹,其實就是一層fc搞定。\(\gamma\)是一個調節項,設爲8。此外還要考慮新出現的物體:
\[w(b_i^t,d_0^{t-1}) = \exp(R)\]
R設爲0.3,固然,還須要歸一化一下,
\[w(b_i^t,d_j^{t-1}) = \frac{w(b_i^t,d_j^{t-1})}{\sum_{k=0}^{m}w(b_i^t,d_k^{t-1})}\]
最後,空tracklet的類別機率設爲均勻分佈就行,
\[P_{\textbf{tr}}(c|d_0^{t}) = \frac{1}{C+1}\]
這一段比較長,符號也比較多,總結一下,中心就是第一個式子,下面這一堆都是這個式子裏面每一個項的解釋,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}}\)是篩選過的,一般是幾百個。暫時是這樣考慮的,之後可能有新的想法。
\[\mathcal{E}_{\text{s2}}(d_j^{t}) = \begin{cases} \eta \mathcal{E}_{\text{s2}}(b_k^t) + (1-\eta) \mathcal{E}_{\text{s2}}(d_j^{t-1}) \quad & \text{if } t>0, \\ \mathcal{E}_{\text{s2}}(b_k^0) \quad & \text{otherwise,} \end{cases}\]
很簡單的式子,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定義以下:
\[\begin{aligned} L &_{\text{track_box}}(b_{t-1}, b^{\text{gt}}_{t-1}, b^{\text{gt}}_{t}) = \begin{cases} (1 - \cos(\mathcal{E}(b_{t-1}), \mathcal{E}(b^{\text{gt}}_{t})))^2 \quad \text{if IoU}(b_{t-1}, b^{\text{gt}}_{t-1}) \ge 0.5\\ \max (0, \cos(\mathcal{E}(b_{t-1}), \mathcal{E}(b^{\text{gt}}_{t})))^2 \quad \text{otherwise} \\ \end{cases} \end{aligned}\]
就是按照同一目標的特徵類似度應該比較大,不一樣目標類似度應較小,比較好理解。
做者從準確性、魯棒性和穩定性幾個方面做了討論,值得注意的是這個算法在穩定性方面頗有優點,也就是檢測框「抖動」的現象減輕了不少,這對於實際應用很是重要。
另外還有一些細節,AssociateTracklet的過程實際上是一個二分圖匹配的過程,不必定是權重最大的就認爲是同一個目標,運用經典的二分圖匹配算法就能夠了,這在許多多目標跟蹤器中也有應用。PropagateBox過程用了FlowNet2來取代opencv裏自帶的光流算法,不過這個過程應該只是用來複現Baseline,在做者提出的方法裏並無用到?
最後,說一下我的的幾點見解:優化

  • 雖然說統一了檢測和跟蹤,可是跟蹤只用到了上一幀的信息,這或許對穩定性有一些傷害。
  • 對於reappear的問題是無力的,不過不少多目標跟蹤的算法一樣面臨這個問題,當消失的目標從新出現時,會被視爲新的目標,要解決這個問題就得用re-id來輔助一下了。
  • 跟蹤性能到底如何?文章只在MOT15上跟其餘算法進行了pk,而且也不是最優的,再最新的MOT17上可能就更無力了。不過,整合檢測和跟蹤,是將來的大勢所趨,能夠說開了個好頭,提出了一個很是乾淨的框架。
相關文章
相關標籤/搜索