Anchor-free目標(biāo)檢測 | 工業(yè)應(yīng)用更友好的新網(wǎng)絡(luò)(2)
4.3)討論
① 一張圖片最多可以檢測出49個(gè)對象
每個(gè)30維向量中只有一組(20個(gè))對象分類的概率,也就只能預(yù)測出一個(gè)對象。所以輸出的 7*7=49個(gè) 30維向量,最多表示出49個(gè)對象。
② 總共有 49*2=98 個(gè)候選區(qū)(bounding box)
每個(gè)30維向量中有2組bounding box,所以總共是98個(gè)候選區(qū)。
③ YOLO的bounding box并不是Faster RCNN的Anchor
Faster RCNN等一些算法采用每個(gè)grid中手工設(shè)置n個(gè)Anchor(先驗(yàn)框,預(yù)先設(shè)置好位置的bounding box)的設(shè)計(jì),每個(gè)Anchor有不同的大小和寬高比。YOLO的bounding box看起來很像一個(gè)grid中2個(gè)Anchor,但它們不是。YOLO并沒有預(yù)先設(shè)置2個(gè)bounding box的大小和形狀,也沒有對每個(gè)bounding box分別輸出一個(gè)對象的預(yù)測。它的意思僅僅是對一個(gè)對象預(yù)測出2個(gè)bounding box,選擇預(yù)測得相對比較準(zhǔn)的那個(gè)。
這里采用2個(gè)bounding box,有點(diǎn)不完全算監(jiān)督算法,而是像進(jìn)化算法。如果是監(jiān)督算法,我們需要事先根據(jù)樣本就能給出一個(gè)正確的bounding box作為回歸的目標(biāo)。但YOLO的2個(gè)bounding box事先并不知道會(huì)在什么位置,只有經(jīng)過前向計(jì)算,網(wǎng)絡(luò)會(huì)輸出2個(gè)bounding box,這兩個(gè)bounding box與樣本中對象實(shí)際的bounding box計(jì)算IOU。這時(shí)才能確定,IOU值大的那個(gè)bounding box,作為負(fù)責(zé)預(yù)測該對象的bounding box。
訓(xùn)練開始階段,網(wǎng)絡(luò)預(yù)測的bounding box可能都是亂來的,但總是選擇IOU相對好一些的那個(gè),隨著訓(xùn)練的進(jìn)行,每個(gè)bounding box會(huì)逐漸擅長對某些情況的預(yù)測(可能是對象大小、寬高比、不同類型的對象等)。所以,這是一種進(jìn)化或者非監(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. 這個(gè) responsible 有點(diǎn)讓人疑惑,對預(yù)測"負(fù)責(zé)"是啥意思。其實(shí)沒啥特別意思,就是一個(gè)Object只由一個(gè)grid來進(jìn)行預(yù)測,不要多個(gè)grid都搶著預(yù)測同一個(gè)Object。更具體一點(diǎn)說,就是在設(shè)置訓(xùn)練樣本的時(shí)候,樣本中的每個(gè)Object歸屬到且僅歸屬到一個(gè)grid,即便有時(shí)Object跨越了幾個(gè)grid,也僅指定其中一個(gè)。具體就是計(jì)算出該Object的bounding box的中心位置,這個(gè)中心位置落在哪個(gè)grid,該grid對應(yīng)的輸出向量中該對象的類別概率是1(該gird負(fù)責(zé)預(yù)測該對象),所有其它grid對該Object的預(yù)測概率設(shè)為0(不負(fù)責(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. 同樣,雖然一個(gè)grid中會(huì)產(chǎn)生2個(gè)bounding box,但我們會(huì)選擇其中一個(gè)作為預(yù)測結(jié)果,另一個(gè)會(huì)被忽略。下面構(gòu)造訓(xùn)練樣本的部分會(huì)看的更清楚。
④ 可以調(diào)整網(wǎng)格數(shù)量、bounding box數(shù)量
7*7網(wǎng)格,每個(gè)網(wǎng)格2個(gè)bounding box,對448*448輸入圖像來說覆蓋粒度有點(diǎn)粗。我們也可以設(shè)置更多的網(wǎng)格以及更多的bounding box。設(shè)網(wǎng)格數(shù)量為 S*S,每個(gè)網(wǎng)格產(chǎn)生B個(gè)邊框,網(wǎng)絡(luò)支持識別C個(gè)不同的對象。這時(shí),輸出的向量長度為:
YOLO選擇的參數(shù)是 7*7網(wǎng)格,2個(gè)bounding box,20種對象,因此 輸出向量長度 = 20 + 2 * (4+1) = 30。整個(gè)輸出的tensor就是 7*7*30。
因?yàn)榫W(wǎng)格和bounding box設(shè)置的比較稀疏,所以這個(gè)版本的YOLO訓(xùn)練出來后預(yù)測的準(zhǔn)確率和召回率都不是很理想,后續(xù)的v2、v3版本還會(huì)改進(jìn)。當(dāng)然,因?yàn)槠渌俣饶軌驖M足實(shí)時(shí)處理的要求,所以對工業(yè)界還是挺有吸引力的。
5)訓(xùn)練樣本構(gòu)造
作為監(jiān)督學(xué)習(xí),我們需要先構(gòu)造好訓(xùn)練樣本,才能讓模型從中學(xué)習(xí)。
對于一張輸入圖片,其對應(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個(gè)對象分類的概率
對于輸入圖像中的每個(gè)對象,先找到其中心點(diǎn)。比如圖8中的自行車,其中心點(diǎn)在黃色圓點(diǎn)位置,中心點(diǎn)落在黃色網(wǎng)格內(nèi),所以這個(gè)黃色網(wǎng)格對應(yīng)的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個(gè)網(wǎng)格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點(diǎn)所在的網(wǎng)格對預(yù)測該對象負(fù)責(zé)"。狗和汽車的分類概率也是同樣的方法填寫。
② 2個(gè)bounding box的位置
訓(xùn)練樣本的bounding box位置應(yīng)該填寫對象實(shí)際的bounding box,但一個(gè)對象對應(yīng)了2個(gè)bounding box,該填哪一個(gè)呢?上面討論過,需要根據(jù)網(wǎng)絡(luò)輸出的bounding box與對象實(shí)際bounding box的IOU來選擇,所以要在訓(xùn)練過程中動(dòng)態(tài)決定到底填哪一個(gè)bounding box。參考下面第③點(diǎn)。
③ 2個(gè)bounding box的置信度
上面討論過置信度公式:
6)損失函數(shù)
損失就是網(wǎng)絡(luò)實(shí)際輸出值與樣本標(biāo)簽值之間的偏差。
YOLO給出的損失函數(shù)如下
DenseBox和YOLO的區(qū)別:
1.DenseBox最初應(yīng)用于人臉檢測,相當(dāng)于只有兩類,而YOLO是通用檢測,通常大于兩類。
2.DenseBox是密集預(yù)測,對每個(gè)pixel進(jìn)行預(yù)測,而YOLO先將圖片進(jìn)行網(wǎng)格化,對每個(gè)grid cell進(jìn)行預(yù)測,所以前者更適合于小目標(biāo),后者更適合于大目標(biāo)。
3.DenseBox的gt通過bbox中心圓形區(qū)域確定的,而YOLO的gt由bbox中心點(diǎn)落入的grid cell確定的。
CornerNet:
下圖,經(jīng)過特征提取主干網(wǎng)絡(luò)(主干網(wǎng)絡(luò)為Hourglass-104)后分為兩個(gè)分支(兩個(gè)分支分別接前面提到的corner pooling,隨后細(xì)談),一個(gè)分支生成目標(biāo)左上點(diǎn)熱力圖,一個(gè)分支生成目標(biāo)右下點(diǎn)熱力圖,而此時(shí)兩個(gè)熱力圖并沒有建立聯(lián)系,因此無法確定兩點(diǎn)是夠?qū)儆谕荒繕?biāo),因此兩分支同時(shí)生成embeddings,通過判斷兩個(gè)embedding vector的相似性確定同一物體(距離小于某一閾值則劃為同一目標(biāo))。
1、輸入一張圖像,經(jīng)過backbone網(wǎng)絡(luò)(Hourglass network)后,得到feature map。
2、將feature map同時(shí)輸入到兩個(gè)branch,分別用于預(yù)測Top-Left Corners和Bottom-right Corners。
3、兩個(gè)branch都會(huì)先經(jīng)過一個(gè)叫Corner Pooling的網(wǎng)絡(luò),最后輸出三個(gè)結(jié)果,分別是Heatmaps、Embeddings、Offsets。
4、根據(jù)Heatmaps能夠得到物體的左上角點(diǎn)和右下角點(diǎn),根據(jù)Offsets對左上角和右下角點(diǎn)位置進(jìn)行更加精細(xì)的微調(diào),根據(jù)Embeddings可以將同一個(gè)物體的左上角和右下角點(diǎn)進(jìn)行匹配。得到到最終的目標(biāo)框。
1:怎么檢測這個(gè)兩個(gè)點(diǎn)?生成keypoint的heatmap,heatmap中響應(yīng)值最大的位置就是點(diǎn)的位置。
2:怎么知道這兩個(gè)點(diǎn)所組成的框包含物體的類別?每個(gè)heatmaps集合的形式都是CxHxW,其中C代表的是檢測目標(biāo)的類別數(shù),H和W則代表的heatmap的分辨率,Corner響應(yīng)值最大所在的channel即對應(yīng)了物體的類別。
3:當(dāng)圖像中有多個(gè)物體時(shí),怎么知道哪些點(diǎn)可以組成框?(哪些左上角的點(diǎn)和哪些右下角的點(diǎn)能夠組成有效的框)生成embedding向量,用向量的距離衡量兩個(gè)Corner是否可以組成對。
4:Loss是什么形式?loss總共分了三個(gè)部分,一部分是用于定位keypoint點(diǎn)的detecting loss,一個(gè)是用于精確定位的offset loss,一個(gè)是用于對Corner點(diǎn)進(jìn)行配對的grouping loss。
5:網(wǎng)絡(luò)結(jié)構(gòu)是怎么樣的?使用Hourglass作為backbone,使用Corner Pooling構(gòu)造了prediction module,用來得到最終的結(jié)果。
6:有沒有什么比較新奇的東西?提出的Corner Pooling,第一次使用檢測點(diǎn)的方法檢測物體。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。
隔離器相關(guān)文章:隔離器原理