本文來自公眾號“AI大道理”
YOLO v3 是目前工業界用的非常多的目標檢測的算法。
YOLO v3 沒有太多的創新,主要是借鑒一些好的方案融合到 YOLO v2 里面。
不過效果還是不錯的,在保持速度優勢的前提下,提升了預測精度,尤其是加強了對小物體的識別能力。
YOLO v3 主要的改進有:
(1)調整了網絡結構;
(2)利用多尺度特征進行對象檢測;
(3)對象分類用 Logistic 取代了 softmax。
1)多種尺度網格
YOLO v3 的核心思想就是用 3 種不同的網格來划分原始圖像。
其中 13 * 13 的網格划分的每一塊最大,用於預測大物體。
26 * 26 的網格划分的每一塊中等大小,用於預測中等物體。
52 * 52 的網格划分的每一塊最小,用於預測小物體。
2)Darknet-53
YOLO v3 的 backbone 采用了自己設計的 Darknet-53 的網絡結構(含有53個卷積層),它借鑒了殘差網絡 residual network 的做法,在一些層之間設置了快捷鏈路(shortcut connections)。
上圖的 Darknet-53 網絡采用 256 * 256 * 3 作為輸入,最左側那一列的 1、2、8 等數字表示多少個重復的殘差組件。每個殘差組件有兩個卷積層和一個快捷鏈路。
3)9 種尺度先驗框
隨着輸出的特征圖的數量和尺度的變化,先驗框的尺寸也需要相應的調整。
YOLO v2 已經開始采用 K-means 聚類得到先驗框的尺寸,YOLO v3 延續了這種方法,為每種下采樣尺度設定 3 種先驗框,總共聚類出 9 種尺寸的先驗框。
在 COCO 數據集這 9 個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的 13 * 13 特征圖上(有最大的感受野)應用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的對象。
中等的 26 * 26 特征圖上(中等感受野)應用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的對象。
較大的 52 * 52 特征圖上(較小的感受野)應用較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的對象。
藍色框為聚類得到的先驗框,黃色框是 ground truth,紅框是對象中心點所在的網格。
4)輸入與輸出
不考慮神經網絡結構細節的話,總的來說,對於一個輸入圖像,YOLO v3 將其映射到 3 個尺度的輸出張量,代表圖像各個位置存在各種對象的概率。
對於一個 416 * 416 的輸入圖像,在每個尺度的特征圖的每個網格設置 3 個先驗框,總共有 13 * 13 * 3 + 26 * 26 * 3 + 52 * 52 * 3 = 10647 個預測。
每一個預測是一個 (4 + 1 + 80) = 85 維向量,這個 85 維向量包含邊框坐標(4 個數值),邊框置信度(1 個數值),對象類別的概率(對於 COCO 數據集,有 80 種對象)。
對比一下,YOLO v2 采用 13 * 13 * 5 = 845 個預測,YOLO v3 的嘗試預測邊框數量增加了 10 多倍,而且是在不同分辨率上進行,所以 mAP 以及對小物體的檢測效果有一定的提升。
5)bounding box的坐標預測方式
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。
坐標的損失采用的是平方誤差損失。
6)類別預測
類別預測方面主要是將原來的單標簽分類改進為多標簽分類。
因此網絡結構上就將原來用於單標簽多分類的softmax層換成用於多標簽多分類的邏輯回歸層。
為什么要做這樣的修改?
原來分類網絡中的softmax層都是假設一張圖像或一個object只屬於一個類別,但是在一些復雜場景下,一個object可能屬於多個類。
比如你的類別中有woman和person這兩個類,那么如果一張圖像中有一個woman,那么你檢測的結果中類別標簽就要同時有woman和person兩個類。
這就是多標簽分類,需要用邏輯回歸層來對每個類別做二分類。
邏輯回歸層主要用到sigmoid函數,該函數可以將輸入約束在0到1的范圍內,因此當一張圖像經過特征提取后的某一類輸出經過sigmoid函數約束后如果大於0.5,就表示屬於該類。
YOLO v2 曾采用 passthrough 結構來檢測細粒度特征,在 YOLO v3 更進一步采用了 3 個不同尺度的特征圖來進行對象檢測。
結合上圖看,卷積網絡在 79 層后,經過下方幾個黃色的卷積層得到一種尺度的檢測結果。
相比輸入圖像,這里用於檢測的特征圖有 32 倍的下采樣。
比如輸入是 416 * 416 的話,這里的特征圖就是 13 * 13 了。
由於下采樣倍數高,這里特征圖的感受野比較大,因此適合檢測圖像中尺寸比較大的對象。
為了實現細粒度的檢測,第 79 層的特征圖又開始作上采樣(從 79 層往右開始上采樣卷積),然后與第 61 層特征圖融合(Concatenation),這樣得到第 91 層較細粒度的特征圖,同樣經過幾個卷積層后得到相對輸入圖像 16 倍下采樣的特征圖。
它具有中等尺度的感受野,適合檢測中等尺度的對象。
最后,第 91 層特征圖再次上采樣,並與第 36 層特征圖融合(Concatenation),最后得到相對輸入圖像 8 倍下采樣的特征圖。
它的感受野最小,適合檢測小尺寸的對象。
在YOLO v1中使用了一種叫sum-square error的損失計算方法,就是簡單的差方相加而已。
但在v3的論文里沒有明確提所用的損失函數。
其實也是跟YOLO v1類似,只是做了一些小調整。即損失還是四個特性((x,y)、(w,h)、分類和confidence)的損失累加起來,也就是一個loss_function搞定端到端的訓練。
YOLO3借鑒了殘差網絡結構,形成更深的網絡層次,以及多尺度檢測,提升了mAP及小物體檢測效果。
如果采用COCO mAP50做評估指標(不是太介意預測框的准確性的話),YOLO3的表現相當驚人,如下圖所示,在精確度相當的情況下,YOLOv3的速度是其它模型的3、4倍。
——————
淺談則止,細致入微AI大道理
掃描下方“AI大道理”,選擇“關注”公眾號
—————————————————————
—————————————————————