基於關鍵點的Anchor Free目標檢測算法:CornerNet、CornerNet-Lite、兩種CenterNet、FCOS原理

基於關鍵點的Anchor Free目標檢測算法

2018到2019年間,出現了許多基於關鍵點的one stage目標檢測算法。這類算法的特點是不使用Anchor boxes作爲先驗框,所以又叫做Anchor-Free目標檢測算法。
本文主要介紹五種有代表性的Anchor-Free目標檢測算法:
CornerNet:使用左上角和右下角的兩個角點來表示一個目標;
CornerNet-Lite:CornetNet-Lite是對CornetNet進行優化,具體分爲兩種算法CornerNet-Saccade(高準確率優先)和CornerNet-Squeeze(高實時性優先);
CenterNet:Keypoint Triplets for Object Detection:使用中心點、左上角點和右下角點三個關鍵點來表示一個目標;
CenterNet:Objects as Points:用一箇中心點+長寬值來表示一個目標;
FCOS:訓練集中目標用左上角點和右下角點表示,特徵圖每個點映射回原圖得到原圖中的一個點,使用該點+點到框的四個距離來表示一個目標。

注意上面有兩個CenterNet,但是它們是兩種Anchor-Free目標檢測模型,請注意區分。

CornerNet

論文:CornerNet: Detecting Objects as Paired Keypoints
論文地址:https://arxiv.org/pdf/1808.01244.pdf
代碼地址:https://github.com/umich-vl/CornerNet
這篇文章中提出了一種新的目標檢測方法CornerNet,使用單個卷積神經網絡將目標邊界框檢測爲一對關鍵點(即邊界框的左上角和右下角)。通過將目標檢測爲成對關鍵點,我們消除了現有的one stage檢測器設計中對一組anchors的需要。除此之外文章還引入了corner pooling,這是一種新型的池化層,可以幫助網絡更好地定位邊界框的角點。CornerNet在MS COCO上實現了42.1%的AP,優於所有現有的one stage檢測器。
以往的YOLOv3、SSD等one stage檢測器使用anchor boxes作爲先驗框,檢測器將anchor boxes密集地分佈在圖像上,通過對anchor boxes進行評分,並通過迴歸來改進其座標來生成最終的邊界框預測。
但anchor boxes的使用有兩個缺點:

  • 首先,我們通常需要非常多的anchor boxes以確保與大多數ground truth充分重疊。 但實際只有一小部分anchor boxes與ground truth重疊,這在正負樣本之間造成了巨大的不平衡,同時也減慢了訓練速度;
  • 其次,anchor boxes的使用引入了許多超參數和設計選擇。 這些包括多少個box,大小和寬高比。 這些選擇主要是通過ad-hoc啓發式方法進行的,並且當與多尺度架構相結合時可能會變得更加複雜,其中單個網絡在多個分辨率下進行單獨預測,每個尺度使用不同的特徵和它自己的一組anchor boxes。

CornerNet不使用anchor boxes,而將一個目標的位置檢測化爲檢測邊界框的左上角和右下角這對關鍵點的問題。我們使用單個卷積網絡來預測同一物體類別的所有實例的左上角的熱圖,所有右下角的熱圖,以及每個檢測到的角點的嵌入向量。 嵌入用於對屬於同一目標的一對角點進行分組——訓練網絡以預測它們的類似嵌入。 這種方法極大地簡化了網絡的輸出,並且無需設計anchor boxes。
作者認爲基於關鍵點的目標檢測要優於anchor的檢測方法主要有兩方面的原因:
由於框的中心依賴於四個邊,很難進行定位。而定位角點只需要定位兩條邊,同時引入了coner pool的先驗,因此,定位更加簡單;角點高效的離散了框的解空間,只需要O(wh)的角點可以表示O(w2h2)的anchor box的數量。

CornerNet網絡結構

首先1個7×7的卷積層將輸入圖像尺寸縮小爲原來的1/4(論文中輸入圖像大小是511×511,縮小後得到128×128大小的輸出)。
然後通過Hourglass Network網絡進行特徵提取,該網絡通過串聯2個hourglass module組成。每個hourglass module都是先通過一系列的降採樣操作縮小輸入的大小,然後通過上採樣恢復到輸入圖像大小,因此該部分的輸出特徵圖大小還是128×128,整個hourglass network的深度是104層。
然後將網絡得到的特徵輸入到兩個模塊Top-left Corner pooling和Bottom-right Corner pooling提取關鍵點的特徵。對於每個Corner Pooling模塊,後面接一個預測模塊,包括三個部分:目標框的左上角關鍵點和右下角關鍵點的類別分類(Heatmaps),每個目標的一對關鍵點(Embeddings),以及基於座標回算目標目標位置時的偏置(offsets)。有了兩個角點的heatmaps,embeding vectors,及Offset,我們在後面可以通過後處理的方式得到最終的邊框。
heatmaps是輸出預測角點信息,可以用維度爲CHW的特徵圖表示,其中C表示目標的類別(注意沒有背景類),這個特徵圖的每個通道都是一個mask,mask的每個值範圍爲0到1,表示該點是角點的分數;embeddings用來對預測的corner點做group,也就是找到屬於同一個目標的左上角角點和右下角角點;offsets用來對預測框做微調,這是因爲從輸入圖像中的點映射到特徵圖時有量化誤差,offsets就是用來輸出這些誤差信息。

                                                          -->Heatmaps
									                      |
                               ->Top-left Corner pooling-->->Embeddings
                              /                           |
                             /                            -->Offsets
						    /
輸入圖片->Hourglass Network-->
							\
							 \                                -->Heatmaps
							  \                               |
							   ->Bottom-right Corner pooling-->->Embeddings
							                                  |
							                                  -->Offsets

CornerNet使用Hourglass Network作爲CornerNet的骨幹網絡。 Hourglass Network之後是兩個預測模塊。 一個模塊預測左上角角點,另一個模塊預測右下角角點,每個模塊都有自己的corner pooling模塊,在預測熱圖、嵌入和偏移之前,池化來自沙漏網絡的特徵。corner pooling後包括三部分:目標框的左上角關鍵點和右下角關鍵點的類別分類(Heatmaps),每個目標的一對關鍵點(Embeddings),以及基於座標回算目標目標位置時的偏置(offsets)。 與許多其他探測器不同,我們不使用不同尺度的特徵來檢測不同大小的物體。 Heatmaps表示不同物體類別的角的位置,一組爲左上角角點,另一組爲右下角角點。 Embeddings預測每個檢測到的角的嵌入向量,使得來自同一目標的兩個角的嵌入之間的距離很小。 爲了產生更緊密的邊界框,網絡還預測offsets以稍微調整角的位置。 通過預測的熱圖( Heatmaps),嵌入(Embeddings)和偏移(offsets),我們應用一個簡單的後處理算法來獲得最終的邊界框。

Heatmaps

兩個corner pooling模塊後各接了一個預測模塊。預測模塊中包含Heatmaps、Embeddings、offsets三個模塊。通過Heatmaps模塊,我們預測兩組熱圖,一組用於預測左上角角點,另一組用於預測右下角角點。 每組熱圖具有C個通道,其中C是分類的類別數,並且大小爲H×W。注意沒有背景這個類別。這個特徵圖的每個通道都是一個mask,mask的每個值爲0-1之間的值,表示該點是角點的分數。
對於每個角點,有一個ground-truth正位置,其他所有的位置都是負值。 在訓練期間,我們沒有同等地懲罰負位置,而是減少對正位置半徑內的負位置給予的懲罰。 這是因爲如果一對假角點檢測器靠近它們各自的ground-truth位置,它仍然可以產生一個與ground-truth充分重疊的邊界框。我們通過確保半徑內的一對點生成的邊界框與ground-truth的IoU ≥ t(實驗中t=0.7)來確定物體的大小,從而確定半徑。給定半徑,懲罰的減少量由非標準化的2D高斯函數產生:
ex2+y22σ2 e^{-\frac{x^{2}+y^{2}}{2 \sigma^{2}}}
其中心即位置,其σ是半徑的1/3。

Heatmaps的損失函數:
Ldet=1Nc=1Ci=1Hj=1W{(1pcij)αlog(pcij) if ycij=1(1ycij)β(pcij)αlog(1pcij) otherwise  L_{d e t}=\frac{-1}{N} \sum_{c=1}^{C} \sum_{i=1}^{H} \sum_{j=1}^{W} \begin{cases}{\left(1-p_{c i j}\right)^{\alpha} \log \left(p_{c i j}\right)} & {\text { if } y_{c i j}=1} \\\\ {\left(1-y_{c i j}\right)^{\beta}\left(p_{c i j}\right)^{\alpha} \log \left(1-p_{c i j}\right)} & {\text { otherwise }}\end{cases}
上式整體上是改良版的focal loss。pcij表示預測的heatmaps在第c個通道(類別c)的(i,j)位置的值,ycij爲用非標準化高斯增強的“ground-truth”熱圖。N表示目標的數量。利用ycij中編碼的高斯凸點,(1−ycij)項減少了ground-truth周圍的懲罰。
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有較大的重疊面積,仍能基本框住目標,因此仍然是有效的預測框。

Offsets

這個值和目標檢測算法中預測的offset完全不一樣,在目標檢測算法中預測的offset是表示預測框和anchor之間的偏置,而這裏的offset是表示在取整計算時丟失的精度信息。即下面的公式:
ok=(xknxkn,yknykn) o_{k}=\left(\frac{x_{k}}{n}-\left\lfloor\frac{x_{k}}{n}\right\rfloor, \frac{y_{k}}{n}-\left\lfloor\frac{y_{k}}{n}\right\rfloor\right)
從輸入圖像到特徵圖之間尺寸會縮小,假設縮小倍數是n,那麼輸入圖像上的(x,y)點對應到特徵圖上就如下式:
(xn,yn) \left(\left\lfloor\frac{x}{n}\right\rfloor,\left\lfloor\frac{y}{n}\right\rfloor\right)
式中的符號是向下取整,取整會帶來精度丟失,這尤其影響小尺寸目標的迴歸,Faster RCNN中的 ROI Pooling也是有類似的精度丟失問題。我們通過上面計算ok的公式計算offset,然後通過下面的smooth L1損失函數監督學習該參數(使用L1損失與原圖標註的位置對其進行修正),和常見的目標檢測算法中的迴歸支路類似。
下式中ok是偏移量,xk和yk是角點k的x和y座標。我們預測所有類別的左上角共享一組偏移,另一組由右下角共享。 對於訓練,我們在ground-truth角點位置應用平滑的L1損失。
Loff=1Nk=1NSmoothL1Loss(ok,o^k) L_{o f f}=\frac{1}{N} \sum_{k=1}^{N} SmoothL1Loss\left(o_{k}, \hat o_{k}\right)

Embeddings

一張圖中可能會存在多個目標,因此,可能會檢測到多組角點。這裏使用embedding模塊來確定一組左上角及右下角的點是否是來自同一個目標的邊界框。通過基於左上角點的embeding vectors及右下角點embeding vectors的距離來決定是否將兩個點進行組合。重要的是二者之間的距離,而向量中的具體數值卻不是很重要。本文使用1-D的embeding 向量,etk代表目標k左上角點的embeding ,ebk代表其右下角點的embeding。定義"pull"損失用於組合角點,“push”損失用於分離角點。
Embeddings的損失函數:
Lpull=1Nk=1N[(etkek)2+(ebkek)2] L_{p u l l}=\frac{1}{N} \sum_{k=1}^{N}\left[\left(e_{t_{k}}-e_{k}\right)^{2}+\left(e_{b_{k}}-e_{k}\right)^{2}\right]
Lpush=1N(N1)k=1Nj=1jkNmax(0,Δekej) L_{p u s h}=\frac{1}{N(N-1)} \sum_{k=1}^{N} \sum_{j=1 \atop j \neq k}^{N} \max \left(0, \Delta-\left|e_{k}-e_{j}\right|\right)
etk表示屬於k類目標的左上角角點的embedding vector,ebk表示屬於k類目標的右下角關鍵點的embedding vector,ek表示etk和ebk的均值。我們在所有實驗中將Δ設爲1。與偏移損失類似,我們僅在ground-truth角點位置應用損失。
第一個公式用來縮小屬於同一個目標(k類目標)的兩個關鍵點的embedding vector(etk和ebk)距離。第二個公式用來擴大不屬於同一個目標的兩個角點的embedding vector距離。

Corner Pooling

CornerNet使用了兩個Corner Pooling模塊,分別是Top-left Corner pooling和Bottom-right Corner pooling,分別預測左上角關鍵點和右下角關鍵點。
CornerNet要預測左上角和右下角兩個角點,但是這兩個角點在不同目標上沒有相同規律可循,如果採用普通池化操作,那麼在訓練預測角點支路時會比較困難。考慮到左上角角點的右邊有目標頂端的特徵信息(第一張圖的頭頂),左上角角點的下邊有目標左側的特徵信息(第一張圖的手),因此如果左上角角點經過池化操作後能有這兩個信息,那麼就有利於該點的預測,這就有了corner pooling。
每個corner pooling模塊有2個輸入特徵圖,特徵圖的寬高分別用W和H表示,假設接下來要對特徵圖上(i,j)點做左上角的corner pooling,那麼就計算(i,j)到(i,H)的最大值(最大池化);同時計算(i,j)到(W,j)的最大值(最大池化),然後將這兩個最大值相加(就是普通的加法)得到(i,j)點的值。右下角點的corner pooling操作類似,只不過計算最大值變成從(0,j)到(i,j)和從(i,0)到(i,j)。
用公式表示即爲:
tij={max(ftij,t(i+1)j) if i<HftHj otherwise  t_{i j}=\begin{cases}{\max \left(f_{t_{ij}}, t_{(i+1) j}\right)} & {\text { if } i<H} \\\\ {f_{t_{H j}}} & {\text { otherwise }}\end{cases}
lij={max(flij,li(j+1)) if j<Wfliw otherwise  l_{i j}=\begin{cases} \max \left(f_{l_{i j}}, l_{i(j+1)}\right) & \text { if } j<W \\\\ f_{l i w} & \text { otherwise } \end{cases}
Corner Pooling計算舉例:
假如做Top-left Corner pooling:

-  -  -  -  -          -  -  -  -  -
2  1  3  0  2          3  3  3  2  2
5  4  1  1  6  ------->6  6  6  6  6
-  -  -  -  -          -  -  -  -  -
-  -  -  -  -          -  -  -  -  -

-  3  1  -  -          -  3  4  -  -
-  1  1  -  -          -  3  4  -  -
-  3  4  -  -  ------->-  3  4  -  - 
-  2  2  -  -          -  2  2  -  -
-  0  2  -  -          -  0  2  -  -
最後將兩個最大值矩陣同樣位置的元素相加,得:
-  -  -  -  -
-  6  7  -  -
-  9  10 -  -
-  -  -  -  -
-  -  -  -  -

Hourglass Network

CornerNet使用沙漏網絡(Hourglass Network)作爲其骨幹網絡。沙漏網絡首次被提到是用於人體姿態估計任務。它是一個完全卷積神經網絡,由一個或多個Hourglass組成。Hourglass首先通過一系列卷積層和最大池化層對輸入特性進行下采樣。然後通過一系列的上採樣和卷積層將特徵上採樣回原來的分辨率。由於細節在最大池化層中丟失,因此添加了跳過層用來將細節帶回到上採樣的特徵。沙漏模塊在一個統一的結構中捕獲全局和局部特徵。當多個Hourglass堆積在網絡中時,Hourglass可以重新處理特徵以獲取更高級別的信息。這些特性使沙漏網絡成爲目標檢測的理想選擇。事實上,許多現有的檢測器已經採用了類似沙漏網絡的網絡。
我們的沙漏網絡由兩個Hourglass組成,我們對Hourglass的結構做了一些修改。我們不使用最大池化,而是使用步長2來降低特徵分辨率。我們減少了5倍的特徵分辨率,並增加了特徵通道的數量(256,384,384,384,512)。當我們對特徵進行上採樣時,我們應用了兩個殘差模塊,然後是一個最近的相鄰上採樣。每個跳躍連接還包含兩個殘差模塊。沙漏模塊中間有4個512通道的殘差模塊。在沙漏模塊之前,我們使用128個通道7×7的卷積模塊,步長爲2,4倍減少的圖像分辨率,後跟一個256個通道,步長爲2的殘差塊。
在沙漏網絡基礎上,我們還在訓練時增加了中間監督。但是,我們沒有向網絡中添加反向中間預測,因爲我們發現這會損害網絡的性能。我們在第一個沙漏模塊的輸入和輸出,應用了一個3×3的Conv-BN模塊。然後,我們通過元素級的加法合併它們,後跟一個ReLU和一個具有256個通道的殘差塊,然後將其用作第二個沙漏模塊的輸入。沙漏網絡的深度爲104。與許多其他最先進的檢測器不同,我們只使用整個網絡最後一層的特徵來進行預測。

訓練細節

我們在PyTorch中實現了CornerNet。網絡是在默認的PyTorch設置下隨機初始化的,沒有在任何外部數據集上進行預訓練。在訓練期間,我們設置了網絡的輸入分辨率511×511,輸出分辨率爲128×128。爲了減少過擬合,我們採用了標準的數據增強技術,包括隨機水平翻轉、隨機縮放、隨機裁剪和隨機色彩抖動,其中包括調整圖像的亮度,飽和度和對比度。 最後,我們將PCA應用於輸入圖像。
完整的損失函數:
L=Ldet+αLpull+βLpush+γLoff L=L_{d e t}+\alpha L_{p u l l}+\beta L_{p u s h}+\gamma L_{o f f}
其中α,β和γ分別是pull,push和offset的權重。 我們將α和β都設置爲0.1,將γ設置爲1。我們發現,1或更大的α和β值會導致性能不佳。 我們使用49的batch size,並在10個Titan X(PASCAL)GPU上訓練網絡(主GPU4個圖像,其餘GPU每個GPU5個圖像)。 爲了節省GPU資源,在我們的ablation experiments(即模型簡化測試,去掉該結構的網絡與加上該結構的網絡所得到的結果進行對比)中,我們訓練網絡,進行250k次迭代,學習率爲2.5×10−4。當我們將我們的結果與其他檢測器進行比較時,我們額外訓練網絡,進行250k次迭代,併到最後50k次迭代時,將學習速率降低至2.5×10−5。

測試細節

在測試期間,我們使用簡單的後處理算法從熱圖,嵌入和偏移生成邊界框。 我們首先通過在角點熱圖上使用3×3最大池化層來應用非極大值抑制(NMS)。然後我們從熱圖中選擇前100個左上角和前100個右下角。 角點位置由相應的偏移調整。 我們計算左上角和右下角嵌入之間的L1距離。距離大於0.5或包含不同類別的角點對將被剔除。 左上角和右下角的平均得分用作檢測分數。
我們不是將圖像大小調整爲固定大小,而是保持圖像的原始分辨率,並在將其輸入給CornerNet之前用0填充。 原始圖像和翻轉圖像都用於測試。 我們將原始圖像和翻轉圖像的檢測結合起來,並應用soft-max來抑制冗餘檢測。 僅記錄前100個檢測項。 Titan X(PASCAL)GPU上的每個圖像的平均檢測時間爲244ms。

CornerNet-Lite

論文:CornerNet-Lite: Efficient Keypoint Based Object Detection
論文地址:https://arxiv.org/pdf/1904.08900.pdf
代碼地址:https://github.com/princeton-vl/CornerNet-Lite
CornetNet-Lite是對CornetNet的優化,文章中提出了CornerNet的兩種改進算法:CornerNet-Saccade和CornerNet-Squeeze。
CornerNet-Saccade引入了Saccade思想,在追求高準確率(mAP)的同時,儘可能提高速度(FPS),即準確率優先,其對標於CornerNet等算法。CornerNet-Squeeze引入SqueezeNet優化思想,在追求高實時性(FPS)的同時,儘可能提高準確率(mAP),即速度優先,其對標於YOLOv3等算法。
CornerNet-Saccade可以用於線下處理,將 CornerNet 的效率提升6倍,將COCO的效率提高1.0%。CornerNet-Squeeze適合用於實時檢測,比YOLOv3的效率和準確性更高(CornerNet-Squeenze的AP值是34.4%,速度是34ms,而YOLOv3的AP值是33.0%,速度是39ms)。
CornerNet-Saccade通過減少像素的個數來加速推理的速度。它使用了類似於人眼的注意力機制。首先縮小一幅圖像,產生一個attention map,然後再通過模型進一步放大和處理。原始的CornerNet在多個尺度上進行全卷積操作,這和CornerNet-Saccade不同。CornerNet-Saccade 選取若干個高分辨率的裁剪區域來檢測,提升檢測速度和精度。
CornerNet-Squeeze減少每個像素點上需要處理的步驟,以此來加速推理。它融合了SqueezeNet和 MobileNet的思想,加入了一個精煉的Hourglass主幹網絡,這個主幹網絡中大量使用了1×1的卷積,bottleneck層,以及深度可分離卷積。
我們是否能將CornerNet-Squeeze和CornerNet-Saccade網絡結合起來使用提升效率呢?
文章的實驗結果表明是不提倡的:CornerNet-Squeeze-Saccade速度和準確率都要比CornerNet-Squeeze差。這是因爲,要用Saccade,網絡要能產生足夠準確的attention maps,但是我們的CornerNet-Squeeze過於精煉,不具備這樣的能力。此外,原來的CornerNet 應用在多個不同的尺度上,提供了足夠的空間來進行saccade,減少要處理的像素數量。相反,CornerNet-Squeeze由於推理成本的限制,只能用在單尺度上,供saccade操作的空間就很小。

意義和新穎性

上述兩個CornerNet-Lite使得基於關鍵點的檢測方法更具競爭力,覆蓋了兩個主要的使用場景:CornerNet-Saccade用於線下處理,無需犧牲準確率也可提升效率,CornerNet-Squeeze用於實時處理,提升準確率而無需犧牲效率。
這兩個變體都很有創新。CornerNet-Saccade 是第一個在基於關鍵點的目標檢測方法中使用saccade的方法。它和之前工作的關鍵區別就是,每個裁剪區域(像素點或特徵圖)的處理方式。其它使用了類似saccade機制的工作要麼在每個裁剪區域內檢測單個物體,要麼用一個雙階段網絡在每個裁剪區域內產生多個子裁剪區域,然後再產生若干個檢測對象。而 CornerNet-Saccade 只使用單階段網絡在每個裁剪區域內輸出多個檢測對象。
CornerNet-Squeeze是第一篇將SqueezeNet和Hourglass結構整合起來用於目標檢測任務的論文。之前用了Hourglass結構的方法優於獲取高準確率,但是我們不清楚它是否/如何能獲得高效率。我們的設計和結果顯示,這也是可能的,尤其在目標檢測的任務上。

CornerNet-Saccade

人類視覺中的Saccades(掃視運動)是指用於固定不同圖像區域的一系列快速眼動。在目標檢測算法中,我們廣義地使用該術語來表示在預測期間選擇性地裁剪(crop)和處理圖像區域(順序地或並行地,像素或特徵)。
在一張圖片中,在物體可能出現的位置附近,CornerNet-Saccade在較小的區域範圍內檢測物體。它利用縮小後的圖片來預測attention maps以及大概的邊框,這倆都能提供物體可能的位置。然後CornerNet-Saccade在高分辨率的圖像中,在位置中心附近區域內檢測物體。它也可以通過調節每張圖片上物體位置的最大個數來平衡精度和速度。
估計目標位置:
CornerNet-Saccade的第一步就是獲取圖像中可能的物體位置。我們使用縮小的圖像預測attention maps,它能指出物體的位置以及物體大致的尺寸。給定輸入圖像,我們將圖像縮小至長邊爲255像素或者192像素。192像素的圖像在邊緣位置填充0,使得它的大小達到255像素,這樣它們就可以並行處理。我們使用這樣的低分辨率圖有2個原因。首先,這一步不應該成爲前向推理時的瓶頸。其次,網絡應該很容易就可以利用圖像的全局信息預測attention maps。
對每一個縮小後的圖片,CornerNet-Saccade預測3個 attention maps,一個針對小物體,一個針對中等物體,一個針對大物體。如果一個物體邊框的長邊小於32像素,它就被認爲是小物體,超過96像素的就被認爲是大物體,中間的就是中等物體。對不同大小的物體分開預測位置,讓我們能更好地控制 CornerNet-Saccade在每個位置應該放大多少。我們在小物體位置可以放大的多一些,在大物體位置可以放大的少一些。
我們利用不同比例的特徵圖來預測attention maps。從CornerNet-Saccade的主幹網絡(Hourglass網絡)中獲取特徵圖。每一個Hourglass模塊都使用了多個卷積和下采樣層來降低輸入特徵圖的大小。然後再將特徵圖通過多個上採樣層和卷積層上採樣至原始輸入的分辨率。上採樣層輸出的特徵圖用於預測attention maps。比例較細緻的特徵圖用於預測小物體,而比例較粗糙的用於預測大物體。我們在每個特徵圖上應用一個3×3卷積-ReLU 模塊,後面跟着一個1×1Conv-Sigmoid模塊,以此來預測attention maps。在測試時,我們僅處理得分高於閾值t的位置,在所有實驗中t=0.3。
當 CornerNet-Saccade處理縮小後的圖像,它就可能會檢測到圖像中的物體並生成邊框。從縮小後的圖像上獲取的邊框可能不那麼準確。因此,我們需要在高分辨率的圖像上再檢測一次,來獲得更準確的邊框。
在訓練時,我們將attention map上每個邊框對應的中心位置設爲正,其餘都爲負。然後我們再使用α=2的Focal Loss。
目標的檢測:
CornerNet-Saccade使用縮小後圖像上得到的位置來決定到底在哪個位置進行處理。如果我們直接在縮小後的圖像上進行裁剪,有一些物體可能就會變得很小,使檢測變得不準確。因此,我們應該在更高分辨率的圖像上進行檢測。
對於從attention maps得到的位置,可以針對不同尺寸的目標設置不同的放大尺寸。Ss代表小目標的縮放尺寸,Sm代表中等目標的縮放尺寸,Sl代表大目標的縮放尺寸。整體三者之間存在一種關係,Ss>Sm>sl,因爲,我們需要對小目標進縮放的成都要大一些。本文設置如下,Ss=4,sm=2,sl=1。對於可能存在的位置(x,y),根據大致的目標尺寸,按照si的比例對downsized圖片進行放大,然後,將CornerNet-Saccade應用到255x255窗口的中心位置處。
從預測的邊界框中得到的位置包含更多目標物的尺寸信息。可以利用得到的邊界框的尺寸來確定縮放大小。確定縮放比例後,使小目標的長邊爲24,中等目標的爲64,大目標的爲192。
爲了讓處理更加地高效,我們加了一些重要的實現細節。首先,我們以批次來處理所有區域,這樣能更好地利用GPU。其次,我們將原始圖片保存在GPU 顯存裏,在GPU裏面進行縮放和裁剪,降低CPU 和 GPU 之間轉移圖像數據帶來的消耗。
在可能的位置處檢測到目標物後,基於soft-NMS處理對於的檢測結果。在對圖片進行裁剪時,裁剪區域的邊界可能會包含目標物的部分區域,如下圖所示。產生的邊界框可能包含目標物很少的區域,而無法被soft-NMS處理掉,因此,刪除了距離裁剪邊界很近的邊界框。訓練時,採用與CornerNet相似的損失,用於預測corner heatmaps,embedings及offsets。
準確率及效率的權衡:
通過控制每張圖片上物體位置的最大個數,我們可以平衡效率和準確率。爲了平衡準確率和效率,我們優先處理那些更可能包含物體的位置。因此,當我們得到了物體的位置後,根據它們的得分將它們排序,然後優先處理那些從邊框中得到的位置。給定要處理的最大裁剪個數kmax,我們在最高的kmax個位置上進行物體檢測。
抑制冗餘對象位置:
當物體之間距離很近時,我們可能會得到高度重疊的物體。我們並不想把這兩個框都檢測一遍,因爲檢測其中一個框時就可能會檢測到另一個框中的物體。
我們採取了一個類似於NMS的方法,去除多餘的位置。首先,我們將目標物體的位置進行排序,優先處理邊框內的位置,然後再處理attention maps上的位置。我們保留最佳的物體位置,去除那些距離最佳位置過於近的位置。我們重複以上操作,直到沒有物體位置剩餘。
骨幹網絡:
我們設計了一個新的 Hourglass 主幹網絡,更適合用在CornerNet-Saccade。新的Hourglass網絡由3個Hourglass模塊組成,深度是54層,而原CornerNet中的Hourglass-104由2個Hourglass模塊組成,深度是104層。我們稱新的主幹網絡爲Hourglass-54。
Hourglass-54中每一個 Hourglass 模塊的參數量更少,也要更淺。按照Hourglass-104中的尺寸縮小策略,我們以步長2來縮小特徵圖。我們在每個下采樣層後面使用了一個殘差模塊。每個Hourglass 模塊降低輸入特徵尺寸3倍,增加它的通道數(384,384,512 384, 384, 512384,384,512)。在模塊的中間位置有一個512通道的殘差模塊,在每個上採樣層後面有一個殘差模塊。我們同樣在Hourglass模塊之前降低圖像的尺寸2倍。
訓練細節:
我們使用Adam方法來優化attention maps和目標檢測的損失函數,並且使用和CornerNet中一樣的訓練超參數。網絡的輸入大小是255×255,這也是測試時的輸入大小。我們在4張1080ti GPU上訓練,batch size是48。爲了避免過擬合,我們使用了CornerNet中的數據增強。當我們要在目標物體附近隨機裁剪一個區域,目標物體要麼是隨機選取的,要麼是在中心位置的附近。這確保了訓練和測試是一致的,因爲網絡檢測物體的範圍是在一個以物體位置爲中心的裁剪區域內。

CornerNet-Squeeze

CornerNet-Saccade是減少要處理像素的數量,而CornerNet-Squeeze則是研究了一個替換方案,降低每個像素點上要處理的成本。在CornerNet中,絕大多數的計算資源都耗費在Hourglass-104上。Hourglass-104由殘差模塊組成,每個殘差模塊由2 個3×3的卷積層外加一個skip連接構成。儘管Hourglass-104獲得了不錯的效果,但是就它的參數個數和推理時間來說,它是非常耗時的。爲了降低Hourglass-104的複雜度,我們引入了SqueezeNet和MobileNet中的思想,設計了一個輕量級Hourglass架構。
來自SqueezeNet和MobileNet中的想法:
SqueezeNet提出了3個降低網絡複雜度的策略:

  • 將3×3的卷積核替換爲1×1的卷積核;
  • 降低輸入通道爲3×3卷積核;
  • 晚點進行下采樣;

SqueezeNet中的構建模塊fire module,首先通過由1×1卷積組成的squeeze層降低輸入通道數。然後將結果送入由1×1和3×3卷積混合組成的expand層。
基於SqueezeNet的想法,我們在CornerNet-Squeeze中使用了fire module,沒有用殘差模塊。而且,受MobileNet的啓發,我們將第二層中的標準3×3卷積替換爲3×3深度可分離卷積,這進一步加快了推理速度。
我們沒有繼續探究SqueezeNet中的第三個策略。因爲Hourglass網絡有一個對稱的結構,晚點進行下采樣會導致在上採樣時得到更高分辨率的特徵圖。在高分辨率特徵圖上進行卷積操作,計算成本更高,這就使我們沒法進行實時檢測。
除了替換殘差模塊,我們也做了其它的一些改動。我們在Hourglass模塊之前增加了一個下采樣層,以此降低Hourglass模塊特徵圖的最大分辨率,並且在每個Hourglass模塊內去掉了一個下采樣層。CornerNet-Squeeze在Hourglass模塊前相應地將圖像尺寸縮小了3倍,但是CornerNet僅將圖像尺寸縮小了2倍。我們在CornerNet的預測模塊中,將3×3卷積替換爲1×1卷積。最後,我們將hourglass網絡中最相鄰的上採樣層替換爲4x4的反捲積。
訓練細節:
我們使用了與CornerNet中同樣的損失函數和超參數來訓練CornerNet-Squeeze。唯一的改變就是 batch size。CornerNet-Squeeze面對同樣的圖像分辨率,在Hourglass模塊之前縮小圖像大小可以降低內存消耗4倍。我們在4個1080ti GPU上以batch size=55來訓練網絡,在主GPU上訓練13張圖片,剩餘的GPU每個訓練14張圖片。

CenterNet:Keypoint Triplets for Object Detection

論文:CenterNet: Keypoint Triplets for Object Detection
論文地址:https://arxiv.org/pdf/1904.08189.pdf
代碼地址:https://github.com/Duankaiwen/CenterNet
在目標檢測中,由於缺乏對相關剪裁區域的額外監督,基於關鍵點的方法通常會得到一大堆錯誤的物體邊框。本文提出了一個有效的方法,在每個裁剪區域內以最小的代價去探索它的視覺模式。我們構建了一個單階段基於關鍵點的檢測器,叫做CornerNet。CornerNet 用每個目標物體的三個關鍵點來檢測,而不是一對關鍵點,提升識別精度和召回率。因此,本文設計了兩個模塊,分別是 cascade corner pooling 和 center pooling,前者能豐富左上角和右下角蒐集到的信息,後者在中間區域能提供更具辨識度的信息。在MS-COCO數據集上,CenterNet 獲得的AP值是47%,比所有的單階段檢測器至少高出4.9%。同時,它的前向推理速度更快,CenterNet 的性能和雙階段檢測器相比也很具競爭力。
深度學習出現之後,目標檢測得到了明顯的提升。目前最流行的方法都是基於ancho 的,在要識別物體上放置預先定義好的anchor boxes,通過ground truth boxes迴歸出相應的位置。這些方法通常需要一堆anchors來保證預測的邊框和ground truth有較高的IoU,anchors的大小、寬高比都需要提前人爲設計好。此外,anchors經常會和ground truth邊框不一致,降低邊框分類的準確率。
爲了解決anchor的缺點,人們提出了一個基於關鍵點的目標檢測方法CornerNet。它用一對角點來表示每個物體,無需anchor boxes,在one stage檢測器中取得了state of art的檢測準確率。但是,CornerNet仍有侷限性,就是它缺乏對物體全局信息的參考。也就是說,由於每個物體都是用兩個角點表示,算法對識別物體的邊界框很敏感,而同時又無法確定哪兩個關鍵點屬於同一個物體。因此,經常會產生一些錯誤的邊框,絕大多數都可以很容易地通過輔助信息(如寬高比)去除。
爲了解決這個問題,我們讓CornerNet可以識別每個候選區域內的視覺模式,這樣它就能自己識別每個邊框的正確性。在這篇論文中,我們提出了一個低成本但是很高效的辦法叫做CenterNet,通過增加一個關鍵點來探索候選框內中間區域(靠近幾何中心的位置)的信息。我們的想法就是,如果一個預測邊框和ground truth邊框有着很高的 IoU,則該邊框的中心關鍵點預測出相同類別的概率要高,反之亦然。所以,在推理時,通過一對關鍵點產生了一個邊框,如果同類別物體的中心關鍵點落在該候選框的中心區域,那麼我們就認爲該候選框包含那個物體。如果目標邊框是準確的,那麼在其中心區域能夠檢測到目標物體中心點的概率就會很高。 若有則保留該目標框,若無則刪除該目標框。如圖1,即使用三個關鍵點來表示目標物體。
爲了更好的檢測中心關鍵點和角點,我們提出了兩個方法來分別增強中心和角點信息:

  • 第一個方法叫center pooling,用於預測中心關鍵點的分支。Center pooling 有助於中心關鍵點取得物體內部辨識度更高的視覺信息,讓候選框中心部分的感知更簡單。實現方式是,在預測中心關鍵點的特徵圖上,取中心關鍵點橫向和縱向上響應和的最大值。
  • 第二個方法就是cascade corner pooling,增加原始 corner pooling 感知候選框內部信息的功能。實現方式是,在預測角點的特徵圖上,計算物體邊框和內部方向上響應和的最大值。實驗證明,這樣一個雙指向的池化方法面對噪聲更加穩定,魯棒性更強,有助於提升精度和召回。

我們在MS-COCO數據集上評估了CenterNet。在center pooling和cascade corner pooling都使用的情況下,在測試集上AP值能達到47%,超過了現有的單階段檢測器一大截。使用了52層的Hourglass主幹網絡時,推理時間平均爲270毫秒每張圖片;使用104層的Hourglass主幹網絡時,推理時間爲340毫秒每張圖片。CenterNet效率很高,和現有的two stage檢測器相比也不弱。

基準和動機

這篇論文使用CornerNet作爲基準。爲了檢測角點,CornerNet產生兩個熱力圖:一個左上角的熱力圖,一個右下角的熱力圖。熱力圖代表不同類別關鍵點的位置,對每個關鍵點賦一個置信度分數。此外,CornerNet 也對每個角點預測一個 embedding 和一組偏移量。Embeddings 用於判斷兩個角點是否來自同一個目標物體。偏移量學習如何將角點從熱力圖重新映射回輸入圖像上,爲了產生物體的邊框,我們依據它們的分數從熱力圖上分別選取 top−k top-ktop−k 個左上角點和右下角點。然後,我們計算這一對角點的 embedding 向量的距離,以此來判斷這一對角點是否屬於同一個物體。如果距離小於某閾值,則會生成一個物體邊框。該邊框會得到一個置信度分數,等於這一對角點的平均分數。
爲了能夠量化分析誤檢問題,研究人員提出了一種新的衡量指標,稱爲FD(false discovery,錯誤的檢測邊框的比例),能夠很直觀的反映出誤檢情況。FD的計算方式爲:
FDi=1APi F D_{i}=1-A P_{i}
APi表示IOU閾值爲i/100時對應的平均準確率。
結果顯示在IoU閾值較低時,錯誤檢測邊框佔了很大的比例,比如當IoU爲0.05時,FD rate是32.7%。也就是平均下來,每一百個物體邊框,有32.7個邊框和ground truth邊框的IoU是低於0.05的。小的錯誤邊框就更多了,FD rate是60.3%。一個可能原因是,CornerNet無法深入邊框內部一窺究竟。爲了讓CornerNet感知邊框內的視覺信息,一個方案就是將CornerNet改爲two stage檢測器,使用RoI池化來深入瞭解邊框內的視覺信息。但是,這種操作帶來的計算成本很高。
在這篇論文,我們提出了一個非常有效的替代方案CenterNet,可以發掘每個邊框內的視覺信息。爲了檢測物體,我們的方法使用了一個三元組關鍵點,而非一對關鍵點。這樣做後,我們的方法仍然是一個單階段檢測器,但是部分繼承了RoI池化的功能。此方法僅關注中心位置信息,計算成本是很小的。同時通過center pooling和cascade corner pooling,我們在關鍵點檢測過程中進一步加入了物體內部的視覺信息。

CenterNet的網絡結構

                 -->cascade corner pooling->corner heatmaps->embeddings and offsets-->
                 |                                                                   |
輸入圖片->骨幹網絡-->                                           --------------------------->輸出
                 |                                           |       
                 -->center pooling->center heatmap->offsets-->

基於三元組關鍵點的目標檢測

抑制誤檢的原理:
如果目標框是準確的,那麼在其中心區域能夠檢測到目標中心點的概率就會很高,反之亦然。因此,首先利用左上和右下兩個角點生成初始目標框,對每個預測框定義一箇中心區域,然後判斷每個目標框的中心區域是否含有中心點,若有則保留該目標框,若無則刪除該目標框。
CenterNet的原理:
我們用一箇中心關鍵點和一對角點來表示每個物體。我們在CornerNet的基礎上加入一箇中心關鍵點的 heatmap,同時預測中心關鍵點的offsets。然後,基於CornerNet提出的方法產生top−k個候選框。同時,爲了剔除錯誤的邊框,利用檢測到的中心點位置,我們對其按如下過程進行排序操作:
根據它們的分數,選擇top−k箇中心關鍵點;

  • 使用相應的偏移量將中心關鍵點重新映射回輸入圖像中;
  • 爲每個邊框定義一箇中心區域,確保該中心區域存在中心關鍵點。同時確保該中心關鍵點的類別和邊框的類別一致。如果在中心區域檢測到中心關鍵點,我們就保留這個邊框。用左上角,右下角和中心關鍵點分數的平均值更新邊框的分數,並保存該邊框。如果在該中心區域沒有檢測到中心關鍵點,則移除此邊框。

中心區域大小的確定方式:
中心區域的大小影響會邊界框的檢測結果。比如,小中心區域對於小的邊界框具有較低的召回率,而大區域相對於大的目標造成較低的精度。因此,本文提出了尺度敏感區域用於適應不同尺寸大小的目標物。其一般會生成相對小目標較大,相對大目標較小的中心區域,假設我們需要判斷一個邊界框I是否需要被保留,tlx,tly代表框左上角的點,brx,bry代表框右下角的點。定義一箇中心區域j,定義左上角的點的座標爲(ctlx,ctly),右下角點(cbrx,cbry)。這些參數滿足如下定義:
{ctlx=(n+1)tlx+(n1)brx2nctly=(n+1)tly+(n1)bry2ncbrx=(n1)tlx+(n+1)brx2ncbry=(n1)tly+(n+1)bry2n \begin{cases} ctl_{x}=\frac{(n+1)tl_{x}+(n-1)br_{x}}{2n} \\\\ c t l_{y}=\frac{(n+1) t l_{y}+(n-1) b r_{y}}{2 n} \\\\ cbr_{x}=\frac{(n-1) t l_{x}+(n+1) b r_{x}}{2 n} \\\\ c b r_{y}=\frac{(n-1) t l_{y}+(n+1) b r_{y}}{2 n} \end{cases}
n是個奇數,決定中心區域j的大小。在這篇論文中,當邊框小於150時,n=3,否則n=5。根據上面的公式,我們可以得到自適應的中心區域,然後在裏面檢測中心區域是否包含中心關鍵點。

角點及中心點信息的豐富

Center Pooling:
物體的幾何中心不一定能傳達出recognizable的視覺信息(例如,人的頭部有很強的視覺模式,但中心關鍵點通常位於人體的中間)。爲了解決這個問題,作者在corner pooling基礎上實現了center pooling。爲了取得一個方向的最大值比如水平方向上,先使用從左至右的Corner Pooling,再跟着一個從右至左的Corner Pooling,即可直接得到水平方向的最大值。同理,使用top pooling和bottom pooling也可以得到豎直方向的最大值,再將水平Pooling和豎直Pooling的結果相加即可。
Cascade corner pooling:
物體bbox的兩個角點往往在物體外部,缺少對物體局部特徵的描述。因爲Corner Pooling目的是找到物體邊界部分的最大值來確定bbox,因此其對邊緣非常敏感。作者爲了解決這個問題,讓物體在關注目標邊界信息的同時也能關注目標內部信息。首先和Corner Pooling一樣,首先沿邊界查找邊界最大值,然後沿邊界最大值的位置查找內部最大值,最後將兩個最大值相加。通過這種方式,使得角點可以同時獲得物體的邊界信息和內部視覺信息。Cascade Top Pooling的具體實現是首先使用Left Corner Pooling,獲得每個點右邊的最大值,然後使用Top Corner Pooling。

訓練和推理

輸入圖片尺寸爲511x511,heatmap大小爲128x128,訓練損失如下,參數定義同CornerNet。
L=Ldetco+Ldetce+αLpullco+βLpushco+γ(Loffco+Loffce) L=L_{det}^{co}+L_{det}^{ce}+\alpha L_{pull}^{co}+\beta L_{push}^{co}+\gamma \left(L_{off}^{co}+L_{off}^{ce}\right)
第一項和第二項分別代表預測角點和中心點的Focal Loss。第三項用於最小化屬於同一物體的角點組合向量之間的距離,第四項用於最大化不同物體的角點組合向量之間的距離。第五項括號內的兩項都是L1 Loss,用於訓練預測角點和中心點的偏移。前向時,選取top-70的角點和中心點,經過soft-nms,最後選取top100的檢測框。
我們在8塊 Tesla V100 GPUs 上訓練,batch size 設爲48。Iterations 的最大個數設爲48萬。在前45萬個iterations中,學習率設爲2.5×10的-4次方。最後3萬個iterations,學習率爲2.5×10的−5次方。
接着CornerNet論文,對於單一尺度測試,我們輸入原圖和經過水平翻轉的圖片,分辨率與原始分辨率一樣。對於多尺度測試,我們輸入原圖和水平翻轉的圖片,分辨率分別爲0.6、1.2、1.5、1.8。我們從熱力圖上選取前70箇中心關鍵點,前70個左上角點,前70個右下角點,以此檢測邊框。在水平翻轉的圖片上,我們翻轉檢測到的邊框,將它們和原來的邊框進行混合。我們也用了 Soft-NMS 來去除多餘的邊框。最終,根據得分,選擇前100個邊框作爲最終的檢測結果。

CenterNet:Objects as Points

論文:CenterNet:Objects as Points
論文地址:https://arxiv.org/pdf/1904.07850.pdf
代碼地址:https://github.com/xingyizhou/CenterNet
目標檢測識別往往在圖像上將目標以軸對稱的框形式框出。大多成功的目標檢測器都先窮舉出潛在目標位置,然後對該位置進行分類,這種做法浪費時間,低效,還需要額外的後處理。本文中,我們採用不同的方法,構建模型時將目標作爲一個點——即目標BBox的中心點。我們的檢測器採用關鍵點估計來找到中心點,並回歸到其他目標屬性,例如尺寸,3D位置,方向,甚至姿態。我們基於中心點的方法,稱爲:CenterNet,相比較於基於BBox的檢測器,我們的模型是端到端可微的,更簡單,更快,更精確。我們的模型實現了速度和精確的最好權衡,以下是其性能:
MS COCO dataset, with 28:1% AP at 142 FPS, 37:4% AP at 52 FPS, and 45:1% AP with multi-scale testing at 1.4 FPS.
用同個模型在KITTI benchmark 做3D bbox,在COCO keypoint dataset做人體姿態檢測。同複雜的多階段方法比較,我們的取得了有競爭力的結果,而且做到了實時。
One stage detectors在圖像上滑動複雜排列的可能bbox(即錨點),然後直接對框進行分類,而不會指定框中內容。
Two-stage detectors對每個潛在框重新計算圖像特徵,然後將那些特徵進行分類。

後處理,即NMS(非極大值抑制),通過計算Bbox間的IOU來刪除同個目標的重複檢測框。這種後處理很難區分和訓練,因此現有大多檢測器都不是端到端可訓練的。
本文通過目標中心點來呈現目標,然後在中心點位置迴歸出目標的一些屬性,例如:size, dimension, 3D extent, orientation, pose。 而目標檢測問題變成了一個標準的關鍵點估計問題。我們僅僅將圖像傳入全卷積網絡,得到一個熱力圖,熱力圖峯值點即中心點,每個特徵圖的峯值點位置預測了目標的寬高信息。
本文的模型訓練採用標準的監督學習,推理僅僅是單個前向傳播網絡,不存在NMS這類後處理。
對我們的模型做一些拓展,可在每個中心點輸出3D目標框,多人姿態估計所需的結果:

  • 對於3D BBox檢測,我們直接回歸得到目標的深度信息,3D框的尺寸,目標朝向;
  • 對於人姿態估計,我們將關節點(2D joint)位置作爲中心點的偏移量,直接在中心點位置迴歸出這些偏移量的值。

相關工作

本文的CenterNet方法和anchor-based的one-stage目標檢測方法類似,中心點可以看做是shape-agnostic(形狀未知)的錨點,可以看做是一種隱式的anchors。

  • 第一,我們分配的錨點僅僅是放在位置上,沒有尺寸框。沒有手動設置的閾值做前後景分類(像Faster RCNN會將與GT IOU >0.7的作爲前景,<0.3的作爲背景,其他不管);
  • 第二,每個目標僅僅有一個正的錨點,因此不會用到NMS,我們提取關鍵點特徵圖上局部峯值點(local peaks);
  • 第三,CenterNet 相比較傳統目標檢測而言(縮放16倍尺度),使用更大分辨率的輸出特徵圖(縮放了4倍),因此無需用到多重特徵圖錨點。

通過關鍵點估計做目標檢測:
我們並非第一個通過關鍵點估計做目標檢測的。CornerNet將bbox的兩個角作爲關鍵點;ExtremeNet 檢測所有目標的 最上,最下,最左,最右,中心點;所有這些網絡和我們的一樣都建立在魯棒的關鍵點估計網絡之上。但是它們都需要經過一個關鍵點grouping階段,這會降低算法整體速度;而我們的算法僅僅提取每個目標的中心點,無需對關鍵點進行grouping 或者是後處理。
單目3D目標檢測:
3D BBox檢測爲自動駕駛賦能。Deep3Dbox使用一個slow-RCNN風格的框架,該網絡先檢測2D目標,然後將目標送到3D估計網絡;3D RCNN在Faster-RCNN上添加了額外的head來做3D projection;Deep Manta使用一個coarse-to-fine的Faster-RCNN,在多任務中訓練。而我們的模型同one-stage版本的Deep3Dbox 或3D RCNN相似,同樣,CenterNet比它們都更簡潔,更快。

初步工作

輸入圖像的寬W,高H。形式如下:
IRW×H×3 I \in R^{W \times H \times 3}
我們目標是生成關鍵點熱力圖:
Y^ϵ[0,1]WR×HR×C \hat Y \epsilon[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C}
其中R是下采樣因子,這裏採用R=4。C表示關鍵點類別,C=17時爲人關節點,用於人姿態估計; C= 80爲目標類別數(COCO數據集中),用於目標檢測。
在預測的heatmaps中:
Y^x,y,c=1 \hat Y_{x, y, c}=1
表示檢測到的關鍵點。
Y^x,y,c=0 \hat Y_{x, y, c}=0
表示爲背景。
在整個訓練的流程中,CenterNet學習了CornerNet的方法。對於每個標籤圖(ground truth)中的某一 C 類,我們要將真實關鍵點p計算出來計算出來用於訓練,中心點的計算方式爲:
p=(x1+x22,y1+y22) p=\left(\frac{x_{1}+x_{2}}{2}, \frac{y_{1}+y_{2}}{2}\right)
下采樣後對應的關鍵點爲:
p~=pR \tilde{p}=\left\lfloor\frac{p}{R}\right\rfloor
R是上文中提到的下采樣因子4。計算出來的是對應低分辨率圖像中的中心點。
然後我們利用
Y[0,1]WR×HR×C Y \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C}
來對圖像進行標記。在下采樣的[128,128]圖像中將ground truth point以
Y[0,1]WR×HR×C Y \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C}
的形式輸入下面的高斯核:
Yxyc=exp((xp~x)2+(yp~y)22σp2) Y_{x y c}=\exp \left(-\frac{\left(x-\tilde p_{x}\right)^{2}+\left(y-\tilde p_{y}\right)^{2}}{2 \sigma_{p}^{2}}\right)
其中σp是一個與目標大小(也就是w和h)相關的標準差。這樣我們就將關鍵點分佈到特徵圖上。如果對於同個類c(同個關鍵點或是目標類別)有兩個高斯函數發生重疊,我們選擇元素級最大的。
也就是說,每個點
Y[0,1]WR×HR×C Y \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C}
的範圍是0-1,而1則代表這個目標的中心點,也就是我們要預測要學習的點。
損失函數:
在CenterNet中,作者使用了三種全卷積encoder-decoder網絡:hourglass,Resnet和DLA來預測
Y^ \hat Y
關鍵點損失函數採用的是像素級邏輯迴歸的focal loss,如下公式所示:
Lk=1Nxyc{(1Y^xyc)αlog(Y^xyc) if Yxyc=1(1Yxyc)β(Y^xyc)αlog(1Y^xyc) otherwise  L_{k}=\frac{1}{N} \sum_{x y c} \begin{cases}{\left(1-\hat Y_{x y c}\right)^{\alpha} \log \left(\hat Y_{x y c}\right)} &amp; {\text { if } Y_{x y c}=1} \\\\ {\left(1-Y_{x y c}\right)^{\beta}\left(\hat Y_{x y c}\right)^{\alpha} \log \left(1-\hat Y_{x y c}\right)} &amp; {\text { otherwise }} \end{cases}
其中α和β是focal loss的超參數,實驗中兩個數分別設置爲2和4, N是圖像中的關鍵點個數,除以N主要爲了將所有focal loss歸一化。
和Focal Loss類似,對於easy example的中心點,適當減少其訓練比重也就是loss值,當
Y^xyc=1 \hat Y_{x y c}=1
時, log前面的括號項就充當了矯正的作用。假如上式接近1的話,說明這個是一個比較容易檢測出來的點,那麼第二項前面的括號項就相應比較低了。而當上式接近0的時候,說明這個中心點還沒有學習到,所以要加大其訓練的比重,因此第二項前面的括號項就會很大。
因爲上文中對圖像進行了R=4的下采樣,這樣的特徵圖重新映射到原始圖像上的時候會帶來精度誤差,因此對於每一箇中心點,額外採用了一個local offset來補償誤差:
O^RWR×HR×2 \hat O \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2}
所有類 c 的中心點共享同一個offset prediction,這個偏置值(offset)用L1 loss來訓練:
Loff=1NpO^p~(pRp~) L_{o f f}=\frac{1}{N} \sum_{p}\left|\hat O_{\tilde p}-\left(\frac{p}{R}-\tilde p\right)\right|
絕對值項中第一項是我們預測出來的偏置,第二項是在訓練過程中提前計算出來的數值。
事實上,這個偏置損失是可選的,我們不使用它也可以,只不過精度會下降一些。

目標看作點


(x1(k),y1(k),x2(k),y2(k)) \left(x_{1}^{(k)}, y_{1}^{(k)}, x_{2}^{(k)}, y_{2}^{(k)}\right)
代表類別爲ck的目標k,其中心點爲:
pk=(x1(k)+x2(k)2,y1(k)+y2(k)2) p_{k}=\left(\frac{x_{1}^{(k)}+x_{2}^{(k)}}{2}, \frac{y_{1}^{(k)}+y_{2}^{(k)}}{2}\right)
我們使用關鍵點:
Y^ \hat Y
來預測所有中心點。
此外,爲每個目標k迴歸出目標的尺寸
sk=(x2(k)x1(k),y2(k)y1(k)) s_{k}=\left(x_{2}^{(k)}-x_{1}^{(k)}, y_{2}^{(k)}-y_{1}^{(k)}\right)
sk這個值是在訓練前提前計算出來的,是進行了下采樣之後的長寬值。
爲了減少計算負擔,我們爲每個目標種類使用單一的尺寸預測:
S^RWR×HR×2 \hat S \in R^{\frac{W}{R} \times \frac{H}{R} \times 2}
因此我們可以在中心點位置添加L1 Loss:
Lsize=1Nk=1Ns^pksk L_{s i z e}=\frac{1}{N} \sum_{k=1}^{N}\left|\hat s_{p k}-s_{k}\right|
我們不將scale進行歸一化,直接使用原始像素座標。
整個訓練的損失函數如下:
Ldet=Lk+λsizeLsize+λoffLoff L_{d e t}=L_{k}+\lambda_{s i z e} L_{s i z e}+\lambda_{o f f} L_{o f f}
整體的損失函數爲物體損失、大小損失與偏置損失的和,每個損失都有相應的權重。在論文中 λsize=0.1 ,λoff=1 ,論文中所使用的backbone都有三個head layer,分別產生[1,80,128,128]、[1,2,128,128]、[1,2,128,128],也就是每個座標點產生C+4個數據(即關鍵點類別C, 偏移量的x,y,尺寸的w,h)。
從點到迴歸框:
在預測階段,我們首先針對一張圖像進行下采樣,隨後對下采樣後的圖像進行預測,對於每個類在下采樣的特徵圖中預測中心點,然後將輸出圖中的每個類的熱點單獨地提取出來。如何提取呢?我們將熱力圖上的所有響應點與其連接的8個臨近點進行比較,如果該點響應值大於或等於其八個臨近點值則保留,最後我們保留所有滿足之前要求的前100個峯值點。
假設
P^c \hat P_{c}
表示類別c的n箇中心點的集合。
P^ \hat P
代表c類中檢測到的一個點。
每個關鍵點的位置用整型座標表示:
(xi,yi) \left(x_{i}, y_{i}\right)
使用
Y^xiyic \hat Y_{x_{i} y_{i} c}
表示當前點的置信度。
然後我們使用下面的公式來產生目標框:
(x^i+δx^iw^i/2,y^i+δy^ih^i/2,x^i+δx^i+w^i/2,y^i+δy^i+h^i/2) (\hat x_{i}+\delta \hat x_{i}-\hat w_{i} / 2, \hat y_{i}+\delta \hat y_{i}-\hat h_{i} / 2, \hat x_{i}+\delta \hat x_{i}+\hat w_{i} / 2, \hat y_{i}+\delta \hat y_{i}+\hat h_{i} / 2)
其中:
(δx^i,δy^i)=O^x^i,y^i \left(\delta \hat x_{i}, \delta \hat y_{i}\right)=\hat O \hat x_{i}, \hat y_{i}
是當前點對應原始圖像的偏置點。
(w^i,h^i)=S^x^i,y^i \left(\hat w_{i}, \hat h_{i}\right)=\hat S \hat x_{i}, \hat y_{i}
是預測出來當前點對應目標的長寬。
最終根據模型預測出來的
Y^[0,1]WR×HR×C \hat Y \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C }
即就是當前中心點存在物體的概率值,代碼中設置的閾值爲0.3,也就是從上面選出的100個結果中選出大於該閾值的中心點作爲最終的結果。
3D檢測:
3D檢測是對每個目標進行3維bbox估計,每個中心點需要3個附加信息:depth,3D dimension,orientation(深度、3D維度和方向)。因此對其中每個部分增加一個單獨的部分檢測頭。
對於每個中心點,深度值depth是一個維度的。然後depth很難直接回歸,我們參考Depth map prediction from a single image using a multi-scale deep network這篇文章對輸出做了變換:
d=1/σ(d^)1 d=1 / \sigma(\hat d)-1
其中σ是sigmoid函數。
我們在特徵點估計網絡上添加了一個深度估計器:
D^[0,1]WR×HR \hat D \in[0,1]^{\frac{W}{R} \times \frac{H}{R}}
該通道使用了兩個卷積層,然後做ReLU 。我們用L1 loss來訓練該深度估計器。
目標的3D維度是三個標量值。我們直接回歸出它們(長寬高)的絕對值,單位爲米。
Γ^[0,1]WR×HR×3 \hat \Gamma \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times 3}
該3D維度估計器也使用L1 loss來訓練。
方向默認是單標量的值,然而其也很難迴歸。我們參考3d bounding box estimation using deep learning and geometry這篇文章的做法,使用兩個bins來呈現方向,且i做n-bin迴歸。方向用8個標量值來編碼的形式,每個bin有4個值。對於一個bin,兩個值用作softmax分類,其餘兩個值迴歸到在每個bin中的角度。
人體姿態估計:
人體姿態估計估計出每個人體的k個關節點位置(COCO數據集中k=17,即每個人有17個關節點),我們令中心點的姿態是2k維的,然後將每個關鍵點(關節點對應的點)參數化爲相對於中心點的偏移(L1 Loss):
J^=RWR×HR×2 \hat J=R^{\frac{W}{R} \times \frac{H}{R} \times 2}
爲了精修關鍵點,估計k個人體部位熱力圖 (Focal Loss):
Φ^RWR×HR×k \hat \Phi \in R^{\frac{W}{R} \times \frac{H}{R} \times k}
我們使用標準的bottom-up多人體姿態估計,我們訓練人的關節點熱力圖使用focal loss和像素偏移量,這塊的思路和中心點的訓練雷同。
我們將初始預測映射到特徵圖上檢測到的最近的關鍵點。然後將中心偏移作爲分組標誌,將各個檢測到的關鍵點分配給最近的人體。
具體來說,令:
(x^,y^) (\hat x, \hat y)
代表檢測到的中心點。
第一次迴歸得到的關節點爲:
lj=(x^,y^)+J^x^y^j^(j=1,2,,k) l_{j}=(\hat x, \hat y)+\hat J_{\hat x \hat y \hat j}(j=1,2, \ldots, k)
我們提取到所有關鍵點(關節點,此處是類似中心點檢測用熱力圖迴歸得到的,對於熱力圖上值小於0.1的直接略去),然後將每個迴歸(第一次迴歸,通過偏移方式)位置lj與最近的檢測關鍵點(關節點)進行分配:
argminlLj(llj)2 \arg \min_{l \in L_{j}} (l-l_{j})^{2}

實現細節

我們實驗了4個結構:ResNet-18, ResNet-101, DLA-34, Hourglass-104。我們用deformable卷積層來更改ResNets和DLA-34,按照原樣使用Hourglass網絡。
Hourglass:
堆疊的Hourglass網絡通過兩個連續的hourglass模塊對輸入進行了4倍的下采樣,每個hourglass模塊是個對稱的5層下和上卷積網絡,且帶有skip連接。該網絡較大,但通常會生成最好的關鍵點估計。
ResNet:
Xiao等人對標準的ResNet做了3個up-convolutional網絡來dedao更高的分辨率輸出(最終stride爲4)。爲了節省計算量,我們改變這3個up-convolutional的輸出通道數分別爲256,128,64。up-convolutional核初始爲雙線性插值。
DLA:
即Deep Layer Aggregation(DLA),是帶多級跳躍連接的圖像分類網絡,我們採用全卷積上採樣版的DLA,用deformable卷積來跳躍連接低層和輸出層;將原來上採樣層的卷積都替換成3x3的deformable卷積。在每個輸出head前加了一個3x3x256的卷積,然後做1x1卷積得到期望輸出。
Training:
訓練輸入圖像尺寸:512x512;輸出分辨率:128x128(即4倍stride);採用數據增強方式:隨機flip, 隨機scaling(比例在0.6到1.3),裁剪,顏色jittering;採用Adam優化器。

在3D估計分支任務中未採用數據增強(scaling和crop會影響尺寸)。

總結

CenterNet通過預測一箇中心點解決了2D目標檢測,3D目標檢測以及姿態估計任務,完美的把這三個任務統一到一起;
與另一篇CenterNet:Keypoint Triplets for Object Detection相比較,Keypoint Triplets則是通過中心點預測抑制CornerNet中存在的大量誤檢,而本篇則是使用目標中心點來預測目標;
從使用關鍵點來進行的目標檢測方法在coco上訓練耗時來看,這類方法普遍存在訓練耗時較長的問題。
在實際訓練中,如果在圖像中兩個目標經過下采樣後中心點重疊了,那麼CenterNet會將這兩個物體的當成一個物體來訓練(因爲只有一箇中心點)。同理,在預測過程中,如果兩個同類的物體在下采樣後的中心點也重疊了,那麼CenterNet也只能檢測出一箇中心點。

FCOS

論文:FCOS: Fully Convolutional One-Stage Object Detection
論文地址:https://arxiv.org/pdf/1904.01355.pdf
代碼地址:https://github.com/tianzhi0549/FCOS
本文提出了一種全卷積的one-stage目標檢測器(FCOS),以逐像素預測方式解決目標檢測,類似於語義分割。相比於RetinaNet,SSD,YOLOv3和Faster R-CNN等依賴於預定義的錨框(anchor boxes)的目標檢測模型,FCOS不需要錨框,因此FCOS完全避免了與錨框相關的複雜計算,且避免了與錨框相關的所有超參數,這些參數通常對最終檢測性能非常敏感。FOCS憑藉唯一的後處理非極大值抑制(NMS),達到了比以往one-stage檢測模型更好的性能。

介紹

全卷積網絡FCN在密集預測的任務如語義分割,深度估計,關鍵點檢測上取得了不錯的效果。但是在以往的目標檢測任務中,由於anchor boxes的使用,並沒有應用全卷積逐像素點預測的目標檢測模型。如果我們能像語義分割中的FCN那樣使用逐像素點預測的方式來解決目標檢測問題,那麼視覺任務中所有的問題都可以用一個框架來解決。這篇論文證明這是可以的。而且,和基於anchors的檢測器相比,基於FCN的檢測器更加簡單,也可以取得更好的效果。
以往的DenseBox和UnitBox等方法也曾嘗試將全卷積框架用於目標檢測。這些基於FCN的框架在每層特徵圖的每個空間位置上,直接預測一個4D向量加一個類別。4D向量表示像素點到4個邊框的距離,這樣每一個像素點都要預測一個4D向量。但是爲了應付不同大小的邊框,DenseBox將圖像縮放到一個固定尺寸。這樣DenseBox不得不在圖像金字塔上進行檢測,這和FCN的一次處理完所有卷積的方式相悖,而且這些方法應用在通用目標檢測任務上效果不會很好,往往它們具有高度重疊的邊框。高度重疊的邊框會造成界限不明確,很難理清重疊部分的像素點應該屬於哪一個邊框。
接下來我們證明了FPN能有效地解決這種不明確的問題。我們發現FCOS會在遠離目標物體中心的位置上產生一些效果不好的預測邊框。爲了降低這些不好的檢測結果,我們引入了一個 “center-ness” 分支(只有一層),預測像素點到目標邊框中心的距離。這個分數然後用於降低效果不好的邊框的權重,然後用NMS將檢測結果合併。Center-ness分支很簡單,也很有效。有了它,在同樣的訓練和測試環境下,我們基於FCN的檢測器就能超過基於anchor的檢測器。
FCOS與anchor-based檢測器的區別:

  • anchor-based算法將輸入圖像上的位置作爲錨框的中心店,並且對這些錨框進行迴歸。FCOS直接對feature map中每個位置對應原圖的邊框都進行迴歸,換句話說FCOS直接把每個位置都作爲訓練樣本,這一點和FCN用於語義分割相同。FCOS算法feature map中位置與原圖對應的關係,如果feature map中位置爲(x,y),映射到輸入圖像的位置是:
    (s2+xs,s2+ys) \left(\left\lfloor\frac{s}{2}\right\rfloor+ x s,\left\lfloor\frac{s}{2}\right\rfloor+ y s\right)
  • 在訓練過程中,anchor-based算法對樣本的標記方法是,如果anchor對應的邊框與真實邊框(ground truth)的IOU大於一定閾值,就設爲正樣本,並且把交併比最大的類別作爲這個位置的類別。而在FCOS中,如果位置 (x,y) 落入任何真實邊框,就認爲它是一個正樣本,它的類別標記爲這個真實邊框的類別。
  • 以往的anchor-based算法訓練一個多元分類器,而FCOS訓練C個二元分類器(C是類別數)。
  • 在多尺度FPN的檢測上,anchor-based算法將不同尺寸的錨框分配到不同級別的特徵層,而FCOS通過直接限定不同特徵級別的邊界框的迴歸範圍來進行分配。

FCOS模型的優點:
FCOS模型使用語義分割的思想來解決目標檢測問題,它摒棄了目標檢測中常見的anchor boxes和object proposal,使得不需要調優涉及anchor boxes和object proposal的超參數;
在訓練過程中避免大量計算GT boxes和anchor boxes 之間的IoU,使得訓練過程佔用內存更低;
FCOS可以作爲two stage檢測器的區域建議網絡(RPN),其性能明顯優於基於錨點的RPN算法;
FCOS可以經過最小的修改便可擴展到其他的視覺任務,包括實例分割、關鍵點檢測。
FCOS算法步驟:
對輸入的圖片進行預處理操作;
搭建下圖所示的網絡架構,將輸入數據送入backbone網絡中獲取輸入數據的feature_map,在feature_map的每一點上面進行迴歸操作,進行網絡訓練獲取網絡模型;
將預訓練的網絡模型應用到測試圖片中,從特徵金字塔的多個Head中獲得預測的結果;
使用NMS等後處理操作獲得最終的結果。

FCOS網絡結構

輸入
 |
C1
 |
C2
 |
C3——>P3——>head
 |   |
C4——>P4——>head  
 |   |
C5——>P5——>head
     |
     P6——>head
     |
     P7——>head
每一個head的結構:
                                                -->Classification HxWxC
                                                |
      -->HxWx256-->HxWx256-->HxWx256-->HxWx256-->
      |                                         |
      |                                         -->Center-ness HxWx1
      |
head-->
      |
      -->HxWx256-->HxWx256-->HxWx256-->HxWx256-->Regression HxWx4

P3-P7是FPN特徵金字塔,head是一個三分支的頭檢測網絡。

全卷積one stage檢測器


FiRH×W×C F_{i} \in \mathbb{R}^{H \times W \times C}
爲CNN的第i層特徵圖,s是該層之前的總步長。
輸入圖像的ground truth邊框定義爲:
Bi=(x0(i),y0(i),x1(i)y1(i),c(i))R4×{1,2,,C} B_{i}=\left(x_{0}^{(i)}, y_{0}^{(i)}, x_{1}^{(i)} y_{1}^{(i)}, c^{(i)}\right) \in R^{4} \times\{1,2, \ldots, C\}
上式中:
(x0(i),y0(i))(x1(i)y1(i)) \left(x_{0}^{(i)}, y_{0}^{(i)}\right) 和 \left(x_{1}^{(i)} y_{1}^{(i)}\right)
分別表示邊框左上角和右下角的座標。
c(i) c^{(i)}
表示邊框中目標的類別。
C是類別的總數,對於COCO數據集而言,C=80。
對特徵圖Fi上的每個位置(x,y),我們可以將其映射回輸入圖像:
(s2+xs,s2+ys) \left(\left\lfloor\frac{s}{2}\right\rfloor+ x s,\left\lfloor\frac{s}{2}\right\rfloor+ y s\right)
基於anchor的檢測器將輸入圖像上的位置作爲anchor boxes的中心,然後對這些anchor boxes迴歸出目標邊框。而我們的方法是直接在特徵圖的每個位置上回歸出目標邊框。也就是說,我們的檢測器直接將每個點看作訓練樣本,而不是將anchor boxes看作訓練樣本,這和語義分割中的FCN一樣。
如果(x,y)落入一個ground truth邊框內,它就被標註爲正樣本,該位置的標籤
c c^{\ast}
就是Bi的標籤。否則它就是負樣本(背景類),有:
c=0 c^{\ast}=0
除了分類的標籤外我們也有一個4D的向量:
t=(l,t,r,b) t^{\ast}=\left(l^{\ast}, t^{\ast}, r^{\ast}, b^{\ast}\right)
作爲每一個樣本回歸的目標。四個變量分別代表該位置到邊框四條邊的距離。如果一個點落入多個邊框之中,它就被視作模糊樣本。就目前來說,我們只選取最小面積的邊框作爲迴歸的目標。如果位置(x,y)與邊框Bi相關聯,該位置的迴歸目標可定義爲:
l=xx0(i),t=yy0(i),r=x1(i)x,b=y1(i)y l^{\ast}=x-x_{0}^{(i)}, t^{\ast}=y-y_{0}^{(i)}, r^{\ast}=x_{1}^{(i)}-x, b^{\ast}=y_{1}^{(i)}-y
FCOS模型能夠利用儘可能多的前景樣本來訓練迴歸器。這和基於anchor boxes的檢測器不同,它們只將那些和ground truth邊框IOU足夠高的anchor boxes當作正樣本。我們認爲也許這是FCOS比基於 anchor的檢測器效果好的原因之一。
網絡輸出:
與訓練目標對應,最後一層預測一個類別標籤的80維的向量p,以及一個4維的向量t=(l,t,r,b),即中心點距離邊框的left、top、right和bottom邊之間的距離。我們訓練C個二元分類器,而不是一個多類別分類器。我們在主幹網絡特徵圖之後增加4個卷積層,分別對應分類和迴歸分支。而且,由於迴歸目標通常是正的,我們在迴歸分支上面用exp(x)將任意實數映射到(0,正無窮)之內。FCOS的參數個數要比基於anchor的檢測器少9倍,因爲一般基於anchor的方法在每個位置上會有9個anchor boxes。
損失函數:
L(px,ytx,y)=1Nposx,yLcls(px,y,cx,y)+λNposx,y1(cx,y&gt;0)Lreg(tx,y,tx,y) L\left(p_{x, y}t_{x, y}\right) =\frac{1}{N_{pos}} \sum_{x, y} L_{cls}\left(p_{x, y}, c_{x, y}^{\ast}\right) +\frac{\lambda}{N_{pos}} \sum_{x, y} 1_{(c_{x, y}^{\ast}&gt;0)} L_{reg}\left(t_{x, y},t_{x, y}^{\ast}\right)
該loss函數包含兩部分,Lcls表示分類loss,本文使用的是Focal_loss(類別損失);Lreg表示迴歸loss,本文使用的是IOU loss。
px,y表示特徵圖的位置(x,y)處的分類概率,tx,y表示特徵圖的位置(x,y)處的迴歸座標。Npos表示正樣本的個數,在這篇論文中λ=1用於平衡Lreg的權重。對特徵圖Fi上的各個位置的結果進行求和。
1c&gt;0 1_{c^{\ast}&gt;0}
是指標函數,當
ci&gt;0 c_{i}^{\ast}&gt;0
指標函數值爲1,否則爲0。
前向推理:
FCOS 的前向推理很直接。給定輸入圖片,前向通過整個網絡,獲得特徵圖Fi上每個位置的分類得分px,y以及迴歸預測tx,y。如果一個位置的px,y>0.05,則它被列爲正樣本,然後通過上面的公式計算l,t,r,b獲得預測邊框。

用FPN對FCOS進行多尺度的預測

FCOS可能遇到的兩個問題:

  • 最後一個特徵圖上較大的步長可能導致低召回率。對於基於anchor的檢測器,因步長較大而導致召回率低的問題,可以通過降低判斷正樣本的IOU閾值來彌補。對於FCOS,我們證明即使步長很大,基於FCN的FCOS檢測器也能產生足夠好的召回率。而且,它甚至要比基於anchor的RetinaNet要好。而且,利用多層級FPN預測,能夠進一步提升召回率;
    能被進一步提升,達到 RetinaNet 的最好成績。
  • Ground truth邊框的重疊區域會造成訓練中的不明確,到底重疊區域內的位置應該回歸到哪個邊框裏去?這個問題會導致基於FCN的檢測器性能降低。我們證明這種不明確問題可以通過FPN多層級預測解決,和基於anchor的檢測器相比較,基於FCN的檢測器能取得更優的成績。

在FCOS中,我們在特徵圖的不同層級上檢測不同大小的物體,我們使用了特徵圖的5種層級,即P3、P4、P5、P6、P7。P3、P4、P5是通過CNN 的特徵圖C3、C4、C5後接一個1×1的卷積層而產生。P6、P7通過在P5、P6上分別應用一個步長爲2的卷積層而得到。特徵層P3、P4、P5、P6、P7的步長分別爲8、16、32、64、128。
基於anchor的檢測器在不同特徵層上分配不同大小的anchor boxes,而我們直接限定邊框迴歸的範圍。更具體點,我們首先在所有特徵層上的每個位置計算迴歸目標:
l,t,r,b l^{\ast}, t^{\ast}, r^{\ast}, b^{\ast}
如果一個位置滿足:
max(l,t,r,b)&gt;mimax(l,t,r,b)&lt;mi1 \max \left(l^{\ast}, t^{\ast}, r^{\ast}, b^{\ast}\right)&gt;m_{i} 或\max \left(l^{\ast}, t^{\ast}, r^{\ast}, b^{\ast}\right)&lt;m_{i-1}
那麼它就被設爲負樣本,就不需要回歸邊框。mi是第i個特徵層需要回歸的最大距離。在論文中,m2、m3、m4、m5、m6、m7分別被設爲0、64、128、256、512、∞。因爲不同大小的物體被分配到不同的特徵層,而絕大多數的重疊物體彼此間的大小很不一樣,多層級預測能極大地緩解前面提到的重疊區域模糊問題,因而提升FCN檢測器的精度。
最後,我們在不同的特徵層級間共享 heads,提升了檢測器的效率和性能。但是我們發現不同特徵層級需要回歸不同的大小範圍(比如對P3是[0,64],對P4是[64,128] ),因而對不同的特徵層級使用一樣的heads是不合理的。所以,除了使用標準的exp(x),我們也使用exp(six) ,其中si是一個可訓練的標量,自動調節特徵層Pi的指數函數的底數,從而提升性能。

Center-ness

通過FPN多尺度預測之後發現FCOS和基於anchor的檢測器之間仍然存在着一定的性能差距,主要原因是距離目標中心較遠的位置產生很多低質量的預測邊框。
Center-ness的作用就是用來很好的抑制這些低質量的預測邊框的產生,它的優點是比較簡單。不需要引入其它的超參數。它的位置是在Head網絡的分類網絡分支下面,與分類分支平行。對於給定的一個位置的迴歸目標:
l,t,r,b l^{\ast}, t^{\ast}, r^{\ast}, b^{\ast}
center-ness目標的定義如下:
centerness=min(l,r)max(l,r)×min(t,b)max(t,b) centerness ^{\ast}=\sqrt{\frac{\min \left(l^{\ast}, r^{\ast}\right)}{\max \left(l^{\ast}, r^{\ast}\right)} \times \frac{\min \left(t^{\ast}, b^{\ast}\right)}{\max \left(t^{\ast}, b^{\ast}\right)}}
使用根號是爲了降低centerness衰減的速度。center-ness(中心度)取值爲0到1之間,通過二元交叉熵損失來訓練。並把這個損失加入前面提到的損失函數中。測試時,將預測的center-ness和對應的分類得分相乘,得到最終的得分,再用這個得分對檢測邊框進行排名。因此center-ness可以降低那些遠離物體中心邊框的得分。在最後的NMS過程中,這些低質量的邊框就會很大概率上被剔除,從而顯着提高了檢測性能。
基於anchor的檢測器使用2個IOU閾值Tlow,Thigh來將anchor box標爲負樣本、忽略和正樣本。而 center-ness可以看作爲一個soft閾值。Center-ness通過模型訓練來學習,而無需手動去調。而且依據此方法,我們的檢測器仍可以將任意落入ground truth邊框的點看作正樣本,除了那些在多層級預測中已經被標註爲負樣本的點,在迴歸器中就可以使用儘可能多的訓練樣本。

算法細節

在訓練階段,文中使用ResNet-50作爲backbone網絡,使用SGD優化器,初始學習率爲0.01,batch_size=16,在迭代60K和80K時的weight_decay分別爲0.0001和0.9,使用ImagNet預訓練權重進行初始化,將輸入圖片裁剪爲短邊不小於800,長邊不小於1333大小。整個網絡是在COCO數據集上面訓練得到的。

總結

在COCO數據集上,各種目標檢測算法PK。FCOS已經超越 Two-stage的Faster R-CNN,還超越了 One-stage的YOLOv2、SSD、RetinaNet,以及很新的CornerNet。
相比於YOLOV1算法,YOLOV1只利用了目標的中心區域的點做預測,因此召回率較低。而FCOS利用了目標的整個區域內的點,召回率和基於anchor-based的算法相當;儘管centerness確實帶來效果上的明顯提升,但是缺乏理論可解釋性;作爲一種新的one stage算法,論文中未題算法的推理的速度,可見該算法的速度並不算快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章