目標檢測論文閱讀:Cascade R-CNN: Delving into High Quality Object Detection
來自專欄 從目標檢測開始的挖坑日記
Cascade R-CNN: Delving into High Quality Object Detection
論文鏈接:https://arxiv.org/abs/1712.00726
代碼鏈接:https://github.com/zhaoweicai/cascade-rcnn CVPR2018的文章,最早是在知乎上看到https://zhuanlan.zhihu.com/p/35882192的介紹,大致讀了下感覺是非常有趣的工作,想要了解大致的設計思想的可以看這篇文章。本文主要針對的是檢測問題中的IoU閾值選取問題,眾所周知,閾值選取越高就越容易得到高質量的樣本,但是一味選取高閾值會引發兩個問題:
- 樣本減少引發的過擬合
- 在train和inference使用不一樣的閾值很容易導致mismatch(這一點在下面會有解釋)
作者為了解決上述問題就提出了一種muti-stage的architecture,核心就是利用不斷提高的閾值,在保證樣本數不減少的情況下訓練出高質量的檢測器。
以下是論文的核心內容和一些實驗,當然是按照我自己的理解組織的。1.思想簡介
我們知道,檢測問題和分類問題有很大的不同,檢測問題通過IoU來判斷樣本是否是正確的,因此IoU的選取對train和inference的影響都很大,來看作者做的一組實驗:
先看左圖,橫軸的是proposal的IoU,縱軸的是經過box reg得到的新的IoU,不同的線條代表不同閾值訓練出來的detector,顯然新的IoU越高,說明detector進行回歸的性能越好。可以看到在0.55~0.6的範圍內閾值為0.5的detector性能最好,在0.6~0.75閾值為0.6的detector性能最佳,而到了0.75之後就是閾值為0.7的detector了……
這就說明了,只有proposal自身的閾值和訓練器訓練用的閾值較為接近的時候,訓練器的性能才最好,如果兩個閾值相距比較遠,就是我們之前說的mismatch問題了。從圖中我們可以意識到,單一閾值訓練出的檢測器效果非常有限,以現在最常見的閾值0.5為例,由於所有IoU大於0.5的proposal都會被選中,那麼對於IoU0.6~0.95的proposal來說,detector的表現就很差了。那麼,我能不能直接選用0.7的高閾值呢?畢竟這樣子0.5~0.7的proposal都被排除了,橫軸0.7~0.95之間,紅色線條的表現似乎不差啊?但是看到右圖你就會發現,實際上detector的性能反而是最低的,原因是這樣子訓練樣本大大減少,過擬合問題非常嚴重。如何能保證proposal的高質量又不減少訓練樣本?採用cascade R-CNN stages,用一個stage的輸出去訓練下一個stage,就是作者給出的答案。留意到左圖大部分線條都是在y=x的灰色線條之上的,這就說明某個proposal在經過detector後的IoU幾乎必然是增加的,那麼再經過一個更大閾值訓練的detector,它的IoU就會更好。舉個例子,有三個串聯起來的用0.5/0.6/0.7的閾值訓練出來的detector,有一個IoU約為0.55的proposal,經過0.5的detector,IoU變為0.75;再經過0.6的detector,IoU變為0.82;再經過0.7的detector,最終IoU變為0.87……比任何一個單獨的detector的結果都要好。不僅僅只有IoU改善的好處,因為每經過detector,proposal的IoU都更高,樣本質量更好了,那麼即使我下一個detector閾值設置得比較高,也不會有太多的樣本被刷掉,這樣就可以保證樣本數量避免過擬合問題。
2.相關工作及一些證明
作者還把他的工作和類似的幾種工作做了實驗比較,在論文中是分開的,我這裡統一列出來方便大家對比。先來看一張圖:
Iterative BBox及對比
這是目前幾個非常典型的工作。圖(b)的Iterative BBox為了定位準確,採用了級聯結構來對Box進行回歸,使用的是完全相同的級聯結構。但是這樣以來,第一個問題:單一閾值0.5是無法對所有proposal取得良好效果的,如第1部分的圖所示,proposal經過0.5閾值的detector後IoU都在0.75以上,再使用這一閾值並不明智;第二個,detector會改變樣本的分布,這時候再使用同一個結構效果也不好,看下圖:
第一行橫縱軸分別是回歸目標中的box的x方向和y方向偏移量;第二行橫縱軸分別是回歸目標中的box的寬、高偏差量,由於比較基礎這裡不貼公式了。我們可以看到,從1st stage到2nd stage,proposal的分布其實已經發生很大變化了,因為很多雜訊經過box reg實際上也提高了IoU,2nd和3rd中的那些紅色點已經屬於outliers,如果不提高閾值來去掉它們,就會引入大量雜訊干擾,對結果很不利。從這裡也可以看出,閾值的重新選取本質上是一個resample的過程,它保證了樣本的質量。
當然,這裡會有另一個問題,我們這樣子真的不會減少樣本數量么?雖然第1部分給了比較直觀感性的解釋,但是似乎還不夠……作者給出了更加詳細的實驗證明:從這張圖,我們可以看到,1st stage大於0.5的,到2nd stage大於0.6的,到3rd stage大於0.7的……在這一個過程中proposal的樣本數量確實沒有特別大的改變,甚至還有稍許提升,和2圖結合起來看,應該可以說是非常強有力的證明了。
總結起來,就是:
- cascaded regression不斷改變了proposal的分布,並且通過調整閾值的方式重採樣
- cascaded在train和inference時都會使用,並沒有偏差問題
- cascaded重採樣後的每個檢測器,都對重採樣後的樣本是最優的,沒有mismatch問題
Iterative Loss
Iterative Loss實際上沒有級聯結構,從c圖可以看出來,它只是使用了不同的閾值來進行分類,然後融合他們的結果進行分類推理,並沒有同時進行Box reg。作者認為,從圖4中的第一個圖可以看出來,當IoU提高的時候,proposal的比重下降非常迅速,這種方法沒有從根本上克服overfit問題;另外,這種結構使用了多個高閾值的分類器,訓練閾值卻只能有一個,必然會導致mismatch問題而影響性能。
3.Cascade R-CNN的實現與結果
Cascade R-CNN的結構圖在第2部分的(d)圖已經給出了……
最後總結一下,作者最終確定的結構一共是4個stages: 1個RPN+3個檢測器(閾值設定分別為0.5/0.6/0.7)……其中RPN的實現想必大家都很清楚了,而後面三個檢測器,則按照之前介紹的那樣,每個檢測器的輸入都是上一個檢測器進行了邊框回歸後的結果,實現思路應該類似於Faster RCNN等二階段檢測器的第二階段。貼一下結果吧:個人認為,這個提升還是相當驚艷的。特別需要說明的一點是,對於目前流行的檢測結構來說,特徵提取是耗時最多的,因此儘管Cascade R-CNN增加了比較多的參數,但是速度的影響並沒有想像中的大,具體可以參考下表:
實際上,論文中還有相當多的部分沒有提及。這篇文章還做了大量的對比實驗,例如通過添加ground truth來提高proposal的質量從而驗證mismatch問題;通過添加stages來分析適合的級聯階段數等等;包括一些和第2部分中提到的兩種思路的對比等等,可以說是有理有據……再加上不俗的效果和曉暢通俗的語言,還是非常值得閱讀的,另外作者的code也已經發布,有興趣的同學可以前去觀摩~
4.總結
其實像我這樣的入門者是很難準確說出這篇文章好在哪裡的,這裡引用Naiyan Wang大神的評論吧:Detection其實並不是一個很合適的分類問題,沒有一個明確的離散的正負樣本的定義,而是通過IoU來連續定義的。但是IoU這個指標很難通過gradient descent來優化,雖然之前也有一些IoU loss的工作,但是效果並不理想。Cascade RCNN便是一個在這個方向上很好的嘗試。
推薦閱讀:
TAG:機器學習 | 深度學習DeepLearning | 目標檢測 |