yolo系列的目標檢測演算法真的非常贊!這篇部落格就來介紹yolo v3演算法的內容,因為涉及到v1和v2的一些思想,所以可以先熟悉下:yolo v1演算法詳解,yolo v2演算法詳解。
yolo演算法的基本思想是:首先通過特徵提取網路對輸入影象提取特徵,得到一定size的feature map,比如13*13,然後將輸入影象分成13*13個grid cell,接著如果ground truth中某個object的中心座標落在哪個grid cell中,那麼就由該grid cell來**該object,因為每個grid cell都會**固定數量的bounding box(yolo v1中是2個,yolo v2中是5個,yolo v3中是3個,這幾個bounding box的初始size是不一樣的),那麼這幾個bounding box中最終是由哪乙個來**該object?答案是:這幾個bounding box中只有和ground truth的iou最大的bounding box才是用來**該object的。可以看出**得到的輸出feature map有兩個維度是提取到的特徵的維度,比如13*13,還有乙個維度(深度)是b*(5+c),注:yolo v1中是(b*5+c),其中b表示每個grid cell**的bounding box的數量,比如yolo v1中是2個,yolo v2中是5個,yolo v3中是3個,c表示bounding box的類別數(沒有背景類,所以對於voc資料集是20),5表示4個座標資訊和乙個置信度(objectness score)。
演算法在速度和精度上的提公升可以看figure1。
bounding box的座標**方式還是延續了yolo v2的做法,簡單講就是下面這個截圖的公式,tx、ty、tw、th就是模型的**輸出。cx和cy表示grid cell的座標,比如某層的feature map大小是13*13,那麼grid cell就有13*13個,第0行第1列的grid cell的座標cx就是0,cy就是1。pw和ph表示**前bounding box的size。bx、by。bw和bh就是**得到的bounding box的中心的座標和size。座標的損失採用的是平方誤差損失。
類別**方面主要是將原來的單標籤分類改進為多標籤分類,因此網路結構上就將原來用於單標籤多分類的softmax層換成用於多標籤多分類的邏輯回歸層。首先說明一下為什麼要做這樣的修改,原來分類網路中的softmax層都是假設一張影象或乙個object只屬於乙個類別,但是在一些複雜場景下,乙個object可能屬於多個類,比如你的類別中有woman和person這兩個類,那麼如果一張影象中有乙個woman,那麼你檢測的結果中類別標籤就要同時有woman和person兩個類,這就是多標籤分類,需要用邏輯回歸層來對每個類別做二分類。邏輯回歸層主要用到sigmoid函式,該函式可以將輸入約束在0到1的範圍內,因此當一張影象經過特徵提取後的某一類輸出經過sigmoid函式約束後如果大於0.5,就表示屬於該類。
yolo v3採用多個scale融合的方式做**。原來的yolo v2有乙個層叫:passthrough layer,假設最後提取的feature map的size是13*13,那麼這個層的作用就是將前面一層的26*26的feature map和本層的13*13的feature map進行連線,有點像resnet。當時這麼操作也是為了加強yolo演算法對小目標檢測的精確度。這個思想在yolo v3中得到了進一步加強,在yolo v3中採用類似fpn的upsample和融合做法(最後融合了3個scale,其他兩個scale的大小分別是26*26和52*52),在多個scale的feature map上做檢測,對於小目標的檢測效果提公升還是比較明顯的。前面提到過在yolo v3中每個grid cell**3個bounding box,看起來比yolo v2中每個grid cell**5個bounding box要少,其實不是!因為yolo v3採用了多個scale的特徵融合,所以boundign box的數量要比之前多很多,以輸入影象為416*416為例:(13*13+26*26+52*52)*3和13*13*5相比哪個更多應該很清晰了。
關於bounding box的初始尺寸還是採用yolo v2中的k-means聚類的方式來做,這種先驗知識對於bounding box的初始化幫助還是很大的,畢竟過多的bounding box雖然對於效果來說有保障,但是對於演算法速度影響還是比較大的。作者在coco資料集上得到的9種聚類結果:(10*13); (16*30); (33*23); (30*61); (62*45); (59*119); (116*90); (156*198); (373*326),這應該是按照輸入影象的尺寸是416*416計算得到的。
網路結構(darknet-53)一方面基本採用全卷積(yolo v2中採用pooling層做feature map的sample,這裡都換成卷積層來做了),另一方面引入了residual結構(yolo v2中還是類似vgg那樣直筒型的網路結構,層數太多訓起來會有梯度問題,所以darknet-19也就19層,因此得益於resnet的residual結構,訓深層網路難度大大減小,因此這裡可以將網路做到53層,精度提公升比較明顯)。darknet-53只是特徵提取層,原始碼中只使用了pooling層前面的卷積層來提取特徵,因此multi-scale的特徵融合和**支路並沒有在該網路結構中體現,具體資訊可以看原始碼:**支路採用的也是全卷積的結構,其中最後乙個卷積層的卷積核個數是255,是針對coco資料集的80類:3*(80+4+1)=255,3表示乙個grid cell包含3個bounding box,4表示框的4個座標資訊,1表示objectness score。模型訓練方面還是採用原來yolo v2中的multi-scale training。
table2是幾個網路在imagenet資料集上的效能和精度對比。可以看出darknet-53的效能還是非常不錯的。
yolo v3的實驗結果對比可以看table3。原來yolo v2對於小目標的檢測效果是比較差的,通過引入多尺度特徵融合的方式,可以看出yolo v3的aps要比yolo v2的aps高出不少。
最後這張圖非常有意思,直接用all the other slow ones來代表其他演算法,實實在在展現了本篇文章隨性的風格。
最後貼乙份參考資料:其中part1是介紹yolo演算法相關的基礎知識,part2到part5是介紹如何用pytorch實現yolo v3演算法,非常推薦。
YOLO v3演算法解析
yolo系列的目標檢測演算法真的非常贊!這篇部落格就來介紹yolo v3演算法的內容,因為涉及到v1和v2的一些思想,所以可以先熟悉下 yolo v1演算法詳解,yolo v2演算法詳解。yolo演算法的基本思想是 首先通過特徵提取網路對輸入影象提取特徵,得到一定size的feature map,比...
Yolov3演算法詳解
yolo系列演算法是當前目標檢測領域的當紅演算法,是一階段目標檢測演算法的經典代表,正如其名稱 you only look once 所述,其只需要一趟完整的過程即可完成目標的識別和位置定位,能夠近乎實時得完成目標檢測任務,堪稱眾多目標檢測演算法中速度之最。yolo系列演算法到現如今已有五個版本,最...
yolov3的缺點 yolov3特點總結
p1,yolov3,簡單總結下比較特別的地方 1.bounding box 中心值x,y的 是通過乙個sigmoid 函式,來 在每乙個單元 cell 的相對位置。而不像普通那種 乙個相對於anchor的offset。然後bbox 損失是用的mse 一般都是用smooth l1 3.類別 沒有使用s...