1. 程式人生 > >YOLO_V3 原理以及訓練說明

YOLO_V3 原理以及訓練說明

  • yolo_v3目標檢測原理
  • Darknet 訓練測試說明
  1. yolo_v3

  主要從三個方面來說明,網路的輸入、結構、輸出。

  (1)網路輸入:原論文中提到的大小320*320,416*416,608*608。這個大小必須是32的整數倍數,yolo_v3有5次下采樣,每次取樣步長為2,所以網路的最大步幅(步幅指層的輸入大小除以輸出)為2^5=32。

  (2)網路結構:作者首先訓練了一個darknet-53,訓練這個主要是為了主要有兩個目的:a.這個網路結構能在ImageNet有好的分類結果,從而說明這個網路能學習到好的特徵(設計新的網路結構,這個相當於調參,具體引數怎麼調,就是煉丹了),b.為後續檢測模型做初始化。作者在ImageNet上實驗發現這個darknet-53,的確很強,相對於ResNet-152和ResNet-101,darknet-53不僅在分類精度上差不多,計算速度還比ResNet-152和ResNet-101強多了,網路層數也比他們少。

                     圖一  darknet-53網路結構

                   圖二  darknet-53的效能測試

Darknet-53採用了ResNet這種跳層連線方式,效能完全比ResNet-152和ResNet-101這兩種深層網路好,這裡作者並沒有給出原因,可能的原因:a.網路的基本單元的差異,b.網路層數越少,引數少。需要的計算量少。

             圖三  兩種結構基本單元比較

Yolo_v3網路就是使用了darknet-53的前面的52層(沒有全連線層),直接拿過來,yolo_v3這個網路是一個全卷積網路,大量使用殘差的跳層連線。之前的工作中,取樣一般都是使用size為2*2,步長(stride)為2的max-pooling或者average-pooling進行降取樣。但在這個網路結構中,使用的是步長為2的卷積來進行降取樣。同時,網路中使用了上取樣、route操作,還在一個網路結構中進行3次檢測(有點盜用SSD的思想)

 使用殘差的結構的好處:(1)深度模型一個關鍵的點就是能否正常收斂,殘差這種結構能保證網路結構在很深的情況下,仍能收斂,模型能訓練下去。(2)網路越深,表達的特徵越好,分類+檢測的效果都會提升。(3)殘差中的1*1卷積,使用network in network的想法,大量的減少了每次卷積的channel,一方面減少了引數量(引數量越大,儲存的模型越大),另一方面在一定程度上減少了計算量

網路中作者進行了三次檢測,分別是在32倍降取樣,16倍降取樣,8倍降取樣時進行檢測,這樣在多尺度的feature map上檢測跟SSD有點像。在網路中使用up-sample(上取樣)的原因:網路越深的特徵表達效果越好,比如在進行16倍降取樣檢測,如果直接使用第四次下采樣的特徵來檢測,這樣就使用了淺層特徵,這樣效果一般並不好。如果想使用32倍降取樣後的特徵,但深層特徵的大小太小,因此yolo_v3使用了步長為2的up-sample(上取樣),把32倍降取樣得到的feature map的大小提升一倍,也就成了16倍降取樣。同理8倍取樣也是對16倍降取樣的特徵進行步長為2的上取樣,這樣就可以使用深層特徵進行detection。

 Yolo_v3通過上取樣的方式很好的使16倍降取樣和8倍降取樣使用深層特徵,但進行4次下采樣和3次下采樣得到的淺層feature map大小是一樣的。Yolo_v3想把這些淺層特徵也利用起來,就有了route層。把16倍降取樣得到的feature map和四次下采樣得到的層拼接在一起,在channel那個維度進行拼接。這樣拼接的好處:讓網路同時學習深層和淺層特徵,表達效果更好。8倍降取樣同樣也是這樣的操作,把三次下采樣的feature map拼接在一起。

(箭頭沒畫好,箭頭從up-sample指向detection,代表把feature map的大小上升一倍)

(3)網路輸出:

a.首先先確定網路輸出特徵層的大小。比如輸入為320*320時,則輸出為320/32=10,因此輸出為10*10大小的特徵層(feature map),此時有10*10=100個cell;同理當輸入為416*416時輸出的特徵層為13*13大小的特徵層,13*13=169個cell;輸入為608*608時,輸出的feature map大小為19*19,cell有19*19=361個。進行每進行一次up-sample時,輸出特徵層擴大一倍。

b. Anchor box的確定。這個先驗框不同於之前Faster-Rcnn和SSD那樣人工設定,在yolo_v2和yolo_v3中,都採用了對影象中的object採用k-means聚類。在yolo_v3中作者是這樣描述的:We still use k-means clustering to determine our bounding box priors. We just sort of chose 9 clusters and 3 scales arbitrarily and then divide up the clusters evenly across scales. On the COCO dataset the 9 clusters were:(10,13); (16,30); (33,23); (30,61); (62,45); (59,119); (116 ,90); (156 ,198); (373 ,326). 這個地方,作者有一個地方沒有說清楚,這個框的大小是在什麼輸入大小的影象下確定的,比如你在608*608作為輸入影象中object的大小和在320*320大小影象中的object大小肯定不同,對這兩種輸入聚類的結果肯定不同。但檢視作者提供的yolo_v3網路配置檔案,這個聚類結果應該是在416*416大小的影象下聚類得到的結果

                                圖四  Yolo_v3部分網路配置檔案

c. feature map中的每一個cell都會預測3個邊界框(bounding box) ,每個bounding 
box都會預測三個東西:(1)每個框的位置(4個值,中心座標tx和ty,,框的高度bh和寬度bw),(2)一個objectness prediction ,(3)N個類別,coco資料集80類,voc20類。因此對於coco資料集,在網路輸入為416*416時,網路的輸出大小為13*13(3*(4+1+80))=43095

                           圖五   bounding box

對於上圖的幾點說明:

中心座標(tx和ty)

Yolo_v3使用 sigmoid 函式進行中心座標預測。這使得輸出值在 0 和 1 之間。正常

情況下,YOLO 不會預測邊界框中心的確切座標。它預測的是:與預測目標的網格單元左上角相關的偏移;並且使用feature map中的cell大小進行歸一化。

當輸入影象為416*416,如果中心的預測是 (0.4, 0.7),則第二個cell在 13 x 13 特徵圖上的相對座標是 (1.4, 1.7),具體的位置x座標還需要1.4乘以cell的寬,y座標為1.7乘以cell的高。

Bounding box的寬度bw和高度bh

Yolo_v3得出的預測 bw 和bh 使用影象的高和寬進行歸一化,框的預測 bx 和 by 是 (0.3, 0.8),那麼 13 x 13 特徵圖的實際寬和高是 (13 x 0.3, 13 x 0.8)。

d. 三次檢測,每次對應的感受野不同,32倍降取樣的感受野最大,適合檢測大的

目標,所以在輸入為416*416時,每個cell的三個anchor box為(116 ,90); (156 ,198); (373 ,326)。16倍適合一般大小的物體,anchor box為(30,61); (62,45); (59,119)。8倍的感受野最小,適合檢測小目標,因此anchor box為(10,13); (16,30); (33,23)。所以當輸入為416*416時,實際總共有(52*52+26*26+13*13)*3=10647個proposal box。

                                              圖六 打印出10647個proposal box