1. 程式人生 > >目標檢測論文Cascade R-CNN: Delving into High Quality Object Detection

目標檢測論文Cascade R-CNN: Delving into High Quality Object Detection

轉自:https://zhuanlan.zhihu.com/p/36095768

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便是一個在這個方向上很好的嘗試。