CornerNet:另闢蹊徑的目標檢測方法

Paper link:

Code link:

鍥子

我們好像都厭倦了anchor,儘管它帶給了我們很多。

Abstract:

無論是one-stage方法還是two-stage方法,anchor都能很好的得到利用,幫助我們提升檢測的精度和計算的效率。但是計算機視覺,尤其是目標檢測發展至今,anchor-based方法已經到了小小的瓶頸,要想再獲得耀眼的提升難度較大,於是,很多anchor-free型別的方法紛紛出現,在今年的cvpr中,已經有諸如FSAF,FCOS等方法,給了我們啟發,今天介紹的工作是普林斯頓大學ECCV2018的文章。提出了一種基於關鍵點(Keypoint-based)來進行目標檢測的方法,選取左上角和右下角的一對角點作為關鍵點,該方法消除了對anchor box的依賴,此外還引入獨有的Corner Pooling這種新的池化方法。實驗表明,在COCO資料集上,AP達到了42。2%,如下圖所示,這在當時(2018)超過了所有one-stage檢測方法的效能。

CornerNet:另闢蹊徑的目標檢測方法

Introduction

當前所有SOTA的one-stage方法幾乎都用到了anchor,anchor的廣泛應用能夠讓one-stage有底氣在準確率上跟two-stage方法一較高下。one-stage的常規做法是,在圖片上密集的放置anchor,透過對anchor打分生成候選bounding box,並對這些區域直接進行位置迴歸。

anchor有比較明顯的弊端,我在FCOS那篇文章中也說過,論文作者認為,anchor有兩個缺點。(1)anchor的數量是巨大的,這是因為最後bounding box的確認是依靠anchor和ground-truth的IOU值,所以必須放置足夠的anchor以保證絕大多數的GT box能被覆蓋。這種“寧肯多加一千不肯漏掉一個”的策略,導致只有非常少數量的anchor會與anchor重疊,產生了大量的無用anchor,大量的負樣本,這大大降低了訓練效率,對正確率也有影響,有很多論文也在致力於解決這個樣本失衡問題,暫且不表(2)隨anchor一起引入的是很多超引數和anchor設計方案,比如,anchor的數量,尺寸,長寬比,這些的選擇很多時候是盲目的,是要根據手頭任務決定的,沒有固定的正規化,需要很大的精力調參,訓練難度大,針對這一方面,也有很多論文進行解決,也是暫且不表,我會在最後附上幾篇參考連結。

針對這些缺點,在這篇論文中,作者提出了CornerNet網路,是一種不依靠anchor的one-stage目標檢測方法。總體思想就是利用一系列關鍵點,左上角和右下角,這樣一組角點生成bounding box。首先利用卷積網路產生heatmaps來預測左上角和右下角角點的位置;然後利用向量嵌入進行角點分類,找出屬於同一個bounding box的角點,網路要做的就是將同一組角點嵌入距離很相近的向量;最後透過offset對Corner的位置進行微調。 在這三個模組之前,還需要進行一個很重要的操作——corner pooling。獨有的池化方法,可以更好的確定角點的位置,實驗表明,Corner pooling對CornerNet超越其他one-stage方法至關重要。

Approach

下圖是CornerNet的總體網路,大體可以分為兩大部分:沙漏網路,預測模組。以沙漏網路作為backbone,沙漏網路後面跟著兩個預測模組,一個用來進行左上角Corner的預測,一個用來進行右下角的預測。每個模組中都包括Heatmaps,Embeddings和offsets三部分。這裡注意一點,與其他目標檢測不同,我們不用多尺度特徵來檢測不同尺度的物體。

CornerNet:另闢蹊徑的目標檢測方法

Hourglass Network(沙漏網路)

沙漏網路是一個形象的說法,因為結構類似沙漏而得名。沙漏網路起源於用於人體姿態估計任務。它的目的是捕捉不同尺度下圖片所包含的資訊。常規的沙漏網路結構如下圖:基本思想是先進行降取樣,在降取樣的過程中,C1a-C4a是對應層的副本,從C7開始上取樣,與C1a-C4a對應元素相加,得到C1b-C4b,最後再經過兩個1x1的卷積進行處理,得到最終輸出。沙漏模組首先透過一系列卷積層和最大池化層對輸入特性進行下采樣。然後透過一系列的上取樣和卷積層將特徵上取樣回原來的解析度。由於細節在最大池化層中丟失,因此添加了跳過層用來將細節帶回到上取樣的特徵。CornerNet的沙漏網路是在此基礎上改進的,但不是本文的重點,你只需要知道,

透過沙漏網路,我們能夠將各個尺度的特徵進行很好的整合就好

CornerNet:另闢蹊徑的目標檢測方法

2. Prediction Module

預測模組是CornerNet網路的重中之重,由於左上預測和右下預測沒有本質區別,我以左上為例進行說明。從總體來說,預測模組首先要對模組輸入進行Corner pooling,對pooling得到的特徵,分別進行三個操作:(1)利用Heatmaps對角點進行檢測(2)利用Embeddings向量嵌入的方法將角點進行分類,找出屬於同一目標的角點(3)利用offset對Corner位置進行微調。

角點檢測:

透過預測Heatmaps進行,關於Heatmaps可以簡單的理解為熱點圖,透過熱點圖,預測每個位置是角點的機率。我們需要預測兩組值,一組用於左上,一組用於右下。其中每組heatmaps尺寸為HxW,有C個通道,C表示物體類別,注意,這裡並沒有加上背景類。每一個通道都是一個binary mask,用來表示該類的角的位置。對於每一個角點,都只設置一個正例,所有其他的位置都是負例,在訓練過程中,對負樣本的“懲罰”並不是相同的,我們對正例半徑範圍內的負例減少懲罰,這是有意義的,如下圖所示,我們以正例為圓心畫一個圓,在訓練期間,雖然正例只有一個(紅色框),但是如果一對負例角點各自接近GT位置,那麼它們生成的bounding box仍然會和GT產生很大的重疊,因此,透過設定閾值的辦法,如果該bounding box和GT的IOU超過閾值,就減少懲罰量。

CornerNet:另闢蹊徑的目標檢測方法

半徑是怎麼確定的呢?透過確保半徑內的角點至少產生和GT-box IOU大於t的bounding box來確定。通常t設定為0。3。現在,給定了半徑,懲罰的減少量怎麼計算呢?如下公式是非標準的高斯分佈,其中心位於正位置,σ 為半徑的1/3

CornerNet:另闢蹊徑的目標檢測方法

設Pcij為heatmaps中c類位置在(i,j)的得分,ycij是用高斯增強後的GT heatmaps,則損失函式可以表示如下:

CornerNet:另闢蹊徑的目標檢測方法

其中,N是一張圖片中目標數,

α

和β是控制每個點貢獻的超引數

一般來說,經過卷積後的影象,尺寸是小於原影象的。假設影象中的位置(x,y)在經過卷積後在heatmaps中的位置是([x/n],[y/n]),當將熱圖中的位置重新映射回原圖時,精度會丟失,這會在很大程度上影響bounding box和GT-box之間的IOU。為了解決這個問題,預測一個位置偏移,用來微調Corner的位置,然後再進行對映。如下式所示,其中Ok是offset,xk,yk是角點k的x,y座標。因此,透過預測一組左上角的共享和右下角的共享,實現Corner位置的微調,注意的是,這兩組偏移是全類別共享的。

CornerNet:另闢蹊徑的目標檢測方法

則在訓練過程中,損失為:

CornerNet:另闢蹊徑的目標檢測方法

角點分類

一幅圖中可能有多個物體,因此很有可能會檢測到多個左上角和右下角的角點,這些角點是屬於很多類的,光有了角點還不行,我們要把來自同一個物體的角點進行分類,以此保證分出來的一對角點屬於同一類。受

Pixels to Graphs by Associative Embedding》論文的啟發,透過對角點嵌入關聯向量來對角點進行分類。網路為每個檢測到的點嵌入向量,如果左上角和右下角屬於同一個物體,那麼嵌入向量之間的距離會很小,嵌入的具體值不重要,我們的分類依據是嵌入向量之間的距離。基於此,設計兩個損失函式:pull和push

顧名思義,pull就是為了將屬於同一物體的角點拉近,聚集。如下圖pull損失函式所示,etk,ebk是物件k的左上嵌入和右下嵌入。ek是兩者的均值。

CornerNet:另闢蹊徑的目標檢測方法

push函式則是將不是一個物體的角點退遠,分離。如下圖所示,ek是物件k的嵌入,ej是物件j的嵌入。因為嵌入的是一維向量,所以這裡△設定為1

CornerNet:另闢蹊徑的目標檢測方法

L=Lpull+Lpush得到該網路的損失,透過訓練L,能夠很好的實現“類內距離小,類間距離大”的效果,實現角點很好的分類

Corner Pooling

讓我們再回顧一下網路結構,在三個結構之前,有一個Corner Pooling模組,我們對ROI Pooling可能比較熟悉,但是現在沒有box,更談不上進行ROI Pooling了,因此本文提出了一種新的pooling方式,Corner Pooling。讓我們透過圖來解釋吧,對應一個位置(圖中紅色的點),以此位置為起點,分別在該點的水平方向和豎直方向上遍歷所有的點,分別找到在該方向上的最大值,將兩個最大值相加,就得到Corner pooling後的結果,圖中藍色的點。

CornerNet:另闢蹊徑的目標檢測方法

下圖是一個具體的例項,向我們說明了Corner pooling四個點之後的結果

CornerNet:另闢蹊徑的目標檢測方法

知道方法後,我們在想想Corner pooling為什麼可行。首先,目標檢測中的物體通常並不能和bounding box完美契合,box的左上角通常在物體之外,那怎麼確定這個點就是左上角呢?在這種情況下,角點不能根據當前的位置資訊進行定位。那如果我們從左上角開始,假設兩道鐳射,一道水平掃描;一道垂直掃描,那麼掃描的重疊區域就一定能覆蓋物體。而且我們取這個過程兩個方向的最大值相加,代表了最突出,明顯的特徵,類似最大池化。有了例項之後,公式就很簡單了,這裡也一併附上

CornerNet:另闢蹊徑的目標檢測方法

以上是以左上角為例,右下角也是同樣的操作,只不過掃描的方向改變,這裡就不再贅述。

Prediction Module architecture

知道了每個模組的具體操作,我們再來看看整體的結構,如下圖所示,第一部分是一個resnet的改動(附上resnet作為對比),將3x3卷積模組替換成了Corner pooling,在Corner pooling之後,將特徵輸入3x3x256的Conv-BN,然後再加上resnet的shortcut。最後經過一個3x3x256的Conv。Heatmaps,Embeddings和offset是透過3個256通道的Conv-ReLU-Conv層產生的

CornerNet:另闢蹊徑的目標檢測方法

CornerNet:另闢蹊徑的目標檢測方法

訓練

CornerNet:另闢蹊徑的目標檢測方法

總的損失函式如上,具體每個損失函式的意義在前文中都有闡述,注意這裡引數的設定,本文將α 和β都設定為0。1,而γ設定為1,這是作者經過試驗得到的最佳組合。

Experiments&Results

論文做了多組試驗,這裡選取幾個重要的。

CornerNet:另闢蹊徑的目標檢測方法

CornerNet:另闢蹊徑的目標檢測方法

CornerNet:另闢蹊徑的目標檢測方法

CornerNet:另闢蹊徑的目標檢測方法

CornerNet:另闢蹊徑的目標檢測方法

參考閱讀:

以上就是我對cornerNet的理解,由於時間倉促加之水平有限,肯定會有很多理解的誤區和錯誤,歡迎批評指正,也感謝大家的關注,完結,撒花,下期見~

CornerNet:另闢蹊徑的目標檢測方法