目标检测系列(八)——CenterNet:Objects as points
文章目錄
- 摘要
- 1. 引言
- 2. 相關工作
- 3. 準備階段
- 4. objects as points 目標即點
- 4.1 3D檢測
- 5. 實施細節
- 7. 總結
- 8. 代碼
- 8.1 訓練
- 8.2 測試
摘要
目標檢測常用的方法是將對象標識為圖像中軸向對齊的框,大多數的較好的檢測方法稠密的列舉了目標可能出現的位置,并對每個位置進行分類,這是浪費、低效的,且需要很多額外的后處理。
本文提出了一種不同的方法,我們將目標建模為一個點——b-box的中心點。
本文檢測方法使用關鍵點估計來尋找中心點,并回歸框的其他特性,如尺度、3D 位置、方向、姿態等。
本文的基于中心點的方法——CenterNet,是一個端到端可微、簡單、快速且準確度較高的方法。
CenterNet 在 MS COCO 數據集上達到了最好的速度和精度的平衡,AP 為28.1%時達到142FPS,AP為37.4%時達到52FPS,多尺度測試時AP 為45.1%時達到1.4FPS。
同時,我們使用了相同的方法在 KITTI 中來估計3D b-box。
1. 引言
本文提出了簡單且高效的目標檢測方法,我們使用b-box的單個中心點來表示目標(圖2),之后可以從中心位置的圖像特征來回歸得到目標大小、維度、3d 擴展、方向和姿態等。
基于此,我們的目標檢測問題就變成了一個標準的關鍵點估計問題。
我們將圖像輸入全卷積網絡,得到熱力圖,熱力圖的峰值對應目標的中心。
每個峰值上的圖像特征可以預測目標框的寬和高,網絡使用稠密的有監督學習進行訓練,推理階段是一個單一的前向傳播網絡,沒有NMS的后處理。
本文方法可以通過預測每個中心點的額外的輸出,來擴展到其他應用方面,如3D目標檢測和多人姿態估計。
對于3D 目標檢測,我們回歸目標的絕對深度、3D b-box 維度、目標方向。
對于人類姿態估計,我們將關節點(2D joint)位置作為中心點的偏移量,直接在中心點位置回歸出這些偏移量的值。
本文簡單的方法使得具有較快的速度,如圖1,實驗在三個網絡上進行:
- Resnet-18 with up-convolutional layers : 28.1% coco and 142 FPS
- DLA-34 : 37.4% COCOAP and 52 FPS
- Hourglass-104 : 45.1% COCOAP and 1.4 FPS
2. 相關工作
本文的方法接近于 anchor-based 單階段方法,中心點可以被看成一個形狀未知的anchor(如圖3),但也有很多不同。
- CenterNet 僅僅在一個位置上放置一個點,沒有框重疊的情況,無需使用閾值對前景和背景進行分類。
- 我們只有一個正的“anchor”,所以不需要 NMS 處理,在關鍵點熱力圖中抽取局部峰值即可。
- CenterNet 的輸出分辨率相比其他網絡的輸出分辨率較大(輸出步長為4,其他網絡為16),故不需要多尺度的anchors。
利用關鍵點進行目標檢測:
本文不是第一個使用關鍵點進行目標檢測的方法,CornerNet 使用兩個關鍵點來檢測邊界框。ExtremNet 檢測所有目標的左、右、上、下和中心點。
這些方法同樣能夠建立魯棒性的關鍵點估計網絡,但是,他們在關鍵點檢測之后需要組合的步驟,會顯著的降低網絡速度。
CenterNet 網絡僅僅抽取目標的中心點,無需進行關鍵點組合的后處理。
單目3D目標檢測:
3D 邊界框估計在自動駕駛領域有很重要的作用[17]。
- Deep3Dbox[38] 使用 slow-RCNN[19] 類型的網絡框架,首先檢測 2D 目標[46] ,之后將所有目標輸入 3D 估計網絡。
- 3D RCNN 給 Faster R-CNN 添加了另外的 head,之后做 3D 投影。
- Deep Manta 使用從多個任務中訓練得到的從粗尺度到細尺度的 Faster R-CNN。
- 本文方法類似于 Deep3Dbox [38] 或 3DRCNN [29] 的單階段版本,但更加簡潔。
3. 準備階段
I∈RW×H×3I\in R^{W\times H \times 3}I∈RW×H×3 是大小為 W 和 H 的三維輸入圖像
我們的目標是產生一個關鍵點的熱力圖 Y^∈[0,1]WR×HR×C\hat{Y}\in[0,1]^{\frac{W}{R}\times\frac{H}{R}\times C}Y^∈[0,1]RW?×RH?×C,其中,R 是輸出的特征圖的步長,C 是關鍵點類型個數。
關鍵點類型的個數:
- 人體姿態估計中,C=18
- 目標檢測中,C=80
輸出步長:本文使用 R=4,輸出的步長對輸出的估計用 R 進行下采樣
預測結果:
- 當預測 Y^x,y,c=1\hat{Y}_{x,y,c}=1Y^x,y,c?=1 時,表示檢測到的是關鍵點
- 當預測 Y^x,y,c=0\hat{Y}_{x,y,c}=0Y^x,y,c?=0 時,表示檢測到的是背景
本文使用多個不同的全卷積編碼解碼網絡來估計 Y^\hat{Y}Y^:
- 堆疊沙漏網絡
- up-convolutional residual networks, ResNet
- deep layer aggregation(DLA)
關鍵點預測網絡的訓練:
對類別 c 中的每個真實關鍵點 p∈R2p \in R^2p∈R2,計算一個低分辨率(原圖下采樣4倍后的)的對應點 pˇ=?pR?\check{p}=\lfloor \frac{p}{R} \rfloorpˇ?=?Rp??。
之后將所有真實關鍵點使用高斯核 Yxyc=exp(?(x?pˇx)2+(y?pˇy)22σp2)Y_{xyc}=exp(-\frac{(x-\check{p}_x)^2+(y-\check{p}_y)^2}{2\sigma_p^2})Yxyc?=exp(?2σp2?(x?pˇ?x?)2+(y?pˇ?y?)2?) 投射到熱力圖上,其中 σp\sigma_pσp? 為與目標大小相關的標準差。
如果同一類別的兩個高斯分布重合了,我們使用逐個像素點取最大值的方法來處理。
訓練的目標函數是一個像素級邏輯回歸的focal loss:
其中:
- α\alphaα、β\betaβ 分別為focal loss 的超參數,分別設置為2和4。
- NNN 是圖像中的關鍵點個數,使用其進行歸一化相當于將所有正例 focal loss 規范化為1。
- otherwise 情況其實表示 YxyzY_{xyz}Yxyz? 為負樣本,也就是其值為 (0,1) 之間,左右兩邊不包含,也就是高斯分布上的值。
該 Focal loss 函數是針對 CenterNet 修正而來的損失函數,和 Focal Loss類似,對于easy example的中心點,適當減少其訓練比重也就是loss值.
(1?Y^xyz)α(1-\hat{Y}_{xyz})^{\alpha}(1?Y^xyz?)α 和 (Y^xyz)α(\hat{Y}_{xyz})^{\alpha}(Y^xyz?)α 的作用:
-
限制 easy example 導致的梯度更新被易區分的點所主導的問題
-
當 Yxyz=1Y_{xyz}=1Yxyz?=1 的時候, 假如 Y^xyz\hat{Y}_{xyz}Y^xyz? 接近1的話,說明這個是一個比較容易檢測出來的點,那么 (1?Y^xyz)α(1-\hat{Y}_{xyz})^{\alpha}(1?Y^xyz?)α 就相應比較低了。
-
當 Yxyz=1Y_{xyz}=1Yxyz?=1 的時候,而Y^xyz\hat{Y}_{xyz}Y^xyz? 接近0的時候,說明這個中心點還沒有學習到,所以要加大其訓練的比重,因此 (1?Y^xyz)α(1-\hat{Y}_{xyz})^{\alpha}(1?Y^xyz?)α 就會很大, α\alphaα是超參數,這里取2。
-
當 Yxyz=0Y_{xyz}=0Yxyz?=0 的時候,預測的 Y^xyz\hat{Y}_{xyz}Y^xyz? 理論上也要接近于0,但如果其預測的值 Y^xyz\hat{Y}_{xyz}Y^xyz? 接近于1的話, (Y^xyz)α(\hat{Y}_{xyz})^{\alpha}(Y^xyz?)α 的值就會比較大,加大損失,即增加這個未被正確預測的樣本的損失。
(1?Yxyz)β(1-Y_{xyz})^{\beta}(1?Yxyz?)β 的作用:
- 該項是為了平衡正負樣本(弱化了實際中心點周圍的其他負樣本的損失比重,加強了遠離實際中心點周圍的負樣本的損失比重,因為實際的物體只有一個中心點,其余都是負樣本,但負樣本相較于中心點來說顯得有很多很多)
- 該項和預測的結果沒有關系,只和距離中心點的遠近有關系,距離中心點越近,真值 YxyzY_{xyz}Yxyz? 越接近于1,而 (1?Yxyz)β(1-Y_{xyz})^{\beta}(1?Yxyz?)β 會越小,即離中心越近的點的損失會變小,會更加注重離中心較遠的點的情況。
- YxyzY_{xyz}Yxyz? 是高斯核生成的中心點,且中心點上 Yxyz=1Y_{xyz}=1Yxyz?=1, 對于中心點周圍的點,離中心點越遠,則其值會慢慢下降為0。當越接近于中心點時, YxyzY_{xyz}Yxyz? 會越大,則 (1?Yxyz)β(1-Y_{xyz})^{\beta}(1?Yxyz?)β 的值會越小,反之該值會越大。
- 即對離中心點越近的點,假設 YxyzY_{xyz}Yxyz? 的值為0.9(otherwise情況),但預測得到其為接近于1,那顯然是不對的,應該預測為0才對。此時 (Y^xyz)α(\hat{Y}_{xyz})^{\alpha}(Y^xyz?)α 的值很大,loss會變大,但因為其離中心很近,預測的結果接近于1也情有可原,所以用 (1?Yxyz)β(1-Y_{xyz})^{\beta}(1?Yxyz?)β 來使得loss減小一些。
- 對于離中心點越遠的點,假設 YxyzY_{xyz}Yxyz? 的值為0.1(otherwise情況),但預測得到其為接近于1,那顯然是不對的,要用 (Y^xyz)α(\hat{Y}_{xyz})^{\alpha}(Y^xyz?)α 來懲罰,如果預測的接近于0,那么差不多了,(Y^xyz)α(\hat{Y}_{xyz})^{\alpha}(Y^xyz?)α 值就會很小。而 (1?Yxyz)β(1-Y_{xyz})^{\beta}(1?Yxyz?)β 的值會較大,也就是使得離中心點較遠的點的損失比重較大,越近的點的損失比重越小,相當于弱化了實際中心點周圍的其他負樣本的損失比重,加強了遠離實際中心點周圍的負樣本的損失比重。
為了彌補輸出步長所造成的離散化損失,我們對每個中心點都額外的預測了 local offset O^∈RWR×HR×2\hat{O}\in R^{\frac{W}{R}\times\frac{H}{R}\times 2}O^∈RRW?×RH?×2。
所有的類別都共享相同的預測 offset,該offset是用L1 loss訓練的:
僅僅在關鍵點位置 pˇ\check{p}pˇ? 上實行有監督行為,其他位置被忽略。
4. objects as points 目標即點
令 (x1(k),y1(k),x2(k),y2(k))(x_1^{(k)},y_1^{(k)},x_2^{(k)},y_2^{(k)})(x1(k)?,y1(k)?,x2(k)?,y2(k)?) 表示有ckc_kck?個類別的目標 kkk 的b-box,其中心點在 pk=(x1(k)+x2(k)2,y1(k)+y2(k)2)p_k=(\frac{x_1^{(k)}+x_2^{(k)}}{2},\frac{y_1^{(k)}+y_2^{(k)}}{2})pk?=(2x1(k)?+x2(k)??,2y1(k)?+y2(k)??)。
我們使用關鍵點估計 Y^\hat{Y}Y^ 來預測所有中心點,另外,對每個目標 k 都回歸其目標大小 sk=(x2(k)?x1(k),y2(k)?y1(k))s_k=(x_2^{(k)}-x_1^{(k)}, y_2^{(k)}-y_1^{(k)})sk?=(x2(k)??x1(k)?,y2(k)??y1(k)?)。
為了限制計算量,我們對所有目標類別都使用單個尺度的預測 S^∈RWR×HR×2\hat{S}\in R^{\frac{W}{R}\times\frac{H}{R}\times 2}S^∈RRW?×RH?×2。
我們對中心點使用和(2)相同的 L1 loss :
我們沒有規范化尺度,且直接使用原始的像素坐標,直接使用常量 λsize\lambda_{size}λsize? 來平衡 loss:
設定:
- λsize=0.1\lambda_{size}=0.1λsize?=0.1,λoff=1\lambda_{off}=1λoff?=1
- 使用一個整體的網絡來預測關鍵點 Y^\hat{Y}Y^、偏移 O^\hat{O}O^、尺寸 S^\hat{S}S^
- 該網絡在每個位置一共預測 C+4C+4C+4 個輸出(C:C個熱力圖,每個代表一個類別,4:2個 wh,2個 offset)
- 所有的輸出共享相同的全卷積backbone網絡
- 從backbone輸出的特征要分別經過 3x3 卷積、Relu、1x1卷積過程
- 圖4展示了網絡的輸出
- 圖5是補充細節
從點到b-box:
推理階段,首先給每個類別獨立抽取熱力圖的峰值,檢測所有其值大于或等于其相鄰8個鄰域的響應,保留前100個峰值。
令 P^c\hat{P}_cP^c? 表示類別 ccc 中,檢測到的 nnn 個中心點 P^=(x^i,y^i)i=1n\hat{P}={(\hat{x}_i, \hat{y}_i)}_{i=1}^nP^=(x^i?,y^?i?)i=1n? 。
每個關鍵點是由整數坐標 (xi,yi)(x_i,y_i)(xi?,yi?) 給出的,我們將關鍵點值 Y^xiyic\hat{Y}_{x_iy_ic}Y^xi?yi?c? 作為檢測置信度的衡量,并且在位置上產生一個b-box:
其中:
- (δx^i,δy^i)=O^x^i,y^i(\delta \hat{x}_i, \delta \hat{y}_i) = \hat{O}_{\hat{x}_i, \hat{y}_i}(δx^i?,δy^?i?)=O^x^i?,y^?i?? 是預測的偏移
- (w^i,h^i)=S^x^i,y^i(\hat{w}_i,\hat{h}_i)=\hat{S}_{\hat{x}_i,\hat{y}_i}(w^i?,h^i?)=S^x^i?,y^?i?? 是預測大小
- 所有的輸出都是直接從關鍵點預測的結果得到的,沒有使用 IoU 或 NMS 等后處理
- 峰值關鍵點提取是一種有效的NMS替代方法,可以在設備上使用3×3 max池操作高效地實現。
4.1 3D檢測
3D 檢測是估計一個三維的b-box,并且每個關鍵點都需要額外的參數:深度、3D 維度、方向。
我們給其添加一些額外的輸出來預測這些值。
-
深度:
深度(depth) d 是一個單獨的,但是深度難以直接回歸,我們使用[13]中的輸出變換,且 d=1/δ(d^)?1d=1/\delta(\hatze8trgl8bvbq)-1d=1/δ(d^)?1,其中 δ\deltaδ 是sigmoid函數。我們將深度的計算單獨輸出一個通道 D^∈[0,1]WR×HR\hat{D}\in [0,1]^{\frac{W}{R}\times \frac{H}{R}}D^∈[0,1]RW?×RH?。
不同于之前的形式,在輸出層使用反向sigmoid變換,變換之后使用 L1 loss 來訓練深度估計的網絡。
-
3D dimensions
目標的3D dimensions 是三個標量,我們直接使用分離的head F^∈RWR×HR×3\hat{F}\in R^{\frac{W}{R}\times \frac{H}{R}\times 3}F^∈RRW?×RH?×3 和 L1 loss 來回歸其絕對值,
-
方向
方向是一個默認的單個標量,但也較難回歸。我們使用 [38] 中的方法,將方向表示成兩個 bins,且用 in-bins 回歸。詳細來說就是使用 8 個標量scalars 來編碼,每個bin有4個標量,每個bin中,兩個標量被用來進行 softmax 分離,其余兩個被用來會個每個bin中的角度。詳見附錄。
5. 實施細節
使用 Resnet-18,Resnet-101,DLA-34 和 Hourglass-104 backbone分別實驗
對Resnet 和 DLA-34都使用可變性卷積進行了修正,Hourglass-104使用原來的網絡。
Training:
我們訓練的輸入分辨率是512×512。這使得所有模型的輸出分辨率為128×128。我們使用隨機翻轉、隨機縮放(介于0.6到1.3之間)、裁剪和顏色抖動作為數據增強,并使用Adam[28]優化總體目標。當裁剪或縮放改變三維測量值時,我們不使用增強來訓練三維估計分支。對于殘差網絡和DLA-34,我們對140個階段進行了批量大小為128(8gpu)和學習率為5e-4的訓練,在90和120個階段的學習率分別下降了10倍(見[55])。對于沙漏-104,我們遵循ExtremeNet[61],使用批量大小29(在5gpu上,主GPU批量大小4)和學習率2.5e-4,50個階段的學習率在40個階段下降了10倍。為了進行檢測,我們對ExtremeNet[61]中的沙漏-104進行微調,以節省計算量。使用ImageNet pretrain初始化Resnet101和DLA-34的下采樣層,隨機初始化上采樣層。
7. 總結
CenterNet的優點如下:
-
設計模型的結構比較簡單,一般人也可以輕松看明白,不僅對于two-stage,對于one-stage的目標檢測算法來說該網絡的模型設計也是優雅簡單的。
-
該模型的思想不僅可以用于目標檢測,還可以用于3D檢測和人體姿態識別,雖然論文中沒有是深入探討這個,但是可以說明這個網絡的設計還是很好的,我們可以借助這個框架去做一些其他的任務。
-
雖然目前尚未嘗試輕量級的模型,但是可以猜到這個模型對于嵌入式端這種算力比較小的平臺還是很有優勢的。
CenterNet的缺點也是有的:
-
在實際訓練中,如果在圖像中,同一個類別中的某些物體的GT中心點,在下采樣時會擠到一塊,也就是兩個物體在GT中的中心點重疊了,CenterNet對于這種情況也是無能為力的,也就是將這兩個物體的當成一個物體來訓練(因為只有一個中心點)。同理,在預測過程中,如果兩個同類的物體在下采樣后的中心點也重疊了,那么CenterNet也是只能檢測出一個中心點,不過CenterNet對于這種情況的處理要比faster-rcnn強一些的,具體指標可以查看論文相關部分。
-
有一個需要注意的點,CenterNet在訓練過程中,如果同一個類的不同物體的高斯分布點互相有重疊,那么則在重疊的范圍內選取較大的高斯點。
8. 代碼
代碼已開源:https://github.com/xingyizhou/CenterNet
把需要的模型和數據下載,安裝,之后運行。
8.1 訓練
所有的訓練腳本都在 :https://github.com/xingyizhou/CenterNet/tree/master/experiments
本文的訓練都是在 8 個GPU 上進行的,可以依據該論文來將學習率和 batch size 調整。
例如,在 2 個 gpu 上訓練 coco 數據集:
python main.py ctdet --exp_id coco_dla --batch_size 32 --master_batch 15 --lr 1.25e-4 --gpus 0,1- batch_size 為32時,默認學習率為 1.25e-4(2 gpus),pytorch 通常會將總的batch_size 分配個每個 gpu 來進行訓練
- --master batch 允許給最好的 GPU 使用不同的batch_size。
- 如果訓練提前終止了,可以使用 --resume 來中段訓練,也可以在 exp_id 中找到最后的那個模型
- hourglass 模型是從 extremenet 模型微調而來的,需要先下載該extremenet 模型。
COCO 上進行目標檢測訓練的細節:
- 所有的模型都在 coco train 2017 上訓練,在 coco val 2017 上評估
- 測試時間和 AP 指標都是從 沒有數據增強/ 水平增強(flip)/多尺度增強(0.5, 0.75, 1, 1.25, 1.5)
- coco test-dev 上的結果可以在論文中找到,或給 test.py 增加 --trainval
- exdet 是 ExtremeNet 的實現
- 對于 DLA 和 ResNet,1x 表示訓練迭代 140 個 epoch,在 90 次和 120 次的時候學習率分別下降 10倍;2x 表示訓練迭代 230 個 epoch,在 180 次和 210 次的時候學習率分別下降 10倍;
- Hourglass 網絡訓練的方式是和 Extreme 網絡相同的,訓練迭代 50 個epoch(當 batch_size 為24時,大約 25w 次 iteration),且在第 40 個epoch 時,學習率下降。
- 測試時間包括網絡前向傳播時間、編碼時間和NMS時間(EXtremeNet 中才有)。
batch_size、iteration、epoch 的區別:
-
batchsize:中文翻譯為批大小(批尺寸)。在深度學習中,一般采用SGD訓練,即每次訓練在訓練集中取batchsize個樣本訓練;
-
iteration:中文翻譯為迭代,1個iteration等于使用batchsize個樣本訓練一次;一個迭代 = 一個正向通過+一個反向通過
-
epoch:迭代次數,1個epoch等于使用訓練集中的全部樣本訓練一次;一個epoch = 所有訓練樣本的一個正向傳遞和一個反向傳遞
-
舉個例子,訓練集有1000個樣本,batchsize=10,那么:訓練完整個樣本集需要:100次iteration,1次epoch。
KITTI 上進行 3D 目標檢測的細節:
- 3 dop 劃分方法源于 3DOP,suborn 劃分方法源于 subCNN
- 測試中沒有使用任何數據增強
- 總共訓練 70 個epochs,分別在 45 次和 60 次的時候學習率下降
ddd_3dop.sh:
cd src # train python main.py ddd --exp_id 3dop --dataset kitti --kitti_split 3dop --batch_size 16 --master_batch 7 --num_epochs 70 --lr_step 45,60 --gpus 0,1 # test python test.py ddd --exp_id 3dop --dataset kitti --kitti_split 3dop --resume cd ..
ddd_sub.sh:
8.2 測試
例如:
1、使用 DLA 作為backbone,來評估 COCO 數據集上的效果:
python test.py ctdet --exp_id coco_dla --keep_res --load_model ../models/ctdet_coco_dla_2x.pth如果所有的安裝正確,那么會獲得AP=37.4的結果
- --keep_res:使用原始分辨率的圖像,如果沒有設定這項的話,將會把圖像resize為 512x512 大小
- --flip_test --test_scales 0.5,0.75,1,1.25,1.5:分別實現 flip_test 和 muiti-scale test
2、使用 hourglass 作為backbone,來評估 COCO 數據集上的效果:
python test.py ctdet --exp_id coco_hg --arch hourglass --fix_res --load_model ../models/ctdet_coco_hg.pth3、測試 KITTI 的效果::
首先編碼工具:
cd CenterNet_ROOT/src/tools/kitti_eval g++ -o evaluate_object_3d_offline evaluate_object_3d_offline.cpp -O3之后運行:
python test.py ddd --exp_id 3dop --dataset kitti --kitti_split 3dop --load_model ../models/ddd_3dop.th- ddd 是3D 的模型
- --exp_id 3dop:使用 3dop 數據劃分,也可以使用 --kitti_split subcnn 來劃分
總結
以上是生活随笔為你收集整理的目标检测系列(八)——CenterNet:Objects as points的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络平台是什么意思(xdm是什么意思)
- 下一篇: 小米8是双卡双待吗(小米官方售后服务)