CornerNet 算法筆記

CornerNet 算法筆記

論文:CornerNet: Detecting Objects as Paired Keypoints
論文連接:https://arxiv.org/abs/1808.01244
代碼連接:https://github.com/umich-vl/CornerNetgit

這篇發表在ECCV2018上的目標檢測文章給人一種眼前一亮的感受,簡單說一下幾個比較吸引個人點:一、將目標檢測問題看成關鍵點檢測問題來解決,也就是經過檢測目標框的左上角和右下角兩個關鍵點獲得預測框,所以CornerNet算法中沒有anchor的概念,這種作法在目標檢測領域是比較創新的並且可以取得不錯效果是很難的。二、整個檢測網絡的訓練是從頭開始的,並不基於預訓練的分類模型,這使得用戶可以自由設計特徵提取網絡,不用受預訓練模型的限制。github

咱們知道目前大部分經常使用的目標檢測算法都是基於anchor的,好比Faster RCNN系列,SSD,YOLO(v二、v3)等,引入anchor後檢測效果提高確實比較明顯(好比YOLO v1和YOLO v2),可是引入anchor的缺點在於:一、正負樣本不均衡。大部分檢測算法的anchor數量都成千上萬,可是一張圖中的目標數量並無那麼多,這就致使正樣本數量會遠遠小於負樣本,所以有了對負樣本作欠採樣以及focal loss等算法來解決這個問題。二、引入更多的超參數,好比anchor的數量、大小和寬高比等。所以這篇不採用anchor卻能有不錯效果的CornerNet就省去了這幾個額外的操做,確實是很是有意思的做品。算法

CornerNet算法總體結構如Figure4所示。
首先1個7×7的卷積層將輸入圖像尺寸縮小爲原來的1/4(論文中輸入圖像大小是511×511,縮小後獲得128×128大小的輸出)。
而後通過特徵提取網絡(backbone network)提取特徵,該網絡採用hourglass network,該網絡經過串聯多個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表示目標的類別(注意:沒有背景類),這個特徵圖的每一個通道都是一個mask,mask的每一個值(範圍爲0到1,論文中寫的該mask是binary mask,也就是0或1,我的感受是筆誤,預測值應該是0到1,不然後面公式1計算損失函數時就沒有意思了)表示該點是角點的分數;embeddings用來對預測的corner點作group,也就是找到屬於同一個目標的左上角角點和右下角角點;offsets用來對預測框作微調,這是由於從輸入圖像中的點映射到特徵圖時有量化偏差,offsets就是用來輸出這些偏差信息。
在這裏插入圖片描述markdown

接下來分別看看這3個輸出和corner pooling的含義。網絡

CornerNet的第一個輸出是headmaps,也就是預測角點的位置。
公式1是針對角點預測(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有較大的重疊面積,如Figure5所示。
在這裏插入圖片描述函數

Figure5是關於對不一樣負樣本點的損失函數採起不一樣權重值的緣由。紅色實線框是ground truth;橘色圓圈是根據ground truth的左上角角點、右下角角點和設定的半徑值畫出來的,半徑是根據圓圈內的角點組成的框和ground truth的IOU值大於0.7而設定的,圓圈內的點的數值是以圓心往外呈二維的高斯分佈;白色虛線是一個預測框,能夠看出這個預測框的兩個角點和ground truth並不重合,可是該預測框基本框住了目標,所以是有用的預測框,因此要有必定權重的損失返回,這就是爲何要對不一樣負樣本點的損失函數採起不一樣權重值的緣由。
在這裏插入圖片描述post

CornerNet的第二個輸出是offset,這個值和目標檢測算法中預測的offset相似卻徹底不同,說相似是由於都是偏置信息,說不同是由於在目標檢測算法中預測的offset是表示預測框和anchor之間的偏置,而這裏的offset是表示在取整計算時丟失的精度信息,也就是公式2所表達的內容。
在這裏插入圖片描述
咱們知道從輸入圖像到特徵圖之間會有尺寸縮小,假設縮小倍數是n,那麼輸入圖像上的(x,y)點對應到特徵圖上就以下式子
在這裏插入圖片描述
式子中的符號是向下取整,取整會帶來精度丟失,這尤爲影響小尺寸目標的迴歸,Faster RCNN中的 ROI Pooling也是有相似的精度丟失問題。因此經過公式2計算offset,而後經過公式3的smooth L1損失函數監督學習該參數,和常見的目標檢測算法中的迴歸支路相似。
在這裏插入圖片描述學習

CornerNet的第三個輸出是embedding,對應文章中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距離。
在這裏插入圖片描述atom

最後一部分是corner pooling。首先看看爲何要引入corner pooling,如圖Figure2所示。由於CornerNet是預測左上角和右下角兩個角點,可是這兩個角點在不一樣目標上沒有相同規律可循,若是採用普通池化操做,那麼在訓練預測角點支路時會比較困難。考慮到左上角角點的右邊有目標頂端的特徵信息(第一張圖的頭頂),左上角角點的下邊有目標左側的特徵信息(第一張圖的手),所以若是左上角角點通過池化操做後能有這兩個信息,那麼就有利於該點的預測,這就有了corner pooling。
在這裏插入圖片描述

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結果。第二列的數值計算和Figure3介紹的同樣,好比第一行第一個圖中的0值點,計算該點的最大值時是計算該點和其右側的值爲2的點的最大值,所以獲得的就是2。
在這裏插入圖片描述

Figure7是Figure4中預測模塊的詳細結構,該結構包括corner pooling模塊和預測輸出模塊兩部分,corner pooling模塊採用了相似residual block的形式,有一個skip connection,虛線框部分執行的就是corner pooling操做,也就是Figure6的操做,這樣整個corner pooling操做就介紹完了。
在這裏插入圖片描述

模型測試時候的幾個細節:一、在獲得預測角點後,會對這些角點作NMS操做,選擇前100個左上角角點和100個右下角角點。二、計算左上角和右下角角點的embedding vector的距離時採用L1範數,距離大於0.5或者兩個點來自不一樣類別的目標的都不能構成一對。三、測試圖像採用0值填充方式獲得指定大小做爲網絡的輸入,而不是採用resize,另外同時測試圖像的水平翻轉圖並融合兩者的結果。四、最後經過soft-nms操做去除冗餘框,只保留前100個預測框。

實驗結果:
Table1是關於conner pooling的對比實驗,能夠看出添加conner pooling(第二行)對效果的提高比較明顯,這種提高尤爲在目標尺度比較大的數據中表現明顯。
在這裏插入圖片描述

Table2是關於對不一樣位置負樣本採起不一樣權重的損失函數的效果。第一行是不採用這種策略的效果;第二行是採用固定半徑值的效果,能夠看出提高比較明顯;第三行是採用基於目標計算獲得的半徑值的效果(這篇文章所採用的),效果獲得進一步提高。
在這裏插入圖片描述

Table3是關於這篇文章的幾個創新點效果。第一行是這篇文章的算法結果;第二行是將角點預測結果用ground truth代替,能夠看到提高很是大;第三行是進一步將偏置用ground truth代替,相比之下提高會小不少。這說明目前該算法的瓶頸主要在於角點預測。
在這裏插入圖片描述

Table4是connerNet和其餘目標檢測算法的效果對比,能夠看出模型效果仍是很不錯的。
在這裏插入圖片描述

整篇文章看下來收穫仍是比較多的,但願目標檢測領域可以繼續百花齊放。不過比較好奇算法的速度,在實驗部分沒有看到對比。

相關文章
相關標籤/搜索