深度學習目標檢測(object detection)系列(六)YOLO2

發明者量化交易發表於2019-03-01

YOLO2結構

YOLO系列的實現有一個自己的框架叫做draknet,這是一個純C的框架,無論是YOLO還是YOLO2,在程式碼實現上都是用darknet,改變的是網路結構的配置檔案,首先我們來看一下它到底是什麼樣的:

深度學習目標檢測(object detection)系列(六)YOLO2

從上面的圖我們可以看到YOLO 2有32層。結構還是比較常規的,主要就是在用33的卷積,22的池化和1*1的卷積。除了上面三個常規操作外,還有reorg和route,其中route在25層和28層,reorg在27層。

route

route層是合併的意思,比如28層的route把27層和24層合併到一起輸出到下一層,第27層的輸出是1313256,24層輸出是13131024,所以在第三個維度上做拼接就是28層的輸出了,同樣也是29層的輸入:13131280。同理,第24層route只有16,那麼就不做合併了,直接把16層的輸出拿過來作為24層輸出:2626512。

reorg

reorg很像是一種reshape,但是reshape的方式很新奇,它將262664的輸出形變為1313256,這是因為26261可以變為13134。

這樣一來,YOLO2的32層結構就梳理清楚輸入輸出了,最後我們關注一第30層的輸出,是1313125。由於第30層做的是11卷積,所以是用了125個111024的卷積核,最後輸出1313*125。那麼為什麼輸出是這樣的shape呢?

1313沒什麼好說的,就是169個畫素點,每一個畫素點都有125層的厚度。而在這一層之後就直接預測了,所以這169125個數包含了YOLO2需要的所有資訊,邊框,類別等等。

125指的是25*5,其中的5指的是5個區域建議框,這種操作是在參考faster r-cnn中的anchor建議框,如果看過這個系列的話,在faster r-cnn這個數字是9,只是在YOLO2中,它變成了5。

還剩最後一個數字:25,這是和要檢測類別數量有關係,YOLO2在預測20類(VOC資料集),所以25的排布是20+4+1,其中:

20是class的分數(probability),就是當前的某一個畫素,對應的某個參考框中是某一個class的概率;

4是δ(tx)δ(tx),δ(ty)δ(ty),txtx,tyty,這4個數會被用來計算邊框的位置和大小;

1是confidence,表示邊框預測裡有真正的物件的概率。

所以,YOLO2的結構是在根據檢測的類別數變化的,如果我們做單目標檢測,其他的和上述相同的話,那麼最後一層的輸出將是:
1313(5*(1+4+1)),即131330。在這裡順便吐槽一下CNN結構,我們在做網路結構分析或網路結構設計的時候,經常會有這樣的感覺,輸出的數想讓它代表什麼就代表什麼,有時候甚至看起來很沒有道理,但是最後這樣的操作卻能有效果,最重要的原因就在於卷積操作是沒有實際的意義的,它只是很強的抽取能力,但是它並不知道會抽取出什麼東西,所以如果我們設計合適的損失函式,就可以任意指定輸出,哪怕這種指定看起來並沒有道理。CNN本質上就是連線input與output之間的一個極其複雜的,表達能力很強的,並且很有潛力的函式,但是這個函式最終的能力能不能充分發揮出來,要取決於很多東西,損失函式,訓練技巧,資料集等等。

YOLO2邊框計算

YOLO2的邊框是與最後的特徵圖上每一個畫素點相關的,每一個畫素點都會出五個參考框,這五個參考框是與anchor和stx、sty、tw、th這些數相關的,我們直接看下面的公式:

深度學習目標檢測(object detection)系列(六)YOLO2

在之前我們一直在說anchor這個東西,其實它一點都不抽象,反而非常具體。一個anchor就是一對數,分別是width與height,比如我們寫一對(1,1),那麼它就是一個anchor,在上圖的公式中width是PwPw,height是PhPh。YOLO2在決定anchor的取值的時候,是根據要預測的資料集來的,它事先統計了VOC中的boundingbox的長寬分佈情況,選擇了5對比較合適anchor,這種統計的方式在論文裡稱為Dimension Clusters(維度聚類),其實就是個K-means,以聚類個數k為anchor boxs個數,以k個聚類中心box的寬高維度為anchor box的維度。但是使用標準的K-means有一個問題,那就是大的bbox會比小的bbox產生更大的error,哪怕他們離實際的聚類中心更近,所以為了解決這個問題,維度聚類重新設計了距離評價: d(box,centroid)=1−IOU(box,centroid)d(box,centroid)=1−IOU(box,centroid)

經過K-means預測之後,它們分別是:

(1.3221,1.73145)

(3.19275,4.00944)

(5.00587,8.09892)

(9.47112,4.84053)

(11.2364,10.0071)

除此之外,CxCx與CyCy就是特徵圖上的畫素點位置,δ(tx)δ(tx),δ(ty)δ(ty),txtx,tyty就是特徵圖上的輸出。

最後這個在特徵圖上計算出來的bbox是要向原圖上對映的,這就是一個對應比例的座標變換。

YOLO2閾值與分類

YOLO2最後會對20個class都打分,顯然分值最高的那個,就是最後的這個建議框的類別,並拿出該類別的probability。

YOLO2對於VOC的結構,最後將產生13135的目標,但是一張正常的圖片中是不可能有這麼多物體的,所以最後需要一個閾值限定這些輸出,這個閾值論文中給出的是0.24,那麼拿什麼值和0.24比較呢?上面我們已經拿出了一個probability,還有一個輸出是confidence,比較的就是二者的乘積。

在darknet的官網給出了一個圖,說明了如果閾值取的非常小的話,就會是這樣:

深度學習目標檢測(object detection)系列(六)YOLO2

YOLO2損失函式

YOLO2同樣是一個多工損失,在R-CNN系列中,一般是把分類的迴歸的加在一起作為最後的loss function的,而在YOLO2中loss function有四項,並且這四項的weight不同,他們分別是:

object_scale:5

noobject_scale:1

class_scale:1

corrd_scale:1

什麼意思呢?object是對於存在物體的區域判定為無物體,noobject是沒有存在物體的區域判定為存在物體,class是分錯類別,corrd是bbox的偏差,可以看到,YOLO2對於檢測不到物體時給的懲罰是很大的。

具體的過程是,YOLO2最先關注的是noobject的類,最後一層會輸出13135個bbox,把這些bbox逐個與每一個ground truth比較,如果還是有一些bbox與ground truth的IOU小於0.6的話,那麼就認為屬於noobject,傳回去的東西就是noobject_scale*confidence。
下一步,關注和ground truth重合度最大的bbox,計算剩下的三個loss,這三個loss是沒有判定條件的,不管什麼樣都會輸出:

1.object類會回傳object_scale*(1-confidence)

2.corrd類會回傳四個數的L1距離

3.class類就直接回傳交叉熵

YOLO2效能評價

YOLO2對於VOC2007:

深度學習目標檢測(object detection)系列(六)YOLO2

YOLO2對於VOC2012與COCO:

深度學習目標檢測(object detection)系列(六)YOLO2

原文:quant.la/Article/Vie…

相關文章