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