天天看點

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

下面借這篇blog記錄一些閱讀筆記,如果問題,懇請指出。

文章目錄

  • 1. Introdution
  • 2. CornerNet
    • 2.1 Overview
    • 2.2 Detecting Corners
    • 2.3 Grouping Corners
    • 2.4 Corner Pooling
    • 2.5 prediction module
    • 2.6 Hourglass Network
  • 3. Experiments
    • 3.1 Training Details
    • 3.2 Testing Details
  • 4. Result

paper:CornerNet: Detecting Objects as Paired Keypoints

内容重點:舍去了生成anchor的思想,取而代之的是使用了關鍵點檢測。将對象邊界框檢測為一對關鍵點(左上角和右下角)。消除了生成anchor所帶來的的正負樣本不均的問題。同時介紹了一種新的池化層corner pooling,使得網絡可以更好的定位到兩個關鍵點。

1. Introdution

在One-step的目标檢測網絡中,通常會大量的使用anchor box,依次使得準确度能夠媲美Two-steps檢測網絡。但是由于anchor box是由一些利用的不同的面積與比例預測對象框,這意味着需要在特征矩陣上進行密集的使用。然後再通過分類網絡與回歸網絡細化坐标或者進行篩選。

但是使用anchor的概念會帶來兩個缺點:

1)需要生産非常多的anchor boxes。在DSSD中需要40k+,而在RetinaNet中需要100k+。這是因為檢測器被訓練來分類每個anchor box是否與ground truth充分重疊,并且需要大量的anchor box來確定與大多數ground truth充分重疊。是以,隻有一小部分anchor box會與ground truth重疊;這造成了正負樣本(positive and negative anchor boxes)之間的巨大不平衡,減緩了訓練。

2)anchor boxes的使用會導緻非常多的超參數與設計的選擇。僅僅對于anchor boxes,就設計到多少的boxes,什麼尺寸,什麼比例。這些選擇需要慢慢試探。而當與多尺度體系結構相結合的時候會變得更加的複雜,比如結合FPN結構。在網絡中會有多個預測特征層,需要在每個預測特征層上進行單獨預測。由于每層的預測特征層擁有不同的分辨率,是以需要分别生成各組的anchor boxes。

基于以上考慮,CornerNet中沒有使用基于anchor的方法。而是通過擷取圖像的一堆關鍵點(目标的左上角與右下角)來進行目标檢測。

創新點:

1)利用左上角與右下角這麼一對關鍵點進行目标檢測。關鍵點的擷取通過一個卷積神經網絡生成heatmap與embedding來擷取,為了提高準确度額外生成一個offsets減少偏移損失。在下文會對headmap與embedding進行詳細講解。

2)使用了一種新的池化層稱為:corner pooling。有助于卷積網絡更好地定位邊界框的角點。

3)使用了Hourglass作為特征提取網絡

利用一對關鍵點進行目标檢測比利用anchor進行檢測更加有效的可能原因是:

1)anchor的中心依賴于檢測對象的4條邊界,而定位一個corner隻需要檢測對象的兩條邊界,是以corner比anchor更容易定位。而在針對corner檢測的cornor pooling輔助下,corner的定位會更加的容易。因為corner pooling可以擷取corner定義的一些先驗知識。

2)使用corner能更高效地計算boxes的離散空間位置:使用corner隻要O(wh)計算複雜度就能得到所有的可能anchor boxes,但是使用anchor boxes需要O(w2h2)的複雜度。

2. CornerNet

下面會分别對CornerNet的思路,創新點等方面進行講解。

2.1 Overview

在CornerNet中,我們将對象檢測為一對關鍵點——邊界框的左上角和右下角。通過卷積網絡預測生成兩組heatmap去代表不同對象類别的角點位置。其中一組用于左上角點的預測,而另外一組用與右下角點的預測。

此外,為每個預測到的角點還會提供一個embedding vetor,當來自同一個目标對象的兩個角點的兩個embedding vetor應該是比較相識的。也就是這兩個embedding vetor之間的距離是比較小的。

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

同時,為了讓預測的邊界框更加的準确,網絡還預測了offset vector,來微調預測得到的corner。是以,通過網絡預測heatmaps,embedding vetor與offset,再經過檢測的後處理,得到最終的預測邊界框。

完整的結構如圖所示:

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

在CornerNet中,使用了hourglass network作為骨幹網絡,但是這裡沒有多層的預測特征層,也就沒有不同比例的特征,是以直接在最後一層的輸出特征圖上進行後續處理。

在特征提取之後,會接兩個預測子產品,其中一個用于左上角點的預測,令一個子產品用于右下角點的預測。對于每個單獨的子產品,經過角點池化子產品之後,都有自己的預測heatmap,embedding vetor與offset矩陣。

每組hetmap都有C通道,其中C是類别數,大小為H ×W,注意這裡沒有背景類别。每個channel都是一個binary mask,表明一個類的位置所在處。

以上就是CornerNet的大緻過程。

2.2 Detecting Corners

對于每一個角點,都有一個ground-truth positive的位置,而其他的位置都是negative。在訓練過程中,不是同等地懲罰負位置,而是在正位置的一定半徑範圍内減少對負位置的懲罰。

這是因為盡管某一對關鍵點的檢測錯誤,但是如果他們仍然靠近各自的ground truth位置時,這對錯誤的關鍵點仍然可以産生與ground truth充分重疊的面積。這裡上述半徑的值設定為能使處于這個半徑範圍内的一對corner能夠與GT有足夠的IoU,文中門檻值為0.3。給定半徑後,半徑内corner減少的懲罰量通過一個以正樣本corner為中心的非歸一化的二維高斯函數得到: e − x 2 + y 2 2 σ 2 e^{-\frac{x^{2} + y^{2}}{2\sigma^{2}}} e−2σ2x2+y2​.(其中: σ = 1 3 ⋅ r \sigma = \frac{1}{3}·r σ=31​⋅r)

讓pcij表示heatmaps第c個channel上(i,j)位置的corner表示物體為類c的得分,ycij表示由高斯增強後的ground-truth heatmap值。

檢測損失:

L D e t = − 1 N ∑ c = 1 C ∑ i = 1 H ∑ j = 1 W { ( 1 − p c i j ) α l o g ( p c i j ) if  y c i j  = 1 ( 1 − y c i j ) β ( p c i j ) α l o g ( 1 − p c i j ) otherwise L_{Det} = -\frac{1}{N}\sum_{c=1}^{C}\sum_{i=1}^{H}\sum_{j=1}^{W} \begin{cases} (1 - p_{cij})^{α}log(p_{cij}) && \text{if $y_{cij}$ = 1} \\ (1 - y_{cij})^{β}(p_{cij})^{α}log(1-p_{cij}) && \text{otherwise} \end{cases} LDet​=−N1​c=1∑C​i=1∑H​j=1∑W​{(1−pcij​)αlog(pcij​)(1−ycij​)β(pcij​)αlog(1−pcij​)​​if ycij​ = 1otherwise​

分析:

先忽略ycij,可以看見這個損失函數是在交叉熵損失函數的基礎上改變而來。對于正樣本預測時,會執行上半式子。此時,pcij是一個比較大的值,也說明預測得比較容易,是以通過參數 ( 1 − p c i j ) α (1-p_{cij})^{α} (1−pcij​)α來控制其損失權重,使得權重不至于太大。對于負樣本預測時,會執行下半式子。此時,pcij會正确預測此時的類别不正确,是以pcij會是一個比較小的數值。同樣的,通過 ( p c i j ) α (p_{cij})^{α} (pcij​)α來控制其損失權重,使得權重不至于太大。

考慮ycij,當對正樣本進行預測時,如果ycij=1,(i,j)位置與ground truth物體的(i,j)位置相比的一個分值,即若剛好為ground truth位置。而如果是其他的情況時,此時表示(i,j)點不是類别c的目标角點,也就是預測錯誤。但是這裡由于使用了ground truth角點的高斯分布計算,是以如果是距離ground truth比較近的(i,j)點的ycij值也會接近于1,這部分通過β參數控制,使得 ( 1 − y c i j ) β (1-y_{cij})^{β} (1−ycij​)β來控制其損失權重,使得權重不至于太大。

Figure5是關于對不同負樣本點的損失函數采取不同權重值的原因。紅色實線框是ground truth;橘色圓圈是根據ground truth的左上角角點、右下角角點和設定的半徑值畫出來的,半徑是根據圓圈内的角點組成的框和ground truth的IOU值大于0.7而設定的,圓圈内的點的數值是以圓心往外呈二維的高斯分布;白色虛線是一個預測框,可以看出這個預測框的兩個角點和ground truth并不重合,但是該預測框基本框住了目标,是以是有用的預測框,是以要有一定權重的損失傳回,這就是為什麼要對不同負樣本點的損失函數采取不同權重值的原因。

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

而且,對于一般的卷積神經網絡為了提取全局的資訊,一般會不斷的進行下采樣這樣會導緻輸出的特征矩陣與輸入的特征矩陣不一緻,通常輸出的特征矩陣會比輸入的特征矩陣的尺度要小。

假設縮小倍數是n,那麼輸入圖像上的(x,y)點對應到特征圖為 ( [ x n , y n ] ) ([\frac{x}{n},\frac{y}{n}]) ([nx​,ny​]),式子中的符号是向下取整。當我們将熱圖中的位置重新映射到輸入圖像時,可能會失去一些精度,這可能會極大地影響帶有地面真相的小邊界框的IoU。為了解決這個問題,我們預測位置偏移,以便在将角位置重新映射到輸入分辨率之前稍微調整它們。

偏移量 o k = ( x k n − [ x k n ] , y k n − [ y k n ] ) o_{k} = (\frac{x_{k}}{n}-[\frac{x_{k}}{n}],\frac{y_{k}}{n}-[\frac{y_{k}}{n}]) ok​=(nxk​​−[nxk​​],nyk​​−[nyk​​]),其中 x k , y k x_{k},y_{k} xk​,yk​分别是角點的x,y坐标。是以現在,預測了所有類别的左上角共享的一組偏移,以及右下角共享的另一組偏移。然後在訓練的時候,通過smooth L1損失函數監督學習該參數,和常見的目标檢測算法中的回歸支路類似。

偏移損失公式:

L o f f = 1 N ∑ k = 1 N S m o o t h L 1 L o s s ( o k , o ^ k ) L_{off} = \frac{1}{N}\sum_{k=1}^{N}SmoothL1Loss(o_{k},\hat{o}_{k}) Loff​=N1​k=1∑N​SmoothL1Loss(ok​,o^k​)

2.3 Grouping Corners

圖像中可能出現多個對象,是以可能檢測到多個左上角和右下角。我們需要确定一對左上角和右下角是否來自同一個邊界框。

這裡作者借鑒了Newell等人提出的用于多人姿态估計任務的關聯嵌入方法的啟發。Newell等人檢測所有的人類關節,并為每個檢測到的關節生成一個嵌入。他們根據嵌入物之間的距離對關節進行分組。

關聯嵌入的思想也适用于目标檢測任務。該網絡預測每個檢測到的角的嵌入向量(Embedding vector),使得如果左上角和右下角屬于同一邊界框,則它們的嵌入之間的距離應該比較小。然後,我們可以根據左上角和右下角的嵌入之間的距離來對角進行分組。Embedding的實際值并不重要。重要的是一對corners相似就行。

embedding損失包含兩部分,etk表示第k個目标的左上角角點的embedding vector,ebk表示第k個目标的右下角角點的embedding vector,ek表示etk和ebk的均值。pull loss用來縮小屬于同一個目标(第k個目标)的兩個角點的embedding vector(etk和ebk)距離。push loss用來擴大不屬于同一個目标的兩個角點的embedding vector距離,令Δ=1。

embedding距離損失公式:

L p u l l = 1 N ∑ k = 1 N [ ( e t k − e k ) 2 + ( e b k − e k ) 2 ] L_{pull} = \frac{1}{N}\sum_{k=1}^{N}[(e_{tk}-e_{k})^{2}+(e_{bk}-e_{k})^{2}] Lpull​=N1​k=1∑N​[(etk​−ek​)2+(ebk​−ek​)2]

L p u s h = 1 N ( N − 1 ) ∑ k = 1 N ∑ j = 1 & j ≠ k N m a x ( 0 , △ − ∣ e k − e j ∣ ) L_{push} = \frac{1}{N(N-1)}\sum_{k=1}^{N}\sum_{j=1\&j≠k}^{N}max(0,△-|e_{k}-e_{j}|) Lpush​=N(N−1)1​k=1∑N​j=1&j​=k∑N​max(0,△−∣ek​−ej​∣)

2.4 Corner Pooling

corner pooling layer來幫助更好的定位物體bounding box的對角。因為有時物體bounding box的兩個對角處會沒有資訊。

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

這種情況下corner就很難通過局部特征進行定位。那麼為了确定某個像素點是否有一個top-left corner,我們就需要從該點出發向其水準有方向去看看,以及向其垂直向下方向看看。那麼這就是corner pooling layer要做的工作,它輸入兩個特征層,第一個特征層,在每個像素點做該點水準右邊所有像素的最大池化得到該點的一個值,第二個特征層則對每個像素點做該點垂直下面所有像素的最大池化,最後将兩個池化結果相加。如下圖:

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

這一步可以用數學公式來表示,這是一個遞歸的公式:

t i j = { m a x ( f t i j , t ( i + 1 ) j ) i < H f t H j otherwise l i j = { m a x ( f l i j , l i ( j + 1 ) ) j < W f l i W otherwise t_{ij} = \begin{cases} max(f_{t_{ij}},t_{(i+1)j})& \text{$i < H$}\\ f_{t_{H_{j}}}& \text{otherwise} \end{cases} \\ l_{ij} = \begin{cases} max(f_{l_{ij}},l_{i(j+1)})& \text{$j < W$}\\ f_{l_{i_{W}}}& \text{otherwise} \end{cases} tij​={max(ftij​​,t(i+1)j​)ftHj​​​​i<Hotherwise​lij​={max(flij​​,li(j+1)​)fliW​​​​j<Wotherwise​

其中ft為用于水準方向的特征圖,fl為用于垂直方向的特征圖。圖像的尺寸為H×W。水準方向那個特征圖上tij的值等于ft特征圖上(i, j) 到 (i, H) 所有點的最大值。同理,垂直方向lij則為特征圖fl上(i, j) 到 (W, j)所有點的最大值。 該池化操作是可以通過下面方式高效計算:

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

從右到左做max求每個點值得到水準特征圖,從下到上求每個點值得到垂直特征圖,最後相加即可。

2.5 prediction module

該子產品的第一部分是residual block的修改版本

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

最開始的結構講到backbone之後連接配接兩個prediction module,分别預測兩個corner。這裡詳細介紹prediction module内部結構,以左上角corner(top-left corner)對應module為例。

backbone之接着兩個3×3的卷積module(灰色的 3×3 Conv-BN-ReLU),這兩個module各自輸出1個feature map分别作為上文中提到的ft和fl傳到Corner pooling做池化操作,然後pooling最後輸出的結果再經過一個3×3 Conv-BN layer,然後再和shortcut相加後relu激活,激活結果緊跟一個卷積module,然後再跟着3個3×3 Conv-ReLU-Conv分支分别對應heatmaps, embeddings 和offset的預測。

2.6 Hourglass Network

Hourglass Network結構如下:

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

CornerNet采用 Hourglass Network做骨幹網,Hourglass Network是一個全卷積網絡,由一個或多個hourglass module組成。每個hourglass module首先通過卷積c層和max pooling layer下采樣輸入特征層,然後通過一系列的上采樣操作和卷積層上采樣回原resolution。但是max pooling layer會丢失很多細節,于是增加了skip layer來補上細節。這樣Hourglass Network就能同時捕獲全局和局部特征。

hourglass module結構示意圖如下:

論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

CornerNet采用了2個Hourglass組成的Hourglass Network,作者在使用Hourglass時做了一些小調整,包括:

  1. Hourglass在下采樣時不再進行max-pooling,而是在卷積時通過stride=2進行下采樣。下采樣的卷積進行5次,輸出feature maps的通道數分别為(256, 384, 384, 384, 512)
  2. 在每個skip connection,有兩個residual modules。
  3. 圖檔進入Hourglass前,進行了2次下采樣。使用一個kernel size=7*7,stride=2,channel=128的卷積和一個stride=2,channel=256的residual block,将width和height縮小為以前的1/4。

3. Experiments

3.1 Training Details

網絡在PyTorch的預設設定下随機初始化,不需要對任何外部資料集進行預處理。在訓練期間,作者将網絡的輸入分辨率設定為511 × 511,這導緻輸出分辨率為128 × 128。作者使用了多種資料增加來避免過拟合,而且在輸入圖檔之前會使用PCA預處理。

總的損失函數公式:

L = L d e t + α L p u l l + β L p u s h + γ L o f f L = L_{det} + αL_{pull} + βL_{push} + γL_{off} L=Ldet​+αLpull​+βLpush​+γLoff​

其中,α、β和γ分别是embedding距離損失公式和偏置損耗的權重。将α和β都設定為0.1,γ為1。發現1或更大的α和β值會導緻較差的性能。

3.2 Testing Details

0)使用simple post-processing算法從Heatmaps, Embeddings, Offsets生成邊界框。

1)在得到預測角點後,會對這些角點做NMS操作,選擇前100個左上角角點和100個右下角角點。

2)計算左上角和右下角角點的embedding vector的距離時采用L1範數,距離大于0.5或者兩個點來自不同類别的目标的都不能構成一對。

3)測試圖像采用0值填充方式得到指定大小作為網絡的輸入,而不是采用resize,另外同時測試圖像的水準翻轉圖并融合二者的結果。

4)最後通過soft-nms操作去除備援框,隻保留前100個預測框。

4. Result

  • backbone與corner的作用
    論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result
  • corner pooling的作用
    論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result
  • 有無heatmaps與offset的對比
    論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result
  • 與其他SOTA算法對比
    論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result
    論文閱讀筆記 | 目标檢測算法——CornerNet算法1. Introdution2. CornerNet3. Experiments4. Result

總結:

想法比較新穎,通過一對關鍵點來實作預測邊界框,同時使用corner pooling來輔助預測關鍵點。

不過看完論文之後,感覺還有很多細節沒有弄懂,隻是了解了大概的處理過程,完全弄懂可能得看一下代碼了。

參考資料:

  1. https://blog.csdn.net/edward_zcl/article/details/100858681
  2. https://blog.csdn.net/u014380165/article/details/83032273
  3. https://blog.csdn.net/yanghao201607030101/article/details/110118751

繼續閱讀