Yolov3演算法詳解

2021-10-10 09:09:40 字數 4585 閱讀 7053

yolo系列演算法是當前目標檢測領域的當紅演算法,是一階段目標檢測演算法的經典代表,正如其名稱「you only look once」所述,其只需要一趟完整的過程即可完成目標的識別和位置定位,能夠近乎實時得完成目標檢測任務,堪稱眾多目標檢測演算法中速度之最。

yolo系列演算法到現如今已有五個版本,最新的版本為yolo v5,但本文先介紹yolo v3演算法,因為yolo系列演算法是從yolo v3開始「走紅」進而被廣泛應用,接下來的yolo v4 和yolo v5雖然是在yolo v3基礎上進一步改進,但都是在細枝末節上進行的優化,反而丟失了yolo v3在工業界的普遍適用性。

在yolov2版本時,其主幹網路是乙個darknet-19網路,到了yolov3版本,主幹網路進化為了darknet-53網路,網路層數更多,同時也引進了更加先進的resnet殘差網路。與darknet-19網路相比,darknet-53網路在處理大量時整體效率上有所不如,但是准去率上確提高了很多,且經證明,在相同準確率下,darknet-53速度卻要由於darknet-19。

darknet-19與darknet-53網路結構對比如下所示。

進行目標檢測時,一副影象與可能存在多個物體,物體有大有小,所以目標檢測模型必須要有檢測不同大小物體的能力。而在實際卷積神經網路各層輸出的特徵圖中,不同深度的卷積層所檢測到的特徵是有區別的,淺層網路的輸出的特徵圖經過的卷積操作少,保留較多的小尺寸細節資訊,例如物體顏色、位置、邊緣等,資訊更加低階、具體,隨著網路深度的加深,輸出的特徵圖經過了更多層卷積操作,包含了更廣視野範圍的影象資訊,特徵圖所提取的資訊變得抽象,例如物體的語義資訊(物體的類別特徵:貓、狗、汽車等)。另外,針對這一現象,許多模型開始嘗試使用不同層次的特徵圖進行**,主要有一下幾種主流的方法:

(a) 這種方法最直觀。首先對於一幅影象建立影象金字塔,不同級別的金字塔影象被輸入到對應的網路當中,用於不同大小物體的檢測。但這樣做的結果就是每個級別的金字塔都需要進行一次處理,速度很慢。

(b) 檢測只在最後乙個特徵圖階段進行,這個結構無法檢測不同大小的物體。

(c) 對不同深度的特徵圖分別進行目標檢測。ssd演算法中採用的便是這樣的結構。每乙個特徵圖獲得的資訊僅**於之前的層,之後的層的特徵資訊無法獲取並加以利用。

(d) 與(c)很接近,但有一點不同的是,當前層的特徵圖會對未來層的特徵圖進行上取樣,並加以利用。這是乙個有跨越性的設計。因為有了這樣乙個結構,當前的特徵圖就可以獲得「未來」層的資訊,這樣的話低階特徵與高階特徵就有機融合起來了,提公升檢測精度。yolov3中正是使用這一種方案。

將特徵金字塔與darknet-53網路模型相結合,就有了yolov3的主幹網路。這裡需要說明的是,在整個yolov3網路中,沒有池化層,只有卷積層,通過調節卷積步長控制輸出特徵圖的尺寸。所以對於輸入尺寸沒有特別限制。

以輸入416 $\times$ 416尺寸的影象為例,在yolov3的darknet-53網路中特徵提取過程如下圖所示。

從上圖中可以到,虛線框內的darknet-53網路對右側網路有3個輸出,最底下的輸出是13×13×1024的特徵圖,這一輸出經過最多層卷積操作,包含更高階、更抽象、視野範圍更大的特徵,適合尺寸較大的目標檢測,在右側網路中,這一特徵圖再次經過卷積的特徵圖先兩個方向傳遞,乙個是再次經過3×3和1×1的卷積後輸出13×13×75的特徵圖用於目標檢測,另乙個是進行上取樣改變特徵圖大小後與darknet-53網路的第二個輸出特徵圖進行堆疊組成新的特徵圖,這個新的特徵圖再次進行卷積,也同樣進行兩個方向的傳遞,其中乙個方向最終輸出26×26×75的特徵圖用於目標檢測中,另乙個方向的是進行上取樣轉變尺寸後與darknet-53網路第乙個輸出的特徵圖進行堆疊後形成新的特徵圖進行特徵提取,最終輸出52×52×75的特徵圖,這一特徵圖包含了淺層網路提取的特徵圖對小尺寸目標檢測更有一定提公升。

在上述過程中,兩次用到上取樣和特徵堆疊,其中上採用是將小尺寸特徵圖通過插值等方法,生成大尺寸影象。例如使用最近鄰插值演算法,將88的影象變換為1616,注意,上取樣層不改變特徵圖的通道數。而特徵堆疊是指的是concat操作,源於densenet網路的設計思路,將特徵圖按照通道維度直接進行拼接,例如8816的特徵圖與8816的特徵圖拼接後生成8832的特徵圖。

總結而言,經過上述主幹網路後,將輸出以下三種不同大小的特徵圖:

在本文開題處我們就說過,yolo系列演算法時一種典型的「一階段」目標檢測演算法,這是yolo最為出彩的設計,一次性即可完成對目標的定位和識別——這是rcnn等其他型別的目標檢測演算法所不能完成的。不過這也要求yolo模型的輸出結果中必須包含目標物體的定位資訊和類別資訊。

對於模型的輸出,yolov3演算法在這一點上的設計堪稱絕妙。

主幹網路產生了3種不同的特徵圖,這三中特徵圖將被分別傳入logistic層中,進而運算產生模型的輸出。這裡多問一句,為什麼不使用softmax呢?這是因為softmax對每個框只產生乙個分類,在目標檢測任務中,存在多個目標物體重合的情況,也就是存在多個分類,softmax就不適用了,所以在yolo演算法中使用了logistic。

有多個輸入自然就有多個輸出,yolov3主幹網路的3中特徵圖分別經過logistic層後,也將產生3個輸出。在介紹模型輸出結果之前,我們有必要先說說yolov3中應用到的另一種思想——分而治之。

目標檢測任務極具挑戰性的乙個很大原因是因為原始影象中可能包含的目標物體大小不確定。對於這一難題,yolov3演算法的解決思路時將原始影象使用不同的粒度進行劃分網格,例如劃分為13×13、26×26、52×52的網格。13×13的大網格用於檢測大的目標物體,26×26的網格用於檢測中等的目標物體,52×52的網格用於檢測小目標物體。有沒有覺得13、26、52這幾個數字很眼熟?沒錯,這是與主幹網路輸出的3種特徵圖的大小是一一對應的。在logistic層的輸出結果中,對每個劃分單元格都有乙個對應的向量來描述目標檢測的結果,即在該單元格是否有物體、物體的位置、物體的分類。

在logistic層的輸出結果中具體是怎麼來描述的檢測結果的了?這還得從原始輸入影象說起,我們從13×13的網格劃分方式為例進行說明。如下圖所示,我們將一張影象輸入到模型中,13×13的單元格與主幹網路的13×13×75的特徵圖對應,也就是說,13×13×75的特徵圖經過logistic層後的輸出結果將包含$13×13=169$個單元格的檢測結果,如圖中紅色框標識的單元格所示,將包含169個這種向量。每個向量又可以分為3個相同結構的子向量,每個子向量對應乙個先驗框的檢測結果。

先驗框是什麼鬼,之前沒說過呀?別急,現在說也不遲。我們之前所在目標檢測任務中一大難點就是目標物體的大小是不確定的,但其實除了大小不確定外,位置也是不確定的,所以我們很難保證在同乙個單元格中會不會有多個目標物體覆蓋,也即是說,有可能乙個單元格需要多個輸出,對應可能的多個物體。yolov3中規定,每個單元格輸出3個結果,每個結果對應乙個先驗框(外文資料中稱為anchor box,中文翻譯各不相同,本文姑且稱之為先驗框),因為有三種網格劃分,所以共有9種先驗框。先驗框的長寬是在建模前使用k-means對資料集中的標籤框進行聚類,得到類別中心點的9個框,作為先驗框。在yolov3作者**中提出3種尺寸的單元格對應的先驗框分別為:

繼續,我們來解析一下輸出結果相對先驗框的含義。

通過這些值,可以進一步換算出**框的位置、長寬:

式中,$b_x, b_y, b_w, b_y$分別是**框的位置和長寬,$p_w, p_h$是對應的先驗框的長寬,$c_x, c_y$是對應單元格左上角位置座標,$ \sigma$是指$sigmod$啟用函式。

每個網格將會輸出3個**框,所以一張原始影象經過yolov3網路後將產生的**框數量為:3×13×13 + 3×26×26 + 3×52×52 = 10647個**框,你能想象滿屏都是這種**框嗎?所以,大部分了的**框都是沒必要的,那麼,怎麼提出無效**框,保留最準確的**框了?

如下圖所示,首先,我們可根據置信度判斷判斷**款內是否有目標物體的存在,如果置信度過低(小於某個閾值),那麼,直接刪除這個**框。例如下方中的**框$h$。

接下來才是真正的難題,刪除類似$h$這種置信度低的**框後仍有$a$、$b$、$c$、$d$、$e$、$f$等**框留下,且這些**框相對雷索都還算準確,但,我們對每個目標物體依然只需要保留乙個**框,怎麼辦呢?

在yolov3模型中,作者引入了非極大值抑制法(non-maximum suppression,nms)來解決這一問題。

先對所有留下的**框,根據分類器的類別分類概率做排序,假設從小到大依次為:$a$、$d$、$b$、$f$、$e$、$c$。

(1)從最大概率**框a開始,分別判斷$d~c$與a的重疊度iou是否大於某個設定的閾值;

(2)明顯,$b$、$c$與a的重疊度比較大,假設超過閾值,那麼就扔掉$b$、$c$;並標記第乙個矩形框$a$,是我們保留下來的。

(3)從剩下的**框$d$、$e$、$f$中,選擇概率最大的$d$,然後判斷$d$與$e$、$f$的重疊度,重疊度大於一定的閾值,那麼就扔掉;並標記e是我們保留下來的第二個矩形框。

就這樣一直重複,找到所有被保留下來的**框。最終,保留下來的**框為$a$和$d$。這就是非極大值抑制法。

在上述過程中,有乙個新的概念,即iou。iou(intersection over union)通俗來講就是交並比,如下圖所示。

上述就是非極大值抑制法的完整過程。這裡需要說明,使用非極大值抑制法存在一定不足,在上圖中,狗所在的區域與自行車所在的區域存在重合,這樣的話,如果同時要識別自行車,那麼,自行車的**框因為與狗的**框存在很大重疊,就會別丟棄,導致自行車識別失敗,針對這一問題,一些學者基於非極大值抑制法提出soft-nms等方法,大家可自行研究。

至此,yolov3演算法整個流程基本結束,本來還想再捋一捋loss計算部分內容,但總感覺沒有領悟透,最近事多,姑且擱置。

yolov3系列 零 yolov3詳解

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

YOLO v3演算法解析

yolo系列的目標檢測演算法真的非常贊!這篇部落格就來介紹yolo v3演算法的內容,因為涉及到v1和v2的一些思想,所以可以先熟悉下 yolo v1演算法詳解,yolo v2演算法詳解。yolo演算法的基本思想是 首先通過特徵提取網路對輸入影象提取特徵,得到一定size的feature map,比...

yolov3的缺點 yolov3特點總結

p1,yolov3,簡單總結下比較特別的地方 1.bounding box 中心值x,y的 是通過乙個sigmoid 函式,來 在每乙個單元 cell 的相對位置。而不像普通那種 乙個相對於anchor的offset。然後bbox 損失是用的mse 一般都是用smooth l1 3.類別 沒有使用s...