- Zhaowei Cai, Nuno Vasconcelos. 《Cascade R-CNN: Delving into High Quality Object Detection》. CVPR 2018.
- 論文鏈接:https://arxiv.org/abs/1712.00726
- 代碼鏈接:https://github.com/zhaoweicai/cascade-rcnn
前言
IOU閾值被用來定義正負例,當使用一個較低的IOU閾值訓練object detector, 通常會導致noisy detection. 當提高閾值后發現性能會有所下降. 這主要可能是又兩個原因:
- 當提升閾值之后正樣本會"指數式地"減少,容易過擬合
- inference時存在mismatch的問題(即在train上取得最佳的IOU閾值對inference時產生的proposal并不能很好地進行回歸)
本文提出的Cascade R-CNN主要就是為了解決此問題.
這篇文章是基于Faster RCNN進行改進的,Faster R-CNN網絡只有一個RCNN網絡,而Cascade RCNN將多個RCNN網絡基于不同的IOU閾值進行級聯,對檢測的結果進行不斷地優化。前一個RCNN網絡的輸出可以作為后一個RCNN網絡的輸入,越往后的檢測模型,其界定正負樣本的IOU閾值是不斷上升的。 對這些逐級遞增地proposal(原文稱作hypotheses, 下同)resampling保證positive set的尺寸都相等, 這樣能緩解過擬合問題(可能是因為逐級提升的緣故, 因此可以使用一些比較差的數據, 這樣就擴充了positive set從而對過擬合緩解).
mismatch
- 在training階段,由于我們知道gt,所以可以很自然的把與gt的iou大于threshold(0.5)的Proposals作為正樣本,這些正樣本參與之后的bbox回歸學習。
- 在inference階段,由于我們不知道gt,所以只能把所有的proposal都當做正樣本,讓后面的bbox回歸器回歸坐標。
我們可以想到training階段和inference階段,bbox回歸器的輸入分布是不一樣的,training階段的輸入proposals質量更高(被采樣過,IoU>threshold),inference階段的輸入proposals質量相對較差(沒有被采樣過,可能包括很多IoU<threshold的),這就是論文中提到mismatch問題,這個問題是固有存在的,通常threshold取0.5時,mismatch問題還不會很嚴重。
1. Introduction
R-CNN等模型常使用IOU閾值0.5, 這樣會對positives的要求太過于loose, 著就會導致產生太多不達標的proposal(原文說法是noise bbox), 如圖, 圖中比較了0.5和0.7的差別:
(a)中u=0.5也是常用的正負樣本界定的閾值,但是當閾值取0.5時會有較多的誤檢,因為0.5的閾值會使得正樣本中有較多的背景,這是較多誤檢的原因;
(b)用0.7的IOU閾值可以減少誤檢,但檢測效果不一定最好,主要原因在于IOU閾值越高,正樣本的數量就越少,因此過擬合的風險就越大。
本文解決的重要思想是每一個單獨的detector只對一個單獨的IOU(原文稱quality level)進行優化. 此前有類似的工作, 但本文的思想與其不同, 此前是對FP rate優化, 本文是對一個給定的IOU閾值優化.
(c)和(d)中的曲線是用來描述localization performance,其中橫坐標表示輸入proposal和ground truth的IOU值,縱坐標表示輸出的proposal和ground truth的IOU值。紅、綠、藍3條曲線代表訓練檢測模型時用的正負樣本標簽的閾值分別是0.7、0.6、0.5。從(c)可以看出,當一個檢測模型采用某個閾值(假設u=0.6)來界定正負樣本時,那么當輸入proposal的IOU在這個閾值(u=0.6)附近時,該檢測模型比基于其他閾值訓練的檢測模型的效果要好。可以得出以下結論:
- 只有proposal自身的閾值和訓練器訓練用的閾值較為接近的時候,訓練器的性能才最好。
- 如果兩個閾值相距比較遠,就會存在mismatch問題
- 單一閾值訓練出的檢測器效果非常有限,單一閾值不能對所有的Proposals都有很好的優化作用。
那么很自然地想到能不能直接用較大的閾值(比如u=0.7)來訓練檢測模型呢?這樣是不行的,從(d)顯示,當RPN輸出的proposal的IOU較小時,閾值u=0.5的RCNN檢測器的效果要優于閾值u=0.6的RCNN檢測器,當RPN輸出的proposal的IOU較大時(接近0.6左右),效果相反。通常,單個IOU閾值的檢測器處理其他級別(IOU閾值和proposal與ground truth的IOU相差較大,不在同一個level)不一定是最佳的。
這些觀察表明,更高質量的檢測要求檢測器與其處理的假設之間的質量匹配更緊密,說的通俗一點就是,閾值高的檢測器要求RPN輸出的proposal與Ground truth的IOU也要高。
但是為了提高檢測器的質量,僅在訓練期間提高閾值u是不夠的。。從(d)中u = 0.7的檢測器可以看出,這會降低檢測性能。問題在于,從proposal檢測器出來的假設存在嚴重失衡(正負比例失衡,滿足閾值條件的正樣本數量很少),這種情況下容易導致過擬合。另一個原因就是inference時的mismatch問題。inference時RPN產生的proposal與ground truth一般不會很高,當檢測器的網絡的IOU閾值設的很高的時候,就會存在mismatch。
因此這條路是走不通的,所以就有了這篇文章的cascade R-CNN,簡單講cascade R-CNN是由一系列的檢測模型組成,每個檢測模型都基于不同IOU閾值的正負樣本訓練得到,前一個檢測模型的輸出作為后一個檢測模型的輸入,因此是stage by stage的訓練方式,而且越往后的檢測模型,其界定正負樣本的IOU閾值是不斷上升的。
為什么要設計成cascade R-CNN這種級聯結構呢?
一方面:從(c)可以看出用不同的IOU閾值訓練得到的檢測模型對不同IOU的輸入proposal的效果差別較大,因此希望訓練每個檢測模型用的IOU閾值要盡可能和輸入proposal的IOU接近。另一方面:可以看(c)中的曲線,三條彩色曲線基本上都在灰色曲線以上,這說明對于這三個閾值而言,輸出IOU基本上都大于輸入IOU。那么就可以以上一個stage的輸出作為下一個stage的輸入,這樣就能得到越來越高的IOU。總之,很難讓一個在指定IOU閾值界定的訓練集上訓練得到的檢測模型對IOU跨度較大的proposal輸入都達到最佳,因此采取cascade的方式能夠讓每一個stage的detector都專注于檢測IOU在某一范圍內的proposal,因為輸出IOU普遍大于輸入IOU,因此檢測效果會越來越好。
3. Object Detection
作者首先給了一張當時比較流行的方法示意圖, 此圖后文用到多次, 我們稱之為結構圖, 各大寫字母含義圖中也給出解釋:
(a)是Faster RCNN,因為two stage類型的object detection算法基本上都基于Faster RCNN,所以這里也以該算法為基礎算法。
(b)是迭代式的bbox回歸,從圖也非常容易看出思想,就是前一個檢測模型回歸得到的bbox坐標初始化下一個檢測模型的bbox,然后繼續回歸,這樣迭代三次后得到結果。(c)是Integral Loss,表示對輸出bbox的標簽界定采取不同的IOU閾值,因為當IOU較高時,雖然預測得到bbox很準確,但是也會丟失一些bbox。
(d)就是本文提出的cascade-R-CNN。cascade-R-CNN看起來和(b)這種迭代式的bbox回歸以及(c)這種Integral Loss很像,和(b)最大的不同點在于cascade-R-CNN中的檢測模型是基于前面一個階段的輸出進行訓練,而不是像(b)一樣3個檢測模型都是基于最初始的數據進行訓練,而且(b)是在驗證階段采用的方式,而cascade-R-CNN是在訓練和驗證階段采用的方式。和(c)的差別也比較明顯,cascade R-CNN中每個stage的輸入bbox是前一個stage的bbox輸出,而(c)其實沒有這種refine的思想,僅僅是檢測模型基于不同的IOU閾值訓練得到而已。
3.1 Bounding Box Regression
我們知道bbox對于所框選的圖片塊 xxx 通常由四個坐標構成: b=(bx,by,bw,bh)\text{b} = (b_{x},b_{y},b_{w},b_{h})b=(bx?,by?,bw?,bh?), bbox regression就是將這個預測的bbox對實際bbox ggg 進行regress, 這個過程借助regressor f(x,b)f(x,b)f(x,b) 進行, 因此最終就是優化這樣一個函數:
Rloc[f]=∑i=1NLloc(f(xi,bi),gi)R_{loc}[f] = \sum \limits_{i = 1}^{N}L_{loc}(f(x_{i},b_{i}),g_{i})Rloc?[f]=i=1∑N?Lloc?(f(xi?,bi?),gi?)
其中 LlocL_{loc}Lloc? 在R-CNN是一個 L2L_{2}L2? loss, 而在Fast R-CNN, 是一個 L1L_{1}L1? loss. 為了使預測盡可能與實際接近, LlocL_{loc}Lloc? 實際操作一個距離向量:
Δ=(δx,δy,δw,δh)\Delta = (\delta _{x},\delta _{y},\delta _{w},\delta _{h}) Δ=(δx?,δy?,δw?,δh?)
其中:
δx=(gx?bx)/bwδy=(gy?by)/bhδw=log(gw/bw)δh=log(gh/bh)\delta _{x} = (g_{x}?b_{x})/ b_{w}\:\delta _{y} = (g_{y}?b_{y})/ b_{h}\:\delta _{w} = log(g_{w}/ b_{w})\:\delta _{h} = log(g_{h}/ b_{h}) δx?=(gx??bx?)/bw?δy?=(gy??by?)/bh?δw?=log(gw?/bw?)δh?=log(gh?/bh?)
想要指出的是, bbox regression中一般b差異不大, 那么就會使 LlocL_{loc}Lloc? 很小, 為了提升他的effectiveness, 那么一般會使其歸一化 N(0,1)\text{ }N(0,1)?N(0,1), 也就是 δx′=(δx?μ)/σx\delta _{x}^{′} = (\delta _{x}?\mu )/ \sigma _{x}δx′?=(δx??μ)/σx?.
此前有工作argue單獨用一次regression step of f定位精度不夠, 因此他們就重復進行f regress:
f′(x,b)=f°f°?°f(x,b)f^{′}(x,b) = f \circ f \circ ? \circ f(x,b) f′(x,b)=f°f°?°f(x,b)
即所謂迭代bbox regression(iterative bounding box regression), 此方法對應上圖中(b), 但此方法還是有兩個問題:
-
從第一張圖(c)的實驗可以知道基于不同IOU閾值訓練的檢測模型對不同IOU的proposal輸入效果差別比較大,因此如果每次迭代都用基于相同IOU閾值的訓練數據訓練得到的檢測模型,那么當輸入proposal的IOU不在你訓練檢測模型時IOU值附近時,效果不會有太大提升。regressorf 是在0.5的閾值訓練, 對于更高閾值的proposal, regressor欠優化, 對于IOU大于0.85的proposal抑制尤為明顯.
-
每次迭代之后的分布都在明顯變化, 很可能初始分布較好, 但經過幾次迭代之后反而表現更差了. 下圖給出一例。下圖是關于迭代式bbox回歸在不同階段的四個回歸值分布情況(藍色點),可以看出在不同階段這4個值得分布差異較大,對于這種情況,一成不變的檢測模型顯然難以在這種改變中達到最優效果。
正因為其特性, 此方法需要一些后期處理. 此方法因此也是不穩定的, 通常迭代超過兩次以后基本再無太大變化.
3.2 Classification
和先前的方法基本不變, 分類時對于proposal分成 M+1M + 1M+1 類, 其中第0類是bg, 預測結果 KaTeX parse error: Expected 'EOF', got '\right' at position 20: …}(x) = p(y = k|\?r?i?g?h?t?.x), 其中 yyy 是指被預測對象類別, 那么最終得到被優化的函數:
Rcls[h]=∑i=1NLcls(h(xi),yi)R_{cls}[h] = \sum \limits_{i = 1}^{N}L_{cls}(h(x_{i}),y_{i}) Rcls?[h]=i=1∑N?Lcls?(h(xi?),yi?)
這里 lclsl_{cls}lcls? 是經典交叉熵損失.
3.3 Detection Quality
和以前一樣, 當 proposal IOU 大于某個閾值, 則預測label y, 否則為bg(label y = 0). IOU設置高或低的優缺點此前已經講過, 此前有通過結構圖中?的做法對多level的輸出計算損失并優化:
Lcls(h(x),y)=∑u∈ULcls(hu(x),yu)L_{cls}(h(x),y) = \sum \limits_{u \in U}L_{cls}(h_{u}(x),y_{u}) Lcls?(h(x),y)=u∈U∑?Lcls?(hu?(x),yu?)
U就是多IOU閾值. 因此所有classifiers在推理過程中一起使用, 但有個關鍵問 題是不同classifier接收的positives的數量不同! 在下圖中的左圖就是這種情況, 首先高IOU樣本數量太少, 很容易過擬合; 其次高預設IOU classifier又不得不處理眾多不適宜的第IOU樣本. 另外這張圖也請牢記, 我們稱之為分布圖.
Cascade R-CNN 和Integral Loss比較
Integral Loss共用pooling,只有一個stage,但有3個不共享的H,每個H處都對應不同的IoU閾值。Integral Loss存在的問題:
- 我們從上圖 proposal分布可以看到,第一個stage的輸入IoU的分布很不均勻,高閾值proposals數量很少,導致負責高閾值的detector很容易過擬合。
- 此外在inference時,3個detector的結果要進行ensemble,但是它們的輸入的IoU大部分都比較低,這時高閾值的detector也需要處理低IoU的proposals,它就存在較嚴重的mismatch問題,它的detector效果就很差了。
4. Cascade R-CNN
結構如結構圖所示.
Cascaded Bounding Box Regression
既然單個classifier很難適應多IOU, 那么作者就設計了順序的多個classifier, 與iterative bounding box regression相對應, 本文的結構:
f′(x,b)=fT°fT?1°?°f1(x,b)f^{′}(x,b) = f_{T} \circ f_{T?1} \circ ? \circ f_{1}(x,b) f′(x,b)=fT?°fT?1?°?°f1?(x,b)
這里每個 ftf_{t}ft? 都是預優化過的,
它與iterative bounding box regression(IBBR for short)的不同有以下幾點:
- IBBR是對同一個網絡重復迭代優化, cascaded regression是通過resample使每一級輸出都能被下級使用.
- cascaded regressor是既用于訓練又用于推理, 那么訓練集和推理集就不會有不匹配的情況了.
- 每一級輸出需要resample, 其后對每一級都會進行優化而不是向IBBR一樣只是最終相當于對輸入優化.
我想解釋一下, 為什么輸入為低IOU最后還會優出適應較高IOU的regressor, 這利用到全文第二張圖的左圖, 我再貼出來一邊便于觀察:
左圖中我們可以看出輸出在大多數情況都是好于輸入的, 那么我們逐級遞增地設置regressor, 最終輸出的也就是單一regressor幾乎不可能達到的高IOU.
Cascade Detection
在分布圖中我們可以發現, 每一階段處理之后分布重心都會向高IOU移動,這樣有兩個好處:
- 不容易過擬合.
- detector就可以對高IOU example訓練, 而減輕以前的不匹配問題.
在每個階段 ttt, R-CNN都要對classifierht hth_{t}ht? 和regressorftftf_{t}ft?在閾值 ut,ut>ut?1u^{t},u^{t} > u^{t?1}ut,ut>ut?1 的狀態下優化, loss為:
L(xt,g)=Lcls(ht(xt),yt)+λ[yt≥1]Lloc(ft(xt,bt),g)L(x^{t},g) = L_{cls}(h_{t}(x^{t}),y^{t}) + \lambda [y^{t} \geq 1]L_{loc}(f_{t}(x^{t},b^{t}),g) L(xt,g)=Lcls?(ht?(xt),yt)+λ[yt≥1]Lloc?(ft?(xt,bt),g)
其中 bt=ft?1(xt?1,bt?1)b^{t} = f_{t?1}(x^{t?1},b^{t?1})bt=ft?1?(xt?1,bt?1), g是 xtx^{t}xt 的ground truth. λ\lambdaλ 是調節參數. [yt≥1][y^{t} \geq 1][yt≥1] 是指只有不是bg時才計算 LlocL_{loc}Lloc?.
Experimental Results
這里只使用了水平翻轉, 在沒有使用其他trick.
以下與各模型對比實驗, 因為內容都比較直觀, 以后可能不會補充對他們的分析.
cascade R-CNN和Iterative bbox、Integral loss的對比。
COCO數據集上的提升確實非常明顯。主要通過在現有的two stage算法上添加cascade思想后的對比結果,另外還對比了訓練、測試時間、參數量等信息。
Conclusion
正如一開始提到的兩點問題, 作者在本文也是在盡力解決這些問題:
- 采用多階段逐步提升IOU, 從而在低IOU樣本中獲取更多的"高IOU"樣本。
- 對于最后一個階段輸出了高IOU樣本, 訓練classifier從而使其適應高IOU樣本, 當其推理時對于高IOU的樣本處理表現也更好。
- 每一個stage的detector都不會過擬合,都有足夠滿足閾值條件的樣本。
參考:
- https://blog.csdn.net/u014380165/article/details/80602027
- https://www.cnblogs.com/edbean/p/11306577.html
- https://zhuanlan.zhihu.com/p/92779720
- https://zhuanlan.zhihu.com/p/42553957