CornerNet 算法筆記

論文名稱:CornerNet: Detecting Objects as Paired Keypointsgit

論文連接:https://arxiv.org/abs/1808.01244github

代碼連接:https://github.com/princeton-vl/CornerNet算法


簡介

這篇文章是ECCV2018的一篇目標檢測論文,該論文的創新之處在於使用Keypoints代替原來的anchor思想進行目標檢測,提出檢測目標左上點和右下點來肯定一個邊界框,提出一個新的池化方法:corner pooling,在mscoco數據集上達到42.2%的ap,精度上是當時的單階段目標檢測器的state of the art,可是速度略慢,大約1fps(論文爲Titan X 244ms/f),沒法知足工程需求。網絡

相對於基於anchor檢測器創新意義有:架構

  1. anchor數量巨大,形成訓練正負樣本不均衡(anchor機制解決方式爲難例挖掘,好比ohem,focal loss)
  2. anchor超參巨多,數量,大小,寬高比等等(好比yolo多尺度聚類anchor,ssd的多尺度aspect ratio)

算法總體架構

 

 如上圖fig1,通過特徵提取主幹網絡(主幹網絡爲Hourglass-104)後分爲兩個分支(兩個分支分別接前面提到的corner pooling,隨後細談),一個分支生成目標左上點熱力圖,一個分支生成目標右下點熱力圖,而此時兩個熱力圖並無創建聯繫,所以沒法肯定兩點是夠屬於同一目標,所以兩分支同時生成embeddings,經過判斷兩個embedding vector的類似性肯定同一物體(距離小於某一閾值則劃爲同一目標)。函數

 

 如上圖fig4,圖片首先通過1個7×7的卷積層將輸入圖像尺寸縮小爲原來的1/4(論文中輸入圖像大小是511×511,縮小後獲得128×128大小的輸出)。學習

而後通過hourglass-104提取特徵,該網絡經過串聯多個hourglass module組成(Figure4中的hourglass network由2個hourglass module組成),每一個hourglass module都是先經過一系列的降採樣操做縮小輸入的大小,而後經過上採樣恢復到輸入圖像大小,所以該部分的輸出特徵圖大小仍是128×128,整個hourglass network的深度是104層。測試

hourglass module後會有兩個輸出分支模塊,分別表示左上角點預測分支和右下角點預測分支,每一個分支模塊包含一個corner pooling層和3個輸出:heatmaps、embeddings和offsets。heatmaps是輸出預測角點信息,能夠用維度爲CHW的特徵圖表示,其中C表示目標的類別(無背景類),每一個點的預測值爲0到1,表示該點是角點的分數;embeddings用來找到屬於同一個目標的左上角角點和右下角角點;offsets用來對預測框作微調,與anchor機制中的offset有區別,前者用來微調特徵圖映射回原圖後的取整量化偏差,後者用來表示ground true與anchor的偏移。優化

Headmaps

 

CornerNet的第一個輸出headmap用來預測角點的位置。公式(1)是針對角點預測(headmaps)的損失函數,是修改後的focal loss。.net

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並不重合,可是該預測框基本框住了目標,所以是有用的預測框,因此要有必定權重的損失返回,這就是爲何要對不一樣負樣本點的損失函數採起不一樣權重值的緣由。

 

Embeddings

 

 CornerNet的第二個輸出是embeddings,對應文章中group corner的內容。前面介紹了關於角點的檢測,在那部分中對角點的預測都是獨立的,不涉及一個目標的一對角點的概念,所以如何找到一個目標的兩個角點就是第三個輸出embedding作的工做。這部分是受associative embedding那篇文章的啓發,簡而言之就是基於不一樣角點的embedding vector之間的距離找到每一個目標的一對角點,若是一個左上角角點和一個右下角角點屬於同一個目標,那麼兩者的embedding vector之間的距離應該很小。

embedding這部分的訓練是經過兩個損失函數實現的,etk表示屬於k類目標的左上角角點的embedding vector,ebk表示屬於k類目標的右下角角點的embedding vector,ek表示etk和ebk的均值。公式(4)用來縮小屬於同一個目標(k類目標)的兩個角點的embedding vector(etk和ebk)距離。公式(5)用來擴大不屬於同一個目標的兩個角點的embedding vector距離。

Offsets

 

 

 CornerNet的第三個輸出是offset,這個值和目標檢測算法中預測的offset相似卻徹底不同,說相似是由於都是偏置信息,說不同是由於在目標檢測算法中預測的offset是表示預測框和anchor之間的偏置,而這裏的offset是表示在取整計算時丟失的精度信息,如上式(2),其中(xk,yk)表示第k個角點的原圖座標值,n表明下采樣因子,ok表示特徵圖縮放回原圖後與原gt框的精度損失。而後經過公式(3)的smooth L1損失函數監督學習該參數,和常見的目標檢測算法中的迴歸支路相似。

Corner pooling

 

CornerNet是預測左上角和右下角兩個角點,可是這兩個角點在不一樣目標上沒有相同規律可循,若是採用普通池化操做,那麼在訓練預測角點支路時會比較困難。做者認爲左上角角點的右邊有目標頂端的特徵信息(第一張圖的頭頂),左上角角點的下邊有目標左側的特徵信息(第一張圖的手),所以若是左上角角點通過池化操做後能有這兩個信息,那麼就有利於該點的預測。Figure3是針對左上角點作corner pooling的示意圖,該層有2個輸入特徵圖,特徵圖的寬高分別用W和H表示,假設接下來要對圖中紅色點(座標假設是(i,j))作corner pooling,那麼就計算(i,j)到(i,H)的最大值(對應Figure3上面第二個圖),相似於找到Figure2中第一張圖的左側手信息;同時計算(i,j)到(W,j)的最大值(對應Figure3下面第二個圖),相似於找到Figure2中第一張圖的頭頂信息,而後將這兩個最大值相加獲得(i,j)點的值(對應Figure3最後一個圖的藍色點)。右下角點的corner pooling操做相似,只不過計算最大值變成從(0,j)到(i,j)和從(i,0)到(i,j)。

 

Figure6也是針對左上角點作corner pooling的示意圖,是Figure3的具體數值計算例子,該圖一共計算了4個點的corner pooling結果。

Prediction module

 

Figure7是Figure4中預測模塊的詳細結構,該結構包括corner pooling模塊和預測輸出模塊兩部分,corner pooling模塊採用了相似residual block的形式,有一個skip connection,虛線框部分執行的就是corner pooling操做,也就是Figure6的操做。

Loss function

 

Ldet爲角點損失,Lpull、Lpush爲embedding損失,Loff爲offset損失

其中α爲0.1,β爲0.1,γ爲1,損失函數優化方式爲Adam

Testing details

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

二、計算左上角和右下角角點的embedding vector的距離時採用L1範數,距離大於0.5或者兩個點來自不一樣類別的目標的都不能構成一對,檢測分數是兩個角點的平均分數。

三、測試圖像採用0值填充方式獲得指定大小做爲網絡的輸入,而不是採用resize,另外同時測試圖像的水平翻轉圖並融合兩者的結果。

四、最後經過soft-nms操做去除冗餘框,只保留前100個預測框。

Eexperiment

 

上表Table1是關因而否添加corner pooling的消融實驗,能夠看出第二行(添加)提高效果明顯,尤爲在大目標上

 

上表Table2是關於不一樣位置負樣本採起不一樣權重的損失函數的效果,第一行爲無懲罰減小機制,第二行爲固定半徑,第三行爲採用目標計算獲得的半徑值,效果提高明顯,尤爲是在中、大目標上。

 

 上表Table3是關於corner pooling分別對左上角點預測和右下角點預測的影響。

 

上表Table4是關於主幹網絡選擇的消融實驗,該實驗分別以fpn爲主幹網絡+corner檢測方式,hourglass-104爲主幹網絡+anchor檢測方式,hourglass-104爲主幹網絡+corner檢測方式,最後說明本文組合方式效果最佳。

 

上表Table5將cornernet分別與RetinaNet、Cascade R-CNN、IoU-Net在高iou閾值下進行ap對比,證實「好的檢測期的邊界框與gt更貼近」

 

上表Table6錯誤分析。第一行是這篇文章的算法結果;第二行是將角點預測結果用ground truth代替,能夠看到提高很是大;第三行是進一步將偏置用ground truth代替,相比之下提高會小不少。這說明目前該算法的瓶頸主要在於角點預測

 

上表Table7是connerNet和其餘優秀目標檢測算法的效果對比。

總結

本論文主要提出使用一對關鍵點(左上角點,右下角點)進行目標檢測,並取得很是好的檢測精度,由此掀起anchor-free熱潮,博主在寫此篇博文時cornernet已經被deprecated,取而代之的仍是普林斯頓大學團隊提出的cornernet-lite(https://arxiv.org/abs/1904.08900),該論文在速度和精度上均對cornernet進行提高,另外一篇同期論文(2019.04)centernet(https://arxiv.org/abs/1904.08189)提出Keypoint Triplets思想也對cornernet進行優化,達到目前單階段目標檢測器最高精度(47.0%)。接下來我將對以上兩篇論文進行總結,並有可能分析cornernet系列的源碼實現細節。本文參考:https://blog.csdn.net/u014380165/article/details/83032273

相關文章
相關標籤/搜索