目標檢測 Yolov3網路詳解

2021-10-08 00:11:26 字數 2939 閱讀 2692

現在來仔細理解下yolov3這個網路細節。

目標檢測的經典網路有yolo和ssd,還有今天要記錄的yolov3。

yolo:將一張圖劃分為眾多個小格仔,每個小格仔檢測到一種物體,並**兩個bounding box,問題是當小格仔內的物體眾多時,yolo很可能會漏檢。

ssd:不太適合檢測小物體,vgg19限制了輸出大小為38x38。

yolov3:當下取樣越大,resolution越小,感受野越大,越不容易檢測到小物體。yolov3可以檢測到三個尺度(小,中,大)的物體。

下面來看yolov3。

框架

yolov3的backbone是darknet-53(53個卷積層),其中n為下取樣次數。

darknet_53= conv3x3 + sum_(下取樣 conv3x3_步長為2 + n x darknetblock)
darknetblock(含2層卷積)= conv1x1 + conv3x3 + residual
所以我們可以發現darknet-53共有1 + (1 + 1 x 2 ) + (1 + 2 x2) + (1 + 8 x 2) + (1 + 8 x 2) + (1 + 4 x 2) +全連線= 53個卷積層。

yolov3採用了類似ssd網路的mul-scales策略,使用3個scale在這裡插入**片(13x13,26x26,52x52)的feature map進行**。

有別於yolov2,這裡作者將每個grid cell**的邊框數從yolov2的5個減為yolov3的3個。最終輸出的tensor維度為n × n × [3 ∗ (4 + 1 + 80)]。其中n為feature map的長寬,3表示3個**的邊框,4表示邊框的tx,ty,tw,th,1表示**的邊框的置信度,80表示分類的類別數。

和yolov2一樣,anchor的大小作者還是使用kmeans聚類得出。在coco資料集上的9個anchor大小分別為:(10× 13); (16× 30); (33× 23); (30× 61); (62× 45); (59×119); (116 × 90); (156 × 198); (373 × 326)

其中在yolov3中,最終有3個分支輸出做**,輸出的特徵圖大小分別為13x13,26x26,52x52,每個特徵圖使用3個anchor:

13x13的特徵圖使用(116 × 90); (156 × 198); (373 × 326)這3個anchor

26x26的特徵圖使用(30× 61); (62× 45); (59×119)這3個anchor

52x52的特徵圖使用(10× 13); (16× 30); (33× 23)這3個anchor

在yolov3裡面,前向傳播過程中,張量的尺寸變換是通過改變卷積核的步長來實現的,比如stride=(2, 2),這就等於將影象邊長縮小了一半(即面積縮小到原來的1/4)。在yolov2中,要經歷5次縮小,會將特徵圖縮小到原輸入尺寸的1/32。若輸入為416x416,則輸出為13x13(416/32=13)

yolov3也和yolov2一樣,backbone都會將輸出特徵圖縮小到輸入的1/32。所以,通常都要求輸入是32的倍數。

類別**方面主要是將原來的單標籤分類改進為多標籤分類

因此網路結構上就將原來用於單標籤多分類的softmax層換成用於多標籤多分類的邏輯回歸層。首先說明一下為什麼要做這樣的修改,原來分類網路中的softmax層都是假設一張影象或乙個object只屬於乙個類別,但是在一些複雜場景下,乙個object可能屬於多個類,比如你的類別中有woman和person這兩個類,那麼如果一張影象中有乙個woman,那麼你檢測的結果中類別標籤就要同時有woman和person兩個類,這就是多標籤分類,需要用邏輯回歸層來對每個類別做二分類。邏輯回歸層主要用到sigmoid函式,該函式可以將輸入約束在0到1的範圍內,因此當一張影象經過特徵提取後的某一類輸出經過sigmoid函式約束後如果大於0.5,就表示屬於該類。

bounding box的座標**方式還是延續了yolo v2的做法

簡單講就是下面這個公式,tx、ty、tw、th就是模型的**輸出。cx和cy表示grid cell的座標,比如某層的feature map大小是13x13,那麼grid cell就有13x13個,第0行第1列的grid cell的座標cx就是0,cy就是1。pw和ph表示**前bounding box的size。bx、by。bw和bh就是**得到的bounding box的中心的座標和size。座標的損失採用的是平方誤差損失。

在目標檢測任務裡,有幾個關鍵資訊是需要確定的:(x,y),(w,h),class,confidence 。根據關鍵資訊的特點可以分為上述四類,損失函式應該由各自特點確定。最後加到一起就可以組成最終的loss function了,也就是乙個loss function搞定端到端的訓練。

YOLO v3 網路結構分析

最近在看tensorflow,沒有經過實踐的學習總感覺很心虛,因此打算做點什麼。所以,那就從yolo入手吧,將yolo v3改寫為tensorflow版本來進行練手。那第一步便是需要對yolo網路結構有一定的理解,不能像之前僅僅用yolo訓練資料然後檢測目標那樣浮於表面。整個網路主要是由一系列的1x...

yolov3檢測人頭 基於yolo v3的人臉檢測

一 實驗環境的搭建 1.安裝環境配置 python 3.6 tensorflow gpu 1.6.0 keras pillow opencv python matplotlib numpy 沒有通過pip安裝 例如 pip install keras 2.啟動虛擬環境,並且安裝對應的實驗環境 3.模...

yolov3系列 零 yolov3詳解

目標檢測演算法與efficientdet講解 論 文 翻譯 yolov3主頁 yolo系列的目標檢測演算法可以說是目標檢測史上的巨集篇巨作,v3演算法是在v1 v2基礎上形成的,先看下 yolov1 yolov2 下圖為yolov3的網路結構 dbl darknetconv2d bn leaky 是...