目標檢測領域最近有個較新的方向:基於關鍵點進行目標物體檢測。該策略的表明算法爲:CornerNet和CenterNet。因爲本人工做特性,對網絡的實時性要求比較高,所以多用YoLov3及其變體。而就在今天下午得知,基於CornerNet改進的CornerNet-Squeeze網絡竟然在實時性和精度上都超越了YoLov3,我仍是蠻激動的,故趁此機會學習下該類檢測算法的原理。git
cornerNer論文連接:https://arxiv.org/pdf/1808.01244.pdf
github:https://github.com/umich-vl/CornerNet
CenterNet論文連接:https://arxiv.org/abs/1904.08189
github:https://github.com/Duankaiwen/CenterNet
CornerNe-Lite論文連接: https://arxiv.org/abs/1904.08900
github: https://github.com/princeton-vl/CornerNet-Litegithub
所謂基於關鍵點進行目標檢測,其實就是使用one-stage網絡將目標邊界框檢測爲一對關鍵點(即邊界框的左上角和右下角)。經過將目標檢測爲成對關鍵點,就可消除現有的one-stage檢測網絡中對一組anchors的須要,這個最近火熱的anchor-free也是不謀而合。接下來,先簡單介紹下CornetNet和CenterNet這兩個基於特徵點的目標檢測網絡。最後對CornerNet-Squeeze作個簡單介紹!算法
CornerNet網絡的總體思路是,首先經過Hourglass Network網絡進行特徵提取,緊接着將網絡獲得的特徵輸入到兩個模塊:Top-left Corner pooling
和Bottom-right Corner pooling
提取關鍵點的特徵,對於每一個Corner Pooling模塊都會進行目標框的左上角關鍵點和右下角關鍵點的類別分類(Heatmaps
),並找到每一個目標的一對關鍵點(Embeddings
),以及減小基於座標回算目標目標位置時的偏置(offsets
)。網絡的總體結構圖以下:markdown
很顯然,CornerNet的核心是四個部分:網絡
兩個Corner Pooling
下圖展現的是Top-left corner pooling的示意圖,爲了使得關鍵點的特徵可以表徵左上角和右下角關鍵點所包含的目標區域的特徵,做者提出了以下所示的corner pooling的策略,好比下圖所示,爲求左上角關鍵點特徵,須要求當前關鍵點同一行中的左邊區域的最大值,和同一列中的下面區域的最大值,並將兩個最大值相加纔是當前位置的左上角關鍵點特徵。ide
Heatmaps模塊
經過Heatmaps模塊,網絡會預測每個關鍵點所屬於的類別,該過程當中使用的損失函數以下:函數
上述公式是針對角點預測(headmaps)的損失函數,總體上是改良版的focal loss。幾個參數的含義:pcij表示預測的heatmaps在第c個通道(類別c)的(i,j)位置的值,ycij表示對應位置的ground truth,N表示目標的數量。ycij=1時候的損失函數容易理解,就是focal loss,α參數用來控制難易分類樣本的損失權重;ycij等於其餘值時表示(i,j)點不是類別c的目標角點,照理說此時ycij應該是0(大部分算法都是這樣處理的),可是這裏ycij不是0,而是用基於ground truth角點的高斯分佈計算獲得,所以距離ground truth比較近的(i,j)點的ycij值接近1,這部分經過β參數控制權重,這是和focal loss的差異。爲何對不一樣的負樣本點用不一樣權重的損失函數呢?這是由於靠近ground truth的誤檢角點組成的預測框仍會和ground truth有較大的重疊面積,以下圖所示所示。
圖中,紅色實線框是ground truth;橘色圓圈是根據ground truth的左上角角點、右下角角點和設定的半徑值畫出來的,半徑是根據圓圈內的角點組成的框和ground truth的IOU值大於0.7而設定的,圓圈內的點的數值是以圓心往外呈二維的高斯分佈;白色虛線是一個預測框,能夠看出這個預測框的兩個角點和ground truth並不重合,可是該預測框基本框住了目標,所以是有用的預測框,因此要有必定權重的損失返回,這就是爲何要對不一樣負樣本點的損失函數採起不一樣權重值的緣由。post
embedding這部分的訓練是經過兩個損失函數實現的,etk表示屬於k類目標的左上角角點的embedding vector,ebk表示屬於k類目標的右下角關鍵點的embedding vector,ek表示etk和ebk的均值。公式4用來縮小屬於同一個目標(k類目標)的兩個關鍵點的embedding vector(etk和ebk)距離。公式5用來擴大不屬於同一個目標的兩個角點的embedding vector距離。性能
最終,以下圖所示,上半支路的網絡結果以下所示,網絡最終是由兩條支路組成的。學習
CenterNet網絡主要是基於CornerNet網絡存在的問題,而提出的基於關鍵點目標檢測的網絡。其實現了目前爲止在one-stage系類算法中最高的MAP。CenterNet的做者發現,CornerNet是經過檢測物體的左上角點和右下角點來肯定目標,但在此過程當中CornetNet使用corner pooling僅僅可以提取到目標邊緣的特徵,而致使CornetNet會產生不少的誤檢。基於此,CenterNet利用關鍵點三元組
即中心點、左上角關鍵點和右下角關鍵點
三個關鍵點而不是兩個點來肯定一個目標,使得網絡可以獲取到目標內部的特徵。而CornerNet在論文中也說道了,約束其網絡性能最重要的部分是關鍵點的提取,所以CenterNet提出了Center Pooling
和cascade corner Pooling
用來更好的提取本文提出的三個關鍵點。
三元組預測
以下圖所示,網絡經過 cascade corner pooling獲得左上角,右下角的關鍵點類別。並經過center pooling獲得中心點的關鍵點類別。隨後經過 offsets 將三個關鍵點位置儘量精確的映射到輸入圖片的對應位置,最後經過 embedings 判斷三個點是否屬於同一個目標。
在預測中心點特徵時,對每一個預測框定義一箇中心區域,經過判斷每一個目標框的中心區域是否含有中心點,如有則保留,而且此時預測框的 confidence 爲中心點,左上角關鍵點和右下角關鍵點的confidence的平均,若無則去除。而很顯然,對於每一個預測框的中心區域,咱們須要其和預測框的大小進行適應,由於中心區面積太小會使得小尺度的錯誤預測框沒法被去除,而中心區過大會致使大尺度的錯誤預測框沒法被去除。所以做者提出以下策略:
如上圖所示,當預測框的尺寸較大時,咱們獲得的中心區域面積也會變小,而與之對應的,當預測框的尺寸較小時,中心區域的面積也會變大。
Center Pooling
做者基於Corner Pooling的系列思想,提出了Center Pooling的思想,使得網絡提取到的中心點特徵可以更好的表徵目標物體。
一個物體的中心並不必定含有很強的,易於區分於其餘類別的語義信息。例如,一我的的頭部含有很強的,易於區分於其餘類別的語義信息,可是其中心每每位於人的中部。咱們提出了center pooling 來豐富中心點特徵。上圖爲該方法原理,center pooling提取中心點水平方向和垂直方向的最大值並相加,以此給中心點提供所處位置之外的信息。這一操做使中心點有機會得到更易於區分於其餘類別的語義信息。Center pooling 可經過不一樣方向上的 corner pooling 的組合實現。一個水平方向上的取最大值操做可由 left pooling 和 right pooling經過串聯實現,同理,一個垂直方向上的取最大值操做可由 top pooling 和 bottom pooling經過串聯實現,如圖6所示。
通常狀況下角點位於物體外部,所處位置並不含有關聯物體的語義信息,這爲角點的檢測帶來了困難。上圖(b) 爲傳統作法,稱爲 corner pooling。它提取物體邊界最大值並相加,該方法只能提供關聯物體邊緣語義信息,對於更加豐富的物體內部語義信息則很難提取到。上圖©爲cascade corner pooling 原理,它首先提取物體邊界最大值,而後在邊界最大值處繼續向內部(圖中沿虛線方向)提取提最大值,並與邊界最大值相加,以此給角點特徵提供更加豐富的關聯物體語義信息。Cascade corner pooling 也可經過不一樣方向上的 corner pooling 的組合實現,如圖8 所示,圖8展現了cascade left corner pooling 原理。
最終,CenterNet在CornerNet的基礎上增長了中心點的預測,以及修改了關鍵點特徵的提取方式,大大減少了網絡的誤檢,而且實現了one-stage系列算法中的最好效果。
普林斯頓大學在4月19號提出了兩種更高效的基於關鍵點的目標檢測算法,分別爲:CornetNet-Saccade
和CornetNet-Squeeze
,若將兩種策略結合則稱爲CornerNet-Lite
。
如上圖所示,CornerNet-Squeeze專一於速度,但其在性能和速度上都超越了YOLOv3,而CornerNet-Saccade專一於精度。
如上圖所示,咱們發現CornetNet-Saccade
和CornetNet-Squeeze
確實很優秀。
如下是Cver對這兩個網絡的介紹,我的感受寫的很好,我就不造輪子了:
最終我最感興趣的網絡CornerNet-Squeeze和YOLOv3進行對比,達到了以下圖所示的效果。
然而,就在我學習並總結這篇文章的過程當中,我發現CornerNet-Squeeze是基於CornerNet改進的,但正如上文中介紹CenterNet的時候提到過的CornerNet所具備的那些弊端,我總以爲CornerNet-Squeeze在誤檢的部分不必定會很優秀,因此接下來就是看源碼階段了,但願CornerNet-Squeeze可以不負我望哈~
參考文獻:
https://mp.weixin.qq.com/s/lk268kc55Lgz1d_21zg26A
https://blog.csdn.net/u014380165/article/details/83032273
https://mp.weixin.qq.com/s/xy1WWl2rNvGAXnqIJCy-Mg