用姿態檢測中的關鍵點檢測的思路來做物體檢測,去掉anchor,去掉nms,很贊!而且開源了程式碼(放在最後了)!

摘要:

物體檢測通常是在影象上把物體用座標軸對齊的框把物體框出來。目前,大多數的成功的物體檢測方法都是先得到一個物體潛在位置的列表,然後一個一個的去區分是不是物體,屬於哪個類。但這種方式非常的低效,而且需要額外的後處理。這篇文章提出了一個新的方案,把物體建模為一個點—包圍框的中心點。我們使用關鍵點估計的方法來得到中心點,然後再回歸得到物體的其他屬性,如尺寸,3D的位置,方向,姿態等。我們這個基於中心點的方法,叫做centernet,是端到端可微分的,比基於包圍框的檢測方法更快,更準確。

1. 介紹

這個方法把物體表示為包圍框的中心點,物體的其他屬性,比如尺寸,維度,3D的擴充套件資訊,方向,姿態等等,都可以透過中心點位置的影象特徵來回歸得到。這樣,物體檢測就變成了一個標準的關鍵點檢測的任務。我們只要把影象送到一個全卷積網路中,得到特徵圖,這個特徵圖把他當成一個熱力圖,熱力圖上的峰值點就是對應的物體中心。峰值點的影象特徵用來預測框的寬和高。整個網路是個標準的監督學習的框架,推理的時候只要一個簡單的前向傳播就好了,也不要NMS了。看下圖2:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

這個方法很通用,很容易擴充套件。我們還可以用在3D物體檢測,多人的姿態估計,只要對中心點多加幾個屬性輸出就可以了。比如,對於3D,我們多預測一個深度,對於姿態的預測,我們增加預測幾個關節點相對於中心點的偏移就可以了。

這個方法很簡單,所以速度快。使用resnet18加一個上取樣層,我們在coco上的可以達到142FPS,AP為28。1%,如果使用仔細設計過的關鍵點預測網路DLA-34,coco上AP能到37。4%速度52FPS。如果使用Hourglass-104,多尺度測試,coco上AP能達到45。1%,1。4FPS。具體效能看下圖:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

2. 相關的工作

基於區域分類的物體檢測

RCNN FastRCNN

使用隱式anchor的物體檢測

FasterRCNN,CenterNet和這個有點像,但是又有幾個差別:1、CenterNet的“anchor”就是一個點,只有位置資訊,不存在overlap之類的東西,因此也不需要透過overlap的閾值來區分前景和背景。2、對於每個物體,我們只有一個正樣本的“anchor”,因此,也就不需要NMS了。3、CenterNet輸出的是一個比較大的解析度的特徵圖(stride為4),通常我們的stride都是16,因此,也就不需要多個anchor了。

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

使用關鍵點預測的物體檢測

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來訓練這個關鍵點,也就是這個點上有沒有物體的預測。

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

其中,α和β是focal loss中的超引數,這裡使用的是α=2,β=4。

為了彌補下采樣造成的誤差,我們還會為中心點預測一個區域性的offset,所有的類別C共享相同的offset,這個offset使用L1的loss來訓練:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

使用這個loss的時候,只要計算關鍵點的位置p就可以了,其他的點不用計算。

4. 把物體看做點

我們圖上的第k個物體,它的類別為​

c_k

,它的包圍框為​

(x_1^k,x_2^k,y_1^k,y_2^k)

,那麼,它的中心點​

p_k=(\frac{x_1^k+x_2^k}{2},\frac{y_1^k+y_2^k}{2})

,我們為每個物體k,預測一個尺寸

s_k=(x_2^k-x_1^k,y_2^k-y_1^k)

​,我們為所有的類別預測一個尺寸,我們還是使用L1的loss:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

我們不對尺度進行歸一化,我們直接用座標值,我們使用λsize對loss做一個尺度的縮放,整體的loss為:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

我們把λsize設為0。1,把λoff設為1。這樣的話,需要對每個位置預測C+4個輸出,圖4為整體的輸出:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

從點轉換為包圍框

在推理的時候,首先在熱力圖上,為每個類別獨立的提取峰值點,如果一個點比它的8個相鄰點的值都大,那麼我們就把它提取出來,然後保留前100個,我們把這個值作為檢測的置信度,然後在這個位置生成一個包圍框:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

其中,​

(\delta \hat x_i,\delta \hat y_i)

是預測出來的中心點的位置,

(\hat w_i,\hat h_i)

​是預測出來的尺寸,這樣的話,就不需要做基於IOU的nms了,峰之點的提取就相當於nms了,可以很高效的使用3x3的max pooling來實現。

4.1 3D檢測

3D檢測需要多輸出幾個量,深度,3D的尺寸,方向。深度不好直接回歸,需要轉換一下,

d=1/\sigma(\hat d)-1

​,其中,σ是sigmoid函式,3D的尺寸比2D多一個,和深度一樣,都使用L1的loss,方向預設是一個標量,比較難迴歸,我們把方向編碼為8個標量,每個bin裡面4個標量,對於每個bin,用softmax來分類,在bin裡面,迴歸剩餘的兩個標量。

4.2 人體姿態檢測

基本差不多。

5. 實現細節

作者這裡實驗了4種網路:resnet18,resnet101,DLA-34,Hourglass-104,使用resnet和DLA的時候,稍微修改了一下,用上了deformable卷積層。不同網路的實驗資料如下:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

訓練

輸入解析度為512x512,輸出解析度為128x128,資料增加用了隨機翻轉,隨機縮放,隨機裁剪和顏色抖動,最佳化器為Adam。

6. 實驗

6.1 物體檢測

直接上圖,總之就是一句話,比我快的沒我準,比我準的沒我快:

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

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。

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

6。2節和6。3節是3D和姿態的內容,這裡就不寫了。

7. 總結

總的來說,這個方法,不要anchor,不要nms,適用範圍廣,速度快,精度高!

論文連結:

https://

arxiv。org/pdf/1904。0785

0。pdf

github連結:xingyizhou/CenterNet

更多內容,請關注微信公眾號“AI公園”。

不要anchor,不要nms,CenterNet《Objects as Points》論文解讀

請長按或掃描二維碼關注本公眾號