Corner-based對象檢測算法三連之——開山鼻祖CornerNet

本文的閱讀前提是對對象檢測算法的基本概念有所了解。

概述

論文中提出的CornerNet,是一種新的對象檢測方法,其使用一個單一的卷積神經(jīng)網(wǎng)絡(luò)將對象的邊界框檢測定義為一對關(guān)鍵點,即左上角和右下角。通過將目標(biāo)作為成對的關(guān)鍵點進行檢測,算法消除了設(shè)計anchor box的需要,anchor box通常用于單階段檢測器。除了新方法外,論文還引入了corner pooling,一種新型的池化層,可以幫助網(wǎng)絡(luò)更好地定位對象的corner。實驗表明,在COCO的數(shù)據(jù)集上,CornerNet實現(xiàn)了42.1%的AP,超過了當(dāng)時所有的單階段探測器。

作者指出,基于corner的對象檢測方法的好處:
首先,box的中心位置更難定位,因為它取決于對象的所有4個邊,而定位一個corner只依賴于兩個邊,因此更容易,尤其是使用corner pooling,其編碼了一些顯式定義的先驗知識。個人認為,由于缺乏更多的來自對象本身的特征(兩個邊),這個也可能會造成大量的false positive box(這個也是CenterNet重點改進的方面)。其次,corner提供了一種更有效的方法來密集地表示所有box的空間:只需要O(wh)個corner來表示O(w^2h^2)個可能的anchor box。

個人感覺論文分支較多,不容易將所有內(nèi)容以連貫的思路概括起來,從而很難做到框架和細節(jié)兩抓。這里我嘗試使用算法在訓(xùn)練和測試時的流程圖(不是軟件工程中的流程圖)將所有內(nèi)容串起來,這樣我們可以跟著流程圖中的前處理、前向傳播、后處理和計算loss過程將所有的細節(jié)填充進去,從而達到掌握整個算法思想和細節(jié)的目的。

CornerNet的流程圖如下:

image1.jpg

下面是圖中標(biāo)出的每個點的具體描述:

1

訓(xùn)練

訓(xùn)練時,作者將原圖resize到511×511的大小,這樣經(jīng)過前向傳播降采樣(降采樣率固定),最終輸出的feature map分辨率為128x128。為了避免過擬合,作者采用一系列的數(shù)據(jù)增強方法:隨機反轉(zhuǎn)、隨機放縮、隨機裁剪和隨機顏色抖動,顏色抖動包括亮度、飽和度和對比度的隨機調(diào)整。最后,作者還對輸入應(yīng)用了PCA。

測試

作者沒有直接將圖像大小調(diào)整為固定的大小,而是保持圖像的原始分辨率。原始圖像和翻轉(zhuǎn)圖像都用于測試。

2

算法的backbone網(wǎng)絡(luò)使用的是hourglass network,但是在該網(wǎng)絡(luò)的基礎(chǔ)上進行了修改,由于我們的關(guān)注重點是在backbone后面box預(yù)測的相關(guān)操作上,所以關(guān)于修改的細節(jié)不再展開。

3

CornerNet只使用了backbone的最后一層輸出的特征映射作為后續(xù)訓(xùn)練或推理的輸入。

4'和4''

通常沒有局部的視覺特征能夠表示對象box corner的存在。為了確定一個像素是否為corner,作者創(chuàng)新性地提出corner pooling層,以確定top-left corner為例,其通過水平地向右查看(即max操作)對象的最頂部邊界,垂直地向底部查看最左側(cè)邊界,從而獲得表示top-left corner的特征,類似地,通過向上和向左觀察獲得表示bottom-right corner的特征。下圖所示為計算top-left corner特征的corner pooling:

image2.jpg

論文中,top-left corner模塊的具體結(jié)構(gòu),即圖1中的top-left corner prediction module的結(jié)構(gòu)如下圖所示,相應(yīng)的我們也可以得到bottom-right corner prediction module的結(jié)構(gòu)圖,此處不贅述。

image3.jpg

通過以上兩幅圖我們就能掌握corner pooling模塊的實現(xiàn)方式和具體結(jié)構(gòu),但是這里有個問題:

We thus propose corner pooling to better localize the corners by encoding explicit prior knowledge.

為什么corner pooling能夠幫助模型檢測到box的corner,為什作者說這是先驗經(jīng)驗,論文中并沒有詳細說明。我猜測這可能借鑒自傳統(tǒng)圖像處理算法(如邊緣或者角點檢測)的思想,現(xiàn)在介紹下我自己的理解。如下圖所示是一個含有數(shù)字2的灰度圖片的數(shù)值顯示(這是理想情況,一般背景都會含有噪聲):

image4.jpg

現(xiàn)在我們假設(shè)使用top-left corner pooling提取top-left corner的特征,我們會得到下面的特征圖:

image4.jpg

從上面的特征圖我們可以看出,黃色區(qū)域的特征非常明顯,那就是從左上角0位置不管是向右還是向下觀察(或右下),特征值都會發(fā)生劇烈變化,這其實就是角點檢測算法Harris檢測對象角點的思想(可以參考這篇文章)。 得到這樣的特征后再通過卷積層學(xué)習(xí),模型應(yīng)該就可以識別出431那個點附近就是數(shù)字2的top-left corner的特征。

5'和5''

此處以top-left heatmap進行說明,bottom-right的heatmap原理與此類似。heatmap分支輸出的top-left heatmap特征尺寸為:WxHxC,論文中實驗W和H為128,C為類別數(shù)量,沒有背景類別(背景被編碼到每層heatmap上)。每個通道上是二值掩碼數(shù)值,表示某個位置(如(w',h'))是否是一個corner,如果是,數(shù)值應(yīng)該盡量接近1,否則接近0,其實就是對特征映射的某個位置進行二分類預(yù)測,表示該點是某個對象的top-left(或bottom-right)corner,還是其他(其他包括可能是其他對象的corner或者背景)。heatmap是通過對輸入的每個通道上的特征值進行了逐像素的sigmoid計算得到。

6'和6''

由第5'和5''條預(yù)測的top-left和bottom-right heatmap都是獨立的corner,但最終要求輸出box,也就是corner對,所以模型要把各個單獨的top-left和bottom-right corner劃分成兩兩一對的組,即文中提出的grouping corners。最終哪兩個corner應(yīng)該是一組,這個當(dāng)然也得模型說了算,這就是embedding的作用,每個corner對應(yīng)一個一維的embedding,至于這個embedding代表什么不重要,只要它們能夠充分表示兩個corner是否應(yīng)該屬于一組。方法是計算兩個corner對應(yīng)embedding的距離(L1距離),小于一定閾值就認為屬于一組,否則就不是。這樣模型就可以通過embedding將獨立的corner劃分為corner組,即box。網(wǎng)絡(luò)輸出的embedding特征尺寸與heatmap相同:W*H*C,論文中W=H=128。

7'和7''

最終的corner預(yù)測是在backbone抽取的feature map上進行的,由于feature map存在降采樣的問題,因而在feature map上生成的corner位置坐標(biāo)與實際原圖中位置坐標(biāo)存在偏差,這種偏差在小尺寸目標(biāo)上更加嚴(yán)重,因此模型也會回歸預(yù)測一個offset用來糾正這種偏差,該輸出指示了在feature map上預(yù)測的corner坐標(biāo),映射回原圖中應(yīng)該糾正的偏移量。輸出的offset尺寸為WxHx1,所有對象的corner會共用一個offset,所以offset的通道數(shù)是1,當(dāng)然top-left corner的offset與bottom-right offset是并列的 。關(guān)于ground truth offset的生成,參考第11條,offset loss計算參考13條。

8

測試推理時,作者首先使用一個3×3最大池化層對corner heatmaps進行池化操作(使用kernel=3, stride=1,padding的方式池化,原h(huán)eatmap的尺寸不變),從而實現(xiàn)非極大抑制(NMS)抑制的作用。然后從heatmap中選擇score前100個top-left corner和100個bottom-right corner。對類別相同的兩兩top-left corner和bottom-right corner的embedding計算L1距離,距離大于0.5的corner對被丟棄,剩下的就是接受的corner對,也就是初步預(yù)測的box。

9

通過第8條生成的box還是原生的box,即坐標(biāo)準(zhǔn)確性還不夠,而且還沒有滿足對象檢測的box輸出要求:box坐標(biāo)、box score和box類別。
box坐標(biāo)調(diào)整:通過預(yù)測的corner offset調(diào)整box坐標(biāo)。
box score:將top-left和bottom-right corner的heatmap score的平均值作為最終的box score。
box類別:與box相關(guān)的corner heatmap的類別就是box的類別。

10

在第9條預(yù)測box的基礎(chǔ)上,作者再使用Soft NMS去除冗余的預(yù)測box,最終產(chǎn)生預(yù)測結(jié)果。

11

生成ground truth heatmap

依據(jù)原圖和boxes labels可以生成與backbone輸出尺寸和通道數(shù)相同的ground truth heatmap,即size為(W,H,C)。當(dāng)然應(yīng)該有兩個,分別是top-left ground truth heatmap和bottom-right ground truth heatmap。以top-left ground truth heatmap為例,原圖中類別C'的某個對象的top-left corner會對應(yīng)到降采樣后的heatmap的某個位置,假設(shè)為(W',H',C'),則該位置的值就應(yīng)該是1,其他位置上如果不是該類某個對象的top-left corner,值就是0。

生成ground truth embeddings

由于作者在文中提到:

The actual values of the embeddings are unimportant. Only the distances between the embeddings are used to group the corners.

所以無法生成與predicted embeddings對應(yīng)的ground truth embeddings用于loss計算,看過第13條就會發(fā)現(xiàn),只要從ground truth box中確定每個對象的embeddings對位置就可以了,即確定訓(xùn)練時哪對embeddings是屬于一個對象的,從而使用pull loss計算loss, 其他的使用push loss即可,具體內(nèi)容見第13條。

生成ground truth offsets

由于是固定輸入尺寸的,也知道網(wǎng)絡(luò)的降采樣因子,所以可以結(jié)合ground truth box的corner坐標(biāo)、降采樣因子和下面的公式計算出ground truth offset:

o_{k} = (Y_k, X_k) - (\lfloor \frac{Y_k}{n} \rfloor, \lfloor \frac{X_k}{n} \rfloor)

(Y_k, X_k)為對象k的corner坐標(biāo),n為降采樣因子

12

本條閱讀前提為第11條。

對預(yù)測的heatmap計算損失時,作者并沒有簡單地將其與ground truth heatmap做逐元素的差值,然后用MSE計算誤差。而是將heatmap預(yù)測看做是分類問題,使用交叉熵損失函數(shù)計算誤差,但是又沒有使用標(biāo)準(zhǔn)的交叉熵損失函數(shù),因為在計算損失時中存在兩個問題:其一,雖然groud truth corner位置附近的corner不是ground truth,但是由它們(top-left corner和bottom-right corner)組成的box與ground-truth box也有很大的IoU,那么直接根據(jù)ground truth將這些corner判定為徹底的negtive positive corner會造成模型費力地朝與ground truth heatmap相同的方向?qū)W習(xí),這有些矯枉過正,這里的問題和GoogLeNet中提出label smooth要解決的問題是類似的,但是作者沒有采用label smooth方法,而是對負樣本heatmap的損失進行平滑處理的方法,即懲罰衰減(penalty reduction),具體方法下面會介紹;其二,由于一張圖片中包含的對象是很少的,這對于heatmap來說,就是每個對象的heatmap中大部分位置都是0,只有極少數(shù)幾個位置是1,這其實就是典型的正負樣本不平衡,為了解決這個問題作者借鑒了Focal loss,在Focal loss基礎(chǔ)上結(jié)合了懲罰衰減策略,得出下面的heatmap loss公式:

L_{det} = \frac{-1}{N} \sum_{c=1}^{C} \sum_{i=1}^{H} \sum_{j=1}^{W} \left\{ \begin{array}{rcl} (1-p_{cij})^\alpha log(p_{cij}), y_{cij}= 1 \\ (1-y_{cij})^\beta (p_{cij})^\alpha log(1-p_{cij}), otherwise \end{array}\right.
其中,y_{cij}就是由下面的生成方法產(chǎn)生的懲罰衰減(penalty reduction)系數(shù),當(dāng)y_{cij}=1時表示該位置為groud truth corner所在的位置,p_{cij}就是heatmap中第c個通道(類別)的(j,i)位置的score值。論文中\alpha=2, \beta=4。

下面介紹懲罰衰減(penalty reduction)策略:
對groud truth heatmap附近的heatmap loss進行平滑處理,需要處理兩個問題:一個是多近的附近稱為附近,即對groud truth heatmap周圍多大范圍內(nèi)的負樣本heatmap loss進行平滑處理,超過范圍的就應(yīng)該使用原始loss,這個周圍應(yīng)該是個圓周范圍,那么這里就是確定圓周半徑的問題;另一個問題是進行怎樣的懲罰衰減,直觀地說,當(dāng)然是越靠近groud truth heatmap懲罰越小(即懲罰衰減力度越大),越遠離懲罰越大,直到恢復(fù)為原始loss。將groud truth heatmap作為中心,從中心一直遠離,這是一個衰減力度從1減少到0的過程。這個衰減應(yīng)該與中心的距離有關(guān),但是具體地應(yīng)該是以線性方式減少,還是高階非線性方式,或者是指數(shù)方式?

  • 圓周半徑
    作者根據(jù)對象的大小來確定半徑,方法是確保半徑內(nèi)的任意一對corner(top-left和bottom-right)生成的box與ground-truth box的IoU至少是t(論文中將t設(shè)置為0.7)。
  • 確定懲罰衰減方式
    確定了半徑,懲罰的減少量由非標(biāo)準(zhǔn)化的二維高斯函數(shù)e^{\frac{x^2+y^2}{2 \sigma^2}}確定(萬能的高斯),其中心就是ground truth heatmap的位置,x^2+y^2其實就是周圍某個點到中心距離的平方,σ為半徑的1/3。

13

論文中只計算與ground truth corner相同位置的embedding的loss,如若不然,任意兩個embedding都計算loss的話,計算量會很大。舉例,假如一個圖片中有5個相同類別對象,即有5個ground truth box,那么在預(yù)測的top-left embedding中會有5個位置的embedding會被考慮計算loss,同樣,在預(yù)測的bottom-right embedding中也會有5個位置的embedding會被考慮計算loss。5個top-left的embedding和5個bottom-right embedding會進行兩兩配對,從而產(chǎn)生25對embedding,并計算loss。其中,屬于同一對象的5對embedding(即true positive embedding pairs)的loss會使用pull loss公式計算,因為它們應(yīng)該盡量相似;剩余的都不應(yīng)該是同一對象的兩個corner的embedding(即false positive embedding pairs),應(yīng)使用push loss公式計算,因為它們應(yīng)該盡量相異(即應(yīng)該遠離),此處有些人臉識別中contrastive loss的思想, loss公式如下,關(guān)于這個loss為什么有效,可以參考這篇博客。注意,此處每個配對的embedding應(yīng)該屬于同一類別,即它們位于同一embedding通道上,不同類別的embedding對計算誤差也沒有意義。
L_{pull} = \frac{1}{N} \sum_{k=1}^{N} [(e_{tk} - e_k) ^2 + (e_{bk} - e_k) ^2]

L_{push} = \frac{1}{N(N-1)} \sum_{k=1}^{N} \sum_{j=1,j \ne k}^{N} \max(0, \Delta-|e_k - e_j|)
其中,e_{k}e_{tk}e_{bk}的平均,論文中\Delta為1。

14

作者使用smooth L_1 Loss計算offset的損失,公式如下:

L_{off} = \frac{1}{N} \sum_{k=1}^{N}SmoothL1Loss(o_k, \hat{o}_k)
其中,o_k為第11條計算的groud truth offset, \hat{o}_k為模型預(yù)測的offset。與embedding計算損失一樣,只對groud truth corner位置的offset計算loss。

15

結(jié)合第12、13和14條中的Loss得到最終的綜合Loss:
L = L_{det} + \alpha L_{pull} + \beta L_{push} + \gamma L_{off}
其中,\alpha、\beta\gamma是各個任務(wù)Loss權(quán)重,論文中三個參數(shù)分別為0.1、0.1和1。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容