博客專欄

EEPW首頁 > 博客 > Anchor-free目標(biāo)檢測 | 工業(yè)應(yīng)用更友好的新網(wǎng)絡(luò)(2)

Anchor-free目標(biāo)檢測 | 工業(yè)應(yīng)用更友好的新網(wǎng)絡(luò)(2)

發(fā)布人:CV研究院 時間:2021-09-16 來源:工程師 發(fā)布文章

4.3)討論

① 一張圖片最多可以檢測出49個對象

每個30維向量中只有一組(20個)對象分類的概率,也就只能預(yù)測出一個對象。所以輸出的 7*7=49個 30維向量,最多表示出49個對象。

② 總共有 49*2=98 個候選區(qū)(bounding box)

每個30維向量中有2組bounding box,所以總共是98個候選區(qū)。

③ YOLO的bounding box并不是Faster RCNN的Anchor

Faster RCNN等一些算法采用每個grid中手工設(shè)置n個Anchor(先驗框,預(yù)先設(shè)置好位置的bounding box)的設(shè)計,每個Anchor有不同的大小和寬高比。YOLO的bounding box看起來很像一個grid中2個Anchor,但它們不是。YOLO并沒有預(yù)先設(shè)置2個bounding box的大小和形狀,也沒有對每個bounding box分別輸出一個對象的預(yù)測。它的意思僅僅是對一個對象預(yù)測出2個bounding box,選擇預(yù)測得相對比較準(zhǔn)的那個。

這里采用2個bounding box,有點不完全算監(jiān)督算法,而是像進化算法。如果是監(jiān)督算法,我們需要事先根據(jù)樣本就能給出一個正確的bounding box作為回歸的目標(biāo)。但YOLO的2個bounding box事先并不知道會在什么位置,只有經(jīng)過前向計算,網(wǎng)絡(luò)會輸出2個bounding box,這兩個bounding box與樣本中對象實際的bounding box計算IOU。這時才能確定,IOU值大的那個bounding box,作為負責(zé)預(yù)測該對象的bounding box。

訓(xùn)練開始階段,網(wǎng)絡(luò)預(yù)測的bounding box可能都是亂來的,但總是選擇IOU相對好一些的那個,隨著訓(xùn)練的進行,每個bounding box會逐漸擅長對某些情況的預(yù)測(可能是對象大小、寬高比、不同類型的對象等)。所以,這是一種進化或者非監(jiān)督學(xué)習(xí)的思想。

另外論文中經(jīng)常提到responsible。比如:Our system divides the input image into an S*S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. 這個 responsible 有點讓人疑惑,對預(yù)測"負責(zé)"是啥意思。其實沒啥特別意思,就是一個Object只由一個grid來進行預(yù)測,不要多個grid都搶著預(yù)測同一個Object。更具體一點說,就是在設(shè)置訓(xùn)練樣本的時候,樣本中的每個Object歸屬到且僅歸屬到一個grid,即便有時Object跨越了幾個grid,也僅指定其中一個。具體就是計算出該Object的bounding box的中心位置,這個中心位置落在哪個grid,該grid對應(yīng)的輸出向量中該對象的類別概率是1(該gird負責(zé)預(yù)測該對象),所有其它grid對該Object的預(yù)測概率設(shè)為0(不負責(zé)預(yù)測該對象)。

還有:YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. 同樣,雖然一個grid中會產(chǎn)生2個bounding box,但我們會選擇其中一個作為預(yù)測結(jié)果,另一個會被忽略。下面構(gòu)造訓(xùn)練樣本的部分會看的更清楚。

④ 可以調(diào)整網(wǎng)格數(shù)量、bounding box數(shù)量

7*7網(wǎng)格,每個網(wǎng)格2個bounding box,對448*448輸入圖像來說覆蓋粒度有點粗。我們也可以設(shè)置更多的網(wǎng)格以及更多的bounding box。設(shè)網(wǎng)格數(shù)量為 S*S,每個網(wǎng)格產(chǎn)生B個邊框,網(wǎng)絡(luò)支持識別C個不同的對象。這時,輸出的向量長度為:

12.png


YOLO選擇的參數(shù)是 7*7網(wǎng)格,2個bounding box,20種對象,因此 輸出向量長度 = 20 + 2 * (4+1) = 30。整個輸出的tensor就是 7*7*30。

因為網(wǎng)格和bounding box設(shè)置的比較稀疏,所以這個版本的YOLO訓(xùn)練出來后預(yù)測的準(zhǔn)確率和召回率都不是很理想,后續(xù)的v2、v3版本還會改進。當(dāng)然,因為其速度能夠滿足實時處理的要求,所以對工業(yè)界還是挺有吸引力的。

5)訓(xùn)練樣本構(gòu)造

作為監(jiān)督學(xué)習(xí),我們需要先構(gòu)造好訓(xùn)練樣本,才能讓模型從中學(xué)習(xí)。

13.jpg

對于一張輸入圖片,其對應(yīng)輸出的7*7*30張量(也就是通常監(jiān)督學(xué)習(xí)所說的標(biāo)簽y或者label)應(yīng)該填寫什么數(shù)據(jù)呢。

首先,輸出的 7*7維度 對應(yīng)于輸入的 7*7 網(wǎng)格;然后具體看下30維向量的填寫。

① 20個對象分類的概率

對于輸入圖像中的每個對象,先找到其中心點。比如圖8中的自行車,其中心點在黃色圓點位置,中心點落在黃色網(wǎng)格內(nèi),所以這個黃色網(wǎng)格對應(yīng)的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網(wǎng)格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點所在的網(wǎng)格對預(yù)測該對象負責(zé)"。狗和汽車的分類概率也是同樣的方法填寫。

② 2個bounding box的位置

訓(xùn)練樣本的bounding box位置應(yīng)該填寫對象實際的bounding box,但一個對象對應(yīng)了2個bounding box,該填哪一個呢?上面討論過,需要根據(jù)網(wǎng)絡(luò)輸出的bounding box與對象實際bounding box的IOU來選擇,所以要在訓(xùn)練過程中動態(tài)決定到底填哪一個bounding box。參考下面第③點。

③ 2個bounding box的置信度

上面討論過置信度公式:

14.png

6)損失函數(shù)

損失就是網(wǎng)絡(luò)實際輸出值與樣本標(biāo)簽值之間的偏差。

15.jpg

YOLO給出的損失函數(shù)如下

16.jpg

DenseBox和YOLO的區(qū)別:

1.DenseBox最初應(yīng)用于人臉檢測,相當(dāng)于只有兩類,而YOLO是通用檢測,通常大于兩類。

2.DenseBox是密集預(yù)測,對每個pixel進行預(yù)測,而YOLO先將圖片進行網(wǎng)格化,對每個grid cell進行預(yù)測,所以前者更適合于小目標(biāo),后者更適合于大目標(biāo)。

3.DenseBox的gt通過bbox中心圓形區(qū)域確定的,而YOLO的gt由bbox中心點落入的grid cell確定的。

CornerNet:

下圖,經(jīng)過特征提取主干網(wǎng)絡(luò)(主干網(wǎng)絡(luò)為Hourglass-104)后分為兩個分支(兩個分支分別接前面提到的corner pooling,隨后細談),一個分支生成目標(biāo)左上點熱力圖,一個分支生成目標(biāo)右下點熱力圖,而此時兩個熱力圖并沒有建立聯(lián)系,因此無法確定兩點是夠?qū)儆谕荒繕?biāo),因此兩分支同時生成embeddings,通過判斷兩個embedding vector的相似性確定同一物體(距離小于某一閾值則劃為同一目標(biāo))。

17.png

1、輸入一張圖像,經(jīng)過backbone網(wǎng)絡(luò)(Hourglass network)后,得到feature map。

2、將feature map同時輸入到兩個branch,分別用于預(yù)測Top-Left Corners和Bottom-right Corners。

3、兩個branch都會先經(jīng)過一個叫Corner Pooling的網(wǎng)絡(luò),最后輸出三個結(jié)果,分別是Heatmaps、Embeddings、Offsets。

4、根據(jù)Heatmaps能夠得到物體的左上角點和右下角點,根據(jù)Offsets對左上角和右下角點位置進行更加精細的微調(diào),根據(jù)Embeddings可以將同一個物體的左上角和右下角點進行匹配。得到到最終的目標(biāo)框。

18.png

1:怎么檢測這個兩個點?生成keypoint的heatmap,heatmap中響應(yīng)值最大的位置就是點的位置。

2:怎么知道這兩個點所組成的框包含物體的類別?每個heatmaps集合的形式都是CxHxW,其中C代表的是檢測目標(biāo)的類別數(shù),H和W則代表的heatmap的分辨率,Corner響應(yīng)值最大所在的channel即對應(yīng)了物體的類別。

3:當(dāng)圖像中有多個物體時,怎么知道哪些點可以組成框?(哪些左上角的點和哪些右下角的點能夠組成有效的框)生成embedding向量,用向量的距離衡量兩個Corner是否可以組成對。

4:Loss是什么形式?loss總共分了三個部分,一部分是用于定位keypoint點的detecting loss,一個是用于精確定位的offset loss,一個是用于對Corner點進行配對的grouping loss。

5:網(wǎng)絡(luò)結(jié)構(gòu)是怎么樣的?使用Hourglass作為backbone,使用Corner Pooling構(gòu)造了prediction module,用來得到最終的結(jié)果。

6:有沒有什么比較新奇的東西?提出的Corner Pooling,第一次使用檢測點的方法檢測物體。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

隔離器相關(guān)文章:隔離器原理


關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉