不要anchor,不要nms,CenterNet《Objects as Points》論文解讀
用姿態檢測中的關鍵點檢測的思路來做物體檢測,去掉anchor,去掉nms,很贊!而且開源了程式碼(放在最後了)!
摘要:
物體檢測通常是在影象上把物體用座標軸對齊的框把物體框出來。目前,大多數的成功的物體檢測方法都是先得到一個物體潛在位置的列表,然後一個一個的去區分是不是物體,屬於哪個類。但這種方式非常的低效,而且需要額外的後處理。這篇文章提出了一個新的方案,把物體建模為一個點—包圍框的中心點。我們使用關鍵點估計的方法來得到中心點,然後再回歸得到物體的其他屬性,如尺寸,3D的位置,方向,姿態等。我們這個基於中心點的方法,叫做centernet,是端到端可微分的,比基於包圍框的檢測方法更快,更準確。
1. 介紹
這個方法把物體表示為包圍框的中心點,物體的其他屬性,比如尺寸,維度,3D的擴充套件資訊,方向,姿態等等,都可以透過中心點位置的影象特徵來回歸得到。這樣,物體檢測就變成了一個標準的關鍵點檢測的任務。我們只要把影象送到一個全卷積網路中,得到特徵圖,這個特徵圖把他當成一個熱力圖,熱力圖上的峰值點就是對應的物體中心。峰值點的影象特徵用來預測框的寬和高。整個網路是個標準的監督學習的框架,推理的時候只要一個簡單的前向傳播就好了,也不要NMS了。看下圖2:
這個方法很通用,很容易擴充套件。我們還可以用在3D物體檢測,多人的姿態估計,只要對中心點多加幾個屬性輸出就可以了。比如,對於3D,我們多預測一個深度,對於姿態的預測,我們增加預測幾個關節點相對於中心點的偏移就可以了。
這個方法很簡單,所以速度快。使用resnet18加一個上取樣層,我們在coco上的可以達到142FPS,AP為28。1%,如果使用仔細設計過的關鍵點預測網路DLA-34,coco上AP能到37。4%速度52FPS。如果使用Hourglass-104,多尺度測試,coco上AP能達到45。1%,1。4FPS。具體效能看下圖:
2. 相關的工作
基於區域分類的物體檢測
RCNN FastRCNN
使用隱式anchor的物體檢測
FasterRCNN,CenterNet和這個有點像,但是又有幾個差別:1、CenterNet的“anchor”就是一個點,只有位置資訊,不存在overlap之類的東西,因此也不需要透過overlap的閾值來區分前景和背景。2、對於每個物體,我們只有一個正樣本的“anchor”,因此,也就不需要NMS了。3、CenterNet輸出的是一個比較大的解析度的特徵圖(stride為4),通常我們的stride都是16,因此,也就不需要多個anchor了。
使用關鍵點預測的物體檢測
CornerNet ExtremeNet
單目3D物體檢測
Deep3Dbox 3DRCNN
3. 準備工作
對於一張H×W的影象,我們透過網路之後,會得到一個特徵圖,也就是熱力圖,尺寸為H/R x W/R x C,值域為[0, 1],其中C為類別的數量,R就是stride值。熱力圖中Y=1的地方就是關鍵點,Y=0的地方就是背景。那麼,ground truth怎麼生成呢,我們透過高斯核來生成,如果兩個物體的高斯分佈有重合的地方,就加起來。我們可以透過focal loss來訓練這個關鍵點,也就是這個點上有沒有物體的預測。
其中,α和β是focal loss中的超引數,這裡使用的是α=2,β=4。
為了彌補下采樣造成的誤差,我們還會為中心點預測一個區域性的offset,所有的類別C共享相同的offset,這個offset使用L1的loss來訓練:
使用這個loss的時候,只要計算關鍵點的位置p就可以了,其他的點不用計算。
4. 把物體看做點
我們圖上的第k個物體,它的類別為
,它的包圍框為
,那麼,它的中心點
,我們為每個物體k,預測一個尺寸
,我們為所有的類別預測一個尺寸,我們還是使用L1的loss:
我們不對尺度進行歸一化,我們直接用座標值,我們使用λsize對loss做一個尺度的縮放,整體的loss為:
我們把λsize設為0。1,把λoff設為1。這樣的話,需要對每個位置預測C+4個輸出,圖4為整體的輸出:
從點轉換為包圍框
在推理的時候,首先在熱力圖上,為每個類別獨立的提取峰值點,如果一個點比它的8個相鄰點的值都大,那麼我們就把它提取出來,然後保留前100個,我們把這個值作為檢測的置信度,然後在這個位置生成一個包圍框:
其中,
是預測出來的中心點的位置,
是預測出來的尺寸,這樣的話,就不需要做基於IOU的nms了,峰之點的提取就相當於nms了,可以很高效的使用3x3的max pooling來實現。
4.1 3D檢測
3D檢測需要多輸出幾個量,深度,3D的尺寸,方向。深度不好直接回歸,需要轉換一下,
,其中,σ是sigmoid函式,3D的尺寸比2D多一個,和深度一樣,都使用L1的loss,方向預設是一個標量,比較難迴歸,我們把方向編碼為8個標量,每個bin裡面4個標量,對於每個bin,用softmax來分類,在bin裡面,迴歸剩餘的兩個標量。
4.2 人體姿態檢測
基本差不多。
5. 實現細節
作者這裡實驗了4種網路:resnet18,resnet101,DLA-34,Hourglass-104,使用resnet和DLA的時候,稍微修改了一下,用上了deformable卷積層。不同網路的實驗資料如下:
訓練
輸入解析度為512x512,輸出解析度為128x128,資料增加用了隨機翻轉,隨機縮放,隨機裁剪和顏色抖動,最佳化器為Adam。
6. 實驗
6.1 物體檢測
直接上圖,總之就是一句話,比我快的沒我準,比我準的沒我快:
6.1.1 附加實驗
如果比較倒黴的話,兩個物體會落在一箇中心點上,這樣的話,這兩個物體就只能檢測出來一個,我們研究了一下這種情況。
中心點衝突
在coco資料集中,再stride為4的情況下,有614對的物體落在同一個中心點上,總共有860001個物體,那就是有< 0。1% 的物體沒法檢測,要比rcnn和fast rcnn使用selective search丟失的proposal~2%要少,也比使用faster rcnn的不充分的anchor,15個anchor,0。5的閾值丟掉的~20%要少。另外,有715對物體的IOU大於0。7,應該是要分配給兩個anchor的,使用基於center的方法來分配會導致更少的衝突。
NMS
為了驗證這個方法不需要NMS,我們把NMS加上跑了一次,發現DLA-34(flip test)的時候,AP從39。2%提升到了39。7%,對於Hourglass-104,AP保持在42。2%沒有變化。
訓練和測試的解析度
在訓練的時候,我們固定解析度為512x512,測試的時候,我們不進行縮放,只是做一下padding,補全最大的stride步長,也就是把長寬padding到stride的整數倍。
迴歸損失
我們對比了L1的loss和smoth-L1的loss,發現L1的loss要好一點。
包圍框尺寸的權值
我們發現0。1的時候最好。
訓練策略
預設我們訓練了140個epochs,在第90個epochs的時候學習率下降一次,如果我們在學習率下降之前訓練的epochs數量加倍,可以提升1。1個AP。
6。2節和6。3節是3D和姿態的內容,這裡就不寫了。
7. 總結
總的來說,這個方法,不要anchor,不要nms,適用範圍廣,速度快,精度高!
論文連結:
https://
arxiv。org/pdf/1904。0785
0。pdf
github連結:xingyizhou/CenterNet
更多內容,請關注微信公眾號“AI公園”。
請長按或掃描二維碼關注本公眾號